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

ruby-changes:9207

From: nobu <ko1@a...>
Date: Mon, 15 Dec 2008 14:39:59 +0900 (JST)
Subject: [ruby-changes:9207] Ruby:r20744 (trunk): * vm_eval.c (vm_call0): NODE_ZSUPER supported.

nobu	2008-12-15 14:39:39 +0900 (Mon, 15 Dec 2008)

  New Revision: 20744

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

  Log:
    * vm_eval.c (vm_call0): NODE_ZSUPER supported.  [ruby-core:20480]

  Modified files:
    trunk/ChangeLog
    trunk/vm_eval.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20743)
+++ ChangeLog	(revision 20744)
@@ -1,5 +1,7 @@
-Mon Dec 15 14:15:23 2008  Nobuyoshi Nakada  <nobu@r...>
+Mon Dec 15 14:39:37 2008  Nobuyoshi Nakada  <nobu@r...>
 
+	* vm_eval.c (vm_call0): NODE_ZSUPER supported.  [ruby-core:20480]
+
 	* vm_eval.c (vm_call_super): uses method_missing().
 
 	* vm_eval.c (method_missing): get rid of too large alloca.
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 20743)
+++ vm_eval.c	(revision 20744)
@@ -35,6 +35,7 @@
 	blockptr = th->passed_block;
 	th->passed_block = 0;
     }
+  again:
     switch (nd_type(body)) {
       case RUBY_VM_METHOD_NODE:{
 	rb_control_frame_t *reg_cfp;
@@ -99,6 +100,16 @@
 			      recv, klass, argc, (VALUE *)argv, blockptr);
 	break;
       }
+      case NODE_ZSUPER:{
+	klass = RCLASS_SUPER(klass);
+	if (!klass || !(body = rb_method_node(klass, id))) {
+	    return method_missing(recv, id, argc, argv, 0);
+	}
+	RUBY_VM_CHECK_INTS();
+	nosuper = CALL_SUPER;
+	body = body->nd_body;
+	goto again;
+      }
       default:
 	rb_bug("unsupported: vm_call0(%s)", ruby_node_name(nd_type(body)));
     }

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

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