sclass ManagedStringList extends AbstractRandomAccessList implements IManagedObject { replace Addr with int. !include #1031662 // IManagedObject mix-in new L list; int physicalLength; class Entry { int ptr; S value; bool changed; *(int *ptr) {} //*(int *ptr, S *value) {} // ? *(S *value) { dirty = true; } S value() { if (value == null && ptr != 0) value = mem.readString(valueAddr(index)); ret value; } } int size() { ret l(list); } int arrayStart() { ret addr+2; } int elementAddr(int i) { ret arrayStart()+i; } // read from memory *(ManagedIntObjects_v1 *mem, Addr *addr) { physicalLength = mem.get(addr); size = mem.get(addr+1); list = emptyList(size); for i to size: list.add(new Entry(mem.get(elementAddr(i)))); } *(ManagedIntObjects_v1 *mem, LS initialData) { addAll(list, initialData); flush(); } void flush { ensureCapacityInternal(size()); mem.set(addr+1, size()); int i = 0; for (S key, Entry entry : map) { int keyPtr = mem.get(keyAddr(i)); if (!eq(mem.readString(keyPtr), key)) { mem.freeString(keyAddr(i)); // strings belong to map mem.set(keyAddr(i), mem.newString(key)); } int valuePtr = mem.get(valueAddr(i)); if (entry.index != i || entry.value != null && !eq(entry.value if (!eq(mem.readString(valuePtr), entry.value())) { mem.freeString(valueAddr(i)); // strings belong to map mem.set(valueAddr(i), mem.newString(key)); } map.put(key, new Entry(i++, value)); } } void ensureCapacityInternal(int minCapacity) { if (physicalLength < minCapacity) grow(minCapacity); } private void grow(int minCapacity) { int oldCapacity = physicalLength; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; long oldAddr = addr, oldSize = objectSize(); physicalLength = newCapacity; setAddr(mem.realloc(addr, objectSize())); mem.set(addr, physicalLength); } // GC handling public void scanForCollection(IManagedObjectCollector gc) { gc.noteObject(addr, objectSize()); int n = size(); for i to n: gc.noteString(mem.get(elementAddr(i))); } int objectSize() { ret 2+physicalLength; } }