| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
| 10 #include "src/ast/ast-numbering.h" | 10 #include "src/ast/ast-numbering.h" |
| (...skipping 3513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3524 return first; | 3524 return first; |
| 3525 } else { | 3525 } else { |
| 3526 HBasicBlock* join_block = graph()->CreateBasicBlock(); | 3526 HBasicBlock* join_block = graph()->CreateBasicBlock(); |
| 3527 Goto(first, join_block); | 3527 Goto(first, join_block); |
| 3528 Goto(second, join_block); | 3528 Goto(second, join_block); |
| 3529 join_block->SetJoinId(join_id); | 3529 join_block->SetJoinId(join_id); |
| 3530 return join_block; | 3530 return join_block; |
| 3531 } | 3531 } |
| 3532 } | 3532 } |
| 3533 | 3533 |
| 3534 | |
| 3535 HBasicBlock* HOptimizedGraphBuilder::JoinContinue(IterationStatement* statement, | 3534 HBasicBlock* HOptimizedGraphBuilder::JoinContinue(IterationStatement* statement, |
| 3535 BailoutId continue_id, |
| 3536 HBasicBlock* exit_block, | 3536 HBasicBlock* exit_block, |
| 3537 HBasicBlock* continue_block) { | 3537 HBasicBlock* continue_block) { |
| 3538 if (continue_block != NULL) { | 3538 if (continue_block != NULL) { |
| 3539 if (exit_block != NULL) Goto(exit_block, continue_block); | 3539 if (exit_block != NULL) Goto(exit_block, continue_block); |
| 3540 continue_block->SetJoinId(statement->ContinueId()); | 3540 continue_block->SetJoinId(continue_id); |
| 3541 return continue_block; | 3541 return continue_block; |
| 3542 } | 3542 } |
| 3543 return exit_block; | 3543 return exit_block; |
| 3544 } | 3544 } |
| 3545 | 3545 |
| 3546 | 3546 |
| 3547 HBasicBlock* HOptimizedGraphBuilder::CreateLoop(IterationStatement* statement, | 3547 HBasicBlock* HOptimizedGraphBuilder::CreateLoop(IterationStatement* statement, |
| 3548 HBasicBlock* loop_entry, | 3548 HBasicBlock* loop_entry, |
| 3549 HBasicBlock* body_exit, | 3549 HBasicBlock* body_exit, |
| 3550 HBasicBlock* loop_successor, | 3550 HBasicBlock* loop_successor, |
| (...skipping 1526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5077 last_block, | 5077 last_block, |
| 5078 stmt->ExitId())); | 5078 stmt->ExitId())); |
| 5079 } else { | 5079 } else { |
| 5080 if (fall_through_block != NULL) Goto(fall_through_block, break_block); | 5080 if (fall_through_block != NULL) Goto(fall_through_block, break_block); |
| 5081 if (last_block != NULL) Goto(last_block, break_block); | 5081 if (last_block != NULL) Goto(last_block, break_block); |
| 5082 break_block->SetJoinId(stmt->ExitId()); | 5082 break_block->SetJoinId(stmt->ExitId()); |
| 5083 set_current_block(break_block); | 5083 set_current_block(break_block); |
| 5084 } | 5084 } |
| 5085 } | 5085 } |
| 5086 | 5086 |
| 5087 | |
| 5088 void HOptimizedGraphBuilder::VisitLoopBody(IterationStatement* stmt, | 5087 void HOptimizedGraphBuilder::VisitLoopBody(IterationStatement* stmt, |
| 5088 BailoutId stack_check_id, |
| 5089 HBasicBlock* loop_entry) { | 5089 HBasicBlock* loop_entry) { |
| 5090 Add<HSimulate>(stmt->StackCheckId()); | 5090 Add<HSimulate>(stack_check_id); |
| 5091 HStackCheck* stack_check = | 5091 HStackCheck* stack_check = |
| 5092 HStackCheck::cast(Add<HStackCheck>(HStackCheck::kBackwardsBranch)); | 5092 HStackCheck::cast(Add<HStackCheck>(HStackCheck::kBackwardsBranch)); |
| 5093 DCHECK(loop_entry->IsLoopHeader()); | 5093 DCHECK(loop_entry->IsLoopHeader()); |
| 5094 loop_entry->loop_information()->set_stack_check(stack_check); | 5094 loop_entry->loop_information()->set_stack_check(stack_check); |
| 5095 CHECK_BAILOUT(Visit(stmt->body())); | 5095 CHECK_BAILOUT(Visit(stmt->body())); |
| 5096 } | 5096 } |
| 5097 | 5097 |
| 5098 | 5098 |
| 5099 void HOptimizedGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { | 5099 void HOptimizedGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| 5100 DCHECK(!HasStackOverflow()); | 5100 DCHECK(!HasStackOverflow()); |
| 5101 DCHECK(current_block() != NULL); | 5101 DCHECK(current_block() != NULL); |
| 5102 DCHECK(current_block()->HasPredecessor()); | 5102 DCHECK(current_block()->HasPredecessor()); |
| 5103 DCHECK(current_block() != NULL); | 5103 DCHECK(current_block() != NULL); |
| 5104 HBasicBlock* loop_entry = BuildLoopEntry(stmt); | 5104 HBasicBlock* loop_entry = BuildLoopEntry(stmt); |
| 5105 | 5105 |
| 5106 BreakAndContinueInfo break_info(stmt, scope()); | 5106 BreakAndContinueInfo break_info(stmt, scope()); |
| 5107 { | 5107 { |
| 5108 BreakAndContinueScope push(&break_info, this); | 5108 BreakAndContinueScope push(&break_info, this); |
| 5109 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry)); | 5109 CHECK_BAILOUT(VisitLoopBody(stmt, stmt->StackCheckId(), loop_entry)); |
| 5110 } | 5110 } |
| 5111 HBasicBlock* body_exit = | 5111 HBasicBlock* body_exit = JoinContinue( |
| 5112 JoinContinue(stmt, current_block(), break_info.continue_block()); | 5112 stmt, stmt->ContinueId(), current_block(), break_info.continue_block()); |
| 5113 HBasicBlock* loop_successor = NULL; | 5113 HBasicBlock* loop_successor = NULL; |
| 5114 if (body_exit != NULL) { | 5114 if (body_exit != NULL) { |
| 5115 set_current_block(body_exit); | 5115 set_current_block(body_exit); |
| 5116 loop_successor = graph()->CreateBasicBlock(); | 5116 loop_successor = graph()->CreateBasicBlock(); |
| 5117 if (stmt->cond()->ToBooleanIsFalse()) { | 5117 if (stmt->cond()->ToBooleanIsFalse()) { |
| 5118 loop_entry->loop_information()->stack_check()->Eliminate(); | 5118 loop_entry->loop_information()->stack_check()->Eliminate(); |
| 5119 Goto(loop_successor); | 5119 Goto(loop_successor); |
| 5120 body_exit = NULL; | 5120 body_exit = NULL; |
| 5121 } else { | 5121 } else { |
| 5122 // The block for a true condition, the actual predecessor block of the | 5122 // The block for a true condition, the actual predecessor block of the |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5162 } | 5162 } |
| 5163 if (loop_successor->HasPredecessor()) { | 5163 if (loop_successor->HasPredecessor()) { |
| 5164 loop_successor->SetJoinId(stmt->ExitId()); | 5164 loop_successor->SetJoinId(stmt->ExitId()); |
| 5165 } else { | 5165 } else { |
| 5166 loop_successor = NULL; | 5166 loop_successor = NULL; |
| 5167 } | 5167 } |
| 5168 | 5168 |
| 5169 BreakAndContinueInfo break_info(stmt, scope()); | 5169 BreakAndContinueInfo break_info(stmt, scope()); |
| 5170 if (current_block() != NULL) { | 5170 if (current_block() != NULL) { |
| 5171 BreakAndContinueScope push(&break_info, this); | 5171 BreakAndContinueScope push(&break_info, this); |
| 5172 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry)); | 5172 CHECK_BAILOUT(VisitLoopBody(stmt, stmt->StackCheckId(), loop_entry)); |
| 5173 } | 5173 } |
| 5174 HBasicBlock* body_exit = | 5174 HBasicBlock* body_exit = JoinContinue( |
| 5175 JoinContinue(stmt, current_block(), break_info.continue_block()); | 5175 stmt, stmt->ContinueId(), current_block(), break_info.continue_block()); |
| 5176 HBasicBlock* loop_exit = CreateLoop(stmt, | 5176 HBasicBlock* loop_exit = CreateLoop(stmt, |
| 5177 loop_entry, | 5177 loop_entry, |
| 5178 body_exit, | 5178 body_exit, |
| 5179 loop_successor, | 5179 loop_successor, |
| 5180 break_info.break_block()); | 5180 break_info.break_block()); |
| 5181 set_current_block(loop_exit); | 5181 set_current_block(loop_exit); |
| 5182 } | 5182 } |
| 5183 | 5183 |
| 5184 | 5184 |
| 5185 void HOptimizedGraphBuilder::VisitForStatement(ForStatement* stmt) { | 5185 void HOptimizedGraphBuilder::VisitForStatement(ForStatement* stmt) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 5211 HControlInstruction* branch = New<HBranch>(graph()->GetConstantTrue()); | 5211 HControlInstruction* branch = New<HBranch>(graph()->GetConstantTrue()); |
| 5212 branch->SetSuccessorAt(0, body_entry); | 5212 branch->SetSuccessorAt(0, body_entry); |
| 5213 branch->SetSuccessorAt(1, loop_successor); | 5213 branch->SetSuccessorAt(1, loop_successor); |
| 5214 FinishCurrentBlock(branch); | 5214 FinishCurrentBlock(branch); |
| 5215 set_current_block(body_entry); | 5215 set_current_block(body_entry); |
| 5216 } | 5216 } |
| 5217 | 5217 |
| 5218 BreakAndContinueInfo break_info(stmt, scope()); | 5218 BreakAndContinueInfo break_info(stmt, scope()); |
| 5219 if (current_block() != NULL) { | 5219 if (current_block() != NULL) { |
| 5220 BreakAndContinueScope push(&break_info, this); | 5220 BreakAndContinueScope push(&break_info, this); |
| 5221 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry)); | 5221 CHECK_BAILOUT(VisitLoopBody(stmt, stmt->StackCheckId(), loop_entry)); |
| 5222 } | 5222 } |
| 5223 HBasicBlock* body_exit = | 5223 HBasicBlock* body_exit = JoinContinue( |
| 5224 JoinContinue(stmt, current_block(), break_info.continue_block()); | 5224 stmt, stmt->ContinueId(), current_block(), break_info.continue_block()); |
| 5225 | 5225 |
| 5226 if (stmt->next() != NULL && body_exit != NULL) { | 5226 if (stmt->next() != NULL && body_exit != NULL) { |
| 5227 set_current_block(body_exit); | 5227 set_current_block(body_exit); |
| 5228 CHECK_BAILOUT(Visit(stmt->next())); | 5228 CHECK_BAILOUT(Visit(stmt->next())); |
| 5229 body_exit = current_block(); | 5229 body_exit = current_block(); |
| 5230 } | 5230 } |
| 5231 | 5231 |
| 5232 HBasicBlock* loop_exit = CreateLoop(stmt, | 5232 HBasicBlock* loop_exit = CreateLoop(stmt, |
| 5233 loop_entry, | 5233 loop_entry, |
| 5234 body_exit, | 5234 body_exit, |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5410 key = Pop(); | 5410 key = Pop(); |
| 5411 } | 5411 } |
| 5412 | 5412 |
| 5413 Bind(each_var, key); | 5413 Bind(each_var, key); |
| 5414 Add<HSimulate>(stmt->AssignmentId()); | 5414 Add<HSimulate>(stmt->AssignmentId()); |
| 5415 | 5415 |
| 5416 BreakAndContinueInfo break_info(stmt, scope(), 5); | 5416 BreakAndContinueInfo break_info(stmt, scope(), 5); |
| 5417 break_info.set_continue_block(continue_block); | 5417 break_info.set_continue_block(continue_block); |
| 5418 { | 5418 { |
| 5419 BreakAndContinueScope push(&break_info, this); | 5419 BreakAndContinueScope push(&break_info, this); |
| 5420 CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry)); | 5420 CHECK_BAILOUT(VisitLoopBody(stmt, stmt->StackCheckId(), loop_entry)); |
| 5421 } | 5421 } |
| 5422 | 5422 |
| 5423 HBasicBlock* body_exit = | 5423 HBasicBlock* body_exit = JoinContinue( |
| 5424 JoinContinue(stmt, current_block(), break_info.continue_block()); | 5424 stmt, stmt->ContinueId(), current_block(), break_info.continue_block()); |
| 5425 | 5425 |
| 5426 if (body_exit != NULL) { | 5426 if (body_exit != NULL) { |
| 5427 set_current_block(body_exit); | 5427 set_current_block(body_exit); |
| 5428 | 5428 |
| 5429 HValue* current_index = Pop(); | 5429 HValue* current_index = Pop(); |
| 5430 HValue* increment = | 5430 HValue* increment = |
| 5431 AddUncasted<HAdd>(current_index, graph()->GetConstant1()); | 5431 AddUncasted<HAdd>(current_index, graph()->GetConstant1()); |
| 5432 increment->ClearFlag(HValue::kCanOverflow); | 5432 increment->ClearFlag(HValue::kCanOverflow); |
| 5433 Push(increment); | 5433 Push(increment); |
| 5434 body_exit = current_block(); | 5434 body_exit = current_block(); |
| (...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6697 } | 6697 } |
| 6698 } | 6698 } |
| 6699 | 6699 |
| 6700 static bool ComputeReceiverTypes(Expression* expr, HValue* receiver, | 6700 static bool ComputeReceiverTypes(Expression* expr, HValue* receiver, |
| 6701 SmallMapList** t, | 6701 SmallMapList** t, |
| 6702 HOptimizedGraphBuilder* builder) { | 6702 HOptimizedGraphBuilder* builder) { |
| 6703 Zone* zone = builder->zone(); | 6703 Zone* zone = builder->zone(); |
| 6704 SmallMapList* maps = expr->GetReceiverTypes(); | 6704 SmallMapList* maps = expr->GetReceiverTypes(); |
| 6705 *t = maps; | 6705 *t = maps; |
| 6706 bool monomorphic = expr->IsMonomorphic(); | 6706 bool monomorphic = expr->IsMonomorphic(); |
| 6707 if (maps != NULL && receiver->HasMonomorphicJSObjectType()) { | 6707 if (maps != nullptr && receiver->HasMonomorphicJSObjectType()) { |
| 6708 if (maps->length() > 0) { | 6708 if (maps->length() > 0) { |
| 6709 Map* root_map = receiver->GetMonomorphicJSObjectMap()->FindRootMap(); | 6709 Map* root_map = receiver->GetMonomorphicJSObjectMap()->FindRootMap(); |
| 6710 maps->FilterForPossibleTransitions(root_map); | 6710 maps->FilterForPossibleTransitions(root_map); |
| 6711 monomorphic = maps->length() == 1; | 6711 monomorphic = maps->length() == 1; |
| 6712 } else { | 6712 } else { |
| 6713 // No type feedback, see if we can infer the type. This is safely | 6713 // No type feedback, see if we can infer the type. This is safely |
| 6714 // possible if the receiver had a known map at some point, and no | 6714 // possible if the receiver had a known map at some point, and no |
| 6715 // map-changing stores have happened to it since. | 6715 // map-changing stores have happened to it since. |
| 6716 Handle<Map> candidate_map = receiver->GetMonomorphicJSObjectMap(); | 6716 Handle<Map> candidate_map = receiver->GetMonomorphicJSObjectMap(); |
| 6717 for (HInstruction* current = builder->current_block()->last(); | 6717 for (HInstruction* current = builder->current_block()->last(); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 6743 } | 6743 } |
| 6744 | 6744 |
| 6745 | 6745 |
| 6746 static bool AreStringTypes(SmallMapList* maps) { | 6746 static bool AreStringTypes(SmallMapList* maps) { |
| 6747 for (int i = 0; i < maps->length(); i++) { | 6747 for (int i = 0; i < maps->length(); i++) { |
| 6748 if (maps->at(i)->instance_type() >= FIRST_NONSTRING_TYPE) return false; | 6748 if (maps->at(i)->instance_type() >= FIRST_NONSTRING_TYPE) return false; |
| 6749 } | 6749 } |
| 6750 return true; | 6750 return true; |
| 6751 } | 6751 } |
| 6752 | 6752 |
| 6753 | |
| 6754 void HOptimizedGraphBuilder::BuildStore(Expression* expr, Property* prop, | 6753 void HOptimizedGraphBuilder::BuildStore(Expression* expr, Property* prop, |
| 6755 FeedbackVectorSlot slot, | 6754 FeedbackVectorSlot slot, |
| 6756 BailoutId ast_id, BailoutId return_id, | 6755 BailoutId ast_id, BailoutId return_id, |
| 6757 bool is_uninitialized) { | 6756 bool is_uninitialized) { |
| 6758 if (!prop->key()->IsPropertyName()) { | 6757 if (!prop->key()->IsPropertyName()) { |
| 6759 // Keyed store. | 6758 // Keyed store. |
| 6760 HValue* value = Pop(); | 6759 HValue* value = Pop(); |
| 6761 HValue* key = Pop(); | 6760 HValue* key = Pop(); |
| 6762 HValue* object = Pop(); | 6761 HValue* object = Pop(); |
| 6763 bool has_side_effects = false; | 6762 bool has_side_effects = false; |
| (...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7576 // generic access in the case length() == 0. | 7575 // generic access in the case length() == 0. |
| 7577 DCHECK(join->predecessors()->length() > 0); | 7576 DCHECK(join->predecessors()->length() > 0); |
| 7578 // Deopt if none of the cases matched. | 7577 // Deopt if none of the cases matched. |
| 7579 NoObservableSideEffectsScope scope(this); | 7578 NoObservableSideEffectsScope scope(this); |
| 7580 FinishExitWithHardDeoptimization( | 7579 FinishExitWithHardDeoptimization( |
| 7581 Deoptimizer::kUnknownMapInPolymorphicElementAccess); | 7580 Deoptimizer::kUnknownMapInPolymorphicElementAccess); |
| 7582 set_current_block(join); | 7581 set_current_block(join); |
| 7583 return access_type == STORE ? val : Pop(); | 7582 return access_type == STORE ? val : Pop(); |
| 7584 } | 7583 } |
| 7585 | 7584 |
| 7586 | |
| 7587 HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( | 7585 HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( |
| 7588 HValue* obj, HValue* key, HValue* val, Expression* expr, | 7586 HValue* obj, HValue* key, HValue* val, Expression* expr, |
| 7589 FeedbackVectorSlot slot, BailoutId ast_id, BailoutId return_id, | 7587 FeedbackVectorSlot slot, BailoutId ast_id, BailoutId return_id, |
| 7590 PropertyAccessType access_type, bool* has_side_effects) { | 7588 PropertyAccessType access_type, bool* has_side_effects) { |
| 7591 // A keyed name access with type feedback may contain the name. | 7589 // A keyed name access with type feedback may contain the name. |
| 7592 Handle<TypeFeedbackVector> vector = | 7590 Handle<TypeFeedbackVector> vector = |
| 7593 handle(current_feedback_vector(), isolate()); | 7591 handle(current_feedback_vector(), isolate()); |
| 7594 HValue* expected_key = key; | 7592 HValue* expected_key = key; |
| 7595 if (!key->ActualValue()->IsConstant()) { | 7593 if (!key->ActualValue()->IsConstant()) { |
| 7596 Name* name = nullptr; | 7594 Name* name = nullptr; |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7789 arguments_environment()->parameter_count() - 1; | 7787 arguments_environment()->parameter_count() - 1; |
| 7790 HInstruction* length = Add<HConstant>(argument_count); | 7788 HInstruction* length = Add<HConstant>(argument_count); |
| 7791 HInstruction* checked_key = Add<HBoundsCheck>(key, length); | 7789 HInstruction* checked_key = Add<HBoundsCheck>(key, length); |
| 7792 result = New<HAccessArgumentsAt>(elements, length, checked_key); | 7790 result = New<HAccessArgumentsAt>(elements, length, checked_key); |
| 7793 } | 7791 } |
| 7794 } | 7792 } |
| 7795 ast_context()->ReturnInstruction(result, expr->id()); | 7793 ast_context()->ReturnInstruction(result, expr->id()); |
| 7796 return true; | 7794 return true; |
| 7797 } | 7795 } |
| 7798 | 7796 |
| 7799 | |
| 7800 HValue* HOptimizedGraphBuilder::BuildNamedAccess( | 7797 HValue* HOptimizedGraphBuilder::BuildNamedAccess( |
| 7801 PropertyAccessType access, BailoutId ast_id, BailoutId return_id, | 7798 PropertyAccessType access, BailoutId ast_id, BailoutId return_id, |
| 7802 Expression* expr, FeedbackVectorSlot slot, HValue* object, | 7799 Expression* expr, FeedbackVectorSlot slot, HValue* object, |
| 7803 Handle<Name> name, HValue* value, bool is_uninitialized) { | 7800 Handle<Name> name, HValue* value, bool is_uninitialized) { |
| 7804 SmallMapList* maps; | 7801 SmallMapList* maps; |
| 7805 ComputeReceiverTypes(expr, object, &maps, this); | 7802 ComputeReceiverTypes(expr, object, &maps, this); |
| 7806 DCHECK(maps != NULL); | 7803 DCHECK(maps != NULL); |
| 7807 | 7804 |
| 7808 if (maps->length() > 0) { | 7805 if (maps->length() > 0) { |
| 7809 PropertyAccessInfo info(this, access, maps->first(), name); | 7806 PropertyAccessInfo info(this, access, maps->first(), name); |
| (...skipping 2885 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10695 if (instr->IsAdd()) { | 10692 if (instr->IsAdd()) { |
| 10696 HAdd* add = HAdd::cast(instr); | 10693 HAdd* add = HAdd::cast(instr); |
| 10697 add->set_observed_input_representation(1, rep); | 10694 add->set_observed_input_representation(1, rep); |
| 10698 add->set_observed_input_representation(2, Representation::Smi()); | 10695 add->set_observed_input_representation(2, Representation::Smi()); |
| 10699 } | 10696 } |
| 10700 instr->ClearAllSideEffects(); | 10697 instr->ClearAllSideEffects(); |
| 10701 instr->SetFlag(HInstruction::kCannotBeTagged); | 10698 instr->SetFlag(HInstruction::kCannotBeTagged); |
| 10702 return instr; | 10699 return instr; |
| 10703 } | 10700 } |
| 10704 | 10701 |
| 10705 | |
| 10706 void HOptimizedGraphBuilder::BuildStoreForEffect( | 10702 void HOptimizedGraphBuilder::BuildStoreForEffect( |
| 10707 Expression* expr, Property* prop, FeedbackVectorSlot slot, BailoutId ast_id, | 10703 Expression* expr, Property* prop, FeedbackVectorSlot slot, BailoutId ast_id, |
| 10708 BailoutId return_id, HValue* object, HValue* key, HValue* value) { | 10704 BailoutId return_id, HValue* object, HValue* key, HValue* value) { |
| 10709 EffectContext for_effect(this); | 10705 EffectContext for_effect(this); |
| 10710 Push(object); | 10706 Push(object); |
| 10711 if (key != NULL) Push(key); | 10707 if (key != NULL) Push(key); |
| 10712 Push(value); | 10708 Push(value); |
| 10713 BuildStore(expr, prop, slot, ast_id, return_id); | 10709 BuildStore(expr, prop, slot, ast_id, return_id); |
| 10714 } | 10710 } |
| 10715 | 10711 |
| (...skipping 2713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13429 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13425 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13430 } | 13426 } |
| 13431 | 13427 |
| 13432 #ifdef DEBUG | 13428 #ifdef DEBUG |
| 13433 graph_->Verify(false); // No full verify. | 13429 graph_->Verify(false); // No full verify. |
| 13434 #endif | 13430 #endif |
| 13435 } | 13431 } |
| 13436 | 13432 |
| 13437 } // namespace internal | 13433 } // namespace internal |
| 13438 } // namespace v8 | 13434 } // namespace v8 |
| OLD | NEW |