diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-03-13 16:14:40 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-03-13 16:14:40 +0000 |
commit | 694d70cace59fcaa7517f5e2097bdf1fe586215d (patch) | |
tree | d01d82cf1e166c269e222ebc35089f1427fb1fe9 | |
parent | 46b6b8d21800a40cf02e408d1ae8641102367434 (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-- | ChangeLog | 5 | ||||
-rw-r--r-- | env.h | 1 | ||||
-rw-r--r-- | eval.c | 10 |
3 files changed, 16 insertions, 0 deletions
@@ -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 @@ -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; @@ -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); |