sclass ManagedIntObjects_v1_Collector implements IManagedObjectCollector { ManagedIntObjects_v1 mem; new L objects; new Set pointers; new Map relocationMap; *(ManagedIntObjects_v1 *mem) {} // notify collector that there is an object in a location public void noteObject(int start, int size) { objects.add(intRange(start, start+size)); } // notify collector that there is a pointer in a location public void notePointer(int addr) { if (addr != 0) pointers.add(addr); } // notify collector that there is a pointer array in a location public void notePointerArray(int start) { if (start != 0) { int n = mem.get(start); for i to n: notePointer(start+1+i); } } int sizeNeeded() { ret totalIntRangesLength_int(objects); } void collectAndCompact() { int sizeNeeded = sizeNeeded(); if (mem.size() == sizeNeeded) ret; int freePtr = mem.reservedSpaceAtBeginning(); int[] newMem = new[freePtr+sizeNeeded]; for (IntRange r : objects) { putIfKeyNotEqualToValue(relocationMap, r.start, freePtr); arraycopy(mem.mem, r.start, newMem, freePtr, r.length()); freePtr += r.length(); } mem.mem = newMem; mem.freeList.clear(); } // call after collectAndCompact to get new location of objects int getNewLocation(int addr) { ret lookupOrKeep(relocationMap, addr); } }