Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Side by Side Diff: src/interpreter/interpreter.cc

Issue 1386313005: [Interpreter] Adds Object literal support. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_literal_2
Patch Set: Rebase and review comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/interpreter/interpreter.h ('k') | test/cctest/interpreter/test-bytecode-generator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/interpreter.h" 5 #include "src/interpreter/interpreter.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/compiler.h" 8 #include "src/compiler.h"
9 #include "src/compiler/interpreter-assembler.h" 9 #include "src/compiler/interpreter-assembler.h"
10 #include "src/factory.h" 10 #include "src/factory.h"
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 void Interpreter::DoKeyedStoreICStrict( 342 void Interpreter::DoKeyedStoreICStrict(
343 compiler::InterpreterAssembler* assembler) { 343 compiler::InterpreterAssembler* assembler) {
344 Callable ic = 344 Callable ic =
345 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); 345 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
346 DoPropertyStoreIC(ic, assembler); 346 DoPropertyStoreIC(ic, assembler);
347 } 347 }
348 348
349 349
350 // KeyedStoreICGeneric <object> <key> 350 // KeyedStoreICGeneric <object> <key>
351 // 351 //
352 // Calls the generic KeyStoreIC for <object> and the key <key> with the value in 352 // Calls the generic KeyedStoreIC for <object> and the key <key> with the value
353 // the accumulator. 353 // in the accumulator.
354 void Interpreter::DoKeyedStoreICGeneric( 354 void Interpreter::DoKeyedStoreICGeneric(
355 compiler::InterpreterAssembler* assembler) { 355 compiler::InterpreterAssembler* assembler) {
356 Callable ic = 356 Callable ic =
357 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, MEGAMORPHIC); 357 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, MEGAMORPHIC);
358 Node* code_target = __ HeapConstant(ic.code()); 358 Node* code_target = __ HeapConstant(ic.code());
359 Node* object_reg_index = __ BytecodeOperandReg8(0); 359 Node* object_reg_index = __ BytecodeOperandReg8(0);
360 Node* object = __ LoadRegister(object_reg_index); 360 Node* object = __ LoadRegister(object_reg_index);
361 Node* name_reg_index = __ BytecodeOperandReg8(1); 361 Node* name_reg_index = __ BytecodeOperandReg8(1);
362 Node* name = __ LoadRegister(name_reg_index); 362 Node* name = __ LoadRegister(name_reg_index);
363 Node* value = __ GetAccumulator(); 363 Node* value = __ GetAccumulator();
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 // 649 //
650 // Cast the object referenced by the accumulator to a boolean. 650 // Cast the object referenced by the accumulator to a boolean.
651 void Interpreter::DoToBoolean(compiler::InterpreterAssembler* assembler) { 651 void Interpreter::DoToBoolean(compiler::InterpreterAssembler* assembler) {
652 Node* accumulator = __ GetAccumulator(); 652 Node* accumulator = __ GetAccumulator();
653 Node* result = __ CallRuntime(Runtime::kInterpreterToBoolean, accumulator); 653 Node* result = __ CallRuntime(Runtime::kInterpreterToBoolean, accumulator);
654 __ SetAccumulator(result); 654 __ SetAccumulator(result);
655 __ Dispatch(); 655 __ Dispatch();
656 } 656 }
657 657
658 658
659 // ToName
660 //
661 // Cast the object referenced by the accumulator to a name.
662 void Interpreter::DoToName(compiler::InterpreterAssembler* assembler) {
663 Node* accumulator = __ GetAccumulator();
664 Node* result = __ CallRuntime(Runtime::kToName, accumulator);
665 __ SetAccumulator(result);
666 __ Dispatch();
667 }
668
669
659 // Jump <imm8> 670 // Jump <imm8>
660 // 671 //
661 // Jump by number of bytes represented by the immediate operand |imm8|. 672 // Jump by number of bytes represented by the immediate operand |imm8|.
662 void Interpreter::DoJump(compiler::InterpreterAssembler* assembler) { 673 void Interpreter::DoJump(compiler::InterpreterAssembler* assembler) {
663 Node* relative_jump = __ BytecodeOperandImm8(0); 674 Node* relative_jump = __ BytecodeOperandImm8(0);
664 __ Jump(relative_jump); 675 __ Jump(relative_jump);
665 } 676 }
666 677
667 678
668 // JumpConstant <idx> 679 // JumpConstant <idx>
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 compiler::InterpreterAssembler* assembler) { 734 compiler::InterpreterAssembler* assembler) {
724 Node* accumulator = __ GetAccumulator(); 735 Node* accumulator = __ GetAccumulator();
725 Node* index = __ BytecodeOperandIdx8(0); 736 Node* index = __ BytecodeOperandIdx8(0);
726 Node* constant = __ LoadConstantPoolEntry(index); 737 Node* constant = __ LoadConstantPoolEntry(index);
727 Node* relative_jump = __ SmiUntag(constant); 738 Node* relative_jump = __ SmiUntag(constant);
728 Node* false_value = __ BooleanConstant(false); 739 Node* false_value = __ BooleanConstant(false);
729 __ JumpIfWordEqual(accumulator, false_value, relative_jump); 740 __ JumpIfWordEqual(accumulator, false_value, relative_jump);
730 } 741 }
731 742
732 743
733 // CreateArrayLiteral <idx> <flags> 744 void Interpreter::DoCreateLiteral(Runtime::FunctionId function_id,
734 // 745 compiler::InterpreterAssembler* assembler) {
735 // Creates an array literal for literal index <idx> with flags <flags> and
736 // constant elements in the accumulator.
737 void Interpreter::DoCreateArrayLiteral(
738 compiler::InterpreterAssembler* assembler) {
739 Node* constant_elements = __ GetAccumulator(); 746 Node* constant_elements = __ GetAccumulator();
740 Node* literal_index_raw = __ BytecodeOperandIdx8(0); 747 Node* literal_index_raw = __ BytecodeOperandIdx8(0);
741 Node* literal_index = __ SmiTag(literal_index_raw); 748 Node* literal_index = __ SmiTag(literal_index_raw);
742 Node* flags_raw = __ BytecodeOperandImm8(1); 749 Node* flags_raw = __ BytecodeOperandImm8(1);
743 Node* flags = __ SmiTag(flags_raw); 750 Node* flags = __ SmiTag(flags_raw);
744 Node* closure = __ LoadRegister(Register::function_closure()); 751 Node* closure = __ LoadRegister(Register::function_closure());
745 Node* literals_array = 752 Node* literals_array =
746 __ LoadObjectField(closure, JSFunction::kLiteralsOffset); 753 __ LoadObjectField(closure, JSFunction::kLiteralsOffset);
747 Node* result = __ CallRuntime(Runtime::kCreateArrayLiteral, literals_array, 754 Node* result = __ CallRuntime(function_id, literals_array, literal_index,
748 literal_index, constant_elements, flags); 755 constant_elements, flags);
749 __ SetAccumulator(result); 756 __ SetAccumulator(result);
750 __ Dispatch(); 757 __ Dispatch();
751 } 758 }
752 759
753 760
761 // CreateArrayLiteral <idx> <flags>
762 //
763 // Creates an array literal for literal index <idx> with flags <flags> and
764 // constant elements in the accumulator.
765 void Interpreter::DoCreateArrayLiteral(
766 compiler::InterpreterAssembler* assembler) {
767 DoCreateLiteral(Runtime::kCreateArrayLiteral, assembler);
768 }
769
770
771 // CreateObjectLiteral <idx> <flags>
772 //
773 // Creates an object literal for literal index <idx> with flags <flags> and
774 // constant elements in the accumulator.
775 void Interpreter::DoCreateObjectLiteral(
776 compiler::InterpreterAssembler* assembler) {
777 DoCreateLiteral(Runtime::kCreateObjectLiteral, assembler);
778 }
779
780
754 // CreateClosure <tenured> 781 // CreateClosure <tenured>
755 // 782 //
756 // Creates a new closure for SharedFunctionInfo in the accumulator with the 783 // Creates a new closure for SharedFunctionInfo in the accumulator with the
757 // PretenureFlag <tenured>. 784 // PretenureFlag <tenured>.
758 void Interpreter::DoCreateClosure(compiler::InterpreterAssembler* assembler) { 785 void Interpreter::DoCreateClosure(compiler::InterpreterAssembler* assembler) {
759 // TODO(rmcilroy): Possibly call FastNewClosureStub when possible instead of 786 // TODO(rmcilroy): Possibly call FastNewClosureStub when possible instead of
760 // calling into the runtime. 787 // calling into the runtime.
761 Node* shared = __ GetAccumulator(); 788 Node* shared = __ GetAccumulator();
762 Node* tenured_raw = __ BytecodeOperandImm8(0); 789 Node* tenured_raw = __ BytecodeOperandImm8(0);
763 Node* tenured = __ SmiTag(tenured_raw); 790 Node* tenured = __ SmiTag(tenured_raw);
764 Node* result = 791 Node* result =
765 __ CallRuntime(Runtime::kInterpreterNewClosure, shared, tenured); 792 __ CallRuntime(Runtime::kInterpreterNewClosure, shared, tenured);
766 __ SetAccumulator(result); 793 __ SetAccumulator(result);
767 __ Dispatch(); 794 __ Dispatch();
768 } 795 }
769 796
770 797
771 // Return 798 // Return
772 // 799 //
773 // Return the value in the accumulator. 800 // Return the value in the accumulator.
774 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) { 801 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) {
775 __ Return(); 802 __ Return();
776 } 803 }
777 804
778 805
779 } // namespace interpreter 806 } // namespace interpreter
780 } // namespace internal 807 } // namespace internal
781 } // namespace v8 808 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/interpreter.h ('k') | test/cctest/interpreter/test-bytecode-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698