[macruby-changes] [1082] MacRuby/branches/experimental/roxor.cpp
source_changes at macosforge.org
source_changes at macosforge.org
Sun Mar 22 21:50:23 PDT 2009
Revision: 1082
http://trac.macosforge.org/projects/ruby/changeset/1082
Author: lsansonetti at apple.com
Date: 2009-03-22 21:50:22 -0700 (Sun, 22 Mar 2009)
Log Message:
-----------
implemented redo (works only for loops at the moment, and not blocks yet)
Modified Paths:
--------------
MacRuby/branches/experimental/roxor.cpp
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-03-23 04:26:24 UTC (rev 1081)
+++ MacRuby/branches/experimental/roxor.cpp 2009-03-23 04:50:22 UTC (rev 1082)
@@ -193,6 +193,7 @@
Function *current_block_func;
GlobalVariable *current_opened_class;
BasicBlock *current_loop_begin_bb;
+ BasicBlock *current_loop_body_bb;
BasicBlock *current_loop_end_bb;
Value *current_loop_exit_val;
@@ -503,6 +504,7 @@
current_block_func = NULL;
current_opened_class = NULL;
current_loop_begin_bb = NULL;
+ current_loop_body_bb = NULL;
current_loop_end_bb = NULL;
current_loop_exit_val = NULL;
@@ -3005,9 +3007,11 @@
case NODE_BREAK:
case NODE_NEXT:
+ case NODE_REDO:
case NODE_RETURN:
{
const bool within_loop = current_loop_begin_bb != NULL
+ && current_loop_body_bb != NULL
&& current_loop_end_bb != NULL;
if (!current_block && !within_loop) {
@@ -3017,6 +3021,9 @@
if (nd_type(node) == NODE_NEXT) {
rb_raise(rb_eLocalJumpError, "unexpected next");
}
+ if (nd_type(node) == NODE_REDO) {
+ rb_raise(rb_eLocalJumpError, "unexpected redo");
+ }
}
Value *val = node->nd_head != NULL
@@ -3030,6 +3037,9 @@
else if (nd_type(node) == NODE_NEXT) {
BranchInst::Create(current_loop_begin_bb, bb);
}
+ else if (nd_type(node) == NODE_REDO) {
+ BranchInst::Create(current_loop_body_bb, bb);
+ }
else {
ReturnInst::Create(val, bb);
}
@@ -3045,6 +3055,10 @@
params.push_back(val);
CallInst::Create(breakFunc, params.begin(), params.end(), "", bb);
}
+ else if (nd_type(node) == NODE_REDO) {
+ // TODO
+ abort();
+ }
ReturnInst::Create(val, bb);
}
@@ -3681,10 +3695,12 @@
}
BasicBlock *old_current_loop_begin_bb = current_loop_begin_bb;
+ BasicBlock *old_current_loop_body_bb = current_loop_body_bb;
BasicBlock *old_current_loop_end_bb = current_loop_end_bb;
Value *old_current_loop_exit_val = current_loop_exit_val;
current_loop_begin_bb = loopBB;
+ current_loop_body_bb = bodyBB;
current_loop_end_bb = afterBB;
current_loop_exit_val = NULL;
@@ -3702,6 +3718,7 @@
}
current_loop_begin_bb = old_current_loop_begin_bb;
+ current_loop_body_bb = old_current_loop_body_bb;
current_loop_end_bb = old_current_loop_end_bb;
current_loop_exit_val = old_current_loop_exit_val;
@@ -3716,6 +3733,7 @@
current_block = true;
BasicBlock *old_current_loop_begin_bb = current_loop_begin_bb;
+ BasicBlock *old_current_loop_body_bb = current_loop_body_bb;
BasicBlock *old_current_loop_end_bb = current_loop_end_bb;
current_loop_begin_bb = current_loop_end_bb = NULL;
Function *old_current_block_func = current_block_func;
@@ -3728,6 +3746,7 @@
assert(Function::classof(block));
current_loop_begin_bb = old_current_loop_begin_bb;
+ current_loop_body_bb = old_current_loop_body_bb;
current_loop_end_bb = old_current_loop_end_bb;
current_block = false;
current_mid = old_current_mid;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090322/6aaabe59/attachment.html>
More information about the macruby-changes
mailing list