sclass ManagedString extends AbstractManagedObject implements CharSequence { replace Addr with int. S value; // usable but doesn't handle null *(ManagedIntObjects_v1 mem, Addr *addr) { super(mem); value = mem.readString(addr); } // ...unless you call this bool isNull() { ret value == null; } // internal *(ManagedIntObjects_v1 mem, S *value, Addr *addr) { super(mem); } // for proper null handling static ManagedString load(ManagedIntObjects_v1 mem, Addr addr) { S value = mem.readString(addr); if (value == null) null; ret new ManagedString(mem, value, addr); } static ManagedString create(ManagedIntObjects_v1 mem, S value) { if (value == null) null; ret new ManagedString(mem, value, mem.newString(value)); } // GC handling public void scanForCollection(IManagedObjectCollector gc) { gc.noteString(addr, lambda1 setAddr); } @Override public char charAt(int index) { ret value.charAt(index); } @Override public int length() { ret l(value); } @Override public CharSequence subSequence(int start, int end) { ret value.substring(start, end); } @Override toString { ret value == null ? "" : value.toString(); } }