1 package com.tapina.robe.swi.clib.stdlib; 2 3 import com.tapina.robe.runtime.Environment; 4 import com.tapina.robe.runtime.MemoryMap; 5 import com.tapina.robe.runtime.RawDataBlock; 6 import com.tapina.robe.runtime.DataBlock; 7 import com.tapina.robe.swi.clib.Stub; 8 9 /*** 10 * This function changes the size of a space initially allocated with calloc , malloc , or realloc. It takes a 11 * pointer to the space in a1, and a new size in a2. The contents of the space are unaltered (although they 12 * may be chopped off the new size is smaller). Any new bytes allocated have undefined values. The space may be 13 * moved rather than just extended and so this function returns a new pointer. 14 * If a1 is NULL then this function behaves as malloc , else if a2 is zero then this function behaves as free. 15 * If the space cannot be reallocated then the contents are unchanged. However, the function will return NULL so 16 * you will not be able to access the memory using the original pointer. 17 * Returns: Pointer to space, or NULL if failed. 18 */ 19 public class ReAlloc extends Stub { 20 public void executeStub(Environment environment) { 21 final int[] R = environment.getCpu().R; 22 final MemoryMap memoryMap = environment.getMemoryMap(); 23 final DataBlock oldBlock = R[0] == 0? null : memoryMap.getDataBlock(R[0]); 24 if (oldBlock != null) { 25 if (R[1] != 0) { 26 memoryMap.resizeSystemDataBlock(oldBlock, R[1]); 27 R[0] = oldBlock.getAddress(); 28 } else { 29 memoryMap.removeSystemDataBlock(oldBlock); 30 R[0] = 0; 31 } 32 } else { 33 R[0] = memoryMap.createSystemDataBlock(R[1]).getAddress(); 34 } 35 } 36 }