[前][次][番号順一覧][スレッド一覧]

ruby-changes:20691

From: nobu <ko1@a...>
Date: Fri, 29 Jul 2011 23:53:58 +0900 (JST)
Subject: [ruby-changes:20691] nobu:r32739 (trunk): * vm_eval.c (rb_apply): get rid of too large alloca.

nobu	2011-07-29 23:53:47 +0900 (Fri, 29 Jul 2011)

  New Revision: 32739

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32739

  Log:
    * vm_eval.c (rb_apply): get rid of too large alloca.

  Modified files:
    trunk/ChangeLog
    trunk/vm_eval.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32738)
+++ ChangeLog	(revision 32739)
@@ -1,3 +1,7 @@
+Fri Jul 29 23:53:44 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* vm_eval.c (rb_apply): get rid of too large alloca.
+
 Fri Jul 29 20:48:39 2011  Tanaka Akira  <akr@f...>
 
 	* ext/socket/mkconstants.rb: fix typos.
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 32738)
+++ vm_eval.c	(revision 32739)
@@ -597,9 +597,17 @@
 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);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]