Hello everyone,

First, a bit of background. Then I'll explain what hack I implemented
on MRI ... and ask you how it could be done on Rubinius.

I'm the developper of a Ruby-based supervision framework for robotics.
In there, I implemented some transaction environment that allows to
sandbox changes made on some objects, and then apply them all at the
same time.

The issue I had was that the "transaction proxy", the object that
records the changes, can be captured into closures. And, therefore,
needs to be a perfect delegate of the real object once the transaction
is committed. One solution would have been to modify the object's
metaclass in order to make it a delegate, but that was *really* bad
performance wise.

I therefore implemented a (horrible) C extension hack: I actually swap
the RObject descriptor of the transaction proxy with the one of a
fresh delegate object. It results with having all variables that were
pointing to the proxy to now point to the delegate, and to have the
actual transaction proxy be GCed later on.

Ugly, not robust and very MRI-specific.

Now, I'm really interested in evaluating how good Rubinius is, since
I'm confident it will become a much better implementation of Ruby than
MRI itself.

I would therefore like to solve the problem of *efficiently* turning
an object into a delegate, possibly writing some C++ code to achieve
that. Could you point me to *how* ?

Looking at the basic classes, I already saw that it was possible to
copy metaclasses. Would it be possible to replace the proxie's
metaclass by a prepared delegate implementation ? Or maybe replace the
actual object's class on the fly ?

Any input would be appreciated.

Sylvain

-- 
--- !ruby/object:MailingList
name: rubinius-dev
view: http://groups.google.com/group/rubinius-dev?hl=en
post: [email protected]
unsubscribe: [email protected]

Reply via email to