Chromium Code Reviews| 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 <stack> | 7 #include <stack> |
| 8 | 8 |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/interpreter/control-flow-builders.h" | 10 #include "src/interpreter/control-flow-builders.h" |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 UNIMPLEMENTED(); | 438 UNIMPLEMENTED(); |
| 439 } | 439 } |
| 440 | 440 |
| 441 | 441 |
| 442 void BytecodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { | 442 void BytecodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { |
| 443 UNIMPLEMENTED(); | 443 UNIMPLEMENTED(); |
| 444 } | 444 } |
| 445 | 445 |
| 446 | 446 |
| 447 void BytecodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { | 447 void BytecodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { |
| 448 UNIMPLEMENTED(); | 448 // Find or build a shared function info. |
| 449 Handle<SharedFunctionInfo> shared_info = | |
| 450 Compiler::GetSharedFunctionInfo(expr, info()->script(), info()); | |
| 451 CHECK(!shared_info.is_null()); // TODO(rmcilroy): Set stack overflow? | |
|
Michael Starzinger
2015/10/09 13:19:00
Yeah, that same check in the AstGraphBuilder bothe
rmcilroy
2015/10/12 17:00:15
Yeah I've never seen this myself. I'll let you kno
| |
| 452 | |
| 453 builder() | |
| 454 ->LoadLiteral(shared_info) | |
| 455 .CreateClosure(expr->pretenure() ? TENURED : NOT_TENURED); | |
| 449 } | 456 } |
| 450 | 457 |
| 451 | 458 |
| 452 void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) { | 459 void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) { |
| 453 UNIMPLEMENTED(); | 460 UNIMPLEMENTED(); |
| 454 } | 461 } |
| 455 | 462 |
| 456 | 463 |
| 457 void BytecodeGenerator::VisitNativeFunctionLiteral( | 464 void BytecodeGenerator::VisitNativeFunctionLiteral( |
| 458 NativeFunctionLiteral* expr) { | 465 NativeFunctionLiteral* expr) { |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 723 } | 730 } |
| 724 case Call::GLOBAL_CALL: { | 731 case Call::GLOBAL_CALL: { |
| 725 // Receiver is undefined for global calls. | 732 // Receiver is undefined for global calls. |
| 726 builder()->LoadUndefined().StoreAccumulatorInRegister(receiver); | 733 builder()->LoadUndefined().StoreAccumulatorInRegister(receiver); |
| 727 // Load callee as a global variable. | 734 // Load callee as a global variable. |
| 728 VariableProxy* proxy = callee_expr->AsVariableProxy(); | 735 VariableProxy* proxy = callee_expr->AsVariableProxy(); |
| 729 VisitVariableLoad(proxy->var(), proxy->VariableFeedbackSlot()); | 736 VisitVariableLoad(proxy->var(), proxy->VariableFeedbackSlot()); |
| 730 builder()->StoreAccumulatorInRegister(callee); | 737 builder()->StoreAccumulatorInRegister(callee); |
| 731 break; | 738 break; |
| 732 } | 739 } |
| 740 case Call::OTHER_CALL: { | |
| 741 Visit(callee_expr); | |
| 742 builder()->StoreAccumulatorInRegister(callee); | |
| 743 builder()->LoadUndefined().StoreAccumulatorInRegister(receiver); | |
|
Michael Starzinger
2015/10/09 13:19:00
nit: I don't think it matters much, since we don't
Michael Starzinger
2015/10/09 13:28:01
Actually, I just checked again and we already in f
rmcilroy
2015/10/12 17:00:15
It doesn't actually matter which way round this go
| |
| 744 break; | |
| 745 } | |
| 733 case Call::LOOKUP_SLOT_CALL: | 746 case Call::LOOKUP_SLOT_CALL: |
| 734 case Call::SUPER_CALL: | 747 case Call::SUPER_CALL: |
| 735 case Call::POSSIBLY_EVAL_CALL: | 748 case Call::POSSIBLY_EVAL_CALL: |
| 736 case Call::OTHER_CALL: | |
| 737 UNIMPLEMENTED(); | 749 UNIMPLEMENTED(); |
| 738 } | 750 } |
| 739 | 751 |
| 740 // Evaluate all arguments to the function call and store in sequential | 752 // Evaluate all arguments to the function call and store in sequential |
| 741 // registers. | 753 // registers. |
| 742 ZoneList<Expression*>* args = expr->arguments(); | 754 ZoneList<Expression*>* args = expr->arguments(); |
| 743 for (int i = 0; i < args->length(); ++i) { | 755 for (int i = 0; i < args->length(); ++i) { |
| 744 Visit(args->at(i)); | 756 Visit(args->at(i)); |
| 745 Register arg = temporary_register_scope.NewRegister(); | 757 Register arg = temporary_register_scope.NewRegister(); |
| 746 DCHECK(arg.index() - i == receiver.index() + 1); | 758 DCHECK(arg.index() - i == receiver.index() + 1); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 938 } | 950 } |
| 939 | 951 |
| 940 | 952 |
| 941 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 953 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
| 942 return info()->feedback_vector()->GetIndex(slot); | 954 return info()->feedback_vector()->GetIndex(slot); |
| 943 } | 955 } |
| 944 | 956 |
| 945 } // namespace interpreter | 957 } // namespace interpreter |
| 946 } // namespace internal | 958 } // namespace internal |
| 947 } // namespace v8 | 959 } // namespace v8 |
| OLD | NEW |