OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
6 | 6 |
7 #include "src/ast/compile-time-value.h" | 7 #include "src/ast/compile-time-value.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/compilation-info.h" | 10 #include "src/compilation-info.h" |
(...skipping 2475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2486 builder()->CallRuntime(Runtime::kInlineGetSuperConstructor, this_function); | 2486 builder()->CallRuntime(Runtime::kInlineGetSuperConstructor, this_function); |
2487 | 2487 |
2488 Register constructor = this_function; // Re-use dead this_function register. | 2488 Register constructor = this_function; // Re-use dead this_function register. |
2489 builder()->StoreAccumulatorInRegister(constructor); | 2489 builder()->StoreAccumulatorInRegister(constructor); |
2490 | 2490 |
2491 ZoneList<Expression*>* args = expr->arguments(); | 2491 ZoneList<Expression*>* args = expr->arguments(); |
2492 | 2492 |
2493 // When a super call contains a spread, a CallSuper AST node is only created | 2493 // When a super call contains a spread, a CallSuper AST node is only created |
2494 // if there is exactly one spread, and it is the last argument. | 2494 // if there is exactly one spread, and it is the last argument. |
2495 if (!args->is_empty() && args->last()->IsSpread()) { | 2495 if (!args->is_empty() && args->last()->IsSpread()) { |
2496 // Prepare the spread arguments. | 2496 RegisterList args_regs = |
2497 RegisterList spread_prepare_args = | 2497 register_allocator()->NewRegisterList(args->length() + 2); |
2498 register_allocator()->NewRegisterList(args->length()); | 2498 builder()->MoveRegister(constructor, args_regs[0]); |
2499 VisitArguments(args, spread_prepare_args); | 2499 VisitForRegisterValue(super->new_target_var(), args_regs[1]); |
2500 | 2500 VisitArguments(args, args_regs, 2); |
2501 builder()->CallRuntime(Runtime::kSpreadIterablePrepareVarargs, | 2501 builder()->NewWithSpread(args_regs); |
2502 spread_prepare_args); | |
2503 | |
2504 // Call ReflectConstruct to do the actual super constructor call. | |
2505 RegisterList reflect_construct_args = | |
2506 register_allocator()->NewRegisterList(4); | |
2507 builder() | |
2508 ->StoreAccumulatorInRegister(reflect_construct_args[2]) | |
2509 .LoadUndefined() | |
2510 .StoreAccumulatorInRegister(reflect_construct_args[0]) | |
2511 .MoveRegister(constructor, reflect_construct_args[1]); | |
2512 VisitForRegisterValue(super->new_target_var(), reflect_construct_args[3]); | |
2513 builder()->CallJSRuntime(Context::REFLECT_CONSTRUCT_INDEX, | |
2514 reflect_construct_args); | |
2515 } else { | 2502 } else { |
2516 RegisterList args_regs = | 2503 RegisterList args_regs = |
2517 register_allocator()->NewRegisterList(args->length()); | 2504 register_allocator()->NewRegisterList(args->length()); |
2518 VisitArguments(args, args_regs); | 2505 VisitArguments(args, args_regs); |
2519 // The new target is loaded into the accumulator from the | 2506 // The new target is loaded into the accumulator from the |
2520 // {new.target} variable. | 2507 // {new.target} variable. |
2521 VisitForAccumulatorValue(super->new_target_var()); | 2508 VisitForAccumulatorValue(super->new_target_var()); |
2522 | 2509 |
2523 // Call construct. | 2510 // Call construct. |
2524 builder()->SetExpressionPosition(expr); | 2511 builder()->SetExpressionPosition(expr); |
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3223 } | 3210 } |
3224 | 3211 |
3225 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { | 3212 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { |
3226 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict | 3213 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict |
3227 : Runtime::kStoreKeyedToSuper_Sloppy; | 3214 : Runtime::kStoreKeyedToSuper_Sloppy; |
3228 } | 3215 } |
3229 | 3216 |
3230 } // namespace interpreter | 3217 } // namespace interpreter |
3231 } // namespace internal | 3218 } // namespace internal |
3232 } // namespace v8 | 3219 } // namespace v8 |
OLD | NEW |