On Sun, Jun 13, 2010 at 11:19 PM, Charles Oliver Nutter <head...@headius.com> wrote: > On Sun, Jun 13, 2010 at 2:54 AM, Wayne Meissner <wmeiss...@gmail.com> wrote: >> Could the weak ref wiring be done lazily, so the overhead is only >> incurred when someone sets an ivar on a java object? >> >> e.g. when a java object enters jruby, it gets a new lightweight >> wrapper, but when someone does an ivar get/set on it, it looks for the >> ivar holder for the java object in the weak map, and attaches it to >> the wrapper (or creates one and adds it to the weak map if it is >> missing). >> >> This way, java objects that are just passing through, don't take the >> hit of wiring up a Reference, but when it is needed, it automagically >> works (with perhaps a bit more overhead than at present). > > I've tried to think of a way to do this, but we'd need to be able to > trigger all in-flight references to a given object to start using the > ivars from the wrapper where we just added ivars.
Actually, I may have just thought of a way to do this. * Upon access or modification of an instance variable, a wrapper adds itself to our tracking map * Wrappers that have not yet been tracked will know they are not being tracked, and when an instance variable access happens they'll first go look in the tracking map for the "master" wrapper * Objects that don't ever access instance variables will never lift themselves into the tracking map and never incur the weakref costs I think this could work! A similar technique might be able to work for singletonized Java objects, although it has a higher potential of "poisoning" all instances of a given type: * All Java proxy types would have a bit indicating whether an instance of them had ever been singletonized * When the first object of a given Java type gets singletonized, we flip this bit and add that singletonized wrapper to the tracking map. >From then on, non-tracked wrappers for the same object will go to the "master" wrapper for their metaclass behavior, and future references will use the same wrapper. * The poisoning effect: future wrappers for the same type will either need to constantly ping the tracking map or else all instance of that type will have to go into the weak map once again. Note that in order to completely eliminate the wrappers (or completely eliminate the use of the tracking map, for now), both features need to be addressed. Any better suggestions for handling singletons (other than turning them off, which has my vote!) - Charlie --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email