[macruby-changes] [1192] MacRuby/branches/experimental/roxor.cpp

source_changes at macosforge.org source_changes at macosforge.org
Thu Mar 26 18:06:23 PDT 2009


Revision: 1192
          http://trac.macosforge.org/projects/ruby/changeset/1192
Author:   lsansonetti at 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;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090326/054d7d28/attachment-0001.html>


More information about the macruby-changes mailing list