<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>jikken/cuckoo.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -63,23 +63,25 @@ module LLVMUtil
     b.load(lenptr)
   end
 
-  def gen_call_var_args_and_self(fname, rtype, slf)
+  def gen_call_var_args_and_self(para, fname, rtype, slf)
     ftype = Type.function(VALUE, [Type::Int32Ty, P_VALUE, VALUE])
-    gen_call_var_args_common(fname, rtype, ftype) {|b, context, func, nele, argarea|
+    gen_call_var_args_common(para, fname, rtype, ftype) {
+      |b, context, func, nele, argarea|
       b.call(func, nele.llvm, argarea, slf)
     }
   end
 
-  def gen_call_var_args(fname, rtype)
+  def gen_call_var_args(para, fname, rtype)
     ftype = Type.function(VALUE, [Type::Int32Ty, P_VALUE])
-    gen_call_var_args_common(fname, rtype, ftype) {|b, context, func, nele, argarea|
+    gen_call_var_args_common(para, fname, rtype, ftype) {
+      |b, context, func, nele, argarea|
       b.call(func, nele.llvm, argarea)
     }
   end
 
-  def gen_call_var_args_common(fname, rtype, ftype)
-    args = @para[:args].reverse
-    nele = @para[:args].size
+  def gen_call_var_args_common(para, fname, rtype, ftype)
+    args = para[:args].reverse
+    nele = para[:args].size
     if @array_alloca_size == nil or @array_alloca_size &lt; nele then
       @array_alloca_size = nele
     end
@@ -113,9 +115,27 @@ module SendUtil
   def gen_method_select(recklass, mname)
     minfo = MethodDefinition::RubyMethod[mname][recklass]
     if minfo then
+      # recklass == nil -&gt;  functional method
       return [minfo, lambda { minfo[:func]}]
     end
 
+    # recklass == nil -&gt;  need dynamic dispatch
+    # inheritance search
+    if recklass then
+      sup = Object.const_get(recklass, true)
+      while sup do
+        minfo = MethodDefinition::RubyMethod[mname][sup.name]
+        if minfo then
+          return [minfo, lambda { minfo[:func]}]
+        end
+        if sup.is_a?(Class) then
+          sup = sup.superclass
+        else
+          break
+        end
+      end
+    end
+
     candidatenum = MethodDefinition::RubyMethod[mname].size
     if candidatenum == 0 then
       return [nil, lambda {nil}]</diff>
      <filename>lib/llvmutil.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,8 +17,8 @@ module MethodDefinition
   InlineMethod =  {
     :require =&gt; {
       :inline_proc =&gt;
-        lambda {
-          fn = @para[:args][0][0].name
+        lambda {|para|
+          fn = para[:args][0][0].name
           unless File.exist?(fn)
             nfn = fn + &quot;.rb&quot;
             if File.exist?(nfn) then
@@ -36,10 +36,10 @@ module MethodDefinition
           
     :[]= =&gt; {
       :inline_proc =&gt; 
-        lambda {
-          val = @para[:args][0]
-          idx = @para[:args][1]
-          arr = @para[:receiver]
+        lambda {|para|
+          val = para[:args][0]
+          idx = para[:args][1]
+          arr = para[:receiver]
           RubyType.resolve
           if arr[0].type then
             val[0].add_same_value(arr[0].type.element_type)
@@ -84,9 +84,9 @@ module MethodDefinition
 
     :to_f =&gt; {
       :inline_proc =&gt; 
-        lambda {
-          recv = @para[:receiver]
-          rettype = RubyType.float(@para[:info][3], 'Return type of to_f')
+        lambda {|para|
+          recv = para[:receiver]
+          rettype = RubyType.float(para[:info][3], 'Return type of to_f')
           @expstack.push [rettype,
             lambda {|b, context|
               context = recv[1].call(b, context)
@@ -103,8 +103,8 @@ module MethodDefinition
 
     :-@ =&gt; {
       :inline_proc =&gt; 
-        lambda {
-          recv = @para[:receiver]
+        lambda {|para|
+          recv = para[:receiver]
           @expstack.push [recv[0],
             lambda {|b, context|
               context = recv[1].call(b, context)
@@ -123,8 +123,8 @@ module MethodDefinition
 
     :p =&gt; {
       :inline_proc =&gt;
-        lambda {
-          pterm = @para[:args][0]
+        lambda {|para|
+          pterm = para[:args][0]
           @expstack.push [pterm[0], 
             lambda {|b, context|
               context = pterm[1].call(b, context)
@@ -138,29 +138,30 @@ module MethodDefinition
 
     :print =&gt; {
       :inline_proc =&gt;
-        lambda {
-          info = @para[:info]
+        lambda {|para|
+          info = para[:info]
           rtype = RubyType.value(info[3], &quot;Return type of print&quot;)
           fname = 'rb_io_print'
-          gen_call_var_args_and_self('rb_io_print', rtype, STDOUT.immediate)
+          gen_call_var_args_and_self(para, 'rb_io_print', rtype,
+                                     STDOUT.immediate)
         }
      },
 
     :sprintf =&gt; {
       :inline_proc =&gt;
-        lambda {
-          info = @para[:info]
+        lambda {|para|
+          info = para[:info]
           rtype = RubyType.value(info[3], &quot;Return type of sprint&quot;)
           fname = 'rb_f_sprintf'
-          gen_call_var_args('rb_f_sprintf', rtype)
+          gen_call_var_args(para, 'rb_f_sprintf', rtype)
         }
      },
 
     :size =&gt; {
       :inline_proc =&gt; 
-        lambda {
-          rec = @para[:receiver]
-          info = @para[:info]
+        lambda {|para|
+          rec = para[:receiver]
+          info = para[:info]
           rettype = RubyType.fixnum(info[3], &quot;Return type of size&quot;)
           @expstack.push [rettype, 
              lambda {|b, context|
@@ -180,11 +181,11 @@ module MethodDefinition
                   
     :each =&gt; {
       :inline_proc =&gt;
-        lambda {
-          ins = @para[:ins]
-          info = @para[:info]
-          rec = @para[:receiver]
-          local = @para[:local]
+        lambda {|para|
+          ins = para[:ins]
+          info = para[:info]
+          rec = para[:receiver]
+          local = para[:local]
           recval = nil
 
           loop_cnt_current = @loop_cnt_current
@@ -328,9 +329,9 @@ module MethodDefinition
 
     :new =&gt; {
        :inline_proc =&gt;
-         lambda {
-           rec = @para[:receiver]
-           args = @para[:args]
+         lambda {|para|
+           rec = para[:receiver]
+           args = para[:args]
            nargs = args.size
            if nargs != 0 then
              if @array_alloca_size == nil or @array_alloca_size &lt; nargs then
@@ -343,7 +344,7 @@ module MethodDefinition
            if @array_alloca_size == nil then
              @array_alloca_size = 1
            end
-           rettype = RubyType.from_sym(rec[0].klass, @para[:info][3], nil)
+           rettype = RubyType.from_sym(rec[0].klass, para[:info][3], nil)
            @expstack.push [rettype, 
              lambda {|b, context|
                cargs = []
@@ -368,8 +369,8 @@ module MethodDefinition
 
     :get_interval_cycle =&gt; {
       :inline_proc =&gt;
-        lambda {
-          info = @para[:info]
+        lambda {|para|
+          info = para[:info]
           rettype = RubyType.fixnum(info[3], &quot;Return type of gen_interval_cycle&quot;)
           glno = add_global_variable(&quot;interval_cycle&quot;, 
                                      Type::Int64Ty, </diff>
      <filename>lib/methoddef.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1186,12 +1186,12 @@ class YarvTranslator&lt;YarvVisitor
     end
 
     if funcinfo = MethodDefinition::InlineMethod[mname] then
-      @para = {:info =&gt; info, 
+      para = {:info =&gt; info, 
                :ins =&gt; ins,
                :args =&gt; args, 
                :receiver =&gt; receiver, 
                :local =&gt; local}
-      instance_eval &amp;funcinfo[:inline_proc]
+      instance_exec(para, &amp;funcinfo[:inline_proc])
       return
     end
 </diff>
      <filename>lib/vmtraverse.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a5b46e5a504fd7fcee6a4b174de930b7190fd00b</id>
    </parent>
  </parents>
  <author>
    <name>U-KOZUE\kozue</name>
    <email>m-72@tf6.so-net.ne.jp</email>
  </author>
  <url>http://github.com/miura1729/yarv2llvm/commit/c0f95b7afc3ab16f97cacb431daa339d6ded1e37</url>
  <id>c0f95b7afc3ab16f97cacb431daa339d6ded1e37</id>
  <committed-date>2009-01-01T14:28:10-08:00</committed-date>
  <authored-date>2009-01-01T14:28:10-08:00</authored-date>
  <message>experiment for method dispatch and change instance_exec instead of instance_eval</message>
  <tree>0dd4304d09fc1b86cf42084e7af59d9e8dd94a1a</tree>
  <committer>
    <name>U-KOZUE\kozue</name>
    <email>m-72@tf6.so-net.ne.jp</email>
  </committer>
</commit>
