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 | |
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
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | eval.c | 17 |
2 files changed, 19 insertions, 3 deletions
@@ -1,3 +1,8 @@ +Thu Mar 23 10:47:03 2006 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval.c (method_missing): should support argument splat in + super. [ruby-talk:185438] + Mon Mar 20 12:05:18 2006 Yukihiro Matsumoto <matz@ruby-lang.org> * configure.in: Solaris SunPro compiler -rapth patch from @@ -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); } |