| Index: src/ia32/codegen-ia32.cc
|
| ===================================================================
|
| --- src/ia32/codegen-ia32.cc (revision 1967)
|
| +++ src/ia32/codegen-ia32.cc (working copy)
|
| @@ -140,7 +140,7 @@
|
| frame_->AllocateStackSlots(scope_->num_stack_slots());
|
| // Initialize the function return target after the locals are set
|
| // up, because it needs the expected frame height from the frame.
|
| - function_return_.Initialize(this, JumpTarget::BIDIRECTIONAL);
|
| + function_return_.set_direction(JumpTarget::BIDIRECTIONAL);
|
| function_return_is_shadowed_ = false;
|
|
|
| // Allocate the arguments object and copy the parameters into it.
|
| @@ -467,14 +467,14 @@
|
| int original_height = frame_->height();
|
| #endif
|
| ASSERT(!in_spilled_code());
|
| - JumpTarget true_target(this);
|
| - JumpTarget false_target(this);
|
| + JumpTarget true_target;
|
| + JumpTarget false_target;
|
| ControlDestination dest(&true_target, &false_target, true);
|
| LoadCondition(x, typeof_state, &dest, false);
|
|
|
| if (dest.false_was_fall_through()) {
|
| // The false target was just bound.
|
| - JumpTarget loaded(this);
|
| + JumpTarget loaded;
|
| frame_->Push(Factory::false_value());
|
| // There may be dangling jumps to the true target.
|
| if (true_target.is_linked()) {
|
| @@ -487,7 +487,7 @@
|
| } else if (dest.is_used()) {
|
| // There is true, and possibly false, control flow (with true as
|
| // the fall through).
|
| - JumpTarget loaded(this);
|
| + JumpTarget loaded;
|
| frame_->Push(Factory::true_value());
|
| if (false_target.is_linked()) {
|
| loaded.Jump();
|
| @@ -503,7 +503,7 @@
|
| // short-circuited boolean operators).
|
| ASSERT(has_valid_frame());
|
| if (true_target.is_linked() || false_target.is_linked()) {
|
| - JumpTarget loaded(this);
|
| + JumpTarget loaded;
|
| loaded.Jump(); // Don't lose the current TOS.
|
| if (true_target.is_linked()) {
|
| true_target.Bind();
|
| @@ -1540,7 +1540,7 @@
|
| // where both sides are Smis.
|
| left_side.ToRegister();
|
| ASSERT(left_side.is_valid());
|
| - JumpTarget is_smi(this);
|
| + JumpTarget is_smi;
|
| __ test(left_side.reg(), Immediate(kSmiTagMask));
|
| is_smi.Branch(zero, &left_side, &right_side, taken);
|
|
|
| @@ -1611,7 +1611,7 @@
|
| (right_side.is_constant() && !right_side.handle()->IsSmi());
|
| left_side.ToRegister();
|
| right_side.ToRegister();
|
| - JumpTarget is_smi(this);
|
| + JumpTarget is_smi;
|
| if (!known_non_smi) {
|
| // Check for the smi case.
|
| Result temp = allocator_->Allocate();
|
| @@ -1756,7 +1756,7 @@
|
| ASSERT(!in_spilled_code());
|
| Comment cmnt(masm_, "[ Block");
|
| CodeForStatementPosition(node);
|
| - node->break_target()->Initialize(this);
|
| + node->break_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
| VisitStatements(node->statements());
|
| if (node->break_target()->is_linked()) {
|
| node->break_target()->Bind();
|
| @@ -1870,10 +1870,10 @@
|
| bool has_else_stm = node->HasElseStatement();
|
|
|
| CodeForStatementPosition(node);
|
| - JumpTarget exit(this);
|
| + JumpTarget exit;
|
| if (has_then_stm && has_else_stm) {
|
| - JumpTarget then(this);
|
| - JumpTarget else_(this);
|
| + JumpTarget then;
|
| + JumpTarget else_;
|
| ControlDestination dest(&then, &else_, true);
|
| LoadCondition(node->condition(), NOT_INSIDE_TYPEOF, &dest, true);
|
|
|
| @@ -1900,7 +1900,7 @@
|
|
|
| } else if (has_then_stm) {
|
| ASSERT(!has_else_stm);
|
| - JumpTarget then(this);
|
| + JumpTarget then;
|
| ControlDestination dest(&then, &exit, true);
|
| LoadCondition(node->condition(), NOT_INSIDE_TYPEOF, &dest, true);
|
|
|
| @@ -1920,7 +1920,7 @@
|
|
|
| } else if (has_else_stm) {
|
| ASSERT(!has_then_stm);
|
| - JumpTarget else_(this);
|
| + JumpTarget else_;
|
| ControlDestination dest(&exit, &else_, false);
|
| LoadCondition(node->condition(), NOT_INSIDE_TYPEOF, &dest, true);
|
|
|
| @@ -2087,8 +2087,8 @@
|
| // placeholders, and fill in the addresses after the labels have been
|
| // bound.
|
|
|
| - JumpTarget setup_default(this);
|
| - JumpTarget is_smi(this);
|
| + JumpTarget setup_default;
|
| + JumpTarget is_smi;
|
|
|
| // A non-null default label pointer indicates a default case among
|
| // the case labels. Otherwise we use the break target as a
|
| @@ -2133,7 +2133,7 @@
|
| // frame of the correct height can be merged to). Keep a copy to
|
| // restore at the start of every label. Create a jump target and
|
| // bind it to set its entry frame properly.
|
| - JumpTarget entry_target(this, JumpTarget::BIDIRECTIONAL);
|
| + JumpTarget entry_target(JumpTarget::BIDIRECTIONAL);
|
| entry_target.Bind(&smi_value);
|
| VirtualFrame* start_frame = new VirtualFrame(frame_);
|
|
|
| @@ -2190,7 +2190,7 @@
|
| ASSERT(!in_spilled_code());
|
| Comment cmnt(masm_, "[ SwitchStatement");
|
| CodeForStatementPosition(node);
|
| - node->break_target()->Initialize(this);
|
| + node->break_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
|
|
| // Compile the switch value.
|
| Load(node->tag());
|
| @@ -2203,7 +2203,7 @@
|
| int length = cases->length();
|
| CaseClause* default_clause = NULL;
|
|
|
| - JumpTarget next_test(this);
|
| + JumpTarget next_test;
|
| // Compile the case label expressions and comparisons. Exit early
|
| // if a comparison is unconditionally true. The target next_test is
|
| // bound before the loop in order to indicate control flow to the
|
| @@ -2211,7 +2211,6 @@
|
| next_test.Bind();
|
| for (int i = 0; i < length && !next_test.is_unused(); i++) {
|
| CaseClause* clause = cases->at(i);
|
| - clause->body_target()->Initialize(this);
|
| // The default is not a test, but remember it for later.
|
| if (clause->is_default()) {
|
| default_clause = clause;
|
| @@ -2282,7 +2281,7 @@
|
| if (clause->is_default()) {
|
| clause->body_target()->Bind();
|
| } else {
|
| - JumpTarget body(this);
|
| + JumpTarget body;
|
| body.Jump();
|
| clause->body_target()->Bind();
|
| frame_->Drop();
|
| @@ -2320,7 +2319,7 @@
|
| ASSERT(!in_spilled_code());
|
| Comment cmnt(masm_, "[ LoopStatement");
|
| CodeForStatementPosition(node);
|
| - node->break_target()->Initialize(this);
|
| + node->break_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
|
|
| // Simple condition analysis. ALWAYS_TRUE and ALWAYS_FALSE represent a
|
| // known result for the test expression, with no side effects.
|
| @@ -2341,21 +2340,21 @@
|
|
|
| switch (node->type()) {
|
| case LoopStatement::DO_LOOP: {
|
| - JumpTarget body(this, JumpTarget::BIDIRECTIONAL);
|
| + JumpTarget body(JumpTarget::BIDIRECTIONAL);
|
| IncrementLoopNesting();
|
|
|
| // Label the top of the loop for the backward jump if necessary.
|
| if (info == ALWAYS_TRUE) {
|
| // Use the continue target.
|
| - node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL);
|
| + node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL);
|
| node->continue_target()->Bind();
|
| } else if (info == ALWAYS_FALSE) {
|
| // No need to label it.
|
| - node->continue_target()->Initialize(this);
|
| + node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
| } else {
|
| // Continue is the test, so use the backward body target.
|
| ASSERT(info == DONT_KNOW);
|
| - node->continue_target()->Initialize(this);
|
| + node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
| body.Bind();
|
| }
|
|
|
| @@ -2414,27 +2413,25 @@
|
|
|
| JumpTarget body;
|
| if (test_at_bottom) {
|
| - body.Initialize(this, JumpTarget::BIDIRECTIONAL);
|
| - } else {
|
| - body.Initialize(this);
|
| + body.set_direction(JumpTarget::BIDIRECTIONAL);
|
| }
|
|
|
| // Based on the condition analysis, compile the test as necessary.
|
| if (info == ALWAYS_TRUE) {
|
| // We will not compile the test expression. Label the top of
|
| // the loop with the continue target.
|
| - node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL);
|
| + node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL);
|
| node->continue_target()->Bind();
|
| } else {
|
| ASSERT(info == DONT_KNOW); // ALWAYS_FALSE cannot reach here.
|
| if (test_at_bottom) {
|
| // Continue is the test at the bottom, no need to label the
|
| // test at the top. The body is a backward target.
|
| - node->continue_target()->Initialize(this);
|
| + node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
| } else {
|
| // Label the test at the top as the continue target. The
|
| // body is a forward-only target.
|
| - node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL);
|
| + node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL);
|
| node->continue_target()->Bind();
|
| }
|
| // Compile the test with the body as the true target and
|
| @@ -2517,15 +2514,13 @@
|
|
|
| // Target for backward edge if no test at the bottom, otherwise
|
| // unused.
|
| - JumpTarget loop(this, JumpTarget::BIDIRECTIONAL);
|
| + JumpTarget loop(JumpTarget::BIDIRECTIONAL);
|
|
|
| // Target for backward edge if there is a test at the bottom,
|
| // otherwise used as target for test at the top.
|
| JumpTarget body;
|
| if (test_at_bottom) {
|
| - body.Initialize(this, JumpTarget::BIDIRECTIONAL);
|
| - } else {
|
| - body.Initialize(this);
|
| + body.set_direction(JumpTarget::BIDIRECTIONAL);
|
| }
|
|
|
| // Based on the condition analysis, compile the test as necessary.
|
| @@ -2534,11 +2529,11 @@
|
| // the loop.
|
| if (node->next() == NULL) {
|
| // Use the continue target if there is no update expression.
|
| - node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL);
|
| + node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL);
|
| node->continue_target()->Bind();
|
| } else {
|
| // Otherwise use the backward loop target.
|
| - node->continue_target()->Initialize(this);
|
| + node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
| loop.Bind();
|
| }
|
| } else {
|
| @@ -2546,16 +2541,16 @@
|
| if (test_at_bottom) {
|
| // Continue is either the update expression or the test at
|
| // the bottom, no need to label the test at the top.
|
| - node->continue_target()->Initialize(this);
|
| + node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
| } else if (node->next() == NULL) {
|
| // We are not recompiling the test at the bottom and there
|
| // is no update expression.
|
| - node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL);
|
| + node->continue_target()->set_direction(JumpTarget::BIDIRECTIONAL);
|
| node->continue_target()->Bind();
|
| } else {
|
| // We are not recompiling the test at the bottom and there
|
| // is an update expression.
|
| - node->continue_target()->Initialize(this);
|
| + node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
| loop.Bind();
|
| }
|
|
|
| @@ -2659,12 +2654,12 @@
|
| Comment cmnt(masm_, "[ ForInStatement");
|
| CodeForStatementPosition(node);
|
|
|
| - JumpTarget primitive(this);
|
| - JumpTarget jsobject(this);
|
| - JumpTarget fixed_array(this);
|
| - JumpTarget entry(this, JumpTarget::BIDIRECTIONAL);
|
| - JumpTarget end_del_check(this);
|
| - JumpTarget exit(this);
|
| + JumpTarget primitive;
|
| + JumpTarget jsobject;
|
| + JumpTarget fixed_array;
|
| + JumpTarget entry(JumpTarget::BIDIRECTIONAL);
|
| + JumpTarget end_del_check;
|
| + JumpTarget exit;
|
|
|
| // Get the object to enumerate over (converted to JSObject).
|
| LoadAndSpill(node->enumerable());
|
| @@ -2749,8 +2744,8 @@
|
| entry.Bind();
|
| // 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()->Initialize(this);
|
| - node->continue_target()->Initialize(this);
|
| + node->break_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
| + node->continue_target()->set_direction(JumpTarget::FORWARD_ONLY);
|
|
|
| __ mov(eax, frame_->ElementAt(0)); // load the current count
|
| __ cmp(eax, frame_->ElementAt(1)); // compare to the array length
|
| @@ -2849,8 +2844,8 @@
|
| Comment cmnt(masm_, "[ TryCatch");
|
| CodeForStatementPosition(node);
|
|
|
| - JumpTarget try_block(this);
|
| - JumpTarget exit(this);
|
| + JumpTarget try_block;
|
| + JumpTarget exit;
|
|
|
| try_block.Call();
|
| // --- Catch block ---
|
| @@ -2993,8 +2988,8 @@
|
| // break/continue from within the try block.
|
| enum { FALLING, THROWING, JUMPING };
|
|
|
| - JumpTarget try_block(this);
|
| - JumpTarget finally_block(this);
|
| + JumpTarget try_block;
|
| + JumpTarget finally_block;
|
|
|
| try_block.Call();
|
|
|
| @@ -3146,7 +3141,7 @@
|
| } else {
|
| // Branch around the preparation for return which may emit
|
| // code.
|
| - JumpTarget skip(this);
|
| + JumpTarget skip;
|
| skip.Branch(not_equal);
|
| frame_->PrepareForReturn();
|
| original->Jump(&return_value);
|
| @@ -3160,7 +3155,7 @@
|
|
|
| if (has_valid_frame()) {
|
| // Check if we need to rethrow the exception.
|
| - JumpTarget exit(this);
|
| + JumpTarget exit;
|
| __ cmp(Operand(ecx), Immediate(Smi::FromInt(THROWING)));
|
| exit.Branch(not_equal);
|
|
|
| @@ -3220,9 +3215,9 @@
|
|
|
| void CodeGenerator::VisitConditional(Conditional* node) {
|
| Comment cmnt(masm_, "[ Conditional");
|
| - JumpTarget then(this);
|
| - JumpTarget else_(this);
|
| - JumpTarget exit(this);
|
| + JumpTarget then;
|
| + JumpTarget else_;
|
| + JumpTarget exit;
|
| ControlDestination dest(&then, &else_, true);
|
| LoadCondition(node->condition(), NOT_INSIDE_TYPEOF, &dest, true);
|
|
|
| @@ -3254,8 +3249,8 @@
|
| if (slot->type() == Slot::LOOKUP) {
|
| ASSERT(slot->var()->is_dynamic());
|
|
|
| - JumpTarget slow(this);
|
| - JumpTarget done(this);
|
| + JumpTarget slow;
|
| + JumpTarget done;
|
| Result value;
|
|
|
| // Generate fast-case code for variables that might be shadowed by
|
| @@ -3321,7 +3316,7 @@
|
| // potentially unsafe direct-frame access of SlotOperand.
|
| VirtualFrame::SpilledScope spilled_scope(this);
|
| Comment cmnt(masm_, "[ Load const");
|
| - JumpTarget exit(this);
|
| + JumpTarget exit;
|
| __ mov(ecx, SlotOperand(slot, ecx));
|
| __ cmp(ecx, Factory::the_hole_value());
|
| exit.Branch(not_equal);
|
| @@ -3459,7 +3454,7 @@
|
| } else {
|
| ASSERT(!slot->var()->is_dynamic());
|
|
|
| - JumpTarget exit(this);
|
| + JumpTarget exit;
|
| if (init_state == CONST_INIT) {
|
| ASSERT(slot->var()->mode() == Variable::CONST);
|
| // Only the first const initialization must be executed (the slot
|
| @@ -4284,13 +4279,13 @@
|
| void CodeGenerator::GenerateFastCharCodeAt(ZoneList<Expression*>* args) {
|
| ASSERT(args->length() == 2);
|
|
|
| - JumpTarget slow_case(this);
|
| - JumpTarget end(this);
|
| - JumpTarget not_a_flat_string(this);
|
| - JumpTarget a_cons_string(this);
|
| - JumpTarget try_again_with_new_string(this, JumpTarget::BIDIRECTIONAL);
|
| - JumpTarget ascii_string(this);
|
| - JumpTarget got_char_code(this);
|
| + JumpTarget slow_case;
|
| + JumpTarget end;
|
| + JumpTarget not_a_flat_string;
|
| + JumpTarget a_cons_string;
|
| + JumpTarget try_again_with_new_string(JumpTarget::BIDIRECTIONAL);
|
| + JumpTarget ascii_string;
|
| + JumpTarget got_char_code;
|
|
|
| Load(args->at(0));
|
| Load(args->at(1));
|
| @@ -4448,7 +4443,7 @@
|
|
|
| void CodeGenerator::GenerateValueOf(ZoneList<Expression*>* args) {
|
| ASSERT(args->length() == 1);
|
| - JumpTarget leave(this);
|
| + JumpTarget leave;
|
| Load(args->at(0)); // Load the object.
|
| frame_->Dup();
|
| Result object = frame_->Pop();
|
| @@ -4472,7 +4467,7 @@
|
|
|
| void CodeGenerator::GenerateSetValueOf(ZoneList<Expression*>* args) {
|
| ASSERT(args->length() == 2);
|
| - JumpTarget leave(this);
|
| + JumpTarget leave;
|
| Load(args->at(0)); // Load the object.
|
| Load(args->at(1)); // Load the value.
|
| Result value = frame_->Pop();
|
| @@ -4701,8 +4696,8 @@
|
|
|
| case Token::BIT_NOT: {
|
| // Smi check.
|
| - JumpTarget smi_label(this);
|
| - JumpTarget continue_label(this);
|
| + JumpTarget smi_label;
|
| + JumpTarget continue_label;
|
| Result operand = frame_->Pop();
|
| operand.ToRegister();
|
| __ test(operand.reg(), Immediate(kSmiTagMask));
|
| @@ -4725,7 +4720,7 @@
|
|
|
| case Token::ADD: {
|
| // Smi check.
|
| - JumpTarget continue_label(this);
|
| + JumpTarget continue_label;
|
| Result operand = frame_->Pop();
|
| operand.ToRegister();
|
| __ test(operand.reg(), Immediate(kSmiTagMask));
|
| @@ -4920,7 +4915,7 @@
|
| // is necessary because we assume that if we get control flow on the
|
| // last path out of an expression we got it on all paths.
|
| if (op == Token::AND) {
|
| - JumpTarget is_true(this);
|
| + JumpTarget is_true;
|
| ControlDestination dest(&is_true, destination()->false_target(), true);
|
| LoadCondition(node->left(), NOT_INSIDE_TYPEOF, &dest, false);
|
|
|
| @@ -4958,8 +4953,8 @@
|
| // We have a materialized value on the frame, so we exit with
|
| // one on all paths. There are possibly also jumps to is_true
|
| // from nested subexpressions.
|
| - JumpTarget pop_and_continue(this);
|
| - JumpTarget exit(this);
|
| + JumpTarget pop_and_continue;
|
| + JumpTarget exit;
|
|
|
| // Avoid popping the result if it converts to 'false' using the
|
| // standard ToBoolean() conversion as described in ECMA-262,
|
| @@ -4983,7 +4978,7 @@
|
| }
|
|
|
| } else if (op == Token::OR) {
|
| - JumpTarget is_false(this);
|
| + JumpTarget is_false;
|
| ControlDestination dest(destination()->true_target(), &is_false, false);
|
| LoadCondition(node->left(), NOT_INSIDE_TYPEOF, &dest, false);
|
|
|
| @@ -5020,8 +5015,8 @@
|
| // We have a materialized value on the frame, so we exit with
|
| // one on all paths. There are possibly also jumps to is_false
|
| // from nested subexpressions.
|
| - JumpTarget pop_and_continue(this);
|
| - JumpTarget exit(this);
|
| + JumpTarget pop_and_continue;
|
| + JumpTarget exit;
|
|
|
| // Avoid popping the result if it converts to 'true' using the
|
| // standard ToBoolean() conversion as described in ECMA-262,
|
| @@ -5975,7 +5970,7 @@
|
| // the left and right arguments, and jump to slow case.
|
| // The low bit of the left argument may be lost, but only
|
| // in a case where it is dropped anyway.
|
| - JumpTarget result_ok(generator());
|
| + JumpTarget result_ok;
|
| __ test(left->reg(), Immediate(0xc0000000));
|
| result_ok.Branch(zero, left, taken);
|
| __ shl(left->reg());
|
| @@ -5989,7 +5984,7 @@
|
| case Token::SHL: {
|
| __ shl(left->reg());
|
| // Check that the *signed* result fits in a smi.
|
| - JumpTarget result_ok(generator());
|
| + JumpTarget result_ok;
|
| __ cmp(left->reg(), 0xc0000000);
|
| result_ok.Branch(positive, left, taken);
|
|
|
|
|