// Idea: Every class loader makes only a single class so they can be // garbage collected more easily. srecord noeq LASMultiClassLoader(ClassLoader parent) is ILASClassLoader, AutoCloseable { settable bool rememberClassBytes; new WeakValueMap definedClasses; Lock lock = lock(); event definedClass(Class c); *(Class parent) { this(parent.getClassLoader()); } { definedClasses.onValueForKeyReleased(key -> printWithMS(":: CLASS UNLOADED :: " + key)); } selfType runnablesReferenceQueue(RunnablesReferenceQueue queue) { definedClasses.queue(queue); this; } int nClassesLoaded() { ret l(definedClasses); } Cl definedClasses() { ret values(definedClasses.snapshot()); } public Class defineLASClass(S name, IF0 generateClass) { lock lock; try object definedClasses.get(name); var cl = new InMemoryClassLoader(parent); print("Generating class " + name); Class c = cl.defineAClass(name, generateClass!); definedClasses.put(name, c); definedClass(c); ret c; } close { dispose definedClasses; } }