Forum: Ruby-dev Fwd: shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo):

Posted by SASADA Koichi (Guest)
on 2012-11-11 03:58
Attachment: ________ (0 Bytes)
(Received via mailing list)
refinement $B$rF3F~$9$k$H$-$N@-G=$KBP$9$k(B excuse $B$,!V(Bmethod cache 
$B$KKX$I$"(B
$B$?$k$+$i!$!J(Brefinement 
$B$K4X78L5$$ItJ,$N!K@-G=Dc2<$O$J$$!W$H$$$&OC$@$C$?(B
$B$H;W$&$N$G$9$,!$:#2s$N%3!<%I$r8+$k$H!$$=$l$J$j$K%a%=%C%IC5:w%3%9%H$,A}$((B
$B$=$&$J5$$,$9$k$s$G$9$,!$$$$+$,$G$7$g$&$+!%(B

$B:rF|AjCL$5$;$FD:$$$?$H$*$j!$<BAu$H$7$F$O(B refinement $B$O(B
 - $B%a%=%C%IC5:w$+$i(B refinement $B4X78$N=hM}$r:o=|(B
 - $BC5:w$7$?%a%=%C%I$,(B refine $B$5$l$?%a%=%C%I$@$C$?$i!$(B
   $B$=$N;~E@$GE,@Z$J%a%=%C%I$r8F$S=P$9(B
$B$N$,NI$$$H;W$$$^$9!%(B

$B$A$g$C$H!$8=>u$N%3!<%I$O<u$1F~$l$i$l$^$;$s!%(B


-------- Original Message --------
Subject: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h
(rb_call_info_t::refinements), compile.c (new_callinfo):
Date: Sun, 11 Nov 2012 11:42:16 +0900 (JST)
From: shugo <ko1@atdot.net>
Reply-To: ruby-changes@quickml.atdot.net
To: ruby-changes@quickml.atdot.net

shugo  2012-11-11 11:42:04 +0900 (Sun, 11 Nov 2012)

  New Revision: 37616

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=r...

  Log:
    * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo):
      add a new field for inline method cache.

    * vm_insnhelper.c (vm_search_method): check 
rb_call_info_t::refinements
      not to confuse inline method cache when module_eval is used with
      refinements.

    * test/ruby/test_refinement.rb: related test.

  Modified files:
    trunk/ChangeLog
    trunk/compile.c
    trunk/test/ruby/test_refinement.rb
    trunk/vm_core.h
    trunk/vm_insnhelper.c

Index: ChangeLog
===================================================================
--- ChangeLog  (revision 37615)
+++ ChangeLog  (revision 37616)
@@ -1,3 +1,14 @@
+Sun Nov 11 11:36:19 2012  Shugo Maeda  <shugo@ruby-lang.org>
+
+  * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo):
+    add a new field for inline method cache.
+
+  * vm_insnhelper.c (vm_search_method): check 
rb_call_info_t::refinements
+    not to confuse inline method cache when module_eval is used with
+    refinements.
+
+  * test/ruby/test_refinement.rb: related test.
+
 Sun Nov 11 08:45:45 2012  Martin Duerst  <duerst@it.aoyama.ac.jp>

   * ruby.c: removed a comma before "before"
Index: vm_core.h
===================================================================
--- vm_core.h  (revision 37615)
+++ vm_core.h  (revision 37616)
@@ -153,6 +153,7 @@
     /* inline cache: keys */
     VALUE vmstat;
     VALUE klass;
+    VALUE refinements;

     /* inline cache: values */
     const rb_method_entry_t *me;
Index: compile.c
===================================================================
--- compile.c  (revision 37615)
+++ compile.c  (revision 37616)
@@ -954,6 +954,7 @@
   }
     }
     ci->vmstat = 0;
+    ci->refinements = Qundef;
     ci->blockptr = 0;
     ci->recv = Qundef;
     ci->call = 0; /* TODO: should set default function? */
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c  (revision 37615)
+++ vm_insnhelper.c  (revision 37616)
@@ -843,19 +843,30 @@
 vm_search_method(rb_call_info_t *ci, VALUE recv)
 {
     VALUE klass = CLASS_OF(recv);
+    NODE *cref = rb_vm_cref();
+    VALUE refinements = Qnil;

+    if (cref && !NIL_P(cref->nd_refinements)) {
+  refinements = cref->nd_refinements;
+    }
+
 #if OPT_INLINE_METHOD_CACHE
-    if (LIKELY(GET_VM_STATE_VERSION() == ci->vmstat && klass ==
ci->klass)) {
+    if (LIKELY(GET_VM_STATE_VERSION() == ci->vmstat && klass ==
ci->klass &&
+         refinements == ci->refinements)) {
   /* cache hit! */
     }
     else {
-  ci->me = rb_method_entry(klass, ci->mid, &ci->defined_class);
+  ci->me = rb_method_entry_get_with_refinements(refinements, klass,
+                  ci->mid,
+                  &ci->defined_class);
   ci->klass = klass;
+  ci->refinements = refinements;
   ci->vmstat = GET_VM_STATE_VERSION();
   ci->call = vm_call_general;
     }
 #else
-    ci->me = rb_method_entry(klass, ci->mid, &ci->defined_class);
+    ci->me = rb_method_entry_get_with_refinements(refinements, klass,
ci->mid,
+              &ci->defined_class);
     ci->call = vm_call_general;
     ci->klass = klass;
 #endif
Index: test/ruby/test_refinement.rb
===================================================================
--- test/ruby/test_refinement.rb  (revision 37615)
+++ test/ruby/test_refinement.rb  (revision 37616)
@@ -685,4 +685,28 @@
     assert_equal("#<refinement:#{c.inspect}@#{m.inspect}>",
                  m.refinements[c].inspect)
   end
+
+  module InlineMethodCache
+    class C
+      def foo
+        "original"
+      end
+    end
+
+    module M
+      refine C do
+        def foo
+          "refined"
+        end
+      end
+    end
+  end
+
+  def test_inline_method_cache
+    c = InlineMethodCache::C.new
+    f = Proc.new { c.foo }
+    assert_equal("original", f.call)
+    assert_equal("refined", InlineMethodCache::M.module_eval(&f))
+    assert_equal("original", f.call)
+  end
 end
Posted by Shugo Maeda (Guest)
on 2012-11-11 07:01
(Received via mailing list)
$BA0ED$G$9!#(B

2012/11/11 SASADA Koichi <ko1@atdot.net>:
> refinement $B$rF3F~$9$k$H$-$N@-G=$KBP$9$k(B excuse $B$,!V(Bmethod cache 
$B$KKX$I$"(B
> $B$?$k$+$i!$!J(Brefinement $B$K4X78L5$$ItJ,$N!K@-G=Dc2<$O$J$$!W$H$$$&OC$@$C$?(B
> $B$H;W$&$N$G$9$,!$:#2s$N%3!<%I$r8+$k$H!$$=$l$J$j$K%a%=%C%IC5:w%3%9%H$,A}$((B
> $B$=$&$J5$$,$9$k$s$G$9$,!$$$$+$,$G$7$g$&$+!%(B
>
> $B:rF|AjCL$5$;$FD:$$$?$H$*$j!$<BAu$H$7$F$O(B refinement $B$O(B
>  - $B%a%=%C%IC5:w$+$i(B refinement $B4X78$N=hM}$r:o=|(B
>  - $BC5:w$7$?%a%=%C%I$,(B refine $B$5$l$?%a%=%C%I$@$C$?$i!$(B
>    $B$=$N;~E@$GE,@Z$J%a%=%C%I$r8F$S=P$9(B
> $B$N$,NI$$$H;W$$$^$9!%(B

$B>e5-$NJQ99$NA0$K!"$H$j$"$($:%F%9%H$NDI2C$H!"$=$l$,DL$k$h$&$J=$@5$r$7$F$$$^$9!#(B
$B$?$@!">e5-$NJQ99$C$F;d$,<BAu$9$k$H$$$&OC$J$s$G$7$?$C$1(B?

$B$@$H$9$k$H!"$b$&$A$g$C$H:Y$+$$$H$3$m$r3NG'$7$?$$$G$9!#(B

$B4pK\E*$J%"%$%G%"$O!"(Brefine$BBP>]$N%/%i%9(B(refine$B$N0z?t(B)$B$N%a%=%C%I$K(Brefine$B$5$l$?$3$H(B
$B$rI=$90u$rIU$1$F$*$$$F!"DL>o$N%a%=%C%IC5:w$G$=$N%a%=%C%I$,8+$D$+$C$?;~$K$O$8$a$F(B
refinements$B@lMQ$N%Q%9$GC5:w$9$k$H$$$&$3$H$G$9$h$M!#(B

$B0J2<$N$h$&$J5?Ld$,$"$j$^$9!#(B

* refine$B$5$l$?$3$H$rI=$9(Bmethod entry$B$N9=B$$r$I$&$9$k$+(B
  rb_method_type_t$B$K(BVM_METHOD_TYPE_REFINED$B$_$?$$$J$N$rDI2C$9$k$s$G$7$?$C$1!#(B
  $B$b$H$N(Bmethod 
entry$B$O(Brb_method_entry_t::def->body$B$H$+$+$i;2>H$9$k$s$G$9$+$M!#(B
* refine$B$7$?;~$K(Brefine$BBP>]%/%i%9$K%a%=%C%I$,$J$$;~$O$I$&$9$k$+(B
  $B%a%=%C%I$,$J$$;~$b>o$K(Brefine$B$5$l$?$3$H$r<($9(Bmethod 
entry$B$rDI2C$9$k(B?
* 
refine$B$5$l$?%a%=%C%I$N8F=P;~$K(Brb_call_info_t$B$K$I$&$$$&>pJs$r3JG<$9$k$+(B
  Twitter$B$G$O!"(Brefine$B$5$l$?$3$H$r<($9(Bmethod 
entry$B$rF~$l$F$*$/$H$$$&$3$H$G$7$?$,!"(B
  $B:#$N(Bvm_call_method$B$N9=B$$@$H(Brb_call_info_t$B$NCf?H$r=q$-49$($F(Bgoto$B$9$k$h$&$J(B
  $B7A$K$J$C$F$$$k$N$G!"$I$&$$$&JQ99$r0U?^$5$l$F$$$k$N$+$h$/$o$+$j$^$;$s$G$7$?!#(B
Posted by SASADA Koichi (Guest)
on 2012-11-12 06:59
(Received via mailing list)
$B!!$5$5$@$G$9!%(B

(2012/11/11 15:01), Shugo Maeda wrote:
>> $B$N$,NI$$$H;W$$$^$9!%(B
>
> 
$B>e5-$NJQ99$NA0$K!"$H$j$"$($:%F%9%H$NDI2C$H!"$=$l$,DL$k$h$&$J=$@5$r$7$F$$$^$9!#(B
> $B$?$@!">e5-$NJQ99$C$F;d$,<BAu$9$k$H$$$&OC$J$s$G$7$?$C$1(B?


$B!!$3$N7o!$;d$,<BAu$7$F$b(B shugo 
$B$5$s$,$5$l$F$bNI$$$+$H;W$$$^$9!%$?$@!$OC(B
$B$N=gHV$,$*$+$7$$!$$H$$$&5$$,$7$F$$$^$9!%(Brefinement $B$NF3F~$O!$(B
$B!J(Brefinement 
$B$N4X78$NL5$$ItJ,$G$N!K%3%9%H$,==J,$KDc$$!$$H$$$&A0Ds$,$"$C(B
$B$?$H;W$$$^$9!%$7$+$7!$:#2s$N7o$O!$$3$NA0Ds$r$R$C$/$jJV$7$F$$$k!$$b$7$/$O(B
$B$R$C$/$jJV$92DG=@-$,$"$j$^$9!%(B

$B!!$3$N>l9g!$<9$j$&$k<jCJ$O!$(B

(1) $B%Q%U%)!<%^%s%9$,CY$/$J$C$F$bNI$$$+!$?tCM$r$b$H$K9g0U$rF@$k(B
(2) module_eval $B$N5!G=$r@-G=$rM}M3$K(B reject $B$9$k(B
(3) $BB.EY$NLdBj$,$J$$<BAu$rMQ0U$9$k(B

$B$N(B 3 
$B$D$G$O$J$$$+$H;W$$$^$9!%$=$l$i$r$;$:$K!$:#2s$N$h$&$K!V$H$j$"$($:;E(B
$BMM$K9gCW$5$;$k$?$a$K=$@5$rFM$C9~$s$@!W$H$$$&$N$OH?BP$7$?$$$G$9!%(B


$B!!$H$j$"$($:!$<B:]$K!$<j85$GB,$C$F$_$^$7$?!%(B

(a) ruby 2.0.0dev (2012-11-10 trunk 37604) [x86_64-linux] 11/10 $B$NHG(B
(b) ruby 2.0.0dev (2012-11-11 trunk 37624) [x86_64-linux] $B:#D+$N(B 
trunk

                         (a)     (b)   # $BC10L$OIC(B
loop_whileloop          1.029   1.024
vm1_yield*              1.414   1.780
vm2_defined_method      6.252   6.788
vm2_method              2.585   3.251
vm2_method_missing      4.558   5.066
vm2_method_with_block   2.576   3.326
vm2_poly_method         4.989   4.645
vm2_poly_method_ov      0.715   0.768
vm3_clearmethodcache    1.062   1.097
app_mandelbrot          2.625   2.738
app_tak                 1.958   2.016
app_tarai               1.336   1.441
so_mandelbrot           5.924   5.712

$B!!!!!!!!!!!!!!(B       $B!!(B(b)/(a) # $BBg$-$$$H(B (2) $B$,B.$$(B
loop_whileloop          1.005
vm1_yield*              0.795
vm2_defined_method      0.921
vm2_method              0.795
vm2_method_missing      0.900
vm2_method_with_block   0.774
vm2_poly_method         1.074
vm2_poly_method_ov      0.931
vm3_clearmethodcache    0.968
app_mandelbrot          0.959
app_tak                 0.971
app_tarai               0.927
so_mandelbrot           1.037

$B!!C1=c$JNc!J(Bvm2_method$B!K$@$H(B 2 
$B3d$[$ICY$/$J$C$F$$$k$h$&$G$9!%(Btarai $B$@$H(B
8% $B$G$9$M!%(B

# 
$B%$%s%i%$%s%a%=%C%I%-%c%C%7%e$,8z$+$J$$Nc!J(Bvm2_poly_method$B!K$@$HB.$/(B
$B$J$C$F$$$k$N$O$J$<$J$s$@$m$&(B...$B!%(B

$B!!F0$/$N$G!VBgLdBj!W$G$O$J$$$H;W$$$^$9$,!$$3$N$^$^%j%j!<%9$9$k$K$ODq93$,(B
$B$"$j$^$9!%(B


>   $B$b$H$N(Bmethod 
entry$B$O(Brb_method_entry_t::def->body$B$H$+$+$i;2>H$9$k$s$G$9$+$M!#(B
$B!!Nc$($P!$$=$s$J46$8$N$b$N$rA[Dj$7$F$$$^$7$?!%(B

> * refine$B$7$?;~$K(Brefine$BBP>]%/%i%9$K%a%=%C%I$,$J$$;~$O$I$&$9$k$+(B
>   $B%a%=%C%I$,$J$$;~$b>o$K(Brefine$B$5$l$?$3$H$r<($9(Bmethod 
entry$B$rDI2C$9$k(B?

$B!!$=$NE@!$;d$b$"$N$"$H5$$E$$$?$N$G$9$,!$(Brefine 
$B$5$l$k%a%=%C%I$ODI2C$9$k(B
$B$HNI$$$H;W$$$^$9!%(B

$B!J$=$b$=$b!$(Brefine $B$5$l$k$Y$-%a%=%C%I$,$J$$$N$K(B refine 
$B$G$-$k!$$C$F;EMM(B
$B$O$I$&$J$N!$$H$$$&5$$b$7$^$7$?$,!%$^$!!$$=$&$$$&%7%A%e%(!<%7%g%s$b$"$k$N(B
$B$+$J$!!K(B

> * refine$B$5$l$?%a%=%C%I$N8F=P;~$K(Brb_call_info_t$B$K$I$&$$$&>pJs$r3JG<$9$k$+(B
>   Twitter$B$G$O!"(Brefine$B$5$l$?$3$H$r<($9(Bmethod 
entry$B$rF~$l$F$*$/$H$$$&$3$H$G$7$?$,!"(B
> 
$B:#$N(Bvm_call_method$B$N9=B$$@$H(Brb_call_info_t$B$NCf?H$r=q$-49$($F(Bgoto$B$9$k$h$&$J(B
> 
$B7A$K$J$C$F$$$k$N$G!"$I$&$$$&JQ99$r0U?^$5$l$F$$$k$N$+$h$/$o$+$j$^$;$s$G$7$?!#(B

$B!!(Bgoto $B$OL5$$$G$9$,!$$3$NJU$OFC$KJQ99$OITMW$J5$$,$7$^$9!%(B

$B!!7kO@$,=P$?$i!$;d$,<BAu$7$^$9$+$M!%(B
Posted by Shugo Maeda (Guest)
on 2012-11-12 08:42
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B12$BF|(B 14:58 SASADA Koichi <ko1@atdot.net>:
> $B!!$3$N7o!$;d$,<BAu$7$F$b(B shugo $B$5$s$,$5$l$F$bNI$$$+$H;W$$$^$9!%$?$@!$OC(B
> $B$N=gHV$,$*$+$7$$!$$H$$$&5$$,$7$F$$$^$9!%(Brefinement $B$NF3F~$O!$(B
> $B!J(Brefinement $B$N4X78$NL5$$ItJ,$G$N!K%3%9%H$,==J,$KDc$$!$$H$$$&A0Ds$,$"$C(B
> $B$?$H;W$$$^$9!%$7$+$7!$:#2s$N7o$O!$$3$NA0Ds$r$R$C$/$jJV$7$F$$$k!$$b$7$/$O(B
> $B$R$C$/$jJV$92DG=@-$,$"$j$^$9!%(B

$B$9$_$^$;$s!"$$$C$?$s(Brevert$B$7$^$7$?!#(B
$B%F%9%H$O(Bskip$B$9$k>uBV$G;D$7$F$"$j$^$9$,!"$3$N%F%9%H$,DL$i$J$$>l9g$O(Bmodule_eval
$B$N%V%m%C%/$G(Brefinements$B$rM-8z$K$9$k5!G=$O:o$k$D$b$j$G$9!#(B

> $B!!F0$/$N$G!VBgLdBj!W$G$O$J$$$H;W$$$^$9$,!$$3$N$^$^%j%j!<%9$9$k$K$ODq93$,(B
> $B$"$j$^$9!%(B

$B%j%j!<%9$9$k$^$G$K@-G=$NLdBj$,%/%j%"$G$-$J$$>l9g$O5!G=$r:o$k$3$H$r9M$($F(B
$B$$$^$7$?$,!"$5$5$@$5$s$N:n6H$r9M$($k$H0l;~E*$K$G$bF~$l$k$Y$-$G$O$J$+$C$?(B
$B$G$9$M!#$9$_$^$;$s!#(B

>> * refine$B$7$?;~$K(Brefine$BBP>]%/%i%9$K%a%=%C%I$,$J$$;~$O$I$&$9$k$+(B
>>   $B%a%=%C%I$,$J$$;~$b>o$K(Brefine$B$5$l$?$3$H$r<($9(Bmethod 
entry$B$rDI2C$9$k(B?
>
> $B!!$=$NE@!$;d$b$"$N$"$H5$$E$$$?$N$G$9$,!$(Brefine $B$5$l$k%a%=%C%I$ODI2C$9$k(B
> $B$HNI$$$H;W$$$^$9!%(B

$BDI2C$7$J$$>l9g!"%a%=%C%IC5:w<:GT;~$b(Brefinements$B$NC5:w%Q%9$rDL$9$3$H$K(B
$B$J$k$+$J$H;W$$$^$9$,!"8e$G(Brefine$BBP>]$N%/%i%9$K%a%=%C%I$,DI2C$5$l$?$j$9$k$H(B
$B$^$:$=$&$J$N$G!"$d$C$Q$j(Brefine$B$7$?;~E@$G%a%=%C%I$rDI2C$7$F$*$+$J$$$H(B
$B$^$:$=$&$G$9!#(B

> $B!J$=$b$=$b!$(Brefine $B$5$l$k$Y$-%a%=%C%I$,$J$$$N$K(B refine 
$B$G$-$k!$$C$F;EMM(B
> $B$O$I$&$J$N!$$H$$$&5$$b$7$^$7$?$,!%$^$!!$$=$&$$$&%7%A%e%(!<%7%g%s$b$"$k$N(B
> $B$+$J$!!K(B

refine$B$NBP>]$O%a%=%C%I$G$O$J$/%/%i%9$J$N$G!"?75,%a%=%C%I$NDI2C$b;EMM$H(B
$B$7$?$$$H9M$($F$$$^$9!#(B
$B6qBNE*$J%f!<%9%1!<%9$H$7$F$O!"Nc$($P(BRSpec$B$N(Bshould$B$N$h$&$J$b$N$,$"$j$^$9!#(B

>> * 
refine$B$5$l$?%a%=%C%I$N8F=P;~$K(Brb_call_info_t$B$K$I$&$$$&>pJs$r3JG<$9$k$+(B
>>   Twitter$B$G$O!"(Brefine$B$5$l$?$3$H$r<($9(Bmethod 
entry$B$rF~$l$F$*$/$H$$$&$3$H$G$7$?$,!"(B
>> 
$B:#$N(Bvm_call_method$B$N9=B$$@$H(Brb_call_info_t$B$NCf?H$r=q$-49$($F(Bgoto$B$9$k$h$&$J(B
>> 
$B7A$K$J$C$F$$$k$N$G!"$I$&$$$&JQ99$r0U?^$5$l$F$$$k$N$+$h$/$o$+$j$^$;$s$G$7$?!#(B
>
> $B!!(Bgoto $B$OL5$$$G$9$,!$$3$NJU$OFC$KJQ99$OITMW$J5$$,$7$^$9!%(B

vm_call_method$B$KJ,4t$rA}$d$7$F!"(B

              case VM_METHOD_TYPE_REFINED:{
                rb_call_info_t cie = *ci;
                ci = &cie;

                ci->me = (refinements$B$+$iC5:w$7$?(Bmethod 
entry$B!"$^$?$O85$N%/%i%9$N(Bmethod entry);
                if (ci->me != 0) {
                    goto normal_method_dispatch;
                }
                else {
                    /* 
refinements$B$+$i%a%=%C%I$,8+$D$+$i$:!"85$N%/%i%9$K$b%a%=%C%IDj5A$,$J$$>l9g(B 
*/
                    goto start_method_dispatch;
                }

$B$H$9$k$h$&$J%$%a!<%8$G9g$C$F$$$^$9$+(B?

refinements$B$+$iC5:w$7$?(Bmethod 
entry$B$ODL>o$N%$%s%i%$%s%-%c%C%7%e$K$O(B
$B:\$i$J$$$N$G$9$h$M(B?
# 
$B$G$-$l$PJL$N$H$3$m$K%-%c%C%7%e$rCV$$$?J}$,$$$$$+$b$7$l$J$$$G$9$1$I!#(B

> $B!!7kO@$,=P$?$i!$;d$,<BAu$7$^$9$+$M!%(B

$B0U?^$r@5$7$/M}2r$G$-$F$$$k$+IT0B$G$O$"$j$^$9$,!"$5$5$@$5$s$OB>$K$b:n6H$,(B
$B$?$/$5$s$"$j$=$&$J$N$G!"$$$C$?$s;d$,$d$C$F$_$^$7$g$&$+(B?

$B$"$H!"K\Bj$H4X78$"$j$^$;$s$,!"%3!<%I$rFI$s$G$$$F0J2<$N5?Ld$,$"$j$^$7$?!#(B

* rb_iseq_t::ic_entries$B$O$^$@;H$o$l$F$$$^$9$+(B?
* callinfo$B$H(Bcall_info$B$GL>A0$NIU$1J}$KMI$l$,$"$k$N$O0U?^E*$G$9$+(B?
Posted by SASADA Koichi (Guest)
on 2012-11-12 08:51
(Received via mailing list)
(2012/11/12 14:58), SASADA Koichi wrote:
> $B!!!!!!!!!!!!!!(B       $B!!(B(b)/(a) # $BBg$-$$$H(B (2) $B$,B.$$(B

(a)/(b) $B$G$9$M!%$9$_$^$;$s!%(B
Posted by SASADA Koichi (Guest)
on 2012-11-12 09:11
(Received via mailing list)
$B!!$5$5$@$G$9!%(B

(2012/11/12 16:42), Shugo Maeda wrote:
> $B$9$_$^$;$s!"$$$C$?$s(Brevert$B$7$^$7$?!#(B
> 
$B%F%9%H$O(Bskip$B$9$k>uBV$G;D$7$F$"$j$^$9$,!"$3$N%F%9%H$,DL$i$J$$>l9g$O(Bmodule_eval
> $B$N%V%m%C%/$G(Brefinements$B$rM-8z$K$9$k5!G=$O:o$k$D$b$j$G$9!#(B
>
>> $B!!F0$/$N$G!VBgLdBj!W$G$O$J$$$H;W$$$^$9$,!$$3$N$^$^%j%j!<%9$9$k$K$ODq93$,(B
>> $B$"$j$^$9!%(B
>
> $B%j%j!<%9$9$k$^$G$K@-G=$NLdBj$,%/%j%"$G$-$J$$>l9g$O5!G=$r:o$k$3$H$r9M$($F(B
> $B$$$^$7$?$,!"$5$5$@$5$s$N:n6H$r9M$($k$H0l;~E*$K$G$bF~$l$k$Y$-$G$O$J$+$C$?(B
> $B$G$9$M!#$9$_$^$;$s!#(B

$B!!8D?ME*$K$O!$!V%^%$%/%m%Y%s%A%^!<%/0J30$K$O8z$+$J$$$s$@$+$i$$$$$h!W$H$$(B
$B$&0U8+$b$"$j$@$m$&$H;W$&$N$G!$5!G=$+@-G=$+!$$N7hDj$O$I$J$?$+$K$*G$$;$7$?(B
$B$$$H$3$m$G$9!%(B


$B!!$I$A$i$+$H$$$&$H!$8D?ME*$J0u>]$NOC$K$J$C$F$7$^$&$N$G$9$,!$@-G=$h$j$b!$(B
$B!V%a%=%C%IC5:w$N:,44$K4X$o$kItJ,$K$h$&$o$+$i$s=hM}$GKd$^$k!W$H$$$&$N(B
$B$O!$(BRuby 
$B$H$$$&8@8l$r$I$s$I$sM}2r$7$,$?$$$b$N$K$9$k$N$GH?BP$7$?$$!$$H$$(B
$B$&$N$,$"$j$^$9!%M}2r$7$,$?$$8@8l$d5!G=$O8m2r$5$l$?$jIT9,$K$7$+$J$i$J$$46$8!%(B


>>> * refine$B$7$?;~$K(Brefine$BBP>]%/%i%9$K%a%=%C%I$,$J$$;~$O$I$&$9$k$+(B
>>>   $B%a%=%C%I$,$J$$;~$b>o$K(Brefine$B$5$l$?$3$H$r<($9(Bmethod 
entry$B$rDI2C$9$k(B?
>>
>> $B!!$=$NE@!$;d$b$"$N$"$H5$$E$$$?$N$G$9$,!$(Brefine $B$5$l$k%a%=%C%I$ODI2C$9$k(B
>> $B$HNI$$$H;W$$$^$9!%(B
>
> $BDI2C$7$J$$>l9g!"%a%=%C%IC5:w<:GT;~$b(Brefinements$B$NC5:w%Q%9$rDL$9$3$H$K(B
> 
$B$J$k$+$J$H;W$$$^$9$,!"8e$G(Brefine$BBP>]$N%/%i%9$K%a%=%C%I$,DI2C$5$l$?$j$9$k$H(B
> $B$^$:$=$&$J$N$G!"$d$C$Q$j(Brefine$B$7$?;~E@$G%a%=%C%I$rDI2C$7$F$*$+$J$$$H(B
> $B$^$:$=$&$G$9!#(B

$B!!$=$N>l9g$N%3%9%H$O8=>u$HJQ$o$i$J$$$G$9$h$M!%8=>u$G$b!$I,$:(B 
refinement
$B$r5$$K$9$k$N$G!%(B

>> $B!J$=$b$=$b!$(Brefine $B$5$l$k$Y$-%a%=%C%I$,$J$$$N$K(B refine 
$B$G$-$k!$$C$F;EMM(B
>> $B$O$I$&$J$N!$$H$$$&5$$b$7$^$7$?$,!%$^$!!$$=$&$$$&%7%A%e%(!<%7%g%s$b$"$k$N(B
>> $B$+$J$!!K(B
>
> refine$B$NBP>]$O%a%=%C%I$G$O$J$/%/%i%9$J$N$G!"?75,%a%=%C%I$NDI2C$b;EMM$H(B
> $B$7$?$$$H9M$($F$$$^$9!#(B
> 
$B6qBNE*$J%f!<%9%1!<%9$H$7$F$O!"Nc$($P(BRSpec$B$N(Bshould$B$N$h$&$J$b$N$,$"$j$^$9!#(B

$B!!N;2r$G$9!%(B

$B!!$A$J$_$K!$@hF|$*2q$$$7$?$H$-$K$$$C$?(B

  refine C, :foo do |...|
    ...
  end

$B$N$h$&$JI=5-$O$I$&$+!$$H$$$&OC$r$7$^$7$?$,!$$3$l$O(B method 
$B$r=$>~$9$k!$$H(B
$B$$$&H/A[$+$i$G$7$?!%(B

>                 rb_call_info_t cie = *ci;
>
> $B$H$9$k$h$&$J%$%a!<%8$G9g$C$F$$$^$9$+(B?

$B!!$O$$!%$A$J$_$K!$(Brb_call_info_t 
$B$r0z$-2s$9@_7W$K$OLdBj$,$"$k$3$H$,$o(B
$B$+$C$F$$$k!J%a%=%C%I8F$S=P$7ESCf$G(B to_proc $B$d(B to_a 
$B$rFI$s$@$H$-!$GK2u$5(B
$B$l$k2DG=@-$,$"$k!K$?$a!$:#BeBX0F$r8!F$Cf$G$9!%(B

$B!!(Belse $B@a$N$[$&$O!$(Bsuper class 
$B$rC5:w$7$J$$$H$$$1$J$$$N$G!$$A$g$C$H0c$&(B
$B$h$&$J5$$,$7$^$9$,!$!V$^$?$O85$N%/%i%9$N(Bmethod entry$B!W$,(B super 
class $BC5(B
$B:w$r4^0U$7$F$$$k5$$b$7$^$9$M!%(B


> refinements$B$+$iC5:w$7$?(Bmethod entry$B$ODL>o$N%$%s%i%$%s%-%c%C%7%e$K$O(B
> $B:\$i$J$$$N$G$9$h$M(B?
> # $B$G$-$l$PJL$N$H$3$m$K%-%c%C%7%e$rCV$$$?J}$,$$$$$+$b$7$l$J$$$G$9$1$I!#(B

$B!!(Byes$B!%%$%s%i%$%s%-%c%C%7%e$K$O>h$j$^$;$s!%$J$N$G!$?'!9%7%s%W%k$K$J$k$H(B
$B;W$$$^$9!%(B

$B!!@-G=$GLdBj$K$J$k$h$&$J$i!$(Brefinement $BMQ$N(B global cache 
$B$rMQ0U$9$l$PNI(B
$B$$$+$H;W$$$^$9!%(B

>> $B!!7kO@$,=P$?$i!$;d$,<BAu$7$^$9$+$M!%(B
>
> $B0U?^$r@5$7$/M}2r$G$-$F$$$k$+IT0B$G$O$"$j$^$9$,!"$5$5$@$5$s$OB>$K$b:n6H$,(B
> $B$?$/$5$s$"$j$=$&$J$N$G!"$$$C$?$s;d$,$d$C$F$_$^$7$g$&$+(B?

$B!!$b$7!$$*;~4V$,$"$j$=$&$G$"$l$P!JA0ED$5$s$b$*K;$7$$$H;W$$$^$9$,(B...$B!K!%(B
$B$"$H!$>e=R$7$?$H$*$j!$(Brb_call_info_t 
$B$r0z$-2s$9@_7W$r2~B$$9$kM=Dj$J$N(B
$B$G!$$=$N:n6H8e$+$i<h$j$+$+$C$?J}$,$$$$$+$b$7$l$^$;$s!%>/$J$/$H$b!$:#=5Cf(B
$B$K$OD>$7$^$9!%(B

> $B$"$H!"K\Bj$H4X78$"$j$^$;$s$,!"%3!<%I$rFI$s$G$$$F0J2<$N5?Ld$,$"$j$^$7$?!#(B
>
> * rb_iseq_t::ic_entries$B$O$^$@;H$o$l$F$$$^$9$+(B?

$B!!$O$$!%(Bic_entry 
$B$O%$%s%i%$%s%-%c%C%7%eMQ$G$"$j!$%$%s%i%$%s%a%=%C%I(B
$B%-%c%C%7%e!J(BIMC$B!K@lMQ$N$b$N$G$O$"$j$^$;$s!%(B

$B!!0JA0$O(B IMC 
$B$b$3$l$G;H$C$F$$$^$7$?$,!$B>$K$b%$%s%9%?%s%9JQ?t$N%$%s%G%C(B
$B%/%9$N%-%c%C%7%e!$Dj?t%-%c%C%7%e$J$I$GMxMQ$7$F$$$^$9!%(B

> * callinfo$B$H(Bcall_info$B$GL>A0$NIU$1J}$KMI$l$,$"$k$N$O0U?^E*$G$9$+(B?

$B!!$3$lLB$C$?$s$G$9$h$M$'!%(Brb_callinfo_t $B$KDq93$,$"$C$?$s$G$9(B
$B$,!$(Bprefix/suffix $BE*$K;H$&>l9g$K(B call_info 
$B$C$F$N$K$OJQ$@$H;W$$!%(B

$B!!A4It(B callinfo $B$KIU$1BX$($h$&$+$J$!!%(B
Posted by Shugo Maeda (Guest)
on 2012-11-12 10:20
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B12$BF|(B 17:10 SASADA Koichi <ko1@atdot.net>:
> $B!!8D?ME*$K$O!$!V%^%$%/%m%Y%s%A%^!<%/0J30$K$O8z$+$J$$$s$@$+$i$$$$$h!W$H$$(B
> $B$&0U8+$b$"$j$@$m$&$H;W$&$N$G!$5!G=$+@-G=$+!$$N7hDj$O$I$J$?$+$K$*G$$;$7$?(B
> $B$$$H$3$m$G$9!%(B
>
>
> $B!!$I$A$i$+$H$$$&$H!$8D?ME*$J0u>]$NOC$K$J$C$F$7$^$&$N$G$9$,!$@-G=$h$j$b!$(B
> $B!V%a%=%C%IC5:w$N:,44$K4X$o$kItJ,$K$h$&$o$+$i$s=hM}$GKd$^$k!W$H$$$&$N(B
> $B$O!$(BRuby $B$H$$$&8@8l$r$I$s$I$sM}2r$7$,$?$$$b$N$K$9$k$N$GH?BP$7$?$$!$$H$$(B
> $B$&$N$,$"$j$^$9!%M}2r$7$,$?$$8@8l$d5!G=$O8m2r$5$l$?$jIT9,$K$7$+$J$i$J$$46$8!%(B

$BN;2r$7$^$7$?!#(B
$B$^$@4V$K9g$&$N$G$b$C$HH?BP0U8+$b=P$7$F$$$?$@$1$l$P$H;W$$$^$9!#(B

>
> $B!!$=$N>l9g$N%3%9%H$O8=>u$HJQ$o$i$J$$$G$9$h$M!%8=>u$G$b!$I,$:(B refinement
> $B$r5$$K$9$k$N$G!%(B

$B$O$$!"<B9T%3%9%H$OLdBj$J$$$H;W$$$^$9!#(B
$B<BAu%3%9%H$b>o$K%a%=%C%I$rDI2C$7$?J}$,3Z$+$J!#(B

>>                 else {
>>                     /* 
refinements$B$+$i%a%=%C%I$,8+$D$+$i$:!"85$N%/%i%9$K$b%a%=%C%IDj5A$,$J$$>l9g(B */
>>                     goto start_method_dispatch;
>>                 }
>>
>> $B$H$9$k$h$&$J%$%a!<%8$G9g$C$F$$$^$9$+(B?
>
> $B!!$O$$!%$A$J$_$K!$(Brb_call_info_t $B$r0z$-2s$9@_7W$K$OLdBj$,$"$k$3$H$,$o(B
> $B$+$C$F$$$k!J%a%=%C%I8F$S=P$7ESCf$G(B to_proc $B$d(B to_a 
$B$rFI$s$@$H$-!$GK2u$5(B
> $B$l$k2DG=@-$,$"$k!K$?$a!$:#BeBX0F$r8!F$Cf$G$9!%(B

$BN;2r$7$^$7$?!#(B

> $B!!(Belse $B@a$N$[$&$O!$(Bsuper class 
$B$rC5:w$7$J$$$H$$$1$J$$$N$G!$$A$g$C$H0c$&(B
> $B$h$&$J5$$,$7$^$9$,!$!V$^$?$O85$N%/%i%9$N(Bmethod entry$B!W$,(B super class 
$BC5(B
> $B:w$r4^0U$7$F$$$k5$$b$7$^$9$M!%(B

$B$"$"!"$=$&$G$9$M!#9MN8O3$l$G$7$?!#(B

>> refinements$B$+$iC5:w$7$?(Bmethod entry$B$ODL>o$N%$%s%i%$%s%-%c%C%7%e$K$O(B
>> $B:\$i$J$$$N$G$9$h$M(B?
>> # $B$G$-$l$PJL$N$H$3$m$K%-%c%C%7%e$rCV$$$?J}$,$$$$$+$b$7$l$J$$$G$9$1$I!#(B
>
> $B!!(Byes$B!%%$%s%i%$%s%-%c%C%7%e$K$O>h$j$^$;$s!%$J$N$G!$?'!9%7%s%W%k$K$J$k$H(B
> $B;W$$$^$9!%(B
>
> $B!!@-G=$GLdBj$K$J$k$h$&$J$i!$(Brefinement $BMQ$N(B global cache 
$B$rMQ0U$9$l$PNI(B
> $B$$$+$H;W$$$^$9!%(B

$B$O$$!#(B

>>>$B!!(B $B7kO@$,=P$?$i!$;d$,<BAu$7$^$9$+$M!%(B
>>
>> $B0U?^$r@5$7$/M}2r$G$-$F$$$k$+IT0B$G$O$"$j$^$9$,!"$5$5$@$5$s$OB>$K$b:n6H$,(B
>> $B$?$/$5$s$"$j$=$&$J$N$G!"$$$C$?$s;d$,$d$C$F$_$^$7$g$&$+(B?
>
> $B!!$b$7!$$*;~4V$,$"$j$=$&$G$"$l$P!JA0ED$5$s$b$*K;$7$$$H;W$$$^$9$,(B...$B!K!%(B
> $B$"$H!$>e=R$7$?$H$*$j!$(Brb_call_info_t $B$r0z$-2s$9@_7W$r2~B$$9$kM=Dj$J$N(B
> $B$G!$$=$N:n6H8e$+$i<h$j$+$+$C$?J}$,$$$$$+$b$7$l$^$;$s!%>/$J$/$H$b!$:#=5Cf(B
> $B$K$OD>$7$^$9!%(B

$BN;2r$G$9!#$G$OMh=5$d$C$F$_$^$9!#(B

$B$"$H!"JL$N%a!<%k$G(Bprepend$B$h$j(Brefinement$B$rM%@h$7$F$[$7$$$H$^$D$b$H$5$s$,(B
$B$*$C$7$c$C$F$$$k$N$G!"$=$NJ}K!$r9M$($J$$$H$$$1$J$$$G$9$M!#(B
$B0l4S@-$r9M$($k$H(Bprepend$B$NJ}$,M%@h$5$l$F$b$$$$5$$,$7$^$9$,!";H$$>!<j$O(B
refinement$BM%@h$NJ}$,$h$$$h$&$K;W$$$^$9!#(B

$B$A$g$C$H9M$($?$N$G$9$,!"$9$G$K%b%8%e!<%k$,(Bprepend$B$5$l$F$$$k%/%i%9$r(Brefine
$B$7$?>l9g$O!"(Bprepend$B$5$l$F$$$k%b%8%e!<%k$K(Brefined$B%a%=%C%I$rDI2C$7$F$7$^$&$N(B
$B$,$h$$$h$&$K;W$$$^$9!#(B
$B$=$&$9$k$H!"F1$8%b%8%e!<%k$r(Bprepend$B$7$F$$$kB>$N%/%i%9$N%a%=%C%IC5:w$K$b(B
$B1F6A$,$"$j$^$9$,!"B.EYDc2<$@$1$GF0:n<+BN$OF1$8$K$J$k$H9M$($F$$$^$9!#(B

$BLdBj$O!"(Brefine$B$5$l$?8e$G(Bprepend$B$5$l$?>l9g$G$9$,!"$3$A$i$O$A$g$C$HBP1~$,(B
$BLLE]$=$&$G$9$M$(!#(B
prepend$B$7$?;~$K!">o$K(Bprepend$BBP>]$N%/%i%9$N%a%=%C%I%F!<%V%k$rD4$Y$F!"(B
$B%b%8%e!<%k$K(Brefined$B%a%=%C%I$rDI2C$9$k$/$i$$$G$9$+$M$(!#(B

>> $B$"$H!"K\Bj$H4X78$"$j$^$;$s$,!"%3!<%I$rFI$s$G$$$F0J2<$N5?Ld$,$"$j$^$7$?!#(B
>>
>> * rb_iseq_t::ic_entries$B$O$^$@;H$o$l$F$$$^$9$+(B?
>
> $B!!$O$$!%(Bic_entry $B$O%$%s%i%$%s%-%c%C%7%eMQ$G$"$j!$%$%s%i%$%s%a%=%C%I(B
> $B%-%c%C%7%e!J(BIMC$B!K@lMQ$N$b$N$G$O$"$j$^$;$s!%(B
>
> $B!!0JA0$O(B IMC $B$b$3$l$G;H$C$F$$$^$7$?$,!$B>$K$b%$%s%9%?%s%9JQ?t$N%$%s%G%C(B
> $B%/%9$N%-%c%C%7%e!$Dj?t%-%c%C%7%e$J$I$GMxMQ$7$F$$$^$9!%(B

$B$"$"!"$J$k$[$I!"N;2r$7$^$7$?!#(B

>> * callinfo$B$H(Bcall_info$B$GL>A0$NIU$1J}$KMI$l$,$"$k$N$O0U?^E*$G$9$+(B?
>
> $B!!$3$lLB$C$?$s$G$9$h$M$'!%(Brb_callinfo_t $B$KDq93$,$"$C$?$s$G$9(B
> $B$,!$(Bprefix/suffix $BE*$K;H$&>l9g$K(B call_info $B$C$F$N$K$OJQ$@$H;W$$!%(B

$B$J$k$[$I!#(B

> $B!!A4It(B callinfo $B$KIU$1BX$($h$&$+$J$!!%(B

$BE}0l$7$?J}$,$h$$5$$,$7$^$9$M!#(B
Posted by SASADA Koichi (Guest)
on 2012-11-12 11:22
(Received via mailing list)
(2012/11/12 18:20), Shugo Maeda wrote:
>
> 
$BLdBj$O!"(Brefine$B$5$l$?8e$G(Bprepend$B$5$l$?>l9g$G$9$,!"$3$A$i$O$A$g$C$HBP1~$,(B
> $BLLE]$=$&$G$9$M$(!#(B
> prepend$B$7$?;~$K!">o$K(Bprepend$BBP>]$N%/%i%9$N%a%=%C%I%F!<%V%k$rD4$Y$F!"(B
> $B%b%8%e!<%k$K(Brefined$B%a%=%C%I$rDI2C$9$k$/$i$$$G$9$+$M$(!#(B

$B!!(Bprepend $B$N:Y$+$$5sF0$rCN$i$J$$$N$G$9$,!$(B

class C
  prepend M1
  prepend M2
end

module M
  refine C
    ...
  end
end

class C
  prepend M3
end

$B$N$H$-!$$?$7$+(B C $B$N%a%=%C%I%F!<%V%k$r(B null 
$B$K$7$F$*$$$F1>!9!$$HJ9$$$?$H(B
$B;W$&$s$G$9$,!$$3$3$G$b$&!$(Brefinement check only 
$B$J%a%=%C%I%(%s%H%j$rCV$/(B
$B$h$&$K$9$k$H$I$&$G$9$+$M!%(B

# $B$$$d!$$J$s$+$=$b$=$b(B refinement $B$H(B prepend 
$B$r:.$<$k$C$F$N$O!$(B
# $B?'!9$H4pK\@_7W4V0c$C$F$k$H$$$&$+!$8eIU$146$,$R$I$$46$8$,$9$k!%(B
# $B=PMh$k$1$I$d$C$A$c$$$1$J$$46$8!%(B
Posted by Yukihiro Matsumoto (Guest)
on 2012-11-12 14:22
(Received via mailing list)
$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message "Re: [ruby-dev:46497] Re: Fwd: [ruby-changes:25559] 
shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), 
compile.c (new_callinfo):"
    on Mon, 12 Nov 2012 19:20:09 +0900, SASADA Koichi <ko1@atdot.net> 
writes:

|# $B$$$d!$$J$s$+$=$b$=$b(B refinement $B$H(B prepend $B$r:.$<$k$C$F$N$O!$(B
|# $B?'!9$H4pK\@_7W4V0c$C$F$k$H$$$&$+!$8eIU$146$,$R$I$$46$8$,$9$k!%(B
|# $B=PMh$k$1$I$d$C$A$c$$$1$J$$46$8!%(B

$B!V=PMh$k$1$I$d$C$A$c$$$1$J$$!W$C$F$N$O8@8l@_7WE*$K$O$"$j$($J(B
$B$$8@$$Lu$J$N$G!"!V$G$-$k!W$+!V$G$-$J$$$+!W$I$A$i$+$G$"$k$Y$-(B
$B$G$7$g$&$M!#(B

$B$?$@!"3N$+$K(Brefinement$B$GDI2C$5$l$?%a%=%C%I$H(Bprepend$B$5$l$?$j!"(B
$B%5%V%/%i%9$G%*!<%P!<%i%$%I$5$l$?$j$7$?%a%=%C%I$HN>J}$,$"$k$H!"(B
$B$o$+$j$K$/$$$N$O3N$+$J$N$G!"$=$3$K$D$$$F$h$j9M;!$7$?$[$&$,NI(B
$B$$$@$m$&$H$$$&<(:6$OM}2r$G$-$^$9!#(B

$BFC$K7Q>5$5$l$?$j(Binclude$B$5$l$?$j$7$F$b(Brefinement$B$,M-8z$G$"$k(B
$B$HL@8@$7$F$7$^$C$?$N$G!"(Brefinement$B$,$h$j%*!<%P!<%i%$%I$K$h$k(B
$B1F6A$r<u$1$d$9$/$J$C$?$H8@$($^$9!#(B

$B$&!<$`!"$$$C$=(Brefinement$B$GDI2C$5$l$?%a%=%C%I$O>o$K:GM%@h$K$9(B
$B$Y$-$J$N$+$J$"!#%5%V%/%i%9$G%*!<%P!<%i%$%I$5$l$F$$$?$H$7$F$b(B
refinement$B$5$l$?%a%=%C%IM%@h!#$I$&$d$C$F<BAu$9$k$N$+$K$o$+$K(B
$B$O$o$+$i$J$$$1$I!#(B

                                $B$^$D$b$H(B $B$f$-$R$m(B /:|)
Posted by Shugo Maeda (Guest)
on 2012-11-12 14:22
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B12$BF|(B 19:20 SASADA Koichi <ko1@atdot.net>:
> $B$N$H$-!$$?$7$+(B C $B$N%a%=%C%I%F!<%V%k$r(B null 
$B$K$7$F$*$$$F1>!9!$$HJ9$$$?$H(B
> $B;W$&$s$G$9$,!$$3$3$G$b$&!$(Brefinement check only $B$J%a%=%C%I%(%s%H%j$rCV$/(B
> $B$h$&$K$9$k$H$I$&$G$9$+$M!%(B

$B$"$"!"$=$3$K%a%=%C%I%(%s%H%j$rCV$$$F$$$$$J$i!"$=$NJ}$,$$$$$+$b$7$l$J$$$G$9$M!#(B
$B$I$&$G$7$g$&$+(B? > $B$J$+$@$5$s(B
$B$?$@!"(B

class C
end

module R
  refine C do
    def foo; end
  end
end

class C
  prepend M
end

$B$_$?$$$J%1!<%9$@$H!"(BC$B$K(Brefined$B%a%=%C%I$,$9$G$KDI2C$5$l$?8e$G(Bprepend
$B$5$l$F!"(BC$B$N$9$Y$F$N%a%=%C%I$,(Biclass(C')$B$K0\F0$5$l$k$N$G!"$=$N;~$K$O(B
$B$d$O$j(BC$B$K(Brefined$B%a%=%C%I%(%s%H%j$@$1(B($B%a%=%C%IK\BN$O(BC'$B$@$1$,;}$D(B)$B$r(B
$BDI2C$7$F$*$+$J$$$H$$$1$J$5$=$&$G$9$M!#(B

> # $B$$$d!$$J$s$+$=$b$=$b(B refinement $B$H(B prepend $B$r:.$<$k$C$F$N$O!$(B
> # $B?'!9$H4pK\@_7W4V0c$C$F$k$H$$$&$+!$8eIU$146$,$R$I$$46$8$,$9$k!%(B
> # $B=PMh$k$1$I$d$C$A$c$$$1$J$$46$8!%(B

Rails$B$N%U%l!<%`%o!<%/B&$N%3!<%I$G:#8e(Bmonkey 
patching$B$,(Bprepend$B$K(B
$BCV$-49$($i$l$kM=Dj$J$N$G!"%f!<%6$,$5$i$K(Brefine$B$G3HD%$9$k$h$&$J%1!<%9(B
$B$O$R$g$C$H$7$?$i=P$F$/$k$+$b$7$l$^$;$s!#(B
$B$5$9$,$K(Brefine$B$7$?8e$G(Bprepend$B$9$k$h$&$J%1!<%9$O$"$^$j$J$$$H;W$&$N(B
$B$G$9$,!#(B
Posted by SASADA Koichi (Guest)
on 2012-11-12 14:46
(Received via mailing list)
(2012/11/12 22:21), Shugo Maeda wrote:
> Rails$B$N%U%l!<%`%o!<%/B&$N%3!<%I$G:#8e(Bmonkey patching$B$,(Bprepend$B$K(B
> $BCV$-49$($i$l$kM=Dj$J$N$G!"%f!<%6$,$5$i$K(Brefine$B$G3HD%$9$k$h$&$J%1!<%9(B
> $B$O$R$g$C$H$7$?$i=P$F$/$k$+$b$7$l$^$;$s!#(B
> $B$5$9$,$K(Brefine$B$7$?8e$G(Bprepend$B$9$k$h$&$J%1!<%9$O$"$^$j$J$$$H;W$&$N(B
> $B$G$9$,!#(B

$B$"$j!$(Bmonkey patching $B$O(B refinement 
$B$GCV$-49$($i$l$k$b$N$J$s$G$O$J$$$N$G(B
$B$9$+!)(B
Posted by Shugo Maeda (Guest)
on 2012-11-12 15:14
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B12$BF|(B 22:45 SASADA Koichi <ko1@atdot.net>:
> (2012/11/12 22:21), Shugo Maeda wrote:
>> Rails$B$N%U%l!<%`%o!<%/B&$N%3!<%I$G:#8e(Bmonkey patching$B$,(Bprepend$B$K(B
>> $BCV$-49$($i$l$kM=Dj$J$N$G!"%f!<%6$,$5$i$K(Brefine$B$G3HD%$9$k$h$&$J%1!<%9(B
>> $B$O$R$g$C$H$7$?$i=P$F$/$k$+$b$7$l$^$;$s!#(B
>> $B$5$9$,$K(Brefine$B$7$?8e$G(Bprepend$B$9$k$h$&$J%1!<%9$O$"$^$j$J$$$H;W$&$N(B
>> $B$G$9$,!#(B
>
> $B$"$j!$(Bmonkey patching $B$O(B refinement 
$B$GCV$-49$($i$l$k$b$N$J$s$G$O$J$$$N$G(B
> $B$9$+!)(B

monkey 
patching$B$H$$$&$+!"(Balias_method_chain$B$r;H$C$F$$$k$h$&$J%3!<%I$G!"(B
$B%0%m!<%P%k$K3HD%$7$FLdBj$J$$$h$&$J%1!<%9(B(Rails$B$GDj5A$7$F$$$k%/%i%9$N3HD%$H$+(B)
$B$G$O(Bprepend$B$GCV$-49$($i$l$k$s$8$c$J$$$+$H;W$$$^$9!#(B
$BAH$_9~$_%/%i%9$N3HD%$O(Brefinements$B$GCV$-49$($i$l$k$+$b$7$l$^$;$s$,!#(B
Posted by Nobuyoshi Nakada (nobu)
on 2012-11-14 09:28
(Received via mailing list)
$B$J$+$@$G$9!#(B

At Mon, 12 Nov 2012 22:21:46 +0900,
Shugo Maeda wrote in [ruby-dev:46501]:
> 2012$BG/(B11$B7n(B12$BF|(B 19:20 SASADA Koichi <ko1@atdot.net>:
> > $B$N$H$-!$$?$7$+(B C $B$N%a%=%C%I%F!<%V%k$r(B null 
$B$K$7$F$*$$$F1>!9!$$HJ9$$$?$H(B
> > $B;W$&$s$G$9$,!$$3$3$G$b$&!$(Brefinement check only 
$B$J%a%=%C%I%(%s%H%j$rCV$/(B
> > $B$h$&$K$9$k$H$I$&$G$9$+$M!%(B
>
> 
$B$"$"!"$=$3$K%a%=%C%I%(%s%H%j$rCV$$$F$$$$$J$i!"$=$NJ}$,$$$$$+$b$7$l$J$$$G$9$M!#(B
> $B$I$&$G$7$g$&$+(B? > $B$J$+$@$5$s(B

$BDL>o$N%a%=%C%I%F!<%V%k$H(Brefine$BMQ%a%=%C%I%F!<%V%k$,0l$D$N(BRClass$BCf(B
$B$KF15o$9$k$s$G$9$+(B? 
$BJ#?t(Busing$B$7$?$H$-$N(Bsuper$B$J$I$,$&$^$/$$$/$+5?(B
$BLd$J$N$G$9$,!#(B

$B;d$O!"(Brefined 
method$B$@$1$N(Biclass$B$r(Bprepend$B$9$k!"$H$$$&J}N,$+$H;W$C(B
$B$F$$$^$7$?!#(B
Posted by Shugo Maeda (Guest)
on 2012-11-15 03:19
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B14$BF|(B 17:28 Nobuyoshi Nakada <nobu@ruby-lang.org>:
>> > $B$N$H$-!$$?$7$+(B C $B$N%a%=%C%I%F!<%V%k$r(B null 
$B$K$7$F$*$$$F1>!9!$$HJ9$$$?$H(B
>> > $B;W$&$s$G$9$,!$$3$3$G$b$&!$(Brefinement check only 
$B$J%a%=%C%I%(%s%H%j$rCV$/(B
>> > $B$h$&$K$9$k$H$I$&$G$9$+$M!%(B
>>
>> 
$B$"$"!"$=$3$K%a%=%C%I%(%s%H%j$rCV$$$F$$$$$J$i!"$=$NJ}$,$$$$$+$b$7$l$J$$$G$9$M!#(B
>> $B$I$&$G$7$g$&$+(B? > $B$J$+$@$5$s(B
>
> $BDL>o$N%a%=%C%I%F!<%V%k$H(Brefine$BMQ%a%=%C%I%F!<%V%k$,0l$D$N(BRClass$BCf(B
> $B$KF15o$9$k$s$G$9$+(B? $BJ#?t(Busing$B$7$?$H$-$N(Bsuper$B$J$I$,$&$^$/$$$/$+5?(B
> $BLd$J$N$G$9$,!#(B

refine$B$5$l$?%/%i%9$N%a%=%C%I%F!<%V%k$KCV$/$N$O(Brefinement$B$N%A%'%C%/$,I,MW$H$$$&(B
$B0u$@$1$G!"<B:]$N%a%=%C%I$O(Bcref$B$+$iC)$k$N$GJ#?t(Busing$B$7$F$b:#$HF1$8$h$&$KC5:w$G$-$k(B
$B$H;W$C$F$$$^$9!#(B

> $B;d$O!"(Brefined 
method$B$@$1$N(Biclass$B$r(Bprepend$B$9$k!"$H$$$&J}N,$+$H;W$C(B
> $B$F$$$^$7$?!#(B

$B$=$l$G$b$$$$$+$b$7$l$^$;$s$,!"B>$N%b%8%e!<%k$r(Bprepend$B$7$?;~$KA^F~0LCV$rD4@0$7$?$j(B
$B$9$k$N$,LLE]$8$c$J$$$G$9(B?
$B$^$?!"(Busing$B$r;H$C$F$$$J$$%3%s%F%-%9%H$G8F$P$l$?;~$K!"%a%=%C%IC5:w$N%3%9%H$,A}$($k$h$&$K(B
$B;W$$$^$9!#(B

prepend$B$h$j(Brefinement$B$r>o$KM%@h$9$k$J$i!"(Brefine$B$5$l$?%/%i%9$N%a%=%C%I%F!<%V%k$K(B
$BD>@\DI2C$7$F$7$^$C$F$b$$$$$h$&$K;W$$$^$9!#(B
$B$?$@$=$N>l9g!"8=>u$O(Bprepend$B$5$l$?%/%i%9$N%a%=%C%I%F!<%V%k$,(B0$B$K$J$C$F$$$k$N$r(B
$B$d$a$F!"Be$j$K%U%i%0$+2?$+$G(Bprepend$B$5$l$?%/%i%9$+$I$&$+$r6hJL$7$FI,MW$J;~$K(B
RCLASS_ORIGIN$B$r8+$k$h$&$K$9$kI,MW$,$"$j$^$9$,!#(B
Posted by Nobuyoshi Nakada (nobu)
on 2012-11-16 09:03
(Received via mailing list)
$B$J$+$@$G$9!#(B

At Thu, 15 Nov 2012 11:17:32 +0900,
Shugo Maeda wrote in [ruby-dev:46516]:
> > $B;d$O!"(Brefined 
method$B$@$1$N(Biclass$B$r(Bprepend$B$9$k!"$H$$$&J}N,$+$H;W$C(B
> > $B$F$$$^$7$?!#(B
>
> 
$B$=$l$G$b$$$$$+$b$7$l$^$;$s$,!"B>$N%b%8%e!<%k$r(Bprepend$B$7$?;~$KA^F~0LCV$rD4@0$7$?$j(B
> $B$9$k$N$,LLE]$8$c$J$$$G$9(B?
> 
$B$^$?!"(Busing$B$r;H$C$F$$$J$$%3%s%F%-%9%H$G8F$P$l$?;~$K!"%a%=%C%IC5:w$N%3%9%H$,A}$($k$h$&$K(B
> $B;W$$$^$9!#(B

$B$=$&$$$C$?%G%a%j%C%H$b$?$7$+$K9M$($i$l$k$N$G$9$,!"Nc$($P0J2<$N$h(B
$B$&$K(Busing$B$N$"$H$G$5$i$K(Brefine$B$5$l$?>l9g$O$=$N%a%=%C%I%(%s%H%j$O(B
$B=q$-49$($i$l$J$$$N$G$O$J$$$+$H$$$&5$$,$7$^$9!#(B

  class X
  end
  module M
    refine(X) {}
  end
  using M
  module M
    refine(X) {def foo;:foo;end}
  end
  p X.new.foo

refine$BCf$G$OBP>]$N%/%i%9$O$o$+$C$F$$$k$o$1$@$+$i!"%a%=%C%IDj5A$N(B
$B$H$-$K$9$G$K=q$-49$($i$l$?%a%=%C%I%(%s%H%j$r=q$-D>$7$F$^$o$l$P$$(B
$B$$$N$+$J!#(B
Posted by Shugo Maeda (Guest)
on 2012-11-16 09:23
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B16$BF|(B 17:02 Nobuyoshi Nakada <nobu@ruby-lang.org>:
>   end
> $B$H$-$K$9$G$K=q$-49$($i$l$?%a%=%C%I%(%s%H%j$r=q$-D>$7$F$^$o$l$P$$(B
> $B$$$N$+$J!#(B

refine$B$N%V%m%C%/Fb$G%a%=%C%IDj5A$9$k$?$S$K%a%=%C%I%(%s%H%j$rDI2CKt$OJQ99$9$k$b$N$H;W$C$F(B
$B$$$^$7$?$,!"(Bprepend$B%Y!<%9$N0F$@$H$=$&$7$J$/$F$h$$$s$G$9(B?
# prepend$B%Y!<%9$@$HDI2C$@$1$G$h$/$J$k$H;W$$$^$9$,!#(B

$B$I$A$i$+$H$$$&$H!"(Brb_method_definition_t::body$B$K85$N%a%=%C%I%(%s%H%j$rJ]B8$9$kJ}K!$@$H(B
$B%a%b%j4IM}$NLL$GLLE](B($B%a%=%C%I%(%s%H%j$O%a%b%j4IM}$,FC<l$J$N$G(B)$B$J5$$,$7$F$-$?$N$G!"(B
$B$=$&$$$&0UL#$G(Bprepend$B%Y!<%9$NJ}$,$9$C$-$j$9$k$+$b$7$l$J$$$G$9$M!#(B
Posted by SASADA Koichi (Guest)
on 2012-11-16 09:53
(Received via mailing list)
(2012/11/16 17:22), Shugo Maeda wrote:
>> $B=q$-49$($i$l$J$$$N$G$O$J$$$+$H$$$&5$$,$7$^$9!#(B
>>   p X.new.foo
>>
>> refine$BCf$G$OBP>]$N%/%i%9$O$o$+$C$F$$$k$o$1$@$+$i!"%a%=%C%IDj5A$N(B
>> $B$H$-$K$9$G$K=q$-49$($i$l$?%a%=%C%I%(%s%H%j$r=q$-D>$7$F$^$o$l$P$$(B
>> $B$$$N$+$J!#(B
>
> 
refine$B$N%V%m%C%/Fb$G%a%=%C%IDj5A$9$k$?$S$K%a%=%C%I%(%s%H%j$rDI2CKt$OJQ99$9$k$b$N$H;W$C$F(B
> $B$$$^$7$?$,!"(Bprepend$B%Y!<%9$N0F$@$H$=$&$7$J$/$F$h$$$s$G$9(B?
> # prepend$B%Y!<%9$@$HDI2C$@$1$G$h$/$J$k$H;W$$$^$9$,!#(B


$B!!>/$J$/$H$b:#2s$NNc$O!$(B2$B2sL\$N(B refine $B$^$G(B X::foo 
$B$ODI2C$5$l$J$$$H;W$&(B
$B$N$G2?$bLdBjL5$$$H;W$&$s$G$9$,!$4*0c$$$G$7$g$&$+!%(B

> 
$B$I$A$i$+$H$$$&$H!"(Brb_method_definition_t::body$B$K85$N%a%=%C%I%(%s%H%j$rJ]B8$9$kJ}K!$@$H(B
> 
$B%a%b%j4IM}$NLL$GLLE](B($B%a%=%C%I%(%s%H%j$O%a%b%j4IM}$,FC<l$J$N$G(B)$B$J5$$,$7$F$-$?$N$G!"(B
> $B$=$&$$$&0UL#$G(Bprepend$B%Y!<%9$NJ}$,$9$C$-$j$9$k$+$b$7$l$J$$$G$9$M!#(B

$B!!$(!<$H!$FC<l$+$J$!!%$?$s$K!$(Brefine type $B$J(B definition 
$B$,>C$($?$H$-$K!$(B
$B0l=o$K(B original_definition $B$r>C$;$P$$$$$@$1$N$h$&$J!%(B

$B!!$$$d!$$d$C$F$_$J$$$H$o$+$i$J$$$+$b$7$l$J$$$G$9$,!$2?$+J#;(2x4q$J%j%U%!(B
$B%l%s%9$r;}$A2s$k$h$&$J>l9g$O$o$+$i$s$G$9$,!$$=$&$J$kNc$,;W$$$D$-$^$;$s$G(B
$B$7$?!%(B

$B!!$=$&$$$($P(B alias $B$C$F$I$&$J$s$@$m$&!%(B
Posted by Shugo Maeda (Guest)
on 2012-11-16 10:08
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B16$BF|(B 17:52 SASADA Koichi <ko1@atdot.net>:
>> 
refine$B$N%V%m%C%/Fb$G%a%=%C%IDj5A$9$k$?$S$K%a%=%C%I%(%s%H%j$rDI2CKt$OJQ99$9$k$b$N$H;W$C$F(B
>> $B$$$^$7$?$,!"(Bprepend$B%Y!<%9$N0F$@$H$=$&$7$J$/$F$h$$$s$G$9(B?
>> # prepend$B%Y!<%9$@$HDI2C$@$1$G$h$/$J$k$H;W$$$^$9$,!#(B
>
>
> $B!!>/$J$/$H$b:#2s$NNc$O!$(B2$B2sL\$N(B refine $B$^$G(B X::foo 
$B$ODI2C$5$l$J$$$H;W$&(B
> $B$N$G2?$bLdBjL5$$$H;W$&$s$G$9$,!$4*0c$$$G$7$g$&$+!%(B

prepend$B%Y!<%9$K$7$J$/$F$bLdBj$J$$$H$$$&$3$H$G$9$h$M!#(B
$B;d$b$=$&;W$&$N$G$9$,!"$J$+$@$5$s$O0c$&<BAu$N%$%a!<%8$J$N$+$J$"$H;W$C$F",$N$h$&$K=q$-$^$7$?!#(B

>> 
$B$I$A$i$+$H$$$&$H!"(Brb_method_definition_t::body$B$K85$N%a%=%C%I%(%s%H%j$rJ]B8$9$kJ}K!$@$H(B
>> 
$B%a%b%j4IM}$NLL$GLLE](B($B%a%=%C%I%(%s%H%j$O%a%b%j4IM}$,FC<l$J$N$G(B)$B$J5$$,$7$F$-$?$N$G!"(B
>> $B$=$&$$$&0UL#$G(Bprepend$B%Y!<%9$NJ}$,$9$C$-$j$9$k$+$b$7$l$J$$$G$9$M!#(B
>
> $B!!$(!<$H!$FC<l$+$J$!!%$?$s$K!$(Brefine type $B$J(B definition 
$B$,>C$($?$H$-$K!$(B
> $B0l=o$K(B original_definition $B$r>C$;$P$$$$$@$1$N$h$&$J!%(B

rb_method_entry_t$B$8$c$J$/$F(Brb_method_definition_t$B$N>pJs$@$1J]B8$7$F!"(Bflag$B$H$+$O(B
refined$B$J%a%=%C%I%(%s%H%j(B(rb_method_entry_t)$B$NJ}$K;}$?$;$k$H$$$&$3$H$G$9$+(B?
$B%*%j%8%J%k$N(Brb_method_entry_t$B$rJ]B8$7$F$*$/$H$$$&OC$@$H;W$C$F$$$?$N$GLLE]$=$&$@$J(B
$B$H;W$C$F$$$^$7$?!#(B

original_definition$B$r>C$9$H$$$&$N$O(Balias_count$B$,(B0$B$K$J$C$?$i!"$H$$$&$3$H$G9g$C$F$^$9(B?
$B8F$S=P$7;~$K$O?7$7$$(Brb_method_entry_t$B$rMQ0U$7$F(Brefined$B$J%a%=%C%I%(%s%H%j$N>pJs$r(B
$B%3%T!<$9$k46$8$G$9$+$M!#(B

> $B!!$$$d!$$d$C$F$_$J$$$H$o$+$i$J$$$+$b$7$l$J$$$G$9$,!$2?$+J#;(2x4q$J%j%U%!(B
> $B%l%s%9$r;}$A2s$k$h$&$J>l9g$O$o$+$i$s$G$9$,!$$=$&$J$kNc$,;W$$$D$-$^$;$s$G(B
> $B$7$?!%(B
>
> $B!!$=$&$$$($P(B alias $B$C$F$I$&$J$s$@$m$&!%(B

refined$B$J%a%=%C%I$N(Balias$B$r:n$k;~$O!"(Brefined$B$8$c$J$$J}$N(Brb_method_definiton_t$B$r0z$C$Q$C$F(B
$BMh$F(Balias$B$N%(%s%H%j$r:n$k$N$+$J$H;W$C$F$$$^$7$?$,!"$=$&$$$&OC$G$O$J$/(B?
Posted by Shugo Maeda (Guest)
on 2012-11-18 16:53
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B16$BF|(B 18:07 Shugo Maeda <shugo@ruby-lang.org>:
> $B$H;W$C$F$$$^$7$?!#(B
>
> 
original_definition$B$r>C$9$H$$$&$N$O(Balias_count$B$,(B0$B$K$J$C$?$i!"$H$$$&$3$H$G9g$C$F$^$9(B?
> 
$B8F$S=P$7;~$K$O?7$7$$(Brb_method_entry_t$B$rMQ0U$7$F(Brefined$B$J%a%=%C%I%(%s%H%j$N>pJs$r(B
> $B%3%T!<$9$k46$8$G$9$+$M!#(B

$B$H$j$"$($:!">e5-$NJ}?K$G<BAu$7$F$_$^$7$?!#(B

  http://shugo.net/tmp/refinement_fix_1119.diff

$B?'!9$Hf+$,$"$C$F;W$C$?$h$jBgJQ$G$7$?!D!#(B
Posted by Shugo Maeda (Guest)
on 2012-11-19 05:16
(Received via mailing list)
$BA0ED$G$9!#(B

2012$BG/(B11$B7n(B19$BF|(B 0:53 Shugo Maeda <shugo@ruby-lang.org>:
> $B$H$j$"$($:!">e5-$NJ}?K$G<BAu$7$F$_$^$7$?!#(B
>
>   http://shugo.net/tmp/refinement_fix_1119.diff

$B%Y%s%A%^!<%/$r<h$C$F$_$^$7$?!#(B
$B:8$,=$@5A0!"1&$,=$@58e$G$9!#(B
VirtualBox$B>e$G<h$C$?$N$G$I$J$?$+DI;n$7$F$$$?$@$1$k$H$"$j$,$?$$$G$9!#(B

benchmark results:
Execution time (sec)
name ruby 2.0.0dev (2012-11-17 trunk 37698) [i686-linux] ruby 2.0.0dev
(2012-11-17 trunk 37698) [i686-linux]
app_mandelbrot 4.913 5.017
app_tak 2.839 2.908
app_tarai 2.317 2.346
loop_whileloop 1.540 1.572
loop_whileloop2 0.337 0.332
so_mandelbrot 14.508 14.347
vm1_yield* 1.682 1.389
vm2_defined_method* 5.978 6.099
vm2_method* 3.191 3.090
vm2_method_missing* 5.432 4.683
vm2_method_with_block* 3.105 3.095
vm2_poly_method* 5.922 5.224
vm2_poly_method_ov* 0.520 0.508
vm3_clearmethodcache 0.864 0.762

Speedup ratio comare with the result of `["ruby-r37698-optimized",
"ruby 2.0.0dev (2012-11-17 trunk 37698) [i686-linux]"]' (greater is
better)
name ruby 2.0.0dev (2012-11-17 trunk 37698) [i686-linux]
app_mandelbrot 0.979
app_tak 0.976
app_tarai 0.988
loop_whileloop 0.980
loop_whileloop2 1.014
so_mandelbrot 1.011
vm1_yield* 1.211
vm2_defined_method* 0.980
vm2_method* 1.033
vm2_method_missing* 1.160
vm2_method_with_block* 1.003
vm2_poly_method* 1.134
vm2_poly_method_ov* 1.025
vm3_clearmethodcache 1.133
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.