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

ruby-changes:11324

From: matz <ko1@a...>
Date: Sat, 14 Mar 2009 01:15:26 +0900 (JST)
Subject: [ruby-changes:11324] Ruby:r22939 (ruby_1_8): * eval.c (rb_call0): should pass rest argument information even

matz	2009-03-14 01:14:40 +0900 (Sat, 14 Mar 2009)

  New Revision: 22939

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

  Log:
    * eval.c (rb_call0): should pass rest argument information even
      when it's empty.  [ruby-dev:38117]

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/env.h
    branches/ruby_1_8/eval.c

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 22938)
+++ ruby_1_8/ChangeLog	(revision 22939)
@@ -1,3 +1,8 @@
+Fri Mar 13 19:44:21 2009  Yukihiro Matsumoto  <matz@r...>
+
+	* eval.c (rb_call0): should pass rest argument information even
+	  when it's empty.  [ruby-dev:38117]
+
 Fri Mar 13 19:41:09 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* mkconfig.rb (patchlevel): config.status may not contain
Index: ruby_1_8/env.h
===================================================================
--- ruby_1_8/env.h	(revision 22938)
+++ ruby_1_8/env.h	(revision 22939)
@@ -31,6 +31,7 @@
 
 #define FRAME_DMETH  1
 #define FRAME_FUNC   2
+#define FRAME_REST_ARG   4
 
 extern struct SCOPE {
     struct RBasic super;
Index: ruby_1_8/eval.c
===================================================================
--- ruby_1_8/eval.c	(revision 22938)
+++ ruby_1_8/eval.c	(revision 22939)
@@ -3586,6 +3586,15 @@
 		    }
 		    argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
 		}
+		else if (ruby_frame->flags & FRAME_REST_ARG) {
+		    VALUE rest = ruby_scope->local_vars[argc+2];
+
+		    /* check if T_ARRAY */;
+		    argv = TMP_ALLOC(argc + RARRAY(rest)->len);
+		    MEMCPY(argv, ruby_scope->local_vars+2, VALUE, argc);
+		    MEMCPY(argv+argc, RARRAY(rest)->ptr, VALUE, RARRAY(rest)->len);
+		    argc += RARRAY(rest)->len;
+		}
 		else if (!ruby_scope->local_vars) {
 		    argc = 0;
 		    argv = 0;
@@ -6095,6 +6104,7 @@
 			    i = -i - 1;
 			}
 			else {
+			    ruby_frame->flags |= FRAME_REST_ARG;
 			    v = rb_ary_new2(0);
 			}
 			assign(recv, node->nd_rest, v, 1);

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

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