Ok, so I got frame push/pop working and wanted to move on to binding. I was under the impression that push/pop binding was basically for pushing/popping a DynamicScope, but it seems like it's more than that.
For the following code: def foo; a = 1; eval 'p a'; end We get these linearized instructions: Linearized instructions for JIT: 0 push_frame 1 push_binding(INSTANCE_METHOD foo[-e:0]) 2 check_arity(0, 0, -1) 3 %t_%block_1 = recv_closure 4 thread_poll 5 line_num(0) 6 %t_a_2 = Fixnum:1 7 store_lvar(%t_a_2, foo, a(0:1)) 8 store_lvar(%t_%block_1, foo, %block(0:0)) 9 %v_0 = call_1o(FUNCTIONAL, 'eval', %self, ["p a"]){1O} 10 pop_binding 11 pop_frame 12 return(%v_0) 13 %v_3 = recv_jruby_exc 14 pop_binding 15 pop_frame 16 throw(%v_3) Note that there's a store_lvar for the temporary "a" variable into the heap "a" variable, but there's also a store for the temporary "%block" variable. If I represent binding as DynamicScope, this isn't supportable; the scope entries only support IRubyObject. In the current runtime, the binding's block lives on the frame, not on the scope. I think this is a problem with the explicit heap load/store instructions. The block will already have been saved to the frame in pushFrame, and eval will great a binding on demand using frame + scope. So if push/pop binding just manipulate scope and block is not part of the explicit stores, I think this will work. Looking into it now, but I welcome comments. - Charlie --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email