| 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/linkage.h" | 10 #include "src/compiler/linkage.h" |
| (...skipping 2485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2496 const Operator* op = javascript()->CallRuntime(Runtime::kGetPrototype, 1); | 2496 const Operator* op = javascript()->CallRuntime(Runtime::kGetPrototype, 1); |
| 2497 Node* super_function = NewNode(op, this_function); | 2497 Node* super_function = NewNode(op, this_function); |
| 2498 // TODO(mstarzinger): This probably needs a proper bailout id. | 2498 // TODO(mstarzinger): This probably needs a proper bailout id. |
| 2499 PrepareFrameState(super_function, BailoutId::None()); | 2499 PrepareFrameState(super_function, BailoutId::None()); |
| 2500 environment()->Push(super_function); | 2500 environment()->Push(super_function); |
| 2501 | 2501 |
| 2502 // Evaluate all arguments to the super call. | 2502 // Evaluate all arguments to the super call. |
| 2503 ZoneList<Expression*>* args = expr->arguments(); | 2503 ZoneList<Expression*>* args = expr->arguments(); |
| 2504 VisitForValues(args); | 2504 VisitForValues(args); |
| 2505 | 2505 |
| 2506 // Original constructor is loaded from the {new.target} variable. | 2506 // The new target is loaded from the {new.target} variable. |
| 2507 VisitForValue(super->new_target_var()); | 2507 VisitForValue(super->new_target_var()); |
| 2508 | 2508 |
| 2509 // Create node to perform the super call. | 2509 // Create node to perform the super call. |
| 2510 const Operator* call = javascript()->CallConstruct(args->length() + 2); | 2510 const Operator* call = javascript()->CallConstruct(args->length() + 2); |
| 2511 Node* value = ProcessArguments(call, args->length() + 2); | 2511 Node* value = ProcessArguments(call, args->length() + 2); |
| 2512 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 2512 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
| 2513 ast_context()->ProduceValue(value); | 2513 ast_context()->ProduceValue(value); |
| 2514 } | 2514 } |
| 2515 | 2515 |
| 2516 | 2516 |
| 2517 void AstGraphBuilder::VisitCallNew(CallNew* expr) { | 2517 void AstGraphBuilder::VisitCallNew(CallNew* expr) { |
| 2518 VisitForValue(expr->expression()); | 2518 VisitForValue(expr->expression()); |
| 2519 | 2519 |
| 2520 // Evaluate all arguments to the construct call. | 2520 // Evaluate all arguments to the construct call. |
| 2521 ZoneList<Expression*>* args = expr->arguments(); | 2521 ZoneList<Expression*>* args = expr->arguments(); |
| 2522 VisitForValues(args); | 2522 VisitForValues(args); |
| 2523 | 2523 |
| 2524 // Original constructor is the same as the callee. | 2524 // The new target is the same as the callee. |
| 2525 environment()->Push(environment()->Peek(args->length())); | 2525 environment()->Push(environment()->Peek(args->length())); |
| 2526 | 2526 |
| 2527 // Create node to perform the construct call. | 2527 // Create node to perform the construct call. |
| 2528 const Operator* call = javascript()->CallConstruct(args->length() + 2); | 2528 const Operator* call = javascript()->CallConstruct(args->length() + 2); |
| 2529 Node* value = ProcessArguments(call, args->length() + 2); | 2529 Node* value = ProcessArguments(call, args->length() + 2); |
| 2530 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 2530 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
| 2531 ast_context()->ProduceValue(value); | 2531 ast_context()->ProduceValue(value); |
| 2532 } | 2532 } |
| 2533 | 2533 |
| 2534 | 2534 |
| (...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3204 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 3204 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 3205 BuildVariableAssignment(this_function_var, this_function, Token::INIT_CONST, | 3205 BuildVariableAssignment(this_function_var, this_function, Token::INIT_CONST, |
| 3206 VectorSlotPair(), BailoutId::None(), states); | 3206 VectorSlotPair(), BailoutId::None(), states); |
| 3207 return this_function; | 3207 return this_function; |
| 3208 } | 3208 } |
| 3209 | 3209 |
| 3210 | 3210 |
| 3211 Node* AstGraphBuilder::BuildNewTargetVariable(Variable* new_target_var) { | 3211 Node* AstGraphBuilder::BuildNewTargetVariable(Variable* new_target_var) { |
| 3212 if (new_target_var == nullptr) return nullptr; | 3212 if (new_target_var == nullptr) return nullptr; |
| 3213 | 3213 |
| 3214 // Retrieve the original constructor in case we are called as a constructor. | 3214 // Retrieve the new target in case we are called as a constructor. |
| 3215 const Operator* op = | 3215 const Operator* op = javascript()->CallRuntime(Runtime::kGetNewTarget, 0); |
| 3216 javascript()->CallRuntime(Runtime::kGetOriginalConstructor, 0); | |
| 3217 Node* object = NewNode(op); | 3216 Node* object = NewNode(op); |
| 3218 // TODO(4544): Bailout id only needed for JavaScriptFrame::Summarize. | 3217 // TODO(4544): Bailout id only needed for JavaScriptFrame::Summarize. |
| 3219 PrepareFrameState(object, BailoutId::FunctionContext()); | 3218 PrepareFrameState(object, BailoutId::FunctionContext()); |
| 3220 | 3219 |
| 3221 // Assign the object to the {new.target} variable. This should never lazy | 3220 // Assign the object to the {new.target} variable. This should never lazy |
| 3222 // deopt, so it is fine to send invalid bailout id. | 3221 // deopt, so it is fine to send invalid bailout id. |
| 3223 FrameStateBeforeAndAfter states(this, BailoutId::None()); | 3222 FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| 3224 BuildVariableAssignment(new_target_var, object, Token::INIT_CONST, | 3223 BuildVariableAssignment(new_target_var, object, Token::INIT_CONST, |
| 3225 VectorSlotPair(), BailoutId::None(), states); | 3224 VectorSlotPair(), BailoutId::None(), states); |
| 3226 return object; | 3225 return object; |
| (...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4297 // Phi does not exist yet, introduce one. | 4296 // Phi does not exist yet, introduce one. |
| 4298 value = NewPhi(inputs, value, control); | 4297 value = NewPhi(inputs, value, control); |
| 4299 value->ReplaceInput(inputs - 1, other); | 4298 value->ReplaceInput(inputs - 1, other); |
| 4300 } | 4299 } |
| 4301 return value; | 4300 return value; |
| 4302 } | 4301 } |
| 4303 | 4302 |
| 4304 } // namespace compiler | 4303 } // namespace compiler |
| 4305 } // namespace internal | 4304 } // namespace internal |
| 4306 } // namespace v8 | 4305 } // namespace v8 |
| OLD | NEW |