From 0b3aa7e5927aab18cbac4a6bd53f906a5bbd4337 Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 23 Mar 2006 01:52:05 +0000 Subject: * eval.c (method_missing): should support argument splat in super. [ruby-talk:185438] git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@10047 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 9f9626651..cd2533bc0 100644 --- a/eval.c +++ b/eval.c @@ -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); } -- cgit