| 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 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 // during evaluation of the method values. | 892 // during evaluation of the method values. |
| 893 environment()->Push(literal); | 893 environment()->Push(literal); |
| 894 environment()->Push(proto); | 894 environment()->Push(proto); |
| 895 | 895 |
| 896 // Create nodes to store method values into the literal. | 896 // Create nodes to store method values into the literal. |
| 897 for (int i = 0; i < expr->properties()->length(); i++) { | 897 for (int i = 0; i < expr->properties()->length(); i++) { |
| 898 ObjectLiteral::Property* property = expr->properties()->at(i); | 898 ObjectLiteral::Property* property = expr->properties()->at(i); |
| 899 environment()->Push(property->is_static() ? literal : proto); | 899 environment()->Push(property->is_static() ? literal : proto); |
| 900 | 900 |
| 901 VisitForValue(property->key()); | 901 VisitForValue(property->key()); |
| 902 environment()->Push(BuildToName(environment()->Pop())); | 902 environment()->Push( |
| 903 BuildToName(environment()->Pop(), expr->GetIdForProperty(i))); |
| 903 VisitForValue(property->value()); | 904 VisitForValue(property->value()); |
| 904 Node* value = environment()->Pop(); | 905 Node* value = environment()->Pop(); |
| 905 Node* key = environment()->Pop(); | 906 Node* key = environment()->Pop(); |
| 906 Node* receiver = environment()->Pop(); | 907 Node* receiver = environment()->Pop(); |
| 907 switch (property->kind()) { | 908 switch (property->kind()) { |
| 908 case ObjectLiteral::Property::CONSTANT: | 909 case ObjectLiteral::Property::CONSTANT: |
| 909 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 910 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 910 case ObjectLiteral::Property::PROTOTYPE: | 911 case ObjectLiteral::Property::PROTOTYPE: |
| 911 UNREACHABLE(); | 912 UNREACHABLE(); |
| 912 case ObjectLiteral::Property::COMPUTED: { | 913 case ObjectLiteral::Property::COMPUTED: { |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1124 // its right. All the code from above initializes the static component of the | 1125 // its right. All the code from above initializes the static component of the |
| 1125 // object literal, and arranges for the map of the result to reflect the | 1126 // object literal, and arranges for the map of the result to reflect the |
| 1126 // static order in which the keys appear. For the dynamic properties, we | 1127 // static order in which the keys appear. For the dynamic properties, we |
| 1127 // compile them into a series of "SetOwnProperty" runtime calls. This will | 1128 // compile them into a series of "SetOwnProperty" runtime calls. This will |
| 1128 // preserve insertion order. | 1129 // preserve insertion order. |
| 1129 for (; property_index < expr->properties()->length(); property_index++) { | 1130 for (; property_index < expr->properties()->length(); property_index++) { |
| 1130 ObjectLiteral::Property* property = expr->properties()->at(property_index); | 1131 ObjectLiteral::Property* property = expr->properties()->at(property_index); |
| 1131 | 1132 |
| 1132 environment()->Push(literal); // Duplicate receiver. | 1133 environment()->Push(literal); // Duplicate receiver. |
| 1133 VisitForValue(property->key()); | 1134 VisitForValue(property->key()); |
| 1134 environment()->Push(BuildToName(environment()->Pop())); | 1135 environment()->Push(BuildToName(environment()->Pop(), |
| 1136 expr->GetIdForProperty(property_index))); |
| 1135 // TODO(mstarzinger): For ObjectLiteral::Property::PROTOTYPE the key should | 1137 // TODO(mstarzinger): For ObjectLiteral::Property::PROTOTYPE the key should |
| 1136 // not be on the operand stack while the value is being evaluated. Come up | 1138 // not be on the operand stack while the value is being evaluated. Come up |
| 1137 // with a repro for this and fix it. Also find a nice way to do so. :) | 1139 // with a repro for this and fix it. Also find a nice way to do so. :) |
| 1138 VisitForValue(property->value()); | 1140 VisitForValue(property->value()); |
| 1139 Node* value = environment()->Pop(); | 1141 Node* value = environment()->Pop(); |
| 1140 Node* key = environment()->Pop(); | 1142 Node* key = environment()->Pop(); |
| 1141 Node* receiver = environment()->Pop(); | 1143 Node* receiver = environment()->Pop(); |
| 1142 | 1144 |
| 1143 switch (property->kind()) { | 1145 switch (property->kind()) { |
| 1144 case ObjectLiteral::Property::CONSTANT: | 1146 case ObjectLiteral::Property::CONSTANT: |
| (...skipping 1172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2317 } | 2319 } |
| 2318 if (NodeProperties::IsTyped(input)) { | 2320 if (NodeProperties::IsTyped(input)) { |
| 2319 Type* upper = NodeProperties::GetBounds(input).upper; | 2321 Type* upper = NodeProperties::GetBounds(input).upper; |
| 2320 if (upper->Is(Type::Boolean())) return input; | 2322 if (upper->Is(Type::Boolean())) return input; |
| 2321 } | 2323 } |
| 2322 | 2324 |
| 2323 return NewNode(javascript()->ToBoolean(), input); | 2325 return NewNode(javascript()->ToBoolean(), input); |
| 2324 } | 2326 } |
| 2325 | 2327 |
| 2326 | 2328 |
| 2327 Node* AstGraphBuilder::BuildToName(Node* input) { | 2329 Node* AstGraphBuilder::BuildToName(Node* input, BailoutId bailout_id) { |
| 2328 // TODO(turbofan): Possible optimization is to NOP on name constants. But the | 2330 // TODO(turbofan): Possible optimization is to NOP on name constants. But the |
| 2329 // same caveat as with BuildToBoolean applies, and it should be factored out | 2331 // same caveat as with BuildToBoolean applies, and it should be factored out |
| 2330 // into a JSOperatorReducer. | 2332 // into a JSOperatorReducer. |
| 2331 return NewNode(javascript()->ToName(), input); | 2333 Node* name = NewNode(javascript()->ToName(), input); |
| 2334 PrepareFrameState(name, bailout_id); |
| 2335 return name; |
| 2332 } | 2336 } |
| 2333 | 2337 |
| 2334 | 2338 |
| 2335 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable, | 2339 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable, |
| 2336 BailoutId bailout_id) { | 2340 BailoutId bailout_id) { |
| 2337 // TODO(mstarzinger): Should be unified with the VisitThrow implementation. | 2341 // TODO(mstarzinger): Should be unified with the VisitThrow implementation. |
| 2338 Node* variable_name = jsgraph()->Constant(variable->name()); | 2342 Node* variable_name = jsgraph()->Constant(variable->name()); |
| 2339 const Operator* op = | 2343 const Operator* op = |
| 2340 javascript()->CallRuntime(Runtime::kThrowReferenceError, 1); | 2344 javascript()->CallRuntime(Runtime::kThrowReferenceError, 1); |
| 2341 Node* call = NewNode(op, variable_name); | 2345 Node* call = NewNode(op, variable_name); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2434 | 2438 |
| 2435 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( | 2439 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( |
| 2436 IterationStatement* stmt) { | 2440 IterationStatement* stmt) { |
| 2437 if (loop_assignment_analysis_ == NULL) return NULL; | 2441 if (loop_assignment_analysis_ == NULL) return NULL; |
| 2438 return loop_assignment_analysis_->GetVariablesAssignedInLoop(stmt); | 2442 return loop_assignment_analysis_->GetVariablesAssignedInLoop(stmt); |
| 2439 } | 2443 } |
| 2440 | 2444 |
| 2441 } // namespace compiler | 2445 } // namespace compiler |
| 2442 } // namespace internal | 2446 } // namespace internal |
| 2443 } // namespace v8 | 2447 } // namespace v8 |
| OLD | NEW |