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

ruby-changes:25841

From: ko1 <ko1@a...>
Date: Tue, 27 Nov 2012 20:58:24 +0900 (JST)
Subject: [ruby-changes:25841] ko1:r37898 (trunk): * vm.c (rb_vm_make_env_object): make Proc object if Env is possible

ko1	2012-11-27 20:58:10 +0900 (Tue, 27 Nov 2012)

  New Revision: 37898

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

  Log:
    * vm.c (rb_vm_make_env_object): make Proc object if Env is possible
      to point block.
      [ruby-core:41038] [ruby-trunk - Bug #5634]
    * vm.c (rb_vm_make_proc): No need to make Proc object here.
    * bootstraptest/test_proc.rb: add tests.

  Modified files:
    trunk/ChangeLog
    trunk/bootstraptest/test_proc.rb
    trunk/vm.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37897)
+++ ChangeLog	(revision 37898)
@@ -1,3 +1,13 @@
+Tue Nov 27 19:56:43 2012  Koichi Sasada  <ko1@a...>
+
+	* vm.c (rb_vm_make_env_object): make Proc object if Env is possible
+	  to point block.
+	  [ruby-core:41038] [ruby-trunk - Bug #5634]
+
+	* vm.c (rb_vm_make_proc): No need to make Proc object here.
+
+	* bootstraptest/test_proc.rb: add tests.
+
 Tue Nov 27 18:51:06 2012  Naohisa Goto  <ngotogenome@g...>
 
 	* ruby_atomic.h (ATOMIC_CAS): added for Solaris and other platforms.
Index: bootstraptest/test_proc.rb
===================================================================
--- bootstraptest/test_proc.rb	(revision 37897)
+++ bootstraptest/test_proc.rb	(revision 37898)
@@ -456,3 +456,28 @@
   end
 }
 
+assert_equal 'ok', %q{
+  def x
+    binding
+  end
+  b = x{|a| a }
+  b.eval('yield("ok")')
+}, '[Bug #5634]'
+
+assert_equal 'ok', %q{
+  def x
+    binding
+  end
+  eval("x { 'ok' }").eval "yield"
+}, '[Bug #5634]'
+
+assert_equal 'ok', %q{
+  def x
+    binding
+  end
+  def m
+    x{ 'ok' }
+  end
+  eval('yield', m)
+}, '[Bug #5634]'
+
Index: vm.c
===================================================================
--- vm.c	(revision 37897)
+++ vm.c	(revision 37898)
@@ -476,13 +476,23 @@
 }
 
 static void vm_rewrite_ep_in_errinfo(rb_thread_t *th);
+static VALUE vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block);
 
 VALUE
 rb_vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp)
 {
     VALUE envval;
+    VALUE *lep = VM_CF_LEP(cfp);
+    rb_block_t *blockptr = VM_EP_BLOCK_PTR(lep);
 
-    envval = vm_make_env_each(th, cfp, cfp->ep, VM_CF_LEP(cfp));
+    if (blockptr) {
+	VALUE blockprocval = vm_make_proc_from_block(th, blockptr);
+	rb_proc_t *p;
+	GetProcPtr(blockprocval, p);
+	lep[0] = VM_ENVVAL_BLOCK_PTR(&p->block);
+    }
+
+    envval = vm_make_env_each(th, cfp, cfp->ep, lep);
     vm_rewrite_ep_in_errinfo(th);
 
     if (PROCDEBUG) {
@@ -545,21 +555,11 @@
     VALUE procval, envval, blockprocval = 0;
     rb_proc_t *proc;
     rb_control_frame_t *cfp = RUBY_VM_GET_CFP_FROM_BLOCK_PTR(block);
-    rb_block_t *block2;
 
     if (block->proc) {
 	rb_bug("rb_vm_make_proc: Proc value is already created.");
     }
 
-    if ((block2 = VM_CF_BLOCK_PTR(cfp)) != 0) {
-	rb_proc_t *p;
-
-	blockprocval = vm_make_proc_from_block(th, block2);
-
-	GetProcPtr(blockprocval, p);
-	*VM_CF_LEP(cfp) = VM_ENVVAL_BLOCK_PTR(&p->block);
-    }
-
     envval = rb_vm_make_env_object(th, cfp);
 
     if (PROCDEBUG) {

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

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