| 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" | |
| 11 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
| 12 #include "src/compiler/liveness-analyzer.h" | 11 #include "src/compiler/liveness-analyzer.h" |
| 13 #include "src/compiler/machine-operator.h" | 12 #include "src/compiler/machine-operator.h" |
| 14 #include "src/compiler/node-matchers.h" | 13 #include "src/compiler/node-matchers.h" |
| 15 #include "src/compiler/node-properties.h" | 14 #include "src/compiler/node-properties.h" |
| 16 #include "src/compiler/operator-properties.h" | 15 #include "src/compiler/operator-properties.h" |
| 17 #include "src/compiler/state-values-utils.h" | 16 #include "src/compiler/state-values-utils.h" |
| 18 #include "src/parser.h" | 17 #include "src/parser.h" |
| 19 #include "src/scopes.h" | 18 #include "src/scopes.h" |
| 20 | 19 |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 } | 420 } |
| 422 } | 421 } |
| 423 | 422 |
| 424 private: | 423 private: |
| 425 AstGraphBuilder* builder_; | 424 AstGraphBuilder* builder_; |
| 426 Node* frame_state_before_; | 425 Node* frame_state_before_; |
| 427 }; | 426 }; |
| 428 | 427 |
| 429 | 428 |
| 430 AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, | 429 AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, |
| 431 JSGraph* jsgraph, LoopAssignmentAnalysis* loop, | 430 JSGraph* jsgraph, LoopAssignmentAnalysis* loop) |
| 432 JSTypeFeedbackTable* js_type_feedback) | |
| 433 : isolate_(info->isolate()), | 431 : isolate_(info->isolate()), |
| 434 local_zone_(local_zone), | 432 local_zone_(local_zone), |
| 435 info_(info), | 433 info_(info), |
| 436 jsgraph_(jsgraph), | 434 jsgraph_(jsgraph), |
| 437 environment_(nullptr), | 435 environment_(nullptr), |
| 438 ast_context_(nullptr), | 436 ast_context_(nullptr), |
| 439 globals_(0, local_zone), | 437 globals_(0, local_zone), |
| 440 execution_control_(nullptr), | 438 execution_control_(nullptr), |
| 441 execution_context_(nullptr), | 439 execution_context_(nullptr), |
| 442 try_catch_nesting_level_(0), | 440 try_catch_nesting_level_(0), |
| 443 try_nesting_level_(0), | 441 try_nesting_level_(0), |
| 444 input_buffer_size_(0), | 442 input_buffer_size_(0), |
| 445 input_buffer_(nullptr), | 443 input_buffer_(nullptr), |
| 446 exit_controls_(local_zone), | 444 exit_controls_(local_zone), |
| 447 loop_assignment_analysis_(loop), | 445 loop_assignment_analysis_(loop), |
| 448 state_values_cache_(jsgraph), | 446 state_values_cache_(jsgraph), |
| 449 liveness_analyzer_(static_cast<size_t>(info->scope()->num_stack_slots()), | 447 liveness_analyzer_(static_cast<size_t>(info->scope()->num_stack_slots()), |
| 450 local_zone), | 448 local_zone), |
| 451 frame_state_function_info_(common()->CreateFrameStateFunctionInfo( | 449 frame_state_function_info_(common()->CreateFrameStateFunctionInfo( |
| 452 FrameStateType::kJavaScriptFunction, info->num_parameters() + 1, | 450 FrameStateType::kJavaScriptFunction, info->num_parameters() + 1, |
| 453 info->scope()->num_stack_slots(), info->shared_info(), | 451 info->scope()->num_stack_slots(), info->shared_info(), |
| 454 CALL_MAINTAINS_NATIVE_CONTEXT)), | 452 CALL_MAINTAINS_NATIVE_CONTEXT)) { |
| 455 js_type_feedback_(js_type_feedback) { | |
| 456 InitializeAstVisitor(info->isolate()); | 453 InitializeAstVisitor(info->isolate()); |
| 457 } | 454 } |
| 458 | 455 |
| 459 | 456 |
| 460 Node* AstGraphBuilder::GetFunctionClosureForContext() { | 457 Node* AstGraphBuilder::GetFunctionClosureForContext() { |
| 461 Scope* closure_scope = current_scope()->ClosureScope(); | 458 Scope* closure_scope = current_scope()->ClosureScope(); |
| 462 if (closure_scope->is_script_scope() || | 459 if (closure_scope->is_script_scope() || |
| 463 closure_scope->is_module_scope()) { | 460 closure_scope->is_module_scope()) { |
| 464 // Contexts nested in the native context have a canonical empty function as | 461 // Contexts nested in the native context have a canonical empty function as |
| 465 // their closure, not the anonymous closure containing the global code. | 462 // their closure, not the anonymous closure containing the global code. |
| (...skipping 1280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1746 // It is safe to use [[Put]] here because the boilerplate already | 1743 // It is safe to use [[Put]] here because the boilerplate already |
| 1747 // contains computed properties with an uninitialized value. | 1744 // contains computed properties with an uninitialized value. |
| 1748 if (key->value()->IsInternalizedString()) { | 1745 if (key->value()->IsInternalizedString()) { |
| 1749 if (property->emit_store()) { | 1746 if (property->emit_store()) { |
| 1750 VisitForValue(property->value()); | 1747 VisitForValue(property->value()); |
| 1751 FrameStateBeforeAndAfter states(this, property->value()->id()); | 1748 FrameStateBeforeAndAfter states(this, property->value()->id()); |
| 1752 Node* value = environment()->Pop(); | 1749 Node* value = environment()->Pop(); |
| 1753 Handle<Name> name = key->AsPropertyName(); | 1750 Handle<Name> name = key->AsPropertyName(); |
| 1754 VectorSlotPair feedback = | 1751 VectorSlotPair feedback = |
| 1755 CreateVectorSlotPair(property->GetSlot(0)); | 1752 CreateVectorSlotPair(property->GetSlot(0)); |
| 1756 Node* store = BuildNamedStore(literal, name, value, feedback, | 1753 Node* store = BuildNamedStore(literal, name, value, feedback); |
| 1757 TypeFeedbackId::None()); | |
| 1758 states.AddToNode(store, key->id(), | 1754 states.AddToNode(store, key->id(), |
| 1759 OutputFrameStateCombine::Ignore()); | 1755 OutputFrameStateCombine::Ignore()); |
| 1760 BuildSetHomeObject(value, literal, property, 1); | 1756 BuildSetHomeObject(value, literal, property, 1); |
| 1761 } else { | 1757 } else { |
| 1762 VisitForEffect(property->value()); | 1758 VisitForEffect(property->value()); |
| 1763 } | 1759 } |
| 1764 break; | 1760 break; |
| 1765 } | 1761 } |
| 1766 environment()->Push(literal); // Duplicate receiver. | 1762 environment()->Push(literal); // Duplicate receiver. |
| 1767 VisitForValue(property->key()); | 1763 VisitForValue(property->key()); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1939 Expression* subexpr = expr->values()->at(array_index); | 1935 Expression* subexpr = expr->values()->at(array_index); |
| 1940 if (subexpr->IsSpread()) break; | 1936 if (subexpr->IsSpread()) break; |
| 1941 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; | 1937 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
| 1942 | 1938 |
| 1943 VisitForValue(subexpr); | 1939 VisitForValue(subexpr); |
| 1944 { | 1940 { |
| 1945 FrameStateBeforeAndAfter states(this, subexpr->id()); | 1941 FrameStateBeforeAndAfter states(this, subexpr->id()); |
| 1946 VectorSlotPair pair = CreateVectorSlotPair(expr->LiteralFeedbackSlot()); | 1942 VectorSlotPair pair = CreateVectorSlotPair(expr->LiteralFeedbackSlot()); |
| 1947 Node* value = environment()->Pop(); | 1943 Node* value = environment()->Pop(); |
| 1948 Node* index = jsgraph()->Constant(array_index); | 1944 Node* index = jsgraph()->Constant(array_index); |
| 1949 Node* store = | 1945 Node* store = BuildKeyedStore(literal, index, value, pair); |
| 1950 BuildKeyedStore(literal, index, value, pair, TypeFeedbackId::None()); | |
| 1951 states.AddToNode(store, expr->GetIdForElement(array_index), | 1946 states.AddToNode(store, expr->GetIdForElement(array_index), |
| 1952 OutputFrameStateCombine::Ignore()); | 1947 OutputFrameStateCombine::Ignore()); |
| 1953 } | 1948 } |
| 1954 } | 1949 } |
| 1955 | 1950 |
| 1956 // In case the array literal contains spread expressions it has two parts. The | 1951 // In case the array literal contains spread expressions it has two parts. The |
| 1957 // first part is the "static" array which has a literal index is handled | 1952 // first part is the "static" array which has a literal index is handled |
| 1958 // above. The second part is the part after the first spread expression | 1953 // above. The second part is the part after the first spread expression |
| 1959 // (inclusive) and these elements gets appended to the array. Note that the | 1954 // (inclusive) and these elements gets appended to the array. Note that the |
| 1960 // number elements an iterable produces is unknown ahead of time. | 1955 // number elements an iterable produces is unknown ahead of time. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2009 bailout_id_after, states); | 2004 bailout_id_after, states); |
| 2010 break; | 2005 break; |
| 2011 } | 2006 } |
| 2012 case NAMED_PROPERTY: { | 2007 case NAMED_PROPERTY: { |
| 2013 environment()->Push(value); | 2008 environment()->Push(value); |
| 2014 VisitForValue(property->obj()); | 2009 VisitForValue(property->obj()); |
| 2015 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2010 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2016 Node* object = environment()->Pop(); | 2011 Node* object = environment()->Pop(); |
| 2017 value = environment()->Pop(); | 2012 value = environment()->Pop(); |
| 2018 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2013 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2019 Node* store = BuildNamedStore(object, name, value, feedback, | 2014 Node* store = BuildNamedStore(object, name, value, feedback); |
| 2020 TypeFeedbackId::None()); | |
| 2021 states.AddToNode(store, bailout_id_after, | 2015 states.AddToNode(store, bailout_id_after, |
| 2022 OutputFrameStateCombine::Ignore()); | 2016 OutputFrameStateCombine::Ignore()); |
| 2023 break; | 2017 break; |
| 2024 } | 2018 } |
| 2025 case KEYED_PROPERTY: { | 2019 case KEYED_PROPERTY: { |
| 2026 environment()->Push(value); | 2020 environment()->Push(value); |
| 2027 VisitForValue(property->obj()); | 2021 VisitForValue(property->obj()); |
| 2028 VisitForValue(property->key()); | 2022 VisitForValue(property->key()); |
| 2029 FrameStateBeforeAndAfter states(this, property->key()->id()); | 2023 FrameStateBeforeAndAfter states(this, property->key()->id()); |
| 2030 Node* key = environment()->Pop(); | 2024 Node* key = environment()->Pop(); |
| 2031 Node* object = environment()->Pop(); | 2025 Node* object = environment()->Pop(); |
| 2032 value = environment()->Pop(); | 2026 value = environment()->Pop(); |
| 2033 Node* store = | 2027 Node* store = BuildKeyedStore(object, key, value, feedback); |
| 2034 BuildKeyedStore(object, key, value, feedback, TypeFeedbackId::None()); | |
| 2035 states.AddToNode(store, bailout_id_after, | 2028 states.AddToNode(store, bailout_id_after, |
| 2036 OutputFrameStateCombine::Ignore()); | 2029 OutputFrameStateCombine::Ignore()); |
| 2037 break; | 2030 break; |
| 2038 } | 2031 } |
| 2039 case NAMED_SUPER_PROPERTY: { | 2032 case NAMED_SUPER_PROPERTY: { |
| 2040 environment()->Push(value); | 2033 environment()->Push(value); |
| 2041 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); | 2034 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
| 2042 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); | 2035 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); |
| 2043 FrameStateBeforeAndAfter states(this, property->obj()->id()); | 2036 FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| 2044 Node* home_object = environment()->Pop(); | 2037 Node* home_object = environment()->Pop(); |
| 2045 Node* receiver = environment()->Pop(); | 2038 Node* receiver = environment()->Pop(); |
| 2046 value = environment()->Pop(); | 2039 value = environment()->Pop(); |
| 2047 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2040 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2048 Node* store = BuildNamedSuperStore(receiver, home_object, name, value, | 2041 Node* store = BuildNamedSuperStore(receiver, home_object, name, value); |
| 2049 TypeFeedbackId::None()); | |
| 2050 states.AddToNode(store, bailout_id_after, | 2042 states.AddToNode(store, bailout_id_after, |
| 2051 OutputFrameStateCombine::Ignore()); | 2043 OutputFrameStateCombine::Ignore()); |
| 2052 break; | 2044 break; |
| 2053 } | 2045 } |
| 2054 case KEYED_SUPER_PROPERTY: { | 2046 case KEYED_SUPER_PROPERTY: { |
| 2055 environment()->Push(value); | 2047 environment()->Push(value); |
| 2056 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); | 2048 VisitForValue(property->obj()->AsSuperPropertyReference()->this_var()); |
| 2057 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); | 2049 VisitForValue(property->obj()->AsSuperPropertyReference()->home_object()); |
| 2058 VisitForValue(property->key()); | 2050 VisitForValue(property->key()); |
| 2059 FrameStateBeforeAndAfter states(this, property->key()->id()); | 2051 FrameStateBeforeAndAfter states(this, property->key()->id()); |
| 2060 Node* key = environment()->Pop(); | 2052 Node* key = environment()->Pop(); |
| 2061 Node* home_object = environment()->Pop(); | 2053 Node* home_object = environment()->Pop(); |
| 2062 Node* receiver = environment()->Pop(); | 2054 Node* receiver = environment()->Pop(); |
| 2063 value = environment()->Pop(); | 2055 value = environment()->Pop(); |
| 2064 Node* store = BuildKeyedSuperStore(receiver, home_object, key, value, | 2056 Node* store = BuildKeyedSuperStore(receiver, home_object, key, value); |
| 2065 TypeFeedbackId::None()); | |
| 2066 states.AddToNode(store, bailout_id_after, | 2057 states.AddToNode(store, bailout_id_after, |
| 2067 OutputFrameStateCombine::Ignore()); | 2058 OutputFrameStateCombine::Ignore()); |
| 2068 break; | 2059 break; |
| 2069 } | 2060 } |
| 2070 } | 2061 } |
| 2071 } | 2062 } |
| 2072 | 2063 |
| 2073 | 2064 |
| 2074 void AstGraphBuilder::VisitAssignment(Assignment* expr) { | 2065 void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| 2075 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); | 2066 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2200 switch (assign_type) { | 2191 switch (assign_type) { |
| 2201 case VARIABLE: { | 2192 case VARIABLE: { |
| 2202 Variable* variable = expr->target()->AsVariableProxy()->var(); | 2193 Variable* variable = expr->target()->AsVariableProxy()->var(); |
| 2203 BuildVariableAssignment(variable, value, expr->op(), feedback, expr->id(), | 2194 BuildVariableAssignment(variable, value, expr->op(), feedback, expr->id(), |
| 2204 store_states, ast_context()->GetStateCombine()); | 2195 store_states, ast_context()->GetStateCombine()); |
| 2205 break; | 2196 break; |
| 2206 } | 2197 } |
| 2207 case NAMED_PROPERTY: { | 2198 case NAMED_PROPERTY: { |
| 2208 Node* object = environment()->Pop(); | 2199 Node* object = environment()->Pop(); |
| 2209 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2200 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2210 Node* store = BuildNamedStore(object, name, value, feedback, | 2201 Node* store = BuildNamedStore(object, name, value, feedback); |
| 2211 expr->AssignmentFeedbackId()); | |
| 2212 store_states.AddToNode(store, expr->id(), | 2202 store_states.AddToNode(store, expr->id(), |
| 2213 ast_context()->GetStateCombine()); | 2203 ast_context()->GetStateCombine()); |
| 2214 break; | 2204 break; |
| 2215 } | 2205 } |
| 2216 case KEYED_PROPERTY: { | 2206 case KEYED_PROPERTY: { |
| 2217 Node* key = environment()->Pop(); | 2207 Node* key = environment()->Pop(); |
| 2218 Node* object = environment()->Pop(); | 2208 Node* object = environment()->Pop(); |
| 2219 Node* store = BuildKeyedStore(object, key, value, feedback, | 2209 Node* store = BuildKeyedStore(object, key, value, feedback); |
| 2220 expr->AssignmentFeedbackId()); | |
| 2221 store_states.AddToNode(store, expr->id(), | 2210 store_states.AddToNode(store, expr->id(), |
| 2222 ast_context()->GetStateCombine()); | 2211 ast_context()->GetStateCombine()); |
| 2223 break; | 2212 break; |
| 2224 } | 2213 } |
| 2225 case NAMED_SUPER_PROPERTY: { | 2214 case NAMED_SUPER_PROPERTY: { |
| 2226 Node* home_object = environment()->Pop(); | 2215 Node* home_object = environment()->Pop(); |
| 2227 Node* receiver = environment()->Pop(); | 2216 Node* receiver = environment()->Pop(); |
| 2228 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2217 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2229 Node* store = BuildNamedSuperStore(receiver, home_object, name, value, | 2218 Node* store = BuildNamedSuperStore(receiver, home_object, name, value); |
| 2230 expr->AssignmentFeedbackId()); | |
| 2231 store_states.AddToNode(store, expr->id(), | 2219 store_states.AddToNode(store, expr->id(), |
| 2232 ast_context()->GetStateCombine()); | 2220 ast_context()->GetStateCombine()); |
| 2233 break; | 2221 break; |
| 2234 } | 2222 } |
| 2235 case KEYED_SUPER_PROPERTY: { | 2223 case KEYED_SUPER_PROPERTY: { |
| 2236 Node* key = environment()->Pop(); | 2224 Node* key = environment()->Pop(); |
| 2237 Node* home_object = environment()->Pop(); | 2225 Node* home_object = environment()->Pop(); |
| 2238 Node* receiver = environment()->Pop(); | 2226 Node* receiver = environment()->Pop(); |
| 2239 Node* store = BuildKeyedSuperStore(receiver, home_object, key, value, | 2227 Node* store = BuildKeyedSuperStore(receiver, home_object, key, value); |
| 2240 expr->AssignmentFeedbackId()); | |
| 2241 store_states.AddToNode(store, expr->id(), | 2228 store_states.AddToNode(store, expr->id(), |
| 2242 ast_context()->GetStateCombine()); | 2229 ast_context()->GetStateCombine()); |
| 2243 break; | 2230 break; |
| 2244 } | 2231 } |
| 2245 } | 2232 } |
| 2246 | 2233 |
| 2247 ast_context()->ProduceValue(value); | 2234 ast_context()->ProduceValue(value); |
| 2248 } | 2235 } |
| 2249 | 2236 |
| 2250 | 2237 |
| (...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2718 Variable* variable = expr->expression()->AsVariableProxy()->var(); | 2705 Variable* variable = expr->expression()->AsVariableProxy()->var(); |
| 2719 environment()->Push(value); | 2706 environment()->Push(value); |
| 2720 BuildVariableAssignment(variable, value, expr->op(), feedback, | 2707 BuildVariableAssignment(variable, value, expr->op(), feedback, |
| 2721 expr->AssignmentId(), store_states); | 2708 expr->AssignmentId(), store_states); |
| 2722 environment()->Pop(); | 2709 environment()->Pop(); |
| 2723 break; | 2710 break; |
| 2724 } | 2711 } |
| 2725 case NAMED_PROPERTY: { | 2712 case NAMED_PROPERTY: { |
| 2726 Node* object = environment()->Pop(); | 2713 Node* object = environment()->Pop(); |
| 2727 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2714 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2728 Node* store = BuildNamedStore(object, name, value, feedback, | 2715 Node* store = BuildNamedStore(object, name, value, feedback); |
| 2729 expr->CountStoreFeedbackId()); | |
| 2730 environment()->Push(value); | 2716 environment()->Push(value); |
| 2731 store_states.AddToNode(store, expr->AssignmentId(), | 2717 store_states.AddToNode(store, expr->AssignmentId(), |
| 2732 OutputFrameStateCombine::Ignore()); | 2718 OutputFrameStateCombine::Ignore()); |
| 2733 environment()->Pop(); | 2719 environment()->Pop(); |
| 2734 break; | 2720 break; |
| 2735 } | 2721 } |
| 2736 case KEYED_PROPERTY: { | 2722 case KEYED_PROPERTY: { |
| 2737 Node* key = environment()->Pop(); | 2723 Node* key = environment()->Pop(); |
| 2738 Node* object = environment()->Pop(); | 2724 Node* object = environment()->Pop(); |
| 2739 Node* store = BuildKeyedStore(object, key, value, feedback, | 2725 Node* store = BuildKeyedStore(object, key, value, feedback); |
| 2740 expr->CountStoreFeedbackId()); | |
| 2741 environment()->Push(value); | 2726 environment()->Push(value); |
| 2742 store_states.AddToNode(store, expr->AssignmentId(), | 2727 store_states.AddToNode(store, expr->AssignmentId(), |
| 2743 OutputFrameStateCombine::Ignore()); | 2728 OutputFrameStateCombine::Ignore()); |
| 2744 environment()->Pop(); | 2729 environment()->Pop(); |
| 2745 break; | 2730 break; |
| 2746 } | 2731 } |
| 2747 case NAMED_SUPER_PROPERTY: { | 2732 case NAMED_SUPER_PROPERTY: { |
| 2748 Node* home_object = environment()->Pop(); | 2733 Node* home_object = environment()->Pop(); |
| 2749 Node* receiver = environment()->Pop(); | 2734 Node* receiver = environment()->Pop(); |
| 2750 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); | 2735 Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| 2751 Node* store = BuildNamedSuperStore(receiver, home_object, name, value, | 2736 Node* store = BuildNamedSuperStore(receiver, home_object, name, value); |
| 2752 expr->CountStoreFeedbackId()); | |
| 2753 environment()->Push(value); | 2737 environment()->Push(value); |
| 2754 store_states.AddToNode(store, expr->AssignmentId(), | 2738 store_states.AddToNode(store, expr->AssignmentId(), |
| 2755 OutputFrameStateCombine::Ignore()); | 2739 OutputFrameStateCombine::Ignore()); |
| 2756 environment()->Pop(); | 2740 environment()->Pop(); |
| 2757 break; | 2741 break; |
| 2758 } | 2742 } |
| 2759 case KEYED_SUPER_PROPERTY: { | 2743 case KEYED_SUPER_PROPERTY: { |
| 2760 Node* key = environment()->Pop(); | 2744 Node* key = environment()->Pop(); |
| 2761 Node* home_object = environment()->Pop(); | 2745 Node* home_object = environment()->Pop(); |
| 2762 Node* receiver = environment()->Pop(); | 2746 Node* receiver = environment()->Pop(); |
| 2763 Node* store = BuildKeyedSuperStore(receiver, home_object, key, value, | 2747 Node* store = BuildKeyedSuperStore(receiver, home_object, key, value); |
| 2764 expr->CountStoreFeedbackId()); | |
| 2765 environment()->Push(value); | 2748 environment()->Push(value); |
| 2766 store_states.AddToNode(store, expr->AssignmentId(), | 2749 store_states.AddToNode(store, expr->AssignmentId(), |
| 2767 OutputFrameStateCombine::Ignore()); | 2750 OutputFrameStateCombine::Ignore()); |
| 2768 environment()->Pop(); | 2751 environment()->Pop(); |
| 2769 break; | 2752 break; |
| 2770 } | 2753 } |
| 2771 } | 2754 } |
| 2772 | 2755 |
| 2773 // Restore old value for postfix expressions. | 2756 // Restore old value for postfix expressions. |
| 2774 if (is_postfix) value = environment()->Pop(); | 2757 if (is_postfix) value = environment()->Pop(); |
| (...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3441 Variable* variable, Node* value, Token::Value op, | 3424 Variable* variable, Node* value, Token::Value op, |
| 3442 const VectorSlotPair& feedback, BailoutId bailout_id, | 3425 const VectorSlotPair& feedback, BailoutId bailout_id, |
| 3443 FrameStateBeforeAndAfter& states, OutputFrameStateCombine combine) { | 3426 FrameStateBeforeAndAfter& states, OutputFrameStateCombine combine) { |
| 3444 Node* the_hole = jsgraph()->TheHoleConstant(); | 3427 Node* the_hole = jsgraph()->TheHoleConstant(); |
| 3445 VariableMode mode = variable->mode(); | 3428 VariableMode mode = variable->mode(); |
| 3446 switch (variable->location()) { | 3429 switch (variable->location()) { |
| 3447 case VariableLocation::GLOBAL: | 3430 case VariableLocation::GLOBAL: |
| 3448 case VariableLocation::UNALLOCATED: { | 3431 case VariableLocation::UNALLOCATED: { |
| 3449 // Global var, const, or let variable. | 3432 // Global var, const, or let variable. |
| 3450 Handle<Name> name = variable->name(); | 3433 Handle<Name> name = variable->name(); |
| 3451 Node* store = | 3434 Node* store = BuildGlobalStore(name, value, feedback); |
| 3452 BuildGlobalStore(name, value, feedback, TypeFeedbackId::None()); | |
| 3453 states.AddToNode(store, bailout_id, combine); | 3435 states.AddToNode(store, bailout_id, combine); |
| 3454 return store; | 3436 return store; |
| 3455 } | 3437 } |
| 3456 case VariableLocation::PARAMETER: | 3438 case VariableLocation::PARAMETER: |
| 3457 case VariableLocation::LOCAL: | 3439 case VariableLocation::LOCAL: |
| 3458 // Local var, const, or let variable. | 3440 // Local var, const, or let variable. |
| 3459 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { | 3441 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { |
| 3460 // Perform an initialization check for legacy const variables. | 3442 // Perform an initialization check for legacy const variables. |
| 3461 Node* current = environment()->Lookup(variable); | 3443 Node* current = environment()->Lookup(variable); |
| 3462 if (current->op() != the_hole->op()) { | 3444 if (current->op() != the_hole->op()) { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3559 Node* store = NewNode(op, value, current_context(), name, language); | 3541 Node* store = NewNode(op, value, current_context(), name, language); |
| 3560 PrepareFrameState(store, bailout_id, combine); | 3542 PrepareFrameState(store, bailout_id, combine); |
| 3561 return store; | 3543 return store; |
| 3562 } | 3544 } |
| 3563 } | 3545 } |
| 3564 UNREACHABLE(); | 3546 UNREACHABLE(); |
| 3565 return NULL; | 3547 return NULL; |
| 3566 } | 3548 } |
| 3567 | 3549 |
| 3568 | 3550 |
| 3569 static inline Node* Record(JSTypeFeedbackTable* js_type_feedback, Node* node, | |
| 3570 FeedbackVectorSlot slot) { | |
| 3571 if (js_type_feedback) { | |
| 3572 js_type_feedback->Record(node, slot); | |
| 3573 } | |
| 3574 return node; | |
| 3575 } | |
| 3576 | |
| 3577 | |
| 3578 static inline Node* Record(JSTypeFeedbackTable* js_type_feedback, Node* node, | |
| 3579 TypeFeedbackId id) { | |
| 3580 if (js_type_feedback) { | |
| 3581 js_type_feedback->Record(node, id); | |
| 3582 } | |
| 3583 return node; | |
| 3584 } | |
| 3585 | |
| 3586 | |
| 3587 Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, | 3551 Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, |
| 3588 const VectorSlotPair& feedback) { | 3552 const VectorSlotPair& feedback) { |
| 3589 const Operator* op = javascript()->LoadProperty(language_mode(), feedback); | 3553 const Operator* op = javascript()->LoadProperty(language_mode(), feedback); |
| 3590 Node* node = NewNode(op, object, key, BuildLoadFeedbackVector()); | 3554 Node* node = NewNode(op, object, key, BuildLoadFeedbackVector()); |
| 3591 return Record(js_type_feedback_, node, feedback.slot()); | 3555 return node; |
| 3592 } | 3556 } |
| 3593 | 3557 |
| 3594 | 3558 |
| 3595 Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, | 3559 Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, |
| 3596 const VectorSlotPair& feedback) { | 3560 const VectorSlotPair& feedback) { |
| 3597 const Operator* op = javascript()->LoadNamed(language_mode(), name, feedback); | 3561 const Operator* op = javascript()->LoadNamed(language_mode(), name, feedback); |
| 3598 Node* node = NewNode(op, object, BuildLoadFeedbackVector()); | 3562 Node* node = NewNode(op, object, BuildLoadFeedbackVector()); |
| 3599 return Record(js_type_feedback_, node, feedback.slot()); | 3563 return node; |
| 3600 } | 3564 } |
| 3601 | 3565 |
| 3602 | 3566 |
| 3603 Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value, | 3567 Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value, |
| 3604 const VectorSlotPair& feedback, | 3568 const VectorSlotPair& feedback) { |
| 3605 TypeFeedbackId id) { | |
| 3606 const Operator* op = javascript()->StoreProperty(language_mode(), feedback); | 3569 const Operator* op = javascript()->StoreProperty(language_mode(), feedback); |
| 3607 Node* node = NewNode(op, object, key, value, BuildLoadFeedbackVector()); | 3570 Node* node = NewNode(op, object, key, value, BuildLoadFeedbackVector()); |
| 3608 if (FLAG_vector_stores) { | 3571 return node; |
| 3609 return Record(js_type_feedback_, node, feedback.slot()); | |
| 3610 } | |
| 3611 return Record(js_type_feedback_, node, id); | |
| 3612 } | 3572 } |
| 3613 | 3573 |
| 3614 | 3574 |
| 3615 Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, | 3575 Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, |
| 3616 Node* value, | 3576 Node* value, |
| 3617 const VectorSlotPair& feedback, | 3577 const VectorSlotPair& feedback) { |
| 3618 TypeFeedbackId id) { | |
| 3619 const Operator* op = | 3578 const Operator* op = |
| 3620 javascript()->StoreNamed(language_mode(), name, feedback); | 3579 javascript()->StoreNamed(language_mode(), name, feedback); |
| 3621 Node* node = NewNode(op, object, value, BuildLoadFeedbackVector()); | 3580 Node* node = NewNode(op, object, value, BuildLoadFeedbackVector()); |
| 3622 if (FLAG_vector_stores) { | 3581 return node; |
| 3623 return Record(js_type_feedback_, node, feedback.slot()); | |
| 3624 } | |
| 3625 return Record(js_type_feedback_, node, id); | |
| 3626 } | 3582 } |
| 3627 | 3583 |
| 3628 | 3584 |
| 3629 Node* AstGraphBuilder::BuildNamedSuperLoad(Node* receiver, Node* home_object, | 3585 Node* AstGraphBuilder::BuildNamedSuperLoad(Node* receiver, Node* home_object, |
| 3630 Handle<Name> name, | 3586 Handle<Name> name, |
| 3631 const VectorSlotPair& feedback) { | 3587 const VectorSlotPair& feedback) { |
| 3632 Node* name_node = jsgraph()->Constant(name); | 3588 Node* name_node = jsgraph()->Constant(name); |
| 3633 Node* language = jsgraph()->Constant(language_mode()); | 3589 Node* language = jsgraph()->Constant(language_mode()); |
| 3634 const Operator* op = javascript()->CallRuntime(Runtime::kLoadFromSuper, 4); | 3590 const Operator* op = javascript()->CallRuntime(Runtime::kLoadFromSuper, 4); |
| 3635 Node* node = NewNode(op, receiver, home_object, name_node, language); | 3591 Node* node = NewNode(op, receiver, home_object, name_node, language); |
| 3636 return Record(js_type_feedback_, node, feedback.slot()); | 3592 return node; |
| 3637 } | 3593 } |
| 3638 | 3594 |
| 3639 | 3595 |
| 3640 Node* AstGraphBuilder::BuildKeyedSuperLoad(Node* receiver, Node* home_object, | 3596 Node* AstGraphBuilder::BuildKeyedSuperLoad(Node* receiver, Node* home_object, |
| 3641 Node* key, | 3597 Node* key, |
| 3642 const VectorSlotPair& feedback) { | 3598 const VectorSlotPair& feedback) { |
| 3643 Node* language = jsgraph()->Constant(language_mode()); | 3599 Node* language = jsgraph()->Constant(language_mode()); |
| 3644 const Operator* op = | 3600 const Operator* op = |
| 3645 javascript()->CallRuntime(Runtime::kLoadKeyedFromSuper, 4); | 3601 javascript()->CallRuntime(Runtime::kLoadKeyedFromSuper, 4); |
| 3646 Node* node = NewNode(op, receiver, home_object, key, language); | 3602 Node* node = NewNode(op, receiver, home_object, key, language); |
| 3647 return Record(js_type_feedback_, node, feedback.slot()); | 3603 return node; |
| 3648 } | 3604 } |
| 3649 | 3605 |
| 3650 | 3606 |
| 3651 Node* AstGraphBuilder::BuildKeyedSuperStore(Node* receiver, Node* home_object, | 3607 Node* AstGraphBuilder::BuildKeyedSuperStore(Node* receiver, Node* home_object, |
| 3652 Node* key, Node* value, | 3608 Node* key, Node* value) { |
| 3653 TypeFeedbackId id) { | |
| 3654 Runtime::FunctionId function_id = is_strict(language_mode()) | 3609 Runtime::FunctionId function_id = is_strict(language_mode()) |
| 3655 ? Runtime::kStoreKeyedToSuper_Strict | 3610 ? Runtime::kStoreKeyedToSuper_Strict |
| 3656 : Runtime::kStoreKeyedToSuper_Sloppy; | 3611 : Runtime::kStoreKeyedToSuper_Sloppy; |
| 3657 const Operator* op = javascript()->CallRuntime(function_id, 4); | 3612 const Operator* op = javascript()->CallRuntime(function_id, 4); |
| 3658 Node* node = NewNode(op, receiver, home_object, key, value); | 3613 Node* node = NewNode(op, receiver, home_object, key, value); |
| 3659 return Record(js_type_feedback_, node, id); | 3614 return node; |
| 3660 } | 3615 } |
| 3661 | 3616 |
| 3662 | 3617 |
| 3663 Node* AstGraphBuilder::BuildNamedSuperStore(Node* receiver, Node* home_object, | 3618 Node* AstGraphBuilder::BuildNamedSuperStore(Node* receiver, Node* home_object, |
| 3664 Handle<Name> name, Node* value, | 3619 Handle<Name> name, Node* value) { |
| 3665 TypeFeedbackId id) { | |
| 3666 Node* name_node = jsgraph()->Constant(name); | 3620 Node* name_node = jsgraph()->Constant(name); |
| 3667 Runtime::FunctionId function_id = is_strict(language_mode()) | 3621 Runtime::FunctionId function_id = is_strict(language_mode()) |
| 3668 ? Runtime::kStoreToSuper_Strict | 3622 ? Runtime::kStoreToSuper_Strict |
| 3669 : Runtime::kStoreToSuper_Sloppy; | 3623 : Runtime::kStoreToSuper_Sloppy; |
| 3670 const Operator* op = javascript()->CallRuntime(function_id, 4); | 3624 const Operator* op = javascript()->CallRuntime(function_id, 4); |
| 3671 Node* node = NewNode(op, receiver, home_object, name_node, value); | 3625 Node* node = NewNode(op, receiver, home_object, name_node, value); |
| 3672 return Record(js_type_feedback_, node, id); | 3626 return node; |
| 3673 } | 3627 } |
| 3674 | 3628 |
| 3675 | 3629 |
| 3676 Node* AstGraphBuilder::BuildGlobalLoad(Handle<Name> name, | 3630 Node* AstGraphBuilder::BuildGlobalLoad(Handle<Name> name, |
| 3677 const VectorSlotPair& feedback, | 3631 const VectorSlotPair& feedback, |
| 3678 TypeofMode typeof_mode) { | 3632 TypeofMode typeof_mode) { |
| 3679 const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); | 3633 const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); |
| 3680 Node* node = NewNode(op, BuildLoadFeedbackVector()); | 3634 Node* node = NewNode(op, BuildLoadFeedbackVector()); |
| 3681 return Record(js_type_feedback_, node, feedback.slot()); | 3635 return node; |
| 3682 } | 3636 } |
| 3683 | 3637 |
| 3684 | 3638 |
| 3685 Node* AstGraphBuilder::BuildGlobalStore(Handle<Name> name, Node* value, | 3639 Node* AstGraphBuilder::BuildGlobalStore(Handle<Name> name, Node* value, |
| 3686 const VectorSlotPair& feedback, | 3640 const VectorSlotPair& feedback) { |
| 3687 TypeFeedbackId id) { | |
| 3688 const Operator* op = | 3641 const Operator* op = |
| 3689 javascript()->StoreGlobal(language_mode(), name, feedback); | 3642 javascript()->StoreGlobal(language_mode(), name, feedback); |
| 3690 Node* node = NewNode(op, value, BuildLoadFeedbackVector()); | 3643 Node* node = NewNode(op, value, BuildLoadFeedbackVector()); |
| 3691 if (FLAG_vector_stores) { | 3644 return node; |
| 3692 return Record(js_type_feedback_, node, feedback.slot()); | |
| 3693 } | |
| 3694 return Record(js_type_feedback_, node, id); | |
| 3695 } | 3645 } |
| 3696 | 3646 |
| 3697 | 3647 |
| 3698 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { | 3648 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { |
| 3699 return NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object, | 3649 return NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object, |
| 3700 jsgraph()->IntPtrConstant(offset - kHeapObjectTag)); | 3650 jsgraph()->IntPtrConstant(offset - kHeapObjectTag)); |
| 3701 } | 3651 } |
| 3702 | 3652 |
| 3703 | 3653 |
| 3704 Node* AstGraphBuilder::BuildLoadImmutableObjectField(Node* object, int offset) { | 3654 Node* AstGraphBuilder::BuildLoadImmutableObjectField(Node* object, int offset) { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3813 | 3763 |
| 3814 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, | 3764 Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, |
| 3815 ObjectLiteralProperty* property, | 3765 ObjectLiteralProperty* property, |
| 3816 int slot_number) { | 3766 int slot_number) { |
| 3817 Expression* expr = property->value(); | 3767 Expression* expr = property->value(); |
| 3818 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; | 3768 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; |
| 3819 Handle<Name> name = isolate()->factory()->home_object_symbol(); | 3769 Handle<Name> name = isolate()->factory()->home_object_symbol(); |
| 3820 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 3770 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 3821 VectorSlotPair feedback = | 3771 VectorSlotPair feedback = |
| 3822 CreateVectorSlotPair(property->GetSlot(slot_number)); | 3772 CreateVectorSlotPair(property->GetSlot(slot_number)); |
| 3823 Node* store = BuildNamedStore(value, name, home_object, feedback, | 3773 Node* store = BuildNamedStore(value, name, home_object, feedback); |
| 3824 TypeFeedbackId::None()); | |
| 3825 states.AddToNode(store, BailoutId::None(), OutputFrameStateCombine::Ignore()); | 3774 states.AddToNode(store, BailoutId::None(), OutputFrameStateCombine::Ignore()); |
| 3826 return store; | 3775 return store; |
| 3827 } | 3776 } |
| 3828 | 3777 |
| 3829 | 3778 |
| 3830 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { | 3779 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { |
| 3831 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); | 3780 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); |
| 3832 Node* call = NewNode(op, exception); | 3781 Node* call = NewNode(op, exception); |
| 3833 PrepareFrameState(call, bailout_id); | 3782 PrepareFrameState(call, bailout_id); |
| 3834 Node* control = NewNode(common()->Throw(), call); | 3783 Node* control = NewNode(common()->Throw(), call); |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4268 // Phi does not exist yet, introduce one. | 4217 // Phi does not exist yet, introduce one. |
| 4269 value = NewPhi(inputs, value, control); | 4218 value = NewPhi(inputs, value, control); |
| 4270 value->ReplaceInput(inputs - 1, other); | 4219 value->ReplaceInput(inputs - 1, other); |
| 4271 } | 4220 } |
| 4272 return value; | 4221 return value; |
| 4273 } | 4222 } |
| 4274 | 4223 |
| 4275 } // namespace compiler | 4224 } // namespace compiler |
| 4276 } // namespace internal | 4225 } // namespace internal |
| 4277 } // namespace v8 | 4226 } // namespace v8 |
| OLD | NEW |