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

ruby-changes:7209

From: nobu <ko1@a...>
Date: Wed, 20 Aug 2008 22:28:39 +0900 (JST)
Subject: [ruby-changes:7209] Ruby:r18728 (trunk): * proc.c (proc_new): use the given class.

nobu	2008-08-20 22:28:18 +0900 (Wed, 20 Aug 2008)

  New Revision: 18728

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

  Log:
    * proc.c (proc_new): use the given class.
    
    * vm.c (vm_make_proc): added an argument for the class.

  Modified files:
    trunk/ChangeLog
    trunk/proc.c
    trunk/vm.c
    trunk/vm_core.h
    trunk/vm_insnhelper.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 18727)
+++ ChangeLog	(revision 18728)
@@ -1,3 +1,9 @@
+Wed Aug 20 22:28:15 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* proc.c (proc_new): use the given class.
+
+	* vm.c (vm_make_proc): added an argument for the class.
+
 Wed Aug 20 22:24:48 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* enum.c (enum_take): get rid of extraneous iteration.
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 18727)
+++ vm_core.h	(revision 18728)
@@ -668,7 +668,7 @@
 
 VALUE vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, VALUE self,
 		     int argc, const VALUE *argv, rb_block_t *blockptr);
-VALUE vm_make_proc(rb_thread_t *th, rb_control_frame_t *cfp, const rb_block_t *block);
+VALUE vm_make_proc(rb_thread_t *th, rb_control_frame_t *cfp, const rb_block_t *block, VALUE klass);
 VALUE vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp);
 
 NOINLINE(void rb_gc_save_machine_context(rb_thread_t *));
Index: proc.c
===================================================================
--- proc.c	(revision 18727)
+++ proc.c	(revision 18728)
@@ -379,11 +379,12 @@
 	}
     }
 
-    if (block->proc) {
-	return block->proc;
+    procval = block->proc;
+    if (procval && RBASIC(procval)->klass == klass) {
+	return procval;
     }
 
-    procval = vm_make_proc(th, cfp, block);
+    procval = vm_make_proc(th, cfp, block, klass);
 
     if (is_lambda) {
 	rb_proc_t *proc;
Index: vm.c
===================================================================
--- vm.c	(revision 18727)
+++ vm.c	(revision 18728)
@@ -373,25 +373,27 @@
 
 static VALUE
 vm_make_proc_from_block(rb_thread_t *th, rb_control_frame_t *cfp,
-			rb_block_t *block)
+			rb_block_t *block, VALUE klass)
 {
     VALUE procval;
     rb_control_frame_t *bcfp;
     VALUE *bdfp;		/* to gc mark */
 
-    if (block->proc) {
-	return block->proc;
+    procval = block->proc;
+    if (procval && RBASIC(procval)->klass == klass) {
+	return procval;
     }
 
     bcfp = RUBY_VM_GET_CFP_FROM_BLOCK_PTR(block);
     bdfp = bcfp->dfp;
-    block->proc = procval = vm_make_proc(th, bcfp, block);
+    procval = vm_make_proc(th, bcfp, block, klass);
+    if (!block->proc) block->proc = procval;
     return procval;
 }
 
 VALUE
-vm_make_proc(rb_thread_t *th,
-	     rb_control_frame_t *cfp, const rb_block_t *block)
+vm_make_proc(rb_thread_t *th, rb_control_frame_t *cfp,
+	     const rb_block_t *block, VALUE klass)
 {
     VALUE procval, envval, blockprocval = 0;
     rb_proc_t *proc;
@@ -401,7 +403,7 @@
 	    rb_proc_t *p;
 
 	    blockprocval = vm_make_proc_from_block(
-		th, cfp, (rb_block_t *)GC_GUARDED_PTR_REF(*cfp->lfp));
+		th, cfp, (rb_block_t *)GC_GUARDED_PTR_REF(*cfp->lfp), klass);
 
 	    GetProcPtr(blockprocval, p);
 	    *cfp->lfp = GC_GUARDED_PTR(&p->block);
@@ -412,7 +414,7 @@
     if (PROCDEBUG) {
 	check_env_value(envval);
     }
-    procval = rb_proc_alloc(rb_cProc);
+    procval = rb_proc_alloc(klass);
     GetProcPtr(procval, proc);
     proc->blockprocval = blockprocval;
     proc->block.self = block->self;
@@ -1743,7 +1745,7 @@
 	blockptr->iseq = blockiseq;
 	blockptr->proc = 0;
 
-	proc = vm_make_proc(th, cfp, blockptr);
+	proc = vm_make_proc(th, cfp, blockptr, rb_cProc);
 	rb_set_end_proc(rb_call_end_proc, proc);
     });
     return Qnil;
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 18727)
+++ vm_insnhelper.c	(revision 18728)
@@ -188,7 +188,7 @@
 	    if (blockptr->proc == 0) {
 		rb_proc_t *proc;
 
-		blockval = vm_make_proc(th, th->cfp, blockptr);
+		blockval = vm_make_proc(th, th->cfp, blockptr, rb_cProc);
 
 		GetProcPtr(blockval, proc);
 		*block = &proc->block;
@@ -662,7 +662,7 @@
     }
 
     if (blockptr) {
-	blockarg = vm_make_proc(th, th->cfp, blockptr);
+	blockarg = vm_make_proc(th, th->cfp, blockptr, rb_cProc);
     }
     else {
 	blockarg = Qnil;

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

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