Hi Ravenex,

On Dec 7, 2009, at 8:36 AM, ravenex wrote:
 
Greetings. New to this list, and to MacRuby. I was just skimming over the source code from trunk, but wasn't able to find a document that describes the current design of Roxor. I only found requirements, build instructions, coding styles and the like.

I don't have any answers either, but let me try to collect the relevant information, if only to improve my own understanding.

 The thing I find very confusing is that in vm.cpp, RoxorCore::RoxorCore(), there's a call to ee->DisableLazyCompilation(). This disables LLVM JIT's lazy compilation. Is it the case that Roxor compiles every method called by the toplevel script? Or how is Roxor feeding stuff into the JIT?
 
Any pointers to documents, blog posts or mails would be truely appreciated.


As I understand it, the MacRuby compiler is known as Roxor and is defined in:

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/compiler.h

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/compiler.cpp

Roxor depends on some language facilities, e.g.:

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/llvm.h

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/objc.h

But mostly on the VM (which is essential for breaking the Global Interpreter Lock):

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/vm.h

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/vm.cpp

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/vm_eval.c

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/vm_method.c

It seems to me that in main.cpp, main() calls ruby_options(), where the whole source file gets parsed into MRI's Ruby AST. That AST is supposed to go into RoxorCompiler::compile_main_method(), and out comes LLVM IR. And then after optimizations passes, GETCORE()->compile() puts the JIT in action, turns LLVM IR into native code, and then invoke the IMP. I must have missed something...but if Roxor JIT compiles a method upon first invocation, where is this behavior implemented.

In terms of front-ends, there is both an AOT and JIT compiler.  It looks like both are called from:

http://svn.macosforge.org/repository/ruby/MacRuby/trunk/main.cpp

With the AOT compiler called via: rb_vm_aot_compile -> RoxorAOTCompiler::compile_main_function
and the JIT invoked from: ruby_run_node -> RoxorCompiler::compile_main_function

If I understand your question, it is what method explicitly does the compilation during JIT? That would seem to be: compile_node

* http://svn.macosforge.org/repository/ruby/MacRuby/trunk/compiler.cpp

Function *
RoxorCompiler::compile_main_function(NODE *node)
{
    current_instance_method = true;

    Value *val = compile_node(node);

If so, then the question becomes "Where is implemented, compile_node and does it cache pre-compiled methods"?

I don't know, but hopefully this gives you somewhere to look; or will inspire someone who knows more to provide a better answer....

-- Ernie P.