JRuby success!
Charles Oliver Nutter
charles.nutter at sun.com
Wed May 27 13:08:42 PDT 2009
I have managed to get all the normal JRuby call paths wired up and was
able to start up jirb (REPL) in force-compiled mode. This means that all
normal calls are going through indy and working well enough to boot a
fairly complicated app!
The changes have been pushed to the invokedynamic jruby branch on Kenai.
At the moment there's a lot that can be improved, especially since
there's a lot of extra logic in the target and fallback methods that
would ideally be stitched together primitive method handles rather than
having this generic shim right in the middle of the call path. But it
should be at least as fast as the original call site logic and there's
obviously a lot of room for improvement now.
The bulk of the code can be seen here:
http://kenai.com/projects/jruby/sources/main/content/src/org/jruby/runtime/invokedynamic/InvokeDynamicSupport.java?rev=invokedynamic
The major additions are the try/catch/finally logic for non-local flow
control and method_missing logic.
I think method_missing logic could be wired up as a second
guard_with_test that checks visibility. So the fallback path would
essentially stitch together logic to query for the method, check whether
it's a method_missing scenario, and then call and cache either the
method itself or method_missing.
The exception-handling logic I'm not sure about. This seems to be a
possible gap in primitive method handles: an exception-handling method
handle that can wrap another handle with additional logic. I'm not sure
exactly how it would manifest itself in the API.
Anyway, things are looking pretty good. I will probably play with this a
bit more to see if I can do a better decomposition of the call paths,
but it should be usable right now.
- Charlie
More information about the mlvm-dev
mailing list