[macruby-changes] [5037] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Wed Dec 15 20:48:51 PST 2010


Revision: 5037
          http://trac.macosforge.org/projects/ruby/changeset/5037
Author:   lsansonetti at apple.com
Date:     2010-12-15 20:48:48 -0800 (Wed, 15 Dec 2010)
Log Message:
-----------
fix a bug where calling a method defined with #define_method with a block accepting a splat argument (arity -2) would crash

Modified Paths:
--------------
    MacRuby/trunk/compiler.cpp
    MacRuby/trunk/compiler.h
    MacRuby/trunk/kernel.c

Modified: MacRuby/trunk/compiler.cpp
===================================================================
--- MacRuby/trunk/compiler.cpp	2010-12-16 03:42:04 UTC (rev 5036)
+++ MacRuby/trunk/compiler.cpp	2010-12-16 04:48:48 UTC (rev 5037)
@@ -198,6 +198,8 @@
     asetArrayFunc = get_function("vm_rary_aset");
     entryArrayFunc = get_function("vm_ary_entry");
     checkArrayFunc = get_function("vm_ary_check");
+    lengthArrayFunc = get_function("vm_ary_length");
+    ptrArrayFunc = get_function("vm_ary_ptr");
     newStructFunc = NULL;
     newOpaqueFunc = NULL;
     newPointerFunc = NULL;
@@ -6618,14 +6620,13 @@
     Value *argv;
 
     const int arity = rb_vm_arity_n(block->arity);
-    if (arity < 0) {
+    if (arity == -1) {
 	// VALUE foo(VALUE rcv, SEL sel, int argc, VALUE *argv)
 	// {
 	//     return rb_vm_block_eval2(block, rcv, sel, argc, argv);
 	// }
 	f = cast<Function>(module->getOrInsertFunction("",
-		    RubyObjTy, RubyObjTy, PtrTy, Int32Ty, RubyObjPtrTy,
-		    NULL));
+		    RubyObjTy, RubyObjTy, PtrTy, Int32Ty, RubyObjPtrTy, NULL));
 	Function::arg_iterator arg = f->arg_begin();
 	rcv = arg++;
 	sel = arg++;
@@ -6634,7 +6635,26 @@
 
 	bb = BasicBlock::Create(context, "EntryBlock", f);
     }
+    else if (arity == -2) {
+	// VALUE foo(VALUE rcv, SEL sel, VALUE argv)
+	// {
+	//	return rb_block_eval2(block, rcv, sel, RARRAY_LEN(argv),
+	//		RARRAY_PTR(argv));
+	// }
+	f = cast<Function>(module->getOrInsertFunction("",
+		    RubyObjTy, RubyObjTy, PtrTy, RubyObjTy, NULL));
+	Function::arg_iterator arg = f->arg_begin();
+	rcv = arg++;
+	sel = arg++;
+	Value *argv_ary = arg++;
+
+	bb = BasicBlock::Create(context, "EntryBlock", f);
+
+	argc = CallInst::Create(lengthArrayFunc, argv_ary, "", bb);
+	argv = CallInst::Create(ptrArrayFunc, argv_ary, "", bb);
+    }
     else {
+	assert(arity >= 0);
 	// VALUE foo(VALUE rcv, SEL sel, VALUE arg1, ...)
 	// {
 	//     VALUE argv[n] = {arg1, ...};

Modified: MacRuby/trunk/compiler.h
===================================================================
--- MacRuby/trunk/compiler.h	2010-12-16 03:42:04 UTC (rev 5036)
+++ MacRuby/trunk/compiler.h	2010-12-16 04:48:48 UTC (rev 5037)
@@ -188,6 +188,8 @@
 	Function *asetArrayFunc;
 	Function *entryArrayFunc;
 	Function *checkArrayFunc;
+	Function *lengthArrayFunc;
+	Function *ptrArrayFunc;
 	Function *newStructFunc;
 	Function *newOpaqueFunc;
 	Function *newPointerFunc;

Modified: MacRuby/trunk/kernel.c
===================================================================
--- MacRuby/trunk/kernel.c	2010-12-16 03:42:04 UTC (rev 5036)
+++ MacRuby/trunk/kernel.c	2010-12-16 04:48:48 UTC (rev 5037)
@@ -944,6 +944,18 @@
     return rb_ary_entry(ary, i);
 }
 
+PRIMITIVE long
+vm_ary_length(VALUE ary)
+{
+    return RARRAY_LEN(ary);
+}
+
+PRIMITIVE const VALUE *
+vm_ary_ptr(VALUE ary)
+{
+    return RARRAY_PTR(ary);
+}
+
 PRIMITIVE VALUE
 vm_rary_new(int len)
 {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20101215/c422b137/attachment.html>


More information about the macruby-changes mailing list