Charles Oliver Nutter
2014-01-31 11:56:48 UTC
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
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