Revision: 1192 http://trac.macosforge.org/projects/ruby/changeset/1192 Author: lsansonetti@apple.com Date: 2009-03-26 18:06:22 -0700 (Thu, 26 Mar 2009) Log Message: ----------- fixed bugs in redo Modified Paths: -------------- MacRuby/branches/experimental/roxor.cpp Modified: MacRuby/branches/experimental/roxor.cpp =================================================================== --- MacRuby/branches/experimental/roxor.cpp 2009-03-27 00:24:58 UTC (rev 1191) +++ MacRuby/branches/experimental/roxor.cpp 2009-03-27 01:06:22 UTC (rev 1192) @@ -183,6 +183,7 @@ #endif BasicBlock *bb; + BasicBlock *entry_bb; ID current_mid; bool current_instance_method; ID self_id; @@ -518,6 +519,7 @@ fname = _fname; bb = NULL; + entry_bb = NULL; begin_bb = NULL; rescue_bb = NULL; current_mid = 0; @@ -2280,9 +2282,10 @@ Function *f = cast<Function>(module->getOrInsertFunction("", ft)); BasicBlock *old_rescue_bb = rescue_bb; + BasicBlock *old_entry_bb = entry_bb; + BasicBlock *old_bb = bb; rescue_bb = NULL; - BasicBlock *old_bb = bb; - bb = BasicBlock::Create("EntryBlock", f); + bb = BasicBlock::Create("MainBlock", f); std::map<ID, Value *> old_lvars = lvars; lvars.clear(); @@ -2400,6 +2403,10 @@ Value *val = NULL; if (node->nd_body != NULL) { + entry_bb = BasicBlock::Create("entry_point", f); + BranchInst::Create(entry_bb, bb); + bb = entry_bb; + DEBUG_LEVEL_INC(); val = compile_node(node->nd_body); DEBUG_LEVEL_DEC(); @@ -2410,6 +2417,7 @@ ReturnInst::Create(val, bb); bb = old_bb; + entry_bb = old_entry_bb; lvars = old_lvars; current_self = old_self; rescue_bb = old_rescue_bb; @@ -3275,19 +3283,23 @@ if (nd_type(node) == NODE_BREAK) { if (breakFunc == NULL) { // void rb_vm_break(VALUE val); - breakFunc = cast<Function>(module->getOrInsertFunction("rb_vm_break", + breakFunc = cast<Function>( + module->getOrInsertFunction("rb_vm_break", Type::VoidTy, RubyObjTy, NULL)); } std::vector<Value *> params; params.push_back(val); - CallInst::Create(breakFunc, params.begin(), params.end(), "", bb); + CallInst::Create(breakFunc, params.begin(), + params.end(), "", bb); + ReturnInst::Create(val, bb); } else if (nd_type(node) == NODE_REDO) { - // TODO - abort(); + assert(entry_bb != NULL); + BranchInst::Create(entry_bb, bb); } - - ReturnInst::Create(val, bb); + else { + ReturnInst::Create(val, bb); + } } compile_dead_branch(); return val;
participants (1)
-
source_changes@macosforge.org