[前][次][番号順一覧][スレッド一覧]

ruby-changes:17314

From: nobu <ko1@a...>
Date: Thu, 23 Sep 2010 09:01:48 +0900 (JST)
Subject: [ruby-changes:17314] Ruby:r29318 (trunk): * vm_insnhelper.c (vm_cref_push): no outer cref is needed for proc

nobu	2010-09-23 09:01:40 +0900 (Thu, 23 Sep 2010)

  New Revision: 29318

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29318

  Log:
    * vm_insnhelper.c (vm_cref_push): no outer cref is needed for proc
      from method.  Bug #3786, Bug #3860, [ruby-core:32501]

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_eval.rb
    trunk/vm_insnhelper.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 29317)
+++ ChangeLog	(revision 29318)
@@ -1,3 +1,8 @@
+Thu Sep 23 09:01:28 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* vm_insnhelper.c (vm_cref_push): no outer cref is needed for proc
+	  from method.  Bug #3786, Bug #3860, [ruby-core:32501]
+
 Wed Sep 22 17:12:01 2010  Kazuhiro NISHIYAMA  <zn@m...>
 
 	* test/openssl/utils.rb (OpenSSL#silent): always restore $VERBOSE.
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 29317)
+++ vm_insnhelper.c	(revision 29318)
@@ -1053,22 +1053,24 @@
 }
 
 static NODE *
-vm_get_cref(const rb_iseq_t *iseq, const VALUE *lfp, const VALUE *dfp)
+vm_get_cref0(const rb_iseq_t *iseq, const VALUE *lfp, const VALUE *dfp)
 {
-    NODE *cref = 0;
-
     while (1) {
 	if (lfp == dfp) {
-	    cref = iseq->cref_stack;
-	    break;
+	    return iseq->cref_stack;
 	}
 	else if (dfp[-1] != Qnil) {
-	    cref = (NODE *)dfp[-1];
-	    break;
+	    return (NODE *)dfp[-1];
 	}
 	dfp = GET_PREV_DFP(dfp);
     }
+}
 
+static NODE *
+vm_get_cref(const rb_iseq_t *iseq, const VALUE *lfp, const VALUE *dfp)
+{
+    NODE *cref = vm_get_cref0(iseq, lfp, dfp);
+
     if (cref == 0) {
 	rb_bug("vm_get_cref: unreachable");
     }
@@ -1084,10 +1086,10 @@
     cref->nd_visi = noex;
 
     if (blockptr) {
-	cref->nd_next = vm_get_cref(blockptr->iseq, blockptr->lfp, blockptr->dfp);
+	cref->nd_next = vm_get_cref0(blockptr->iseq, blockptr->lfp, blockptr->dfp);
     }
     else if (cfp) {
-	cref->nd_next = vm_get_cref(cfp->iseq, cfp->lfp, cfp->dfp);
+	cref->nd_next = vm_get_cref0(cfp->iseq, cfp->lfp, cfp->dfp);
     }
 
     return cref;
Index: test/ruby/test_eval.rb
===================================================================
--- test/ruby/test_eval.rb	(revision 29317)
+++ test/ruby/test_eval.rb	(revision 29318)
@@ -415,4 +415,19 @@
     assert_raise(ArgumentError) {eval("__ENCODING__".encode("utf-32be"))}
     assert_raise(ArgumentError) {eval("__ENCODING__".encode("utf-32le"))}
   end
+
+  def test_instance_eval_method_proc
+    bug3860 = Class.new do
+      def initialize(a);
+        @a=a
+      end
+      def get(*args)
+        @a
+      end
+    end
+    foo = bug3860.new 1
+    foo_pr = foo.method(:get).to_proc
+    result = foo.instance_eval(&foo_pr)
+    assert_equal(1, result, 'Bug #3786, Bug #3860, [ruby-core:32501]')
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]