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

ruby-changes:2353

From: ko1@a...
Date: 9 Nov 2007 10:29:36 +0900
Subject: [ruby-changes:2353] nobu - Ruby:r13844 (trunk): * eval.c (rb_invoke_method): check if invoked in function style.

nobu	2007-11-09 10:29:24 +0900 (Fri, 09 Nov 2007)

  New Revision: 13844

  Modified files:
    trunk/ChangeLog
    trunk/eval.c
    trunk/insnhelper.ci
    trunk/vm.c

  Log:
    * eval.c (rb_invoke_method): check if invoked in function style.
      [ruby-core:13245]
    
    * insnhelper.ci (vm_call_cfunc, vm_cfunc_flags): stores and returns VM
      calling flags.
    
    * vm.c (rb_vm_cfunc_funcall_p): returns if the current method is
      invoked in function style.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/insnhelper.ci?r1=13844&r2=13843
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13844&r2=13843
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/eval.c?r1=13844&r2=13843
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/vm.c?r1=13844&r2=13843

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 13843)
+++ ChangeLog	(revision 13844)
@@ -1,3 +1,14 @@
+Fri Nov  9 10:29:21 2007  Nobuyoshi Nakada  <nobu@r...>
+
+	* eval.c (rb_invoke_method): check if invoked in function style.
+	  [ruby-core:13245]
+
+	* insnhelper.ci (vm_call_cfunc, vm_cfunc_flags): stores and returns VM
+	  calling flags.
+
+	* vm.c (rb_vm_cfunc_funcall_p): returns if the current method is
+	  invoked in function style.
+
 Fri Nov  9 10:10:21 2007  Koichi Sasada  <ko1@a...>
 
 	* cont.c: add rb_context_t#type.
@@ -11,7 +22,9 @@
 	* random.c: update MT URL.[ruby-core:13305].
 
 Thu Nov  8 17:09:55 2007  David Flanagan  <davidflanagan@r...>
+
 	* object.c: improve docs for Object.tap
+
 	* ChangeLog: fix bogus dates on my previous entries
 
 Thu Nov  8 15:13:56 2007 David Flanagan <davidflanagan@r...>
@@ -27,7 +40,9 @@
 
 	* parse.y: patch, based on Nobu's, work to support \u escapes
 	           also modifications for better coderange detection
+
 	* test/ruby/test_unicode_escapes.rb: test cases
+
 	* test/ruby/test_mixed_unicode_escapes.rb: mixed encoding test cases
 	
 Thu Nov  8 07:14:37 2007 David Flanagan <davidflanagan@r...>
@@ -37,6 +52,7 @@
 	  :x==:x is false when x is a multi-byte character. 
 	
 Thu Nov  8 07:04:31 2007 David Flanagan <davidflanagan@r...>
+
 	* string.c (tr_setup_table, tr_trans): fix test failures
 	  in test/ruby/test_string.rb
 	
Index: eval.c
===================================================================
--- eval.c	(revision 13843)
+++ eval.c	(revision 13844)
@@ -1507,11 +1507,11 @@
 VALUE
 rb_invoke_method(int argc, VALUE *argv, VALUE recv)
 {
+    int rb_vm_cfunc_funcall_p(rb_control_frame_t *);
     int scope = NOEX_PUBLIC;
     rb_thread_t *th = GET_THREAD();
-    rb_control_frame_t *cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
 
-    if (SPECIAL_CONST_P(cfp->sp[0])) {
+    if (rb_vm_cfunc_funcall_p(th->cfp)) {
 	scope = NOEX_NOSUPER | NOEX_PRIVATE;
     }
 
Index: vm.c
===================================================================
--- vm.c	(revision 13843)
+++ vm.c	(revision 13844)
@@ -1436,6 +1436,14 @@
     return val;
 }
 
+int
+rb_vm_cfunc_funcall_p(rb_control_frame_t *cfp)
+{
+    if (vm_cfunc_flags(cfp) & (VM_CALL_FCALL_BIT | VM_CALL_VCALL_BIT))
+	return Qtrue;
+    return Qfalse;
+}
+
 /* vm */
 
 static void
Index: insnhelper.ci
===================================================================
--- insnhelper.ci	(revision 13843)
+++ insnhelper.ci	(revision 13844)
@@ -48,7 +48,7 @@
     cfp->sp = sp + 1;
     cfp->bp = sp + 1;
     cfp->iseq = iseq;
-    cfp->flag = VM_FRAME_FLAG(type);
+    cfp->flag = type;
     cfp->self = self;
     cfp->lfp = lfp;
     cfp->dfp = dfp;
@@ -347,15 +347,16 @@
 
 static inline VALUE
 vm_call_cfunc(rb_thread_t *th, rb_control_frame_t *reg_cfp, int num,
-	      ID id, VALUE recv, VALUE klass, NODE *mn, rb_block_t *blockptr)
+	      ID id, VALUE recv, VALUE klass, VALUE flag,
+	      NODE *mn, rb_block_t *blockptr)
 {
     VALUE val;
 
     EXEC_EVENT_HOOK(th, RUBY_EVENT_C_CALL, recv, id, klass);
     {
 	rb_control_frame_t *cfp =
-	  vm_push_frame(th, 0, FRAME_MAGIC_CFUNC,
-			recv, (VALUE) blockptr, 0, reg_cfp->sp, 0, 1);
+	    vm_push_frame(th, 0, FRAME_MAGIC_CFUNC | flag * (FRAME_MAGIC_MASK + 1),
+			  recv, (VALUE) blockptr, 0, reg_cfp->sp, 0, 1);
 
 	cfp->method_id = id;
 	cfp->method_klass = klass;
@@ -374,6 +375,14 @@
     return val;
 }
 
+static int
+vm_cfunc_flags(rb_control_frame_t *cfp)
+{
+    if (RUBYVM_CFUNC_FRAME_P(cfp))
+	return cfp->flag / (FRAME_MAGIC_MASK + 1);
+    return 0;
+}
+
 static inline VALUE
 vm_call_bmethod(rb_thread_t *th, ID id, VALUE procval, VALUE recv,
 		VALUE klass, int argc, VALUE *argv)
@@ -487,7 +496,7 @@
 		  return Qundef;
 	      }
 	      case NODE_CFUNC:{
-		  val = vm_call_cfunc(th, cfp, num, id, recv, klass, node, blockptr);
+		  val = vm_call_cfunc(th, cfp, num, id, recv, klass, flag, node, blockptr);
 		  break;
 	      }
 	      case NODE_ATTRSET:{

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

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