[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