Index: src/jump-target.cc |
=================================================================== |
--- src/jump-target.cc (revision 1967) |
+++ src/jump-target.cc (working copy) |
@@ -39,36 +39,6 @@ |
bool JumpTarget::compiling_deferred_code_ = false; |
-JumpTarget::JumpTarget(CodeGenerator* cgen, Directionality direction) |
- : cgen_(cgen), |
- direction_(direction), |
- reaching_frames_(0), |
- merge_labels_(0), |
- entry_frame_(NULL) { |
- ASSERT(cgen != NULL); |
- masm_ = cgen->masm(); |
-} |
- |
- |
-JumpTarget::JumpTarget() |
- : cgen_(NULL), |
- masm_(NULL), |
- direction_(FORWARD_ONLY), |
- reaching_frames_(0), |
- merge_labels_(0), |
- entry_frame_(NULL) { |
-} |
- |
- |
-void JumpTarget::Initialize(CodeGenerator* cgen, Directionality direction) { |
- ASSERT(cgen != NULL); |
- ASSERT(cgen_ == NULL); |
- cgen_ = cgen; |
- masm_ = cgen->masm(); |
- direction_ = direction; |
-} |
- |
- |
void JumpTarget::Unuse() { |
reaching_frames_.Clear(); |
merge_labels_.Clear(); |
@@ -151,7 +121,7 @@ |
// Build the new frame. A freshly allocated frame has memory elements |
// for the parameters and some platform-dependent elements (e.g., |
// return address). Replace those first. |
- entry_frame_ = new VirtualFrame(cgen_); |
+ entry_frame_ = new VirtualFrame(cgen()); |
int index = 0; |
for (; index < entry_frame_->elements_.length(); index++) { |
FrameElement* target = elements[index]; |
@@ -266,31 +236,28 @@ |
void JumpTarget::Jump(Result* arg) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
+ ASSERT(cgen()->has_valid_frame()); |
- cgen_->frame()->Push(arg); |
+ cgen()->frame()->Push(arg); |
DoJump(); |
} |
void JumpTarget::Jump(Result* arg0, Result* arg1) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
+ ASSERT(cgen()->has_valid_frame()); |
- cgen_->frame()->Push(arg0); |
- cgen_->frame()->Push(arg1); |
+ cgen()->frame()->Push(arg0); |
+ cgen()->frame()->Push(arg1); |
DoJump(); |
} |
void JumpTarget::Jump(Result* arg0, Result* arg1, Result* arg2) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
+ ASSERT(cgen()->has_valid_frame()); |
- cgen_->frame()->Push(arg0); |
- cgen_->frame()->Push(arg1); |
- cgen_->frame()->Push(arg2); |
+ cgen()->frame()->Push(arg0); |
+ cgen()->frame()->Push(arg1); |
+ cgen()->frame()->Push(arg2); |
DoJump(); |
} |
@@ -316,35 +283,33 @@ |
#endif |
void JumpTarget::Branch(Condition cc, Result* arg, Hint hint) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
+ ASSERT(cgen()->has_valid_frame()); |
// We want to check that non-frame registers at the call site stay in |
// the same registers on the fall-through branch. |
DECLARE_ARGCHECK_VARS(arg); |
- cgen_->frame()->Push(arg); |
+ cgen()->frame()->Push(arg); |
DoBranch(cc, hint); |
- *arg = cgen_->frame()->Pop(); |
+ *arg = cgen()->frame()->Pop(); |
ASSERT_ARGCHECK(arg); |
} |
void JumpTarget::Branch(Condition cc, Result* arg0, Result* arg1, Hint hint) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->frame() != NULL); |
+ ASSERT(cgen()->frame() != NULL); |
// We want to check that non-frame registers at the call site stay in |
// the same registers on the fall-through branch. |
DECLARE_ARGCHECK_VARS(arg0); |
DECLARE_ARGCHECK_VARS(arg1); |
- cgen_->frame()->Push(arg0); |
- cgen_->frame()->Push(arg1); |
+ cgen()->frame()->Push(arg0); |
+ cgen()->frame()->Push(arg1); |
DoBranch(cc, hint); |
- *arg1 = cgen_->frame()->Pop(); |
- *arg0 = cgen_->frame()->Pop(); |
+ *arg1 = cgen()->frame()->Pop(); |
+ *arg0 = cgen()->frame()->Pop(); |
ASSERT_ARGCHECK(arg0); |
ASSERT_ARGCHECK(arg1); |
@@ -356,8 +321,7 @@ |
Result* arg1, |
Result* arg2, |
Hint hint) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->frame() != NULL); |
+ ASSERT(cgen()->frame() != NULL); |
// We want to check that non-frame registers at the call site stay in |
// the same registers on the fall-through branch. |
@@ -365,13 +329,13 @@ |
DECLARE_ARGCHECK_VARS(arg1); |
DECLARE_ARGCHECK_VARS(arg2); |
- cgen_->frame()->Push(arg0); |
- cgen_->frame()->Push(arg1); |
- cgen_->frame()->Push(arg2); |
+ cgen()->frame()->Push(arg0); |
+ cgen()->frame()->Push(arg1); |
+ cgen()->frame()->Push(arg2); |
DoBranch(cc, hint); |
- *arg2 = cgen_->frame()->Pop(); |
- *arg1 = cgen_->frame()->Pop(); |
- *arg0 = cgen_->frame()->Pop(); |
+ *arg2 = cgen()->frame()->Pop(); |
+ *arg1 = cgen()->frame()->Pop(); |
+ *arg0 = cgen()->frame()->Pop(); |
ASSERT_ARGCHECK(arg0); |
ASSERT_ARGCHECK(arg1); |
@@ -385,8 +349,7 @@ |
Result* arg2, |
Result* arg3, |
Hint hint) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->frame() != NULL); |
+ ASSERT(cgen()->frame() != NULL); |
// We want to check that non-frame registers at the call site stay in |
// the same registers on the fall-through branch. |
@@ -395,15 +358,15 @@ |
DECLARE_ARGCHECK_VARS(arg2); |
DECLARE_ARGCHECK_VARS(arg3); |
- cgen_->frame()->Push(arg0); |
- cgen_->frame()->Push(arg1); |
- cgen_->frame()->Push(arg2); |
- cgen_->frame()->Push(arg3); |
+ cgen()->frame()->Push(arg0); |
+ cgen()->frame()->Push(arg1); |
+ cgen()->frame()->Push(arg2); |
+ cgen()->frame()->Push(arg3); |
DoBranch(cc, hint); |
- *arg3 = cgen_->frame()->Pop(); |
- *arg2 = cgen_->frame()->Pop(); |
- *arg1 = cgen_->frame()->Pop(); |
- *arg0 = cgen_->frame()->Pop(); |
+ *arg3 = cgen()->frame()->Pop(); |
+ *arg2 = cgen()->frame()->Pop(); |
+ *arg1 = cgen()->frame()->Pop(); |
+ *arg0 = cgen()->frame()->Pop(); |
ASSERT_ARGCHECK(arg0); |
ASSERT_ARGCHECK(arg1); |
@@ -413,15 +376,14 @@ |
void BreakTarget::Branch(Condition cc, Result* arg, Hint hint) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
+ ASSERT(cgen()->has_valid_frame()); |
- int count = cgen_->frame()->height() - expected_height_; |
+ 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(cgen_); |
+ JumpTarget fall_through; |
// Branch to fall through will not negate, because it is a |
// forward-only target. |
fall_through.Branch(NegateCondition(cc), NegateHint(hint)); |
@@ -429,9 +391,9 @@ |
fall_through.Bind(); |
} else { |
DECLARE_ARGCHECK_VARS(arg); |
- cgen_->frame()->Push(arg); |
+ cgen()->frame()->Push(arg); |
DoBranch(cc, hint); |
- *arg = cgen_->frame()->Pop(); |
+ *arg = cgen()->frame()->Pop(); |
ASSERT_ARGCHECK(arg); |
} |
} |
@@ -446,26 +408,22 @@ |
void JumpTarget::Bind(Result* arg, int mergable_elements) { |
- ASSERT(cgen_ != NULL); |
- |
- if (cgen_->has_valid_frame()) { |
- cgen_->frame()->Push(arg); |
+ if (cgen()->has_valid_frame()) { |
+ cgen()->frame()->Push(arg); |
} |
DoBind(mergable_elements); |
- *arg = cgen_->frame()->Pop(); |
+ *arg = cgen()->frame()->Pop(); |
} |
void JumpTarget::Bind(Result* arg0, Result* arg1, int mergable_elements) { |
- ASSERT(cgen_ != NULL); |
- |
- if (cgen_->has_valid_frame()) { |
- cgen_->frame()->Push(arg0); |
- cgen_->frame()->Push(arg1); |
+ if (cgen()->has_valid_frame()) { |
+ cgen()->frame()->Push(arg0); |
+ cgen()->frame()->Push(arg1); |
} |
DoBind(mergable_elements); |
- *arg1 = cgen_->frame()->Pop(); |
- *arg0 = cgen_->frame()->Pop(); |
+ *arg1 = cgen()->frame()->Pop(); |
+ *arg0 = cgen()->frame()->Pop(); |
} |
@@ -473,17 +431,15 @@ |
Result* arg1, |
Result* arg2, |
int mergable_elements) { |
- ASSERT(cgen_ != NULL); |
- |
- if (cgen_->has_valid_frame()) { |
- cgen_->frame()->Push(arg0); |
- cgen_->frame()->Push(arg1); |
- cgen_->frame()->Push(arg2); |
+ if (cgen()->has_valid_frame()) { |
+ cgen()->frame()->Push(arg0); |
+ cgen()->frame()->Push(arg1); |
+ cgen()->frame()->Push(arg2); |
} |
DoBind(mergable_elements); |
- *arg2 = cgen_->frame()->Pop(); |
- *arg1 = cgen_->frame()->Pop(); |
- *arg0 = cgen_->frame()->Pop(); |
+ *arg2 = cgen()->frame()->Pop(); |
+ *arg1 = cgen()->frame()->Pop(); |
+ *arg0 = cgen()->frame()->Pop(); |
} |
@@ -492,19 +448,17 @@ |
Result* arg2, |
Result* arg3, |
int mergable_elements) { |
- ASSERT(cgen_ != NULL); |
- |
- if (cgen_->has_valid_frame()) { |
- cgen_->frame()->Push(arg0); |
- cgen_->frame()->Push(arg1); |
- cgen_->frame()->Push(arg2); |
- cgen_->frame()->Push(arg3); |
+ if (cgen()->has_valid_frame()) { |
+ cgen()->frame()->Push(arg0); |
+ cgen()->frame()->Push(arg1); |
+ cgen()->frame()->Push(arg2); |
+ cgen()->frame()->Push(arg3); |
} |
DoBind(mergable_elements); |
- *arg3 = cgen_->frame()->Pop(); |
- *arg2 = cgen_->frame()->Pop(); |
- *arg1 = cgen_->frame()->Pop(); |
- *arg0 = cgen_->frame()->Pop(); |
+ *arg3 = cgen()->frame()->Pop(); |
+ *arg2 = cgen()->frame()->Pop(); |
+ *arg1 = cgen()->frame()->Pop(); |
+ *arg0 = cgen()->frame()->Pop(); |
} |
@@ -520,17 +474,15 @@ |
// ------------------------------------------------------------------------- |
// BreakTarget implementation. |
-void BreakTarget::Initialize(CodeGenerator* cgen, Directionality direction) { |
- JumpTarget::Initialize(cgen, direction); |
- ASSERT(cgen_->has_valid_frame()); |
- expected_height_ = cgen_->frame()->height(); |
+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->cgen_ = cgen_; |
- destination->masm_ = masm_; |
destination->direction_ = direction_; |
destination->reaching_frames_.Clear(); |
destination->merge_labels_.Clear(); |
@@ -546,36 +498,33 @@ |
void BreakTarget::Jump() { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
+ ASSERT(cgen()->has_valid_frame()); |
// Drop leftover statement state from the frame before merging. |
- cgen_->frame()->ForgetElements(cgen_->frame()->height() - expected_height_); |
+ cgen()->frame()->ForgetElements(cgen()->frame()->height() - expected_height_); |
DoJump(); |
} |
void BreakTarget::Jump(Result* arg) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
+ ASSERT(cgen()->has_valid_frame()); |
// Drop leftover statement state from the frame before merging. |
- cgen_->frame()->ForgetElements(cgen_->frame()->height() - expected_height_); |
- cgen_->frame()->Push(arg); |
+ cgen()->frame()->ForgetElements(cgen()->frame()->height() - expected_height_); |
+ cgen()->frame()->Push(arg); |
DoJump(); |
} |
void BreakTarget::Branch(Condition cc, Hint hint) { |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
+ ASSERT(cgen()->has_valid_frame()); |
- int count = cgen_->frame()->height() - expected_height_; |
+ 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(cgen_); |
+ JumpTarget fall_through; |
// Branch to fall through will not negate, because it is a |
// forward-only target. |
fall_through.Branch(NegateCondition(cc), NegateHint(hint)); |
@@ -589,7 +538,6 @@ |
void BreakTarget::Bind(int mergable_elements) { |
#ifdef DEBUG |
- ASSERT(cgen_ != NULL); |
// All the forward-reaching frames should have been adjusted at the |
// jumps to this target. |
for (int i = 0; i < reaching_frames_.length(); i++) { |
@@ -600,8 +548,9 @@ |
// 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()) { |
- cgen_->frame()->ForgetElements(cgen_->frame()->height() - expected_height_); |
+ if (cgen()->has_valid_frame()) { |
+ int count = cgen()->frame()->height() - expected_height_; |
+ cgen()->frame()->ForgetElements(count); |
} |
DoBind(mergable_elements); |
} |
@@ -609,7 +558,6 @@ |
void BreakTarget::Bind(Result* arg, int mergable_elements) { |
#ifdef DEBUG |
- ASSERT(cgen_ != NULL); |
// All the forward-reaching frames should have been adjusted at the |
// jumps to this target. |
for (int i = 0; i < reaching_frames_.length(); i++) { |
@@ -620,12 +568,13 @@ |
// 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()) { |
- cgen_->frame()->ForgetElements(cgen_->frame()->height() - expected_height_); |
- cgen_->frame()->Push(arg); |
+ if (cgen()->has_valid_frame()) { |
+ int count = cgen()->frame()->height() - expected_height_; |
+ cgen()->frame()->ForgetElements(count); |
+ cgen()->frame()->Push(arg); |
} |
DoBind(mergable_elements); |
- *arg = cgen_->frame()->Pop(); |
+ *arg = cgen()->frame()->Pop(); |
} |
@@ -644,25 +593,14 @@ |
// The original's state is reset. |
shadowed->Unuse(); |
- ASSERT(cgen_ != NULL); |
- ASSERT(cgen_->has_valid_frame()); |
- shadowed->set_expected_height(cgen_->frame()->height()); |
- |
- // Setting the code generator to null prevents the shadow target from |
- // being used until shadowing stops. |
- cgen_ = NULL; |
- masm_ = NULL; |
+ ASSERT(cgen()->has_valid_frame()); |
+ shadowed->set_expected_height(cgen()->frame()->height()); |
} |
void ShadowTarget::StopShadowing() { |
ASSERT(is_shadowing_); |
- // This target does not have a valid code generator yet. |
- cgen_ = other_target_->code_generator(); |
- ASSERT(cgen_ != NULL); |
- masm_ = cgen_->masm(); |
- |
// The states of this target, which was shadowed, and the original |
// target, which was shadowing, are swapped. |
BreakTarget temp; |