Revision: 2934 http://trac.macosforge.org/projects/ruby/changeset/2934 Author: lsansonetti@apple.com Date: 2009-10-30 22:49:51 -0700 (Fri, 30 Oct 2009) Log Message: ----------- return-from-block is now active for further dispatch calls inside the same method + do not return-from-block from lambdas (to mimic MRI 1.9) Modified Paths: -------------- MacRuby/trunk/compiler.cpp MacRuby/trunk/vm.cpp Modified: MacRuby/trunk/compiler.cpp =================================================================== --- MacRuby/trunk/compiler.cpp 2009-10-31 05:48:34 UTC (rev 2933) +++ MacRuby/trunk/compiler.cpp 2009-10-31 05:49:51 UTC (rev 2934) @@ -1628,14 +1628,17 @@ RoxorCompiler::compile_return_from_block(Value *val, int id) { if (returnFromBlockFunc == NULL) { - // void rb_vm_return_from_block(VALUE val, int id); + // void rb_vm_return_from_block(VALUE val, int id, + // rb_vm_block_t *current_block); returnFromBlockFunc = cast<Function>( module->getOrInsertFunction("rb_vm_return_from_block", - VoidTy, RubyObjTy, Int32Ty, NULL)); + VoidTy, RubyObjTy, Int32Ty, PtrTy, NULL)); } std::vector<Value *> params; params.push_back(val); params.push_back(ConstantInt::get(Int32Ty, id)); + params.push_back(running_block); + compile_protected_call(returnFromBlockFunc, params); } @@ -4948,8 +4951,6 @@ bool old_current_block = current_block; bool old_current_block_chain = current_block_chain; int old_return_from_block = return_from_block; - BasicBlock *old_rescue_invoke_bb = rescue_invoke_bb; - BasicBlock *old_rescue_rethrow_bb = rescue_rethrow_bb; bool old_dynamic_class = dynamic_class; current_mid = 0; @@ -5015,9 +5016,7 @@ if (return_from_block_bb != NULL) { BasicBlock *old_bb = bb; bb = return_from_block_bb; - compile_return_from_block_handler(return_from_block); - rescue_rethrow_bb = old_rescue_rethrow_bb; - rescue_invoke_bb = old_rescue_invoke_bb; + compile_return_from_block_handler(return_from_block); bb = old_bb; return_from_block = old_return_from_block; } Modified: MacRuby/trunk/vm.cpp =================================================================== --- MacRuby/trunk/vm.cpp 2009-10-31 05:48:34 UTC (rev 2933) +++ MacRuby/trunk/vm.cpp 2009-10-31 05:49:51 UTC (rev 2934) @@ -3098,14 +3098,17 @@ extern "C" void -rb_vm_return_from_block(VALUE val, int id) +rb_vm_return_from_block(VALUE val, int id, rb_vm_block_t *running_block) { - RoxorReturnFromBlockException *exc = new RoxorReturnFromBlockException(); - - exc->val = val; - exc->id = id; - - throw exc; + // Do not trigger a return from the calling scope if the running block + // is a lambda, to conform to the ruby 1.9 specifications. + if (!(running_block->flags & VM_BLOCK_LAMBDA)) { + RoxorReturnFromBlockException *exc = + new RoxorReturnFromBlockException(); + exc->val = val; + exc->id = id; + throw exc; + } } extern "C" std::type_info *__cxa_current_exception_type(void);