diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-03-23 01:52:05 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-03-23 01:52:05 +0000 |
commit | 5b7cdcfb3297f0a00d05f1ecef745fee954920e4 (patch) | |
tree | 92592c2c60defc7b074d82c958637e4a77ebd4d8 /eval.c | |
parent | 1d5f0e29b6c9d15f2194abcf5c2bb78e46c8eeb0 (diff) |
* eval.c (method_missing): should support argument splat in
super. [ruby-talk:185438]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@10047 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -5576,11 +5576,22 @@ method_missing(obj, id, argc, argv, call_status) else if (id == ID_ALLOCATOR) { rb_raise(rb_eTypeError, "allocator undefined for %s", rb_class2name(obj)); } + if (argc < 0) { + VALUE tmp; - nargv = ALLOCA_N(VALUE, argc+1); - nargv[0] = ID2SYM(id); - MEMCPY(nargv+1, argv, VALUE, argc); + argc = -argc-1; + tmp = splat_value(argv[argc]); + nargv = ALLOCA_N(VALUE, argc + RARRAY(tmp)->len + 1); + MEMCPY(nargv+1, argv, VALUE, argc); + MEMCPY(nargv+1+argc, RARRAY(tmp)->ptr, VALUE, RARRAY(tmp)->len); + argc += RARRAY(tmp)->len; + } + else { + nargv = ALLOCA_N(VALUE, argc+1); + MEMCPY(nargv+1, argv, VALUE, argc); + } + nargv[0] = ID2SYM(id); return rb_funcall2(obj, missing, argc+1, nargv); } |