Tuesday, August 07, 2007

xruby 0.3.0 released

I am pleased to announce that XRuby 0.3.0 is released:
http://code.google.com/p/xruby/downloads/list

We have fixed lots of bugs and made significant improvement in the code.

Changes from 0.2.1 to 0.3.0:
1. Use annotation and code generation to bind Java level method to Ruby level method (I will talk more about this later).

2. More unit tests passed. We have not eliminated all test failures in test/ruby. But as most of the failures are caused by the implementation of builtin libraries, we will be able to fixed them soon in 0.4.0.

Changes from 0.2.0 to 0.2.1:
1) Dreamhead optimized method/block calls for methods with zero/one
arguments. It makes our performance even better.

2) ZhangYu improved Java integration significantly, he also created a wiki page with lots of good examples:
http://code.google.com/p/xruby/wiki/JavaIntegration

3) Mechiland and I made more ruby unit tests pass.

The most significant change of 0.3.0 is the using of annotation and code generation to bind Java level method to ruby level method. The idea was inspired by the discussions about Java 5 on jruby's maillist, and dreamhead turned it into reality quickly.

As we know, a Ruby method does a little bit more than a Java method. So if we have a method like this in Java:
public class RubyString {
public RubyFloat to_f() {
...
}
}
To turn it (RubyString.to_f) into a Ruby level method, we have to add a few more code to 'wrap' into a class (extends RubyMethod) and 'register' it (defineMethod), e.g:
public class String_to_f extends RubyNoArgMethod {
protected RubyValue run(RubyValue receiver, RubyBlock block) {
return ((RubyString)receiver).to_f();
}
}
...
RubyRuntime.StringClass.defineMethod("to_f", new String_to_f());
For every method, we need to write similar code and it is not fun to repeat yourself. In 0.3.0, we no longer have to do this anymore. As as long as you add annotation like this:
@RubyLevelClass(name="String")
public class RubyString {
@RubyLevelMethod(name="to_f")
public RubyFloat to_f() {
...
}
}
XRuby will turn it into a Ruby level method automatically (using ASM to generate Java bytecode).

I have not used Java 5's annotation feature before, but this looks like an very elegant solution.

Thank everyone who has contributed to this release.

Labels:

0 Comments:

Post a Comment

<< Home