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

ruby-changes:39908

From: nobu <ko1@a...>
Date: Wed, 30 Sep 2015 15:47:27 +0900 (JST)
Subject: [ruby-changes:39908] nobu:r51989 (trunk): vm_args.c: optimize symbol block passing

nobu	2015-09-30 15:47:18 +0900 (Wed, 30 Sep 2015)

  New Revision: 51989

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

  Log:
    vm_args.c: optimize symbol block passing
    
    * vm_args.c (vm_caller_setup_arg_block): bypass Symbol#to_proc
      call to optimize symbol block passing.

  Modified files:
    trunk/ChangeLog
    trunk/vm_args.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 51988)
+++ ChangeLog	(revision 51989)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Sep 30 15:47:13 2015  Nobuyoshi Nakada  <nobu@r...>
+
+	* vm_args.c (vm_caller_setup_arg_block): bypass Symbol#to_proc
+	  call to optimize symbol block passing.
+
 Wed Sep 30 01:34:34 2015  Nobuyoshi Nakada  <nobu@r...>
 
 	* parse.y (parser_free): fix memory leak at syntax error when
Index: vm_args.c
===================================================================
--- vm_args.c	(revision 51988)
+++ vm_args.c	(revision 51989)
@@ -776,7 +776,12 @@ vm_caller_setup_arg_block(const rb_threa https://github.com/ruby/ruby/blob/trunk/vm_args.c#L776
 
 	proc = *(--reg_cfp->sp);
 
-	if (proc != Qnil) {
+	if (SYMBOL_P(proc) && rb_method_basic_definition_p(rb_cSymbol, idTo_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;
+	}
+	else if (!NIL_P(proc)) {
 	    if (!rb_obj_is_proc(proc)) {
 		VALUE b;
 		b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");

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

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