summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--vm_eval.c10
2 files changed, 13 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 15243bfd1f..a11b947149 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Fri Jul 29 23:53:44 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_apply): get rid of too large alloca.
+
Fri Jul 29 20:48:39 2011 Tanaka Akira <akr@fsij.org>
* ext/socket/mkconstants.rb: fix typos.
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);