Yet another status update on the experimental branch work!

Highlights are:

- More Ruby & Cocoa compatibility work. All samples should now run on experimental on both 10.5 and 10.6. Rake and HotCocoa are now somewhat usable (but not at 100% yet).

- Floating-point arithmetic optimization (see below for more info).

Detailed changes:

- Fixed #method_missing to omit the trailing ':' in case the method only accepts one argument.

- Fixed a bug in the dispatcher, where #method_missing was sometimes called instead of raising a ArgumentError exception.

- Fixed misc bugs in the following methods: ObjectSpace#_id2ref, ObjectSpace#define_finalizer, ObjectSpace#each_object, Float.induced_from, IO#close_on_exec, IO#reopen, IO#readpartial, IO.copy_stream, IO#lineno, IO#lineno=, IO#print, IO#tty?, File.expand_path, File.join, Proc#binding

- Added support for overwriting an Objective-C method that accepts a C pointer.

- Added support in the dispatcher for objects using -[NSObject forwardInvocation:].

- Fixed a bug in the allocation of pure Ruby objects, that weren't marked as objects by the GC.

- Fixed lots of IO bugs. More importantly, IO finalizers are now called by the GC.

- Added a very basic implementation for #define_method.

- Fixed a silly bug in #class_eval or #module_eval when the VM wasn't properly handling the current class.

- Fixed a constant lookup bug in the way we mark metaclass outers.

- Fixed a critical memory crasher when trying to re-allocate out-of- scope block locals.

- Fixed the creation of Binding objects to that they include block locals.

- Fixed a bug when promoting ivars used inside an eval string for slot- based optimization.

- Added support for automatic Boxed/Array conversion to a C pointer.

- Added the following methods to the Boxed class: #to_a, #[], #[]=

- Fixed a bug in #undef_method which wasn't working on >0 arity selectors.

- Optimized the call to #default in Hash#[].

- Fixed a performance problem when preparing blocks: the same block LLVM function was sometimes optimized and JIT'ed more than once.

- Merged with RubySpec upstream twice. More importantly, FFI specs are now available.

- Merged stdlib from trunk.

- Added a macruby_select(1) tool, that allows you to run a given expression on a given MacRuby version.

- Optimized a few code paths in HotCocoa::Graphics to use Boxed types instead of Array objects.

- Added a live demo for HotCocoa::Graphics. You can run it by doing the following:

$ cd sample-macruby/HotCocoa/graphics
$ macruby demo.rb

Note that performance work is still under work.

- Implemented Symbol#to_proc.

- Fixed a bug when re-entrantly calling a block.

- Added an optimization regarding floating point types.

Firstly, floats are now immediate objects (like Fixnums) and not true objects anymore, which means we don't need to allocate extra memory in order to create a float. This is great for us because our memory allocator is slow, so we are able to do efficient floating point handling. The downside is that we lose 2 bits of precision, but some early tests revealed that this is a minor issue and we can still box edge cases as before.

Secondly, the compiler is now generating optimized code when dealing with floating point arithmetic expressions, exactly like we currently optimize Fixnum arithmetic.

This is a very important change for MacRuby, because floats are used thoroughly in Cocoa. As instance, in drawing methods, or when dealing with NSPoint/Size/Rect structures, etc.

A simple benchmark looping on a float.

$ time macruby_select 0.4 -e "i=0.0; while i<10000000; i+=1; end"

real    0m8.239s
user    0m12.182s
sys     0m0.537s

$ time macruby_select 0.5 -e "i=0.0; while i<10000000; i+=1; end"

real    0m0.340s
user    0m0.264s
sys     0m0.072s

A second one, using an NSPoint structure.

$ time macruby_select 0.4 -e 'framework "Foundation"; p=NSPoint.new(1,2); i=0; while i<5000000; p.x=i; i+=1; end'

real    0m9.636s
user    0m13.762s
sys     0m0.612s

$ time macruby_select 0.5 -e 'framework "Foundation"; p=NSPoint.new(1,2); i=0; while i<5000000; p.x=i; i+=1; end'

real    0m0.897s
user    0m0.820s
sys     0m0.081s

Also, I profited of this change to optimize a little bit more Fixnum arithmetic. Here are numbers for the old miniruby vs the new one regarding fib(40).

$ time ./miniruby_old fib.rb 40
102334155

real    0m3.978s
user    0m3.840s
sys     0m0.064s

$ time ./miniruby fib.rb 40
102334155

real    0m3.282s
user    0m3.179s
sys     0m0.057s

Our next goal is to be able to fully run Rake and HotCocoa, to ultimately start planning the merge of the experimental branch into trunk.

Laurent
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to