summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-29 14:53:47 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-29 14:53:47 +0000
commit0d6329343aaa02234b89af0ae2a3129470bda760 (patch)
treed5d2d72bf64b0f86a2852e75889ff5861e1a416c /vm_eval.c
parentd6ec67523643bb0e76f8bacc78116c2ab0a22c35 (diff)
* vm_eval.c (rb_apply): get rid of too large alloca.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32739 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/vm_eval.c b/vm_eval.c
index d6e9d6e30b..8ce268d8f9 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -597,9 +597,17 @@ VALUE
rb_apply(VALUE recv, ID mid, VALUE args)
{
int argc;
- VALUE *argv;
+ VALUE *argv, ret;
argc = RARRAY_LENINT(args);
+ if (argc >= 0x100) {
+ args = rb_ary_subseq(args, 0, argc);
+ RBASIC(args)->klass = 0;
+ OBJ_FREEZE(args);
+ ret = rb_call(recv, mid, argc, RARRAY_PTR(args), CALL_FCALL);
+ RB_GC_GUARD(args);
+ return ret;
+ }
argv = ALLOCA_N(VALUE, argc);
MEMCPY(argv, RARRAY_PTR(args), VALUE, argc);
return rb_call(recv, mid, argc, argv, CALL_FCALL);