euler:rubinius brian$ cat script.rb


			
def uhh(x); p x; x; end
uhh(1) + uhh(2) + uhh(3)

euler:rubinius brian$ shotgun/rubinius describe script.rb


			
Sexp:
[:block,
 [:newline,
  1,
  "script.rb",
  [:defn,
   :uhh,
   [:scope,
    [:block,
     [:args, [:x], [], nil, nil],
     [:newline, 1, "script.rb", [:fcall, :p, [:array, [:lvar, :x, 0]]]],
     [:newline, 1, "script.rb", [:lvar, :x, 0]]],
    [:x]]]],
 [:newline,
  2,
  "script.rb",
  [:call,
   [:call,
    [:fcall, :uhh, [:array, [:lit, 1]]],
    :+,
    [:array, [:fcall, :uhh, [:array, [:lit, 2]]]]],
   :+,
   [:array, [:fcall, :uhh, [:array, [:lit, 3]]]]]]]

Bytecode:
0000:  push_literal               #
0002:  push_literal               :uhh
0004:  push_self                  
0005:  send_stack                 #, 2
0008:  pop                        
0009:  push_int                   3
0011:  push_self                  
0012:  set_call_flags             1
0014:  send_stack                 #, 1
0017:  meta_push_2                
0018:  push_self                  
0019:  set_call_flags             1
0021:  send_stack                 #, 1
0024:  meta_push_1                
0025:  push_self                  
0026:  set_call_flags             1
0028:  send_stack                 #, 1
0031:  meta_send_op_plus          
0032:  meta_send_op_plus          
0033:  pop                        
0034:  push_true                  
0035:  sret                       
= uhh (0x131) ======================
0000:  check_argcount             1, 1
0003:  set_local_from_fp          :x, 0
0006:  push_local                 :x
0008:  push_self                  
0009:  set_call_flags             1
0011:  send_stack                 #, 1
0014:  pop                        
0015:  push_local                 :x
0017:  sret                       
euler:rubinius brian$