summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-03-23 01:52:05 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-03-23 01:52:05 +0000
commit0b3aa7e5927aab18cbac4a6bd53f906a5bbd4337 (patch)
tree92592c2c60defc7b074d82c958637e4a77ebd4d8
parent3003ddcb74a3ec3103c349133c3b45eeb727be44 (diff)
downloadruby-0b3aa7e5927aab18cbac4a6bd53f906a5bbd4337.tar.gz
ruby-0b3aa7e5927aab18cbac4a6bd53f906a5bbd4337.tar.xz
ruby-0b3aa7e5927aab18cbac4a6bd53f906a5bbd4337.zip
* 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
-rw-r--r--ChangeLog5
-rw-r--r--eval.c17
2 files changed, 19 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 92f067849..43d0dc99f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
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);
}