summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-11-07 08:51:15 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-11-07 08:51:15 +0000
commit40a4d1c6e002fca5325e5fb231262754e75aa6d0 (patch)
tree19fb4f48daed687fa8a779a4219f0a23d909b017 /eval.c
parent9372e9a3ccc91b3d0b34314d1b1d9c545b6dc729 (diff)
downloadruby-40a4d1c6e002fca5325e5fb231262754e75aa6d0.tar.gz
ruby-40a4d1c6e002fca5325e5fb231262754e75aa6d0.tar.xz
ruby-40a4d1c6e002fca5325e5fb231262754e75aa6d0.zip
* eval.c (method_missing): update old argument adjustment.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@11290 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/eval.c b/eval.c
index cbf0e1960..8b25fa155 100644
--- a/eval.c
+++ b/eval.c
@@ -5515,14 +5515,17 @@ method_missing(VALUE obj, ID id, int argc, const VALUE *argv,
}
if (argc < 0) {
VALUE tmp;
+ int n;
- argc = -argc-1;
+ argc = -argc;
+ n = argc / 256 - 1;
+ argc %= 256;
tmp = svalue_to_avalue(argv[argc]);
- nargv = ALLOCA_N(VALUE, argc + RARRAY_LEN(tmp) + 1);
+ nargv = ALLOCA_N(VALUE, argc + RARRAY_LEN(tmp) + n + 1);
MEMCPY(nargv+1, argv, VALUE, argc);
MEMCPY(nargv+1+argc, RARRAY_PTR(tmp), VALUE, RARRAY_LEN(tmp));
- argc += RARRAY_LEN(tmp);
-
+ MEMCPY(nargv+1+argc+RARRAY_LEN(tmp), argv+argc+1, VALUE, n);
+ argc += RARRAY_LEN(tmp)+n;
}
else {
nargv = ALLOCA_N(VALUE, argc+1);