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/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
(...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 environment()->Push(value); | 1166 environment()->Push(value); |
1167 } else { | 1167 } else { |
1168 VisitForValue(expr->value()); | 1168 VisitForValue(expr->value()); |
1169 } | 1169 } |
1170 | 1170 |
1171 // Store the value. | 1171 // Store the value. |
1172 Node* value = environment()->Pop(); | 1172 Node* value = environment()->Pop(); |
1173 switch (assign_type) { | 1173 switch (assign_type) { |
1174 case VARIABLE: { | 1174 case VARIABLE: { |
1175 Variable* variable = expr->target()->AsVariableProxy()->var(); | 1175 Variable* variable = expr->target()->AsVariableProxy()->var(); |
1176 BuildVariableAssignment(variable, value, expr->op(), | 1176 BuildVariableAssignment(variable, value, expr->op(), expr->AssignmentId(), |
1177 expr->AssignmentId()); | 1177 ast_context()->GetStateCombine()); |
1178 break; | 1178 break; |
1179 } | 1179 } |
1180 case NAMED_PROPERTY: { | 1180 case NAMED_PROPERTY: { |
1181 Node* object = environment()->Pop(); | 1181 Node* object = environment()->Pop(); |
1182 Unique<Name> name = | 1182 Unique<Name> name = |
1183 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | 1183 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); |
1184 Node* store = | 1184 Node* store = |
1185 NewNode(javascript()->StoreNamed(strict_mode(), name), object, value); | 1185 NewNode(javascript()->StoreNamed(strict_mode(), name), object, value); |
1186 PrepareFrameState(store, expr->AssignmentId()); | 1186 PrepareFrameState(store, expr->AssignmentId(), |
| 1187 ast_context()->GetStateCombine()); |
1187 break; | 1188 break; |
1188 } | 1189 } |
1189 case KEYED_PROPERTY: { | 1190 case KEYED_PROPERTY: { |
1190 Node* key = environment()->Pop(); | 1191 Node* key = environment()->Pop(); |
1191 Node* object = environment()->Pop(); | 1192 Node* object = environment()->Pop(); |
1192 Node* store = NewNode(javascript()->StoreProperty(strict_mode()), object, | 1193 Node* store = NewNode(javascript()->StoreProperty(strict_mode()), object, |
1193 key, value); | 1194 key, value); |
1194 PrepareFrameState(store, expr->AssignmentId()); | 1195 PrepareFrameState(store, expr->AssignmentId(), |
| 1196 ast_context()->GetStateCombine()); |
1195 break; | 1197 break; |
1196 } | 1198 } |
1197 } | 1199 } |
1198 | 1200 |
1199 ast_context()->ProduceValue(value); | 1201 ast_context()->ProduceValue(value); |
1200 } | 1202 } |
1201 | 1203 |
1202 | 1204 |
1203 void AstGraphBuilder::VisitYield(Yield* expr) { | 1205 void AstGraphBuilder::VisitYield(Yield* expr) { |
1204 VisitForValue(expr->generator_object()); | 1206 VisitForValue(expr->generator_object()); |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1950 Node* result = NewNode(op, current_context(), name); | 1952 Node* result = NewNode(op, current_context(), name); |
1951 PrepareFrameState(result, bailout_id, state_combine); | 1953 PrepareFrameState(result, bailout_id, state_combine); |
1952 return result; | 1954 return result; |
1953 } | 1955 } |
1954 } | 1956 } |
1955 UNREACHABLE(); | 1957 UNREACHABLE(); |
1956 return NULL; | 1958 return NULL; |
1957 } | 1959 } |
1958 | 1960 |
1959 | 1961 |
1960 Node* AstGraphBuilder::BuildVariableAssignment(Variable* variable, Node* value, | 1962 Node* AstGraphBuilder::BuildVariableAssignment( |
1961 Token::Value op, | 1963 Variable* variable, Node* value, Token::Value op, BailoutId bailout_id, |
1962 BailoutId bailout_id) { | 1964 OutputFrameStateCombine combine) { |
1963 Node* the_hole = jsgraph()->TheHoleConstant(); | 1965 Node* the_hole = jsgraph()->TheHoleConstant(); |
1964 VariableMode mode = variable->mode(); | 1966 VariableMode mode = variable->mode(); |
1965 switch (variable->location()) { | 1967 switch (variable->location()) { |
1966 case Variable::UNALLOCATED: { | 1968 case Variable::UNALLOCATED: { |
1967 // Global var, const, or let variable. | 1969 // Global var, const, or let variable. |
1968 Node* global = BuildLoadGlobalObject(); | 1970 Node* global = BuildLoadGlobalObject(); |
1969 Unique<Name> name = MakeUnique(variable->name()); | 1971 Unique<Name> name = MakeUnique(variable->name()); |
1970 const Operator* op = javascript()->StoreNamed(strict_mode(), name); | 1972 const Operator* op = javascript()->StoreNamed(strict_mode(), name); |
1971 Node* store = NewNode(op, global, value); | 1973 Node* store = NewNode(op, global, value); |
1972 PrepareFrameState(store, bailout_id); | 1974 PrepareFrameState(store, bailout_id, combine); |
1973 return store; | 1975 return store; |
1974 } | 1976 } |
1975 case Variable::PARAMETER: | 1977 case Variable::PARAMETER: |
1976 case Variable::LOCAL: | 1978 case Variable::LOCAL: |
1977 // Local var, const, or let variable. | 1979 // Local var, const, or let variable. |
1978 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { | 1980 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { |
1979 // Perform an initialization check for legacy const variables. | 1981 // Perform an initialization check for legacy const variables. |
1980 Node* current = environment()->Lookup(variable); | 1982 Node* current = environment()->Lookup(variable); |
1981 if (current->op() != the_hole->op()) { | 1983 if (current->op() != the_hole->op()) { |
1982 value = BuildHoleCheckSilent(current, value, current); | 1984 value = BuildHoleCheckSilent(current, value, current); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2028 } | 2030 } |
2029 case Variable::LOOKUP: { | 2031 case Variable::LOOKUP: { |
2030 // Dynamic lookup of context variable (anywhere in the chain). | 2032 // Dynamic lookup of context variable (anywhere in the chain). |
2031 Node* name = jsgraph()->Constant(variable->name()); | 2033 Node* name = jsgraph()->Constant(variable->name()); |
2032 Node* strict = jsgraph()->Constant(strict_mode()); | 2034 Node* strict = jsgraph()->Constant(strict_mode()); |
2033 // TODO(mstarzinger): Use Runtime::kInitializeLegacyConstLookupSlot for | 2035 // TODO(mstarzinger): Use Runtime::kInitializeLegacyConstLookupSlot for |
2034 // initializations of const declarations. | 2036 // initializations of const declarations. |
2035 const Operator* op = | 2037 const Operator* op = |
2036 javascript()->CallRuntime(Runtime::kStoreLookupSlot, 4); | 2038 javascript()->CallRuntime(Runtime::kStoreLookupSlot, 4); |
2037 Node* store = NewNode(op, value, current_context(), name, strict); | 2039 Node* store = NewNode(op, value, current_context(), name, strict); |
2038 PrepareFrameState(store, bailout_id); | 2040 PrepareFrameState(store, bailout_id, combine); |
2039 return store; | 2041 return store; |
2040 } | 2042 } |
2041 } | 2043 } |
2042 UNREACHABLE(); | 2044 UNREACHABLE(); |
2043 return NULL; | 2045 return NULL; |
2044 } | 2046 } |
2045 | 2047 |
2046 | 2048 |
2047 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { | 2049 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { |
2048 Node* field_load = NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object, | 2050 Node* field_load = NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object, |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2182 | 2184 |
2183 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( | 2185 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( |
2184 IterationStatement* stmt) { | 2186 IterationStatement* stmt) { |
2185 if (loop_assignment_analysis_ == NULL) return NULL; | 2187 if (loop_assignment_analysis_ == NULL) return NULL; |
2186 return loop_assignment_analysis_->GetVariablesAssignedInLoop(stmt); | 2188 return loop_assignment_analysis_->GetVariablesAssignedInLoop(stmt); |
2187 } | 2189 } |
2188 | 2190 |
2189 } // namespace compiler | 2191 } // namespace compiler |
2190 } // namespace internal | 2192 } // namespace internal |
2191 } // namespace v8 | 2193 } // namespace v8 |
OLD | NEW |