OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
(...skipping 3294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3305 case VariableLocation::GLOBAL: | 3305 case VariableLocation::GLOBAL: |
3306 case VariableLocation::UNALLOCATED: { | 3306 case VariableLocation::UNALLOCATED: { |
3307 // Global var, const, or let variable. | 3307 // Global var, const, or let variable. |
3308 Handle<Name> name = variable->name(); | 3308 Handle<Name> name = variable->name(); |
3309 Handle<Object> constant_value = | 3309 Handle<Object> constant_value = |
3310 jsgraph()->isolate()->factory()->GlobalConstantFor(name); | 3310 jsgraph()->isolate()->factory()->GlobalConstantFor(name); |
3311 if (!constant_value.is_null()) { | 3311 if (!constant_value.is_null()) { |
3312 // Optimize global constants like "undefined", "Infinity", and "NaN". | 3312 // Optimize global constants like "undefined", "Infinity", and "NaN". |
3313 return jsgraph()->Constant(constant_value); | 3313 return jsgraph()->Constant(constant_value); |
3314 } | 3314 } |
3315 Node* script_context = current_context(); | 3315 Node* value = BuildGlobalLoad(name, feedback, typeof_mode); |
3316 int slot_index = -1; | |
3317 if (variable->index() > 0) { | |
3318 DCHECK(variable->IsStaticGlobalObjectProperty()); | |
3319 slot_index = variable->index(); | |
3320 int depth = current_scope()->ContextChainLength(variable->scope()); | |
3321 if (depth > 0) { | |
3322 const Operator* op = javascript()->LoadContext( | |
3323 depth - 1, Context::PREVIOUS_INDEX, true); | |
3324 script_context = NewNode(op, current_context()); | |
3325 } | |
3326 } | |
3327 Node* global = BuildLoadGlobalObject(); | |
3328 Node* value = BuildGlobalLoad(script_context, global, name, feedback, | |
3329 typeof_mode, slot_index); | |
3330 states.AddToNode(value, bailout_id, combine); | 3316 states.AddToNode(value, bailout_id, combine); |
3331 return value; | 3317 return value; |
3332 } | 3318 } |
3333 case VariableLocation::PARAMETER: | 3319 case VariableLocation::PARAMETER: |
3334 case VariableLocation::LOCAL: { | 3320 case VariableLocation::LOCAL: { |
3335 // Local var, const, or let variable. | 3321 // Local var, const, or let variable. |
3336 Node* value = environment()->Lookup(variable); | 3322 Node* value = environment()->Lookup(variable); |
3337 if (mode == CONST_LEGACY) { | 3323 if (mode == CONST_LEGACY) { |
3338 // Perform check for uninitialized legacy const variables. | 3324 // Perform check for uninitialized legacy const variables. |
3339 if (value->op() == the_hole->op()) { | 3325 if (value->op() == the_hole->op()) { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3454 Node* AstGraphBuilder::BuildVariableAssignment( | 3440 Node* AstGraphBuilder::BuildVariableAssignment( |
3455 Variable* variable, Node* value, Token::Value op, | 3441 Variable* variable, Node* value, Token::Value op, |
3456 const VectorSlotPair& feedback, BailoutId bailout_id, | 3442 const VectorSlotPair& feedback, BailoutId bailout_id, |
3457 FrameStateBeforeAndAfter& states, OutputFrameStateCombine combine) { | 3443 FrameStateBeforeAndAfter& states, OutputFrameStateCombine combine) { |
3458 Node* the_hole = jsgraph()->TheHoleConstant(); | 3444 Node* the_hole = jsgraph()->TheHoleConstant(); |
3459 VariableMode mode = variable->mode(); | 3445 VariableMode mode = variable->mode(); |
3460 switch (variable->location()) { | 3446 switch (variable->location()) { |
3461 case VariableLocation::GLOBAL: | 3447 case VariableLocation::GLOBAL: |
3462 case VariableLocation::UNALLOCATED: { | 3448 case VariableLocation::UNALLOCATED: { |
3463 // Global var, const, or let variable. | 3449 // Global var, const, or let variable. |
3464 Node* script_context = current_context(); | |
3465 int slot_index = -1; | |
3466 if (variable->index() > 0) { | |
3467 DCHECK(variable->IsStaticGlobalObjectProperty()); | |
3468 slot_index = variable->index(); | |
3469 int depth = current_scope()->ContextChainLength(variable->scope()); | |
3470 if (depth > 0) { | |
3471 const Operator* op = javascript()->LoadContext( | |
3472 depth - 1, Context::PREVIOUS_INDEX, true); | |
3473 script_context = NewNode(op, current_context()); | |
3474 } | |
3475 } | |
3476 Node* global = BuildLoadGlobalObject(); | |
3477 Handle<Name> name = variable->name(); | 3450 Handle<Name> name = variable->name(); |
3478 Node* store = | 3451 Node* store = |
3479 BuildGlobalStore(script_context, global, name, value, feedback, | 3452 BuildGlobalStore(name, value, feedback, TypeFeedbackId::None()); |
3480 TypeFeedbackId::None(), slot_index); | |
3481 states.AddToNode(store, bailout_id, combine); | 3453 states.AddToNode(store, bailout_id, combine); |
3482 return store; | 3454 return store; |
3483 } | 3455 } |
3484 case VariableLocation::PARAMETER: | 3456 case VariableLocation::PARAMETER: |
3485 case VariableLocation::LOCAL: | 3457 case VariableLocation::LOCAL: |
3486 // Local var, const, or let variable. | 3458 // Local var, const, or let variable. |
3487 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { | 3459 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { |
3488 // Perform an initialization check for legacy const variables. | 3460 // Perform an initialization check for legacy const variables. |
3489 Node* current = environment()->Lookup(variable); | 3461 Node* current = environment()->Lookup(variable); |
3490 if (current->op() != the_hole->op()) { | 3462 if (current->op() != the_hole->op()) { |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3694 Node* name_node = jsgraph()->Constant(name); | 3666 Node* name_node = jsgraph()->Constant(name); |
3695 Runtime::FunctionId function_id = is_strict(language_mode()) | 3667 Runtime::FunctionId function_id = is_strict(language_mode()) |
3696 ? Runtime::kStoreToSuper_Strict | 3668 ? Runtime::kStoreToSuper_Strict |
3697 : Runtime::kStoreToSuper_Sloppy; | 3669 : Runtime::kStoreToSuper_Sloppy; |
3698 const Operator* op = javascript()->CallRuntime(function_id, 4); | 3670 const Operator* op = javascript()->CallRuntime(function_id, 4); |
3699 Node* node = NewNode(op, receiver, home_object, name_node, value); | 3671 Node* node = NewNode(op, receiver, home_object, name_node, value); |
3700 return Record(js_type_feedback_, node, id); | 3672 return Record(js_type_feedback_, node, id); |
3701 } | 3673 } |
3702 | 3674 |
3703 | 3675 |
3704 Node* AstGraphBuilder::BuildGlobalLoad(Node* script_context, Node* global, | 3676 Node* AstGraphBuilder::BuildGlobalLoad(Handle<Name> name, |
3705 Handle<Name> name, | |
3706 const VectorSlotPair& feedback, | 3677 const VectorSlotPair& feedback, |
3707 TypeofMode typeof_mode, int slot_index) { | 3678 TypeofMode typeof_mode) { |
3708 const Operator* op = | 3679 const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); |
3709 javascript()->LoadGlobal(name, feedback, typeof_mode, slot_index); | 3680 Node* node = NewNode(op, BuildLoadFeedbackVector()); |
3710 Node* node = NewNode(op, script_context, global, BuildLoadFeedbackVector()); | |
3711 return Record(js_type_feedback_, node, feedback.slot()); | 3681 return Record(js_type_feedback_, node, feedback.slot()); |
3712 } | 3682 } |
3713 | 3683 |
3714 | 3684 |
3715 Node* AstGraphBuilder::BuildGlobalStore(Node* script_context, Node* global, | 3685 Node* AstGraphBuilder::BuildGlobalStore(Handle<Name> name, Node* value, |
3716 Handle<Name> name, Node* value, | |
3717 const VectorSlotPair& feedback, | 3686 const VectorSlotPair& feedback, |
3718 TypeFeedbackId id, int slot_index) { | 3687 TypeFeedbackId id) { |
3719 const Operator* op = | 3688 const Operator* op = |
3720 javascript()->StoreGlobal(language_mode(), name, feedback, slot_index); | 3689 javascript()->StoreGlobal(language_mode(), name, feedback); |
3721 Node* node = | 3690 Node* node = NewNode(op, value, BuildLoadFeedbackVector()); |
3722 NewNode(op, script_context, global, value, BuildLoadFeedbackVector()); | |
3723 if (FLAG_vector_stores) { | 3691 if (FLAG_vector_stores) { |
3724 return Record(js_type_feedback_, node, feedback.slot()); | 3692 return Record(js_type_feedback_, node, feedback.slot()); |
3725 } | 3693 } |
3726 return Record(js_type_feedback_, node, id); | 3694 return Record(js_type_feedback_, node, id); |
3727 } | 3695 } |
3728 | 3696 |
3729 | 3697 |
3730 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { | 3698 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { |
3731 return NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object, | 3699 return NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object, |
3732 jsgraph()->IntPtrConstant(offset - kHeapObjectTag)); | 3700 jsgraph()->IntPtrConstant(offset - kHeapObjectTag)); |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4300 // Phi does not exist yet, introduce one. | 4268 // Phi does not exist yet, introduce one. |
4301 value = NewPhi(inputs, value, control); | 4269 value = NewPhi(inputs, value, control); |
4302 value->ReplaceInput(inputs - 1, other); | 4270 value->ReplaceInput(inputs - 1, other); |
4303 } | 4271 } |
4304 return value; | 4272 return value; |
4305 } | 4273 } |
4306 | 4274 |
4307 } // namespace compiler | 4275 } // namespace compiler |
4308 } // namespace internal | 4276 } // namespace internal |
4309 } // namespace v8 | 4277 } // namespace v8 |
OLD | NEW |