Index: src/ia32/jump-target-ia32.cc |
=================================================================== |
--- src/ia32/jump-target-ia32.cc (revision 2654) |
+++ src/ia32/jump-target-ia32.cc (working copy) |
@@ -362,6 +362,70 @@ |
__ bind(&entry_label_); |
} |
+ |
+void BreakTarget::Jump() { |
+ // Drop leftover statement state from the frame before merging, without |
+ // emitting code. |
+ ASSERT(cgen()->has_valid_frame()); |
+ int count = cgen()->frame()->height() - expected_height_; |
+ cgen()->frame()->ForgetElements(count); |
+ DoJump(); |
+} |
+ |
+ |
+void BreakTarget::Jump(Result* arg) { |
+ // Drop leftover statement state from the frame before merging, without |
+ // emitting code. |
+ ASSERT(cgen()->has_valid_frame()); |
+ int count = cgen()->frame()->height() - expected_height_; |
+ cgen()->frame()->ForgetElements(count); |
+ cgen()->frame()->Push(arg); |
+ DoJump(); |
+} |
+ |
+ |
+void BreakTarget::Bind() { |
+#ifdef DEBUG |
+ // All the forward-reaching frames should have been adjusted at the |
+ // jumps to this target. |
+ for (int i = 0; i < reaching_frames_.length(); i++) { |
+ ASSERT(reaching_frames_[i] == NULL || |
+ reaching_frames_[i]->height() == expected_height_); |
+ } |
+#endif |
+ // Drop leftover statement state from the frame before merging, even on |
+ // the fall through. This is so we can bind the return target with state |
+ // on the frame. |
+ if (cgen()->has_valid_frame()) { |
+ int count = cgen()->frame()->height() - expected_height_; |
+ cgen()->frame()->ForgetElements(count); |
+ } |
+ DoBind(); |
+} |
+ |
+ |
+void BreakTarget::Bind(Result* arg) { |
+#ifdef DEBUG |
+ // All the forward-reaching frames should have been adjusted at the |
+ // jumps to this target. |
+ for (int i = 0; i < reaching_frames_.length(); i++) { |
+ ASSERT(reaching_frames_[i] == NULL || |
+ reaching_frames_[i]->height() == expected_height_ + 1); |
+ } |
+#endif |
+ // Drop leftover statement state from the frame before merging, even on |
+ // the fall through. This is so we can bind the return target with state |
+ // on the frame. |
+ if (cgen()->has_valid_frame()) { |
+ int count = cgen()->frame()->height() - expected_height_; |
+ cgen()->frame()->ForgetElements(count); |
+ cgen()->frame()->Push(arg); |
+ } |
+ DoBind(); |
+ *arg = cgen()->frame()->Pop(); |
+} |
+ |
+ |
#undef __ |