Chromium Code Reviews| Index: src/arm/codegen-arm.cc |
| =================================================================== |
| --- src/arm/codegen-arm.cc (revision 4592) |
| +++ src/arm/codegen-arm.cc (working copy) |
| @@ -33,6 +33,7 @@ |
| #include "debug.h" |
| #include "ic-inl.h" |
| #include "jsregexp.h" |
| +#include "jump-target-light-inl.h" |
| #include "parser.h" |
| #include "regexp-macro-assembler.h" |
| #include "regexp-stack.h" |
| @@ -44,6 +45,22 @@ |
| namespace v8 { |
| namespace internal { |
| + |
| +// These VirtualFrame methods should actually be in a virtual-frame-arm-inl.h |
|
Søren Thygesen Gjesse
2010/05/06 07:48:11
Considered adding virtual-frame-arm-inl.h?
|
| +// file if such a thing existed. |
| +MemOperand VirtualFrame::ParameterAt(int index) { |
| + // Index -1 corresponds to the receiver. |
| + ASSERT(-1 <= index); // -1 is the receiver. |
| + ASSERT(index <= parameter_count()); |
| + return MemOperand(fp, (1 + parameter_count() - index) * kPointerSize); |
| +} |
| + |
| + // The receiver frame slot. |
| +MemOperand VirtualFrame::Receiver() { |
| + return ParameterAt(-1); |
| +} |
| + |
| + |
| #define __ ACCESS_MASM(masm_) |
| static void EmitIdenticalObjectComparison(MacroAssembler* masm, |
| @@ -274,7 +291,7 @@ |
| // Initialize the function return target after the locals are set |
| // up, because it needs the expected frame height from the frame. |
| - function_return_.set_direction(JumpTarget::BIDIRECTIONAL); |
| + function_return_.SetExpectedHeight(); |
| function_return_is_shadowed_ = false; |
| // Generate code to 'execute' declarations and initialize functions |
| @@ -1550,7 +1567,7 @@ |
| VirtualFrame::SpilledScope spilled_scope(frame_); |
| Comment cmnt(masm_, "[ Block"); |
| CodeForStatementPosition(node); |
| - node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->break_target()->SetExpectedHeight(); |
| VisitStatementsAndSpill(node->statements()); |
| if (node->break_target()->is_linked()) { |
| node->break_target()->Bind(); |
| @@ -1837,7 +1854,7 @@ |
| VirtualFrame::SpilledScope spilled_scope(frame_); |
| Comment cmnt(masm_, "[ SwitchStatement"); |
| CodeForStatementPosition(node); |
| - node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->break_target()->SetExpectedHeight(); |
| LoadAndSpill(node->tag()); |
| @@ -1926,7 +1943,7 @@ |
| VirtualFrame::SpilledScope spilled_scope(frame_); |
| Comment cmnt(masm_, "[ DoWhileStatement"); |
| CodeForStatementPosition(node); |
| - node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->break_target()->SetExpectedHeight(); |
| JumpTarget body(JumpTarget::BIDIRECTIONAL); |
| IncrementLoopNesting(); |
| @@ -1936,14 +1953,14 @@ |
| ConditionAnalysis info = AnalyzeCondition(node->cond()); |
| switch (info) { |
| case ALWAYS_TRUE: |
| - node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL); |
| + node->continue_target()->SetExpectedHeight(); |
| node->continue_target()->Bind(); |
| break; |
| case ALWAYS_FALSE: |
| - node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->continue_target()->SetExpectedHeight(); |
| break; |
| case DONT_KNOW: |
| - node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->continue_target()->SetExpectedHeight(); |
| body.Bind(); |
| break; |
| } |
| @@ -2007,12 +2024,12 @@ |
| ConditionAnalysis info = AnalyzeCondition(node->cond()); |
| if (info == ALWAYS_FALSE) return; |
| - node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->break_target()->SetExpectedHeight(); |
| IncrementLoopNesting(); |
| // Label the top of the loop with the continue target for the backward |
| // CFG edge. |
| - node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL); |
| + node->continue_target()->SetExpectedHeight(); |
| node->continue_target()->Bind(); |
| if (info == DONT_KNOW) { |
| @@ -2061,17 +2078,17 @@ |
| ConditionAnalysis info = AnalyzeCondition(node->cond()); |
| if (info == ALWAYS_FALSE) return; |
| - node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->break_target()->SetExpectedHeight(); |
| IncrementLoopNesting(); |
| // If there is no update statement, label the top of the loop with the |
| // continue target, otherwise with the loop target. |
| JumpTarget loop(JumpTarget::BIDIRECTIONAL); |
| if (node->next() == NULL) { |
| - node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL); |
| + node->continue_target()->SetExpectedHeight(); |
| node->continue_target()->Bind(); |
| } else { |
| - node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->continue_target()->SetExpectedHeight(); |
| loop.Bind(); |
| } |
| @@ -2276,8 +2293,8 @@ |
| // sp[4] : enumerable |
| // Grab the current frame's height for the break and continue |
| // targets only after all the state is pushed on the frame. |
| - node->break_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| - node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY); |
| + node->break_target()->SetExpectedHeight(); |
| + node->continue_target()->SetExpectedHeight(); |
| __ ldr(r0, frame_->ElementAt(0)); // load the current count |
| __ ldr(r1, frame_->ElementAt(1)); // load the length |