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

ruby-changes:25145

From: ko1 <ko1@a...>
Date: Tue, 16 Oct 2012 02:41:03 +0900 (JST)
Subject: [ruby-changes:25145] ko1:r37197 (trunk): * vm_insnhelper.h (CI_SET_FASTPATH): add new parameter `enabled'.

ko1	2012-10-16 02:40:50 +0900 (Tue, 16 Oct 2012)

  New Revision: 37197

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

  Log:
    * vm_insnhelper.h (CI_SET_FASTPATH): add new parameter `enabled'.
      If `enable' is 0 then CI_SET_FASTPATH() doesn't work.
      And add new configuration option OPT_CALL_FASTPATH. If this macro
      was defined by 0, then CI_SET_FASTPATH() doesn't work any more.
    * vm_insnhelper.c (vm_call_method): Pass `0' for `enabled' parameter
      of CI_SET_FASTPATH if this method is protected.

  Modified files:
    trunk/ChangeLog
    trunk/vm_insnhelper.c
    trunk/vm_insnhelper.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37196)
+++ ChangeLog	(revision 37197)
@@ -1,3 +1,13 @@
+Tue Oct 16 02:32:29 2012  Koichi Sasada  <ko1@a...>
+
+	* vm_insnhelper.h (CI_SET_FASTPATH): add new parameter `enabled'.
+	  If `enable' is 0 then CI_SET_FASTPATH() doesn't work.
+	  And add new configuration option OPT_CALL_FASTPATH. If this macro
+	  was defined by 0, then CI_SET_FASTPATH() doesn't work any more.
+
+	* vm_insnhelper.c (vm_call_method): Pass `0' for `enabled' parameter
+	  of CI_SET_FASTPATH if this method is protected.
+
 Tue Oct 16 02:17:35 2012  Koichi Sasada  <ko1@a...>
 
 	* vm_core.h (VM_CALL_*): rename VM_CALL_*_BIT
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 37196)
+++ vm_insnhelper.c	(revision 37197)
@@ -1183,7 +1183,7 @@
 	    argument_error((iseq), ((ci)->argc), (iseq)->argc, (iseq)->argc); \
 	} \
 	(ci)->opt_pc = 0; \
-	if (!is_lambda) CI_SET_FASTPATH((ci), vm_call_iseq_setup_2); \
+	CI_SET_FASTPATH((ci), vm_call_iseq_setup_2, !(is_lambda) && ((ci)->me->flag & NOEX_PROTECTED)); \
     } \
     else { \
 	(ci)->opt_pc = vm_callee_setup_arg_complex((th), (ci), (iseq), (argv)); \
@@ -1489,6 +1489,7 @@
 vm_call_method(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
 {
     VALUE val;
+    int enable_fastpath = 1;
 
   start_method_dispatch:
     if (ci->me != 0) {
@@ -1496,34 +1497,34 @@
 	  normal_method_dispatch:
 	    switch (ci->me->def->type) {
 	      case VM_METHOD_TYPE_ISEQ:{
-		CI_SET_FASTPATH(ci, vm_call_iseq_setup);
+		CI_SET_FASTPATH(ci, vm_call_iseq_setup, enable_fastpath);
 		return vm_call_iseq_setup(th, cfp, ci);
 	      }
 	      case VM_METHOD_TYPE_NOTIMPLEMENTED:
 	      case VM_METHOD_TYPE_CFUNC:{
-		CI_SET_FASTPATH(ci, vm_call_cfunc);
+		CI_SET_FASTPATH(ci, vm_call_cfunc, enable_fastpath);
 		val = vm_call_cfunc(th, cfp, ci);
 		break;
 	      }
 	      case VM_METHOD_TYPE_ATTRSET:{
 		rb_check_arity(ci->argc, 0, 1);
-		CI_SET_FASTPATH(ci, vm_call_attrset);
+		CI_SET_FASTPATH(ci, vm_call_attrset, enable_fastpath);
 		val = vm_call_attrset(th, cfp, ci);
 		break;
 	      }
 	      case VM_METHOD_TYPE_IVAR:{
 		rb_check_arity(ci->argc, 0, 0);
-		CI_SET_FASTPATH(ci, vm_call_ivar);
+		CI_SET_FASTPATH(ci, vm_call_ivar, enable_fastpath);
 		val = vm_call_ivar(th, cfp, ci);
 		break;
 	      }
 	      case VM_METHOD_TYPE_MISSING:{
-		CI_SET_FASTPATH(ci, vm_call_missing);
+		CI_SET_FASTPATH(ci, vm_call_missing, enable_fastpath);
 		val = vm_call_missing(th, cfp, ci);
 		break;
 	      }
 	      case VM_METHOD_TYPE_BMETHOD:{
-		CI_SET_FASTPATH(ci, vm_call_bmethod);
+		CI_SET_FASTPATH(ci, vm_call_bmethod, enable_fastpath);
 		val = vm_call_bmethod(th, cfp, ci);
 		break;
 	      }
@@ -1544,12 +1545,12 @@
 	      case VM_METHOD_TYPE_OPTIMIZED:{
 		switch (ci->me->def->body.optimize_type) {
 		  case OPTIMIZED_METHOD_TYPE_SEND: {
-		    CI_SET_FASTPATH(ci, vm_call_opt_send);
+		    CI_SET_FASTPATH(ci, vm_call_opt_send, enable_fastpath);
 		    val = vm_call_opt_send(th, cfp, ci);
 		    break;
 		  }
 		  case OPTIMIZED_METHOD_TYPE_CALL: {
-		    CI_SET_FASTPATH(ci, vm_call_opt_call);
+		    CI_SET_FASTPATH(ci, vm_call_opt_call, enable_fastpath);
 		    val = vm_call_opt_call(th, cfp, ci);
 		    break;
 		  }
@@ -1576,6 +1577,7 @@
 		val = vm_method_missing(th, cfp, ci, stat);
 	    }
 	    else if (!(ci->flag & VM_CALL_OPT_SEND) && (ci->me->flag & NOEX_MASK) & NOEX_PROTECTED) {
+		enable_fastpath = 0;
 		if (!rb_obj_is_kind_of(cfp->self, ci->defined_class)) {
 		    val = vm_method_missing(th, cfp, ci, NOEX_PROTECTED);
 		}
Index: vm_insnhelper.h
===================================================================
--- vm_insnhelper.h	(revision 37196)
+++ vm_insnhelper.h	(revision 37197)
@@ -203,9 +203,18 @@
 /* set fastpath when cached method is *NOT* protected
  * because inline method cache does not care about receiver.
  */
-#define CI_SET_FASTPATH(ci, func) do { \
-    if (!(((ci)->me->flag & NOEX_MASK) & NOEX_PROTECTED)) ((ci)->call = (func)); \
+
+#ifndef OPT_CALL_FASTPATH
+#define OPT_CALL_FASTPATH 1
+#endif
+
+#if OPT_CALL_FASTPATH
+#define CI_SET_FASTPATH(ci, func, enabled) do { \
+    if (LIKELY(enabled)) ((ci)->call = (func)); \
 } while (0)
+#else
+#define CI_SET_FASTPATH(ci, func, enabled) /* do nothing */
+#endif
 
 #define GET_BLOCK_PTR() ((rb_block_t *)(GC_GUARDED_PTR_REF(GET_LEP()[0])))
 

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

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