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

ruby-changes:39914

From: nobu <ko1@a...>
Date: Thu, 1 Oct 2015 19:53:02 +0900 (JST)
Subject: [ruby-changes:39914] nobu:r51995 (trunk): vm_args.c: fix marking symbol ifunc

nobu	2015-10-01 19:52:52 +0900 (Thu, 01 Oct 2015)

  New Revision: 51995

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

  Log:
    vm_args.c: fix marking symbol ifunc
    
    * vm_args.c (vm_caller_setup_arg_block): store new ifunc for
      symbol in control frame proc to be marked.
    
    * proc.c (proc_new), vm_insnhelper.c (vm_yield_with_cfunc):
      block->proc may be an ifunc now.

  Modified files:
    trunk/proc.c
    trunk/vm_args.c
    trunk/vm_insnhelper.c
Index: proc.c
===================================================================
--- proc.c	(revision 51994)
+++ proc.c	(revision 51995)
@@ -596,6 +596,13 @@ proc_new(VALUE klass, int8_t is_lambda) https://github.com/ruby/ruby/blob/trunk/proc.c#L596
     procval = block->proc;
 
     if (procval) {
+	if (RUBY_VM_IFUNC_P(procval)) {
+	    VALUE newprocval = rb_proc_alloc(klass);
+	    rb_proc_t *proc = RTYPEDDATA_DATA(newprocval);
+	    proc->block.iseq = (rb_iseq_t *)procval;
+	    proc->block.proc = newprocval;
+	    return newprocval;
+	}
 	if (RBASIC(procval)->klass == klass) {
 	    return procval;
 	}
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 51994)
+++ vm_insnhelper.c	(revision 51995)
@@ -2297,11 +2297,10 @@ vm_yield_with_cfunc(rb_thread_t *th, con https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L2297
 {
     const struct vm_ifunc *ifunc = (struct vm_ifunc *)block->iseq;
     VALUE val, arg, blockarg;
-    int lambda = block_proc_is_lambda(block->proc);
     const rb_callable_method_entry_t *me = th->passed_bmethod_me;
     th->passed_bmethod_me = NULL;
 
-    if (lambda) {
+    if (!RUBY_VM_IFUNC_P(block->proc) && block_proc_is_lambda(block->proc)) {
 	arg = rb_ary_new4(argc, argv);
     }
     else if (argc == 0) {
Index: vm_args.c
===================================================================
--- vm_args.c	(revision 51994)
+++ vm_args.c	(revision 51995)
@@ -776,12 +776,21 @@ vm_caller_setup_arg_block(const rb_threa https://github.com/ruby/ruby/blob/trunk/vm_args.c#L776
 
 	proc = *(--reg_cfp->sp);
 
-	if (SYMBOL_P(proc) && rb_method_basic_definition_p(rb_cSymbol, idTo_proc)) {
+	if (NIL_P(proc)) {
+	    calling->blockptr = NULL;
+	}
+	else if (SYMBOL_P(proc) && rb_method_basic_definition_p(rb_cSymbol, idTo_proc)) {
+	    calling->blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(reg_cfp);
+	    blockiseq = (rb_iseq_t *)IFUNC_NEW(rb_sym_proc_call, SYM2ID(proc), 0);
+	    calling->blockptr->iseq = blockiseq;
+	    calling->blockptr->proc = (VALUE)blockiseq;
+	}
+	else if (RUBY_VM_IFUNC_P(proc)) {
 	    calling->blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(reg_cfp);
-	    calling->blockptr->iseq = (rb_iseq_t *)IFUNC_NEW(rb_sym_proc_call, SYM2ID(proc), 0);
-	    calling->blockptr->proc = 0;
+	    calling->blockptr->iseq = (rb_iseq_t *)proc;
+	    calling->blockptr->proc = proc;
 	}
-	else if (!NIL_P(proc)) {
+	else {
 	    if (!rb_obj_is_proc(proc)) {
 		VALUE b;
 		b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
@@ -797,9 +806,6 @@ vm_caller_setup_arg_block(const rb_threa https://github.com/ruby/ruby/blob/trunk/vm_args.c#L806
 	    calling->blockptr = &po->block;
 	    RUBY_VM_GET_BLOCK_PTR_IN_CFP(reg_cfp)->proc = proc;
 	}
-	else {
-	    calling->blockptr = NULL;
-	}
     }
     else if (blockiseq != 0) { /* likely */
 	rb_block_t *blockptr = calling->blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(reg_cfp);

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

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