summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-13 16:14:40 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-13 16:14:40 +0000
commit694d70cace59fcaa7517f5e2097bdf1fe586215d (patch)
treed01d82cf1e166c269e222ebc35089f1427fb1fe9
parent46b6b8d21800a40cf02e408d1ae8641102367434 (diff)
* eval.c (rb_call0): should pass rest argument information even
when it's empty. [ruby-dev:38117] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@22939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--env.h1
-rw-r--r--eval.c10
3 files changed, 16 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 6f366cf9aa..ec0c6a52e3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Mar 13 19:44:21 2009 Yukihiro Matsumoto <[email protected]>
+
+ * 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 <[email protected]>
* mkconfig.rb (patchlevel): config.status may not contain
diff --git a/env.h b/env.h
index c50103f71e..c3a44798a1 100644
--- a/env.h
+++ b/env.h
@@ -31,6 +31,7 @@ void rb_gc_mark_frame _((struct FRAME *));
#define FRAME_DMETH 1
#define FRAME_FUNC 2
+#define FRAME_REST_ARG 4
extern struct SCOPE {
struct RBasic super;
diff --git a/eval.c b/eval.c
index 2974bb252a..4c155c276e 100644
--- a/eval.c
+++ b/eval.c
@@ -3586,6 +3586,15 @@ rb_eval(self, n)
}
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 @@ rb_call0(klass, recv, id, oid, argc, argv, body, flags)
i = -i - 1;
}
else {
+ ruby_frame->flags |= FRAME_REST_ARG;
v = rb_ary_new2(0);
}
assign(recv, node->nd_rest, v, 1);