[macruby-changes] [1080] MacRuby/branches/experimental/roxor.cpp
source_changes at macosforge.org
source_changes at macosforge.org
Sun Mar 22 21:25:30 PDT 2009
Revision: 1080
http://trac.macosforge.org/projects/ruby/changeset/1080
Author: lsansonetti at apple.com
Date: 2009-03-22 21:25:29 -0700 (Sun, 22 Mar 2009)
Log Message:
-----------
when compiling a dispatch call, make sure we compile the block *after* the arguments, because it is covered in a crazy rubyspec and we do want to pass these crazy rubyspec do we?
Modified Paths:
--------------
MacRuby/branches/experimental/roxor.cpp
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-03-23 03:35:25 UTC (rev 1079)
+++ MacRuby/branches/experimental/roxor.cpp 2009-03-23 04:25:29 UTC (rev 1080)
@@ -2919,25 +2919,29 @@
return cast<Value>(CallInst::Create(f, params.begin(), params.end(), "", bb));
}
- // Prepare the dispatcher parameters
+ // Prepare the dispatcher parameters.
std::vector<Value *> params;
+ // Method cache.
const SEL sel = mid_to_sel(mid, positive_arity ? 1 : 0);
void *cache = GET_VM()->method_cache_get(sel, super_call);
params.push_back(compile_const_pointer(cache));
+ // Self.
params.push_back(recv == NULL ? current_self : compile_node(recv));
+
+ // Selector.
params.push_back(compile_const_pointer((void *)sel));
- Value *blockVal;
- if (args != NULL && nd_type(args) == NODE_BLOCK_PASS) {
- assert(!block_given);
- blockVal = compile_block_create(args);
- args = args->nd_head;
+
+ // RubySpec requires that we compile the block *after* the arguments, so we
+ // do pass NULL as the block for the moment...
+ params.push_back(compile_const_pointer(NULL));
+ NODE *real_args = args;
+ if (real_args != NULL && nd_type(real_args) == NODE_BLOCK_PASS) {
+ real_args = args->nd_head;
}
- else {
- blockVal = block_given ? compile_block_create() : compile_const_pointer(NULL);
- }
- params.push_back(blockVal);
+
+ // Call option.
const unsigned char call_opt = super_call
? DISPATCH_SUPER
: (nd_type(node) == NODE_VCALL)
@@ -2945,6 +2949,7 @@
: 0;
params.push_back(ConstantInt::get(Type::Int8Ty, call_opt));
+ // Arguments.
int argc = 0;
if (nd_type(node) == NODE_ZSUPER) {
params.push_back(ConstantInt::get(Type::Int32Ty, fargs_arity));
@@ -2957,11 +2962,12 @@
}
argc = fargs_arity;
}
- else if (args != NULL) {
+ else if (real_args != NULL) {
std::vector<Value *> arguments;
- compile_dispatch_arguments(args, arguments, &argc);
+ compile_dispatch_arguments(real_args, arguments, &argc);
params.push_back(ConstantInt::get(Type::Int32Ty, argc));
- for (std::vector<Value *>::iterator i = arguments.begin(); i != arguments.end(); ++i) {
+ for (std::vector<Value *>::iterator i = arguments.begin();
+ i != arguments.end(); ++i) {
params.push_back(*i);
}
}
@@ -2969,6 +2975,18 @@
params.push_back(ConstantInt::get(Type::Int32Ty, 0));
}
+ // Now compile the block and insert it in the params list!
+ Value *blockVal;
+ if (args != NULL && nd_type(args) == NODE_BLOCK_PASS) {
+ assert(!block_given);
+ blockVal = compile_block_create(args);
+ }
+ else {
+ blockVal = block_given
+ ? compile_block_create() : compile_const_pointer(NULL);
+ }
+ params[3] = blockVal;
+
// Can we optimize the call?
if (!super_call && !splat_args) {
Value *optimizedCall = compile_optimized_dispatch_call(sel, argc, params);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090322/711a9c20/attachment.html>
More information about the macruby-changes
mailing list