Index: src/jump-target-heavy.cc |
=================================================================== |
--- src/jump-target-heavy.cc (revision 4592) |
+++ src/jump-target-heavy.cc (working copy) |
@@ -35,6 +35,9 @@ |
namespace internal { |
+bool JumpTarget::compiling_deferred_code_ = false; |
+ |
+ |
void JumpTarget::Jump(Result* arg) { |
ASSERT(cgen()->has_valid_frame()); |
@@ -360,4 +363,64 @@ |
} |
} |
+ |
+void JumpTarget::Unuse() { |
+ reaching_frames_.Clear(); |
+ merge_labels_.Clear(); |
+ entry_frame_ = NULL; |
+ entry_label_.Unuse(); |
+} |
+ |
+ |
+void JumpTarget::AddReachingFrame(VirtualFrame* frame) { |
+ ASSERT(reaching_frames_.length() == merge_labels_.length()); |
+ ASSERT(entry_frame_ == NULL); |
+ Label fresh; |
+ merge_labels_.Add(fresh); |
+ reaching_frames_.Add(frame); |
+} |
+ |
+ |
+// ------------------------------------------------------------------------- |
+// BreakTarget implementation. |
+ |
+void BreakTarget::set_direction(Directionality direction) { |
+ JumpTarget::set_direction(direction); |
+ ASSERT(cgen()->has_valid_frame()); |
+ expected_height_ = cgen()->frame()->height(); |
+} |
+ |
+ |
+void BreakTarget::CopyTo(BreakTarget* destination) { |
+ ASSERT(destination != NULL); |
+ destination->direction_ = direction_; |
+ destination->reaching_frames_.Rewind(0); |
+ destination->reaching_frames_.AddAll(reaching_frames_); |
+ destination->merge_labels_.Rewind(0); |
+ destination->merge_labels_.AddAll(merge_labels_); |
+ destination->entry_frame_ = entry_frame_; |
+ destination->entry_label_ = entry_label_; |
+ destination->expected_height_ = expected_height_; |
+} |
+ |
+ |
+void BreakTarget::Branch(Condition cc, Hint hint) { |
+ ASSERT(cgen()->has_valid_frame()); |
+ |
+ int count = cgen()->frame()->height() - expected_height_; |
+ if (count > 0) { |
+ // We negate and branch here rather than using DoBranch's negate |
+ // and branch. This gives us a hook to remove statement state |
+ // from the frame. |
+ JumpTarget fall_through; |
+ // Branch to fall through will not negate, because it is a |
+ // forward-only target. |
+ fall_through.Branch(NegateCondition(cc), NegateHint(hint)); |
+ Jump(); // May emit merge code here. |
+ fall_through.Bind(); |
+ } else { |
+ DoBranch(cc, hint); |
+ } |
+} |
+ |
} } // namespace v8::internal |