| Index: src/interpreter/interpreter.cc
|
| diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc
|
| index a4e5d99838d8f686ff165def79b4740373259d9f..775fbca5e56ceb7e30e1e5959233e0b870cac095 100644
|
| --- a/src/interpreter/interpreter.cc
|
| +++ b/src/interpreter/interpreter.cc
|
| @@ -7,10 +7,10 @@
|
| #include "src/ast/prettyprinter.h"
|
| #include "src/code-factory.h"
|
| #include "src/compiler.h"
|
| -#include "src/compiler/interpreter-assembler.h"
|
| #include "src/factory.h"
|
| #include "src/interpreter/bytecode-generator.h"
|
| #include "src/interpreter/bytecodes.h"
|
| +#include "src/interpreter/interpreter-assembler.h"
|
| #include "src/zone.h"
|
|
|
| namespace v8 {
|
| @@ -25,21 +25,20 @@ Interpreter::Interpreter(Isolate* isolate) : isolate_(isolate) {
|
| memset(&dispatch_table_, 0, sizeof(dispatch_table_));
|
| }
|
|
|
| -
|
| void Interpreter::Initialize() {
|
| DCHECK(FLAG_ignition);
|
| if (IsDispatchTableInitialized()) return;
|
| Zone zone;
|
| HandleScope scope(isolate_);
|
|
|
| -#define GENERATE_CODE(Name, ...) \
|
| - { \
|
| - compiler::InterpreterAssembler assembler(isolate_, &zone, \
|
| - Bytecode::k##Name); \
|
| - Do##Name(&assembler); \
|
| - Handle<Code> code = assembler.GenerateCode(); \
|
| - int index = static_cast<int>(Bytecode::k##Name); \
|
| - dispatch_table_[index] = *code; \
|
| +#define GENERATE_CODE(Name, ...) \
|
| + { \
|
| + InterpreterAssembler assembler(isolate_, &zone, Bytecode::k##Name); \
|
| + Do##Name(&assembler); \
|
| + Handle<Code> code = assembler.GenerateCode(); \
|
| + TraceCodegen(code, #Name); \
|
| + int index = static_cast<int>(Bytecode::k##Name); \
|
| + dispatch_table_[index] = *code; \
|
| }
|
| BYTECODE_LIST(GENERATE_CODE)
|
| #undef GENERATE_CODE
|
| @@ -50,7 +49,6 @@ void Interpreter::IterateDispatchTable(ObjectVisitor* v) {
|
| &dispatch_table_[0] + kDispatchTableSize);
|
| }
|
|
|
| -
|
| bool Interpreter::MakeBytecode(CompilationInfo* info) {
|
| if (FLAG_print_bytecode || FLAG_print_source || FLAG_print_ast) {
|
| OFStream os(stdout);
|
| @@ -99,10 +97,20 @@ bool Interpreter::IsDispatchTableInitialized() {
|
| return dispatch_table_[0] != nullptr;
|
| }
|
|
|
| +void Interpreter::TraceCodegen(Handle<Code> code, const char* name) {
|
| +#ifdef ENABLE_DISASSEMBLER
|
| + if (FLAG_trace_ignition_codegen) {
|
| + OFStream os(stdout);
|
| + code->Disassemble(name, os);
|
| + os << std::flush;
|
| + }
|
| +#endif // ENABLE_DISASSEMBLER
|
| +}
|
| +
|
| // LdaZero
|
| //
|
| // Load literal '0' into the accumulator.
|
| -void Interpreter::DoLdaZero(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaZero(InterpreterAssembler* assembler) {
|
| Node* zero_value = __ NumberConstant(0.0);
|
| __ SetAccumulator(zero_value);
|
| __ Dispatch();
|
| @@ -112,15 +120,14 @@ void Interpreter::DoLdaZero(compiler::InterpreterAssembler* assembler) {
|
| // LdaSmi8 <imm8>
|
| //
|
| // Load an 8-bit integer literal into the accumulator as a Smi.
|
| -void Interpreter::DoLdaSmi8(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaSmi8(InterpreterAssembler* assembler) {
|
| Node* raw_int = __ BytecodeOperandImm(0);
|
| Node* smi_int = __ SmiTag(raw_int);
|
| __ SetAccumulator(smi_int);
|
| __ Dispatch();
|
| }
|
|
|
| -
|
| -void Interpreter::DoLoadConstant(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLoadConstant(InterpreterAssembler* assembler) {
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* constant = __ LoadConstantPoolEntry(index);
|
| __ SetAccumulator(constant);
|
| @@ -131,7 +138,7 @@ void Interpreter::DoLoadConstant(compiler::InterpreterAssembler* assembler) {
|
| // LdaConstant <idx>
|
| //
|
| // Load constant literal at |idx| in the constant pool into the accumulator.
|
| -void Interpreter::DoLdaConstant(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaConstant(InterpreterAssembler* assembler) {
|
| DoLoadConstant(assembler);
|
| }
|
|
|
| @@ -139,7 +146,7 @@ void Interpreter::DoLdaConstant(compiler::InterpreterAssembler* assembler) {
|
| // LdaConstantWide <idx>
|
| //
|
| // Load constant literal at |idx| in the constant pool into the accumulator.
|
| -void Interpreter::DoLdaConstantWide(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaConstantWide(InterpreterAssembler* assembler) {
|
| DoLoadConstant(assembler);
|
| }
|
|
|
| @@ -147,7 +154,7 @@ void Interpreter::DoLdaConstantWide(compiler::InterpreterAssembler* assembler) {
|
| // LdaUndefined
|
| //
|
| // Load Undefined into the accumulator.
|
| -void Interpreter::DoLdaUndefined(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaUndefined(InterpreterAssembler* assembler) {
|
| Node* undefined_value =
|
| __ HeapConstant(isolate_->factory()->undefined_value());
|
| __ SetAccumulator(undefined_value);
|
| @@ -158,7 +165,7 @@ void Interpreter::DoLdaUndefined(compiler::InterpreterAssembler* assembler) {
|
| // LdaNull
|
| //
|
| // Load Null into the accumulator.
|
| -void Interpreter::DoLdaNull(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaNull(InterpreterAssembler* assembler) {
|
| Node* null_value = __ HeapConstant(isolate_->factory()->null_value());
|
| __ SetAccumulator(null_value);
|
| __ Dispatch();
|
| @@ -168,7 +175,7 @@ void Interpreter::DoLdaNull(compiler::InterpreterAssembler* assembler) {
|
| // LdaTheHole
|
| //
|
| // Load TheHole into the accumulator.
|
| -void Interpreter::DoLdaTheHole(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaTheHole(InterpreterAssembler* assembler) {
|
| Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value());
|
| __ SetAccumulator(the_hole_value);
|
| __ Dispatch();
|
| @@ -178,7 +185,7 @@ void Interpreter::DoLdaTheHole(compiler::InterpreterAssembler* assembler) {
|
| // LdaTrue
|
| //
|
| // Load True into the accumulator.
|
| -void Interpreter::DoLdaTrue(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaTrue(InterpreterAssembler* assembler) {
|
| Node* true_value = __ HeapConstant(isolate_->factory()->true_value());
|
| __ SetAccumulator(true_value);
|
| __ Dispatch();
|
| @@ -188,7 +195,7 @@ void Interpreter::DoLdaTrue(compiler::InterpreterAssembler* assembler) {
|
| // LdaFalse
|
| //
|
| // Load False into the accumulator.
|
| -void Interpreter::DoLdaFalse(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaFalse(InterpreterAssembler* assembler) {
|
| Node* false_value = __ HeapConstant(isolate_->factory()->false_value());
|
| __ SetAccumulator(false_value);
|
| __ Dispatch();
|
| @@ -198,7 +205,7 @@ void Interpreter::DoLdaFalse(compiler::InterpreterAssembler* assembler) {
|
| // Ldar <src>
|
| //
|
| // Load accumulator with value from register <src>.
|
| -void Interpreter::DoLdar(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdar(InterpreterAssembler* assembler) {
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* value = __ LoadRegister(reg_index);
|
| __ SetAccumulator(value);
|
| @@ -209,7 +216,7 @@ void Interpreter::DoLdar(compiler::InterpreterAssembler* assembler) {
|
| // Star <dst>
|
| //
|
| // Store accumulator to register <dst>.
|
| -void Interpreter::DoStar(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStar(InterpreterAssembler* assembler) {
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* accumulator = __ GetAccumulator();
|
| __ StoreRegister(accumulator, reg_index);
|
| @@ -220,7 +227,7 @@ void Interpreter::DoStar(compiler::InterpreterAssembler* assembler) {
|
| // Mov <src> <dst>
|
| //
|
| // Stores the value of register <src> to register <dst>.
|
| -void Interpreter::DoMov(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoMov(InterpreterAssembler* assembler) {
|
| Node* src_index = __ BytecodeOperandReg(0);
|
| Node* src_value = __ LoadRegister(src_index);
|
| Node* dst_index = __ BytecodeOperandReg(1);
|
| @@ -232,13 +239,11 @@ void Interpreter::DoMov(compiler::InterpreterAssembler* assembler) {
|
| // MovWide <src> <dst>
|
| //
|
| // Stores the value of register <src> to register <dst>.
|
| -void Interpreter::DoMovWide(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoMovWide(InterpreterAssembler* assembler) {
|
| DoMov(assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoLoadGlobal(Callable ic,
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLoadGlobal(Callable ic, InterpreterAssembler* assembler) {
|
| // Get the global object.
|
| Node* context = __ GetContext();
|
| Node* native_context =
|
| @@ -252,8 +257,8 @@ void Interpreter::DoLoadGlobal(Callable ic,
|
| Node* raw_slot = __ BytecodeOperandIdx(1);
|
| Node* smi_slot = __ SmiTag(raw_slot);
|
| Node* type_feedback_vector = __ LoadTypeFeedbackVector();
|
| - Node* result = __ CallIC(ic.descriptor(), code_target, global, name, smi_slot,
|
| - type_feedback_vector);
|
| + Node* result = __ CallStub(ic.descriptor(), code_target, context, global,
|
| + name, smi_slot, type_feedback_vector);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -263,7 +268,7 @@ void Interpreter::DoLoadGlobal(Callable ic,
|
| //
|
| // Load the global with name in constant pool entry <name_index> into the
|
| // accumulator using FeedBackVector slot <slot> in sloppy mode.
|
| -void Interpreter::DoLdaGlobalSloppy(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaGlobalSloppy(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
|
| SLOPPY, UNINITIALIZED);
|
| DoLoadGlobal(ic, assembler);
|
| @@ -274,7 +279,7 @@ void Interpreter::DoLdaGlobalSloppy(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Load the global with name in constant pool entry <name_index> into the
|
| // accumulator using FeedBackVector slot <slot> in strict mode.
|
| -void Interpreter::DoLdaGlobalStrict(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaGlobalStrict(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
|
| STRICT, UNINITIALIZED);
|
| DoLoadGlobal(ic, assembler);
|
| @@ -286,7 +291,7 @@ void Interpreter::DoLdaGlobalStrict(compiler::InterpreterAssembler* assembler) {
|
| // Load the global with name in constant pool entry <name_index> into the
|
| // accumulator using FeedBackVector slot <slot> in sloppy mode.
|
| void Interpreter::DoLdaGlobalInsideTypeofSloppy(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF,
|
| SLOPPY, UNINITIALIZED);
|
| DoLoadGlobal(ic, assembler);
|
| @@ -298,7 +303,7 @@ void Interpreter::DoLdaGlobalInsideTypeofSloppy(
|
| // Load the global with name in constant pool entry <name_index> into the
|
| // accumulator using FeedBackVector slot <slot> in strict mode.
|
| void Interpreter::DoLdaGlobalInsideTypeofStrict(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF,
|
| STRICT, UNINITIALIZED);
|
| DoLoadGlobal(ic, assembler);
|
| @@ -309,8 +314,7 @@ void Interpreter::DoLdaGlobalInsideTypeofStrict(
|
| //
|
| // Load the global with name in constant pool entry <name_index> into the
|
| // accumulator using FeedBackVector slot <slot> in sloppy mode.
|
| -void Interpreter::DoLdaGlobalSloppyWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaGlobalSloppyWide(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
|
| SLOPPY, UNINITIALIZED);
|
| DoLoadGlobal(ic, assembler);
|
| @@ -321,8 +325,7 @@ void Interpreter::DoLdaGlobalSloppyWide(
|
| //
|
| // Load the global with name in constant pool entry <name_index> into the
|
| // accumulator using FeedBackVector slot <slot> in strict mode.
|
| -void Interpreter::DoLdaGlobalStrictWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaGlobalStrictWide(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
|
| STRICT, UNINITIALIZED);
|
| DoLoadGlobal(ic, assembler);
|
| @@ -334,7 +337,7 @@ void Interpreter::DoLdaGlobalStrictWide(
|
| // Load the global with name in constant pool entry <name_index> into the
|
| // accumulator using FeedBackVector slot <slot> in sloppy mode.
|
| void Interpreter::DoLdaGlobalInsideTypeofSloppyWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF,
|
| SLOPPY, UNINITIALIZED);
|
| DoLoadGlobal(ic, assembler);
|
| @@ -346,15 +349,13 @@ void Interpreter::DoLdaGlobalInsideTypeofSloppyWide(
|
| // Load the global with name in constant pool entry <name_index> into the
|
| // accumulator using FeedBackVector slot <slot> in strict mode.
|
| void Interpreter::DoLdaGlobalInsideTypeofStrictWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, INSIDE_TYPEOF,
|
| STRICT, UNINITIALIZED);
|
| DoLoadGlobal(ic, assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoStoreGlobal(Callable ic,
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStoreGlobal(Callable ic, InterpreterAssembler* assembler) {
|
| // Get the global object.
|
| Node* context = __ GetContext();
|
| Node* native_context =
|
| @@ -369,8 +370,8 @@ void Interpreter::DoStoreGlobal(Callable ic,
|
| Node* raw_slot = __ BytecodeOperandIdx(1);
|
| Node* smi_slot = __ SmiTag(raw_slot);
|
| Node* type_feedback_vector = __ LoadTypeFeedbackVector();
|
| - __ CallIC(ic.descriptor(), code_target, global, name, value, smi_slot,
|
| - type_feedback_vector);
|
| + __ CallStub(ic.descriptor(), code_target, context, global, name, value,
|
| + smi_slot, type_feedback_vector);
|
|
|
| __ Dispatch();
|
| }
|
| @@ -380,7 +381,7 @@ void Interpreter::DoStoreGlobal(Callable ic,
|
| //
|
| // Store the value in the accumulator into the global with name in constant pool
|
| // entry <name_index> using FeedBackVector slot <slot> in sloppy mode.
|
| -void Interpreter::DoStaGlobalSloppy(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaGlobalSloppy(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
|
| DoStoreGlobal(ic, assembler);
|
| @@ -391,7 +392,7 @@ void Interpreter::DoStaGlobalSloppy(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Store the value in the accumulator into the global with name in constant pool
|
| // entry <name_index> using FeedBackVector slot <slot> in strict mode.
|
| -void Interpreter::DoStaGlobalStrict(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaGlobalStrict(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
|
| DoStoreGlobal(ic, assembler);
|
| @@ -402,8 +403,7 @@ void Interpreter::DoStaGlobalStrict(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Store the value in the accumulator into the global with name in constant pool
|
| // entry <name_index> using FeedBackVector slot <slot> in sloppy mode.
|
| -void Interpreter::DoStaGlobalSloppyWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaGlobalSloppyWide(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
|
| DoStoreGlobal(ic, assembler);
|
| @@ -414,8 +414,7 @@ void Interpreter::DoStaGlobalSloppyWide(
|
| //
|
| // Store the value in the accumulator into the global with name in constant pool
|
| // entry <name_index> using FeedBackVector slot <slot> in strict mode.
|
| -void Interpreter::DoStaGlobalStrictWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaGlobalStrictWide(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
|
| DoStoreGlobal(ic, assembler);
|
| @@ -425,7 +424,7 @@ void Interpreter::DoStaGlobalStrictWide(
|
| // LdaContextSlot <context> <slot_index>
|
| //
|
| // Load the object in |slot_index| of |context| into the accumulator.
|
| -void Interpreter::DoLdaContextSlot(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) {
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* context = __ LoadRegister(reg_index);
|
| Node* slot_index = __ BytecodeOperandIdx(1);
|
| @@ -438,8 +437,7 @@ void Interpreter::DoLdaContextSlot(compiler::InterpreterAssembler* assembler) {
|
| // LdaContextSlotWide <context> <slot_index>
|
| //
|
| // Load the object in |slot_index| of |context| into the accumulator.
|
| -void Interpreter::DoLdaContextSlotWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaContextSlotWide(InterpreterAssembler* assembler) {
|
| DoLdaContextSlot(assembler);
|
| }
|
|
|
| @@ -447,7 +445,7 @@ void Interpreter::DoLdaContextSlotWide(
|
| // StaContextSlot <context> <slot_index>
|
| //
|
| // Stores the object in the accumulator into |slot_index| of |context|.
|
| -void Interpreter::DoStaContextSlot(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) {
|
| Node* value = __ GetAccumulator();
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* context = __ LoadRegister(reg_index);
|
| @@ -460,18 +458,16 @@ void Interpreter::DoStaContextSlot(compiler::InterpreterAssembler* assembler) {
|
| // StaContextSlot <context> <slot_index>
|
| //
|
| // Stores the object in the accumulator into |slot_index| of |context|.
|
| -void Interpreter::DoStaContextSlotWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaContextSlotWide(InterpreterAssembler* assembler) {
|
| DoStaContextSlot(assembler);
|
| }
|
|
|
| -
|
| void Interpreter::DoLoadLookupSlot(Runtime::FunctionId function_id,
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* name = __ LoadConstantPoolEntry(index);
|
| Node* context = __ GetContext();
|
| - Node* result_pair = __ CallRuntime(function_id, context, name);
|
| + Node* result_pair = __ CallRuntime(function_id, context, context, name);
|
| Node* result = __ Projection(0, result_pair);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| @@ -482,7 +478,7 @@ void Interpreter::DoLoadLookupSlot(Runtime::FunctionId function_id,
|
| //
|
| // Lookup the object with the name in constant pool entry |name_index|
|
| // dynamically.
|
| -void Interpreter::DoLdaLookupSlot(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaLookupSlot(InterpreterAssembler* assembler) {
|
| DoLoadLookupSlot(Runtime::kLoadLookupSlot, assembler);
|
| }
|
|
|
| @@ -491,8 +487,7 @@ void Interpreter::DoLdaLookupSlot(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Lookup the object with the name in constant pool entry |name_index|
|
| // dynamically without causing a NoReferenceError.
|
| -void Interpreter::DoLdaLookupSlotInsideTypeof(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaLookupSlotInsideTypeof(InterpreterAssembler* assembler) {
|
| DoLoadLookupSlot(Runtime::kLoadLookupSlotNoReferenceError, assembler);
|
| }
|
|
|
| @@ -501,8 +496,7 @@ void Interpreter::DoLdaLookupSlotInsideTypeof(
|
| //
|
| // Lookup the object with the name in constant pool entry |name_index|
|
| // dynamically.
|
| -void Interpreter::DoLdaLookupSlotWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLdaLookupSlotWide(InterpreterAssembler* assembler) {
|
| DoLdaLookupSlot(assembler);
|
| }
|
|
|
| @@ -512,20 +506,19 @@ void Interpreter::DoLdaLookupSlotWide(
|
| // Lookup the object with the name in constant pool entry |name_index|
|
| // dynamically without causing a NoReferenceError.
|
| void Interpreter::DoLdaLookupSlotInsideTypeofWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| DoLdaLookupSlotInsideTypeof(assembler);
|
| }
|
|
|
| -
|
| void Interpreter::DoStoreLookupSlot(LanguageMode language_mode,
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Node* value = __ GetAccumulator();
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* name = __ LoadConstantPoolEntry(index);
|
| Node* context = __ GetContext();
|
| Node* language_mode_node = __ NumberConstant(language_mode);
|
| - Node* result = __ CallRuntime(Runtime::kStoreLookupSlot, value, context, name,
|
| - language_mode_node);
|
| + Node* result = __ CallRuntime(Runtime::kStoreLookupSlot, context, value,
|
| + context, name, language_mode_node);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -535,8 +528,7 @@ void Interpreter::DoStoreLookupSlot(LanguageMode language_mode,
|
| //
|
| // Store the object in accumulator to the object with the name in constant
|
| // pool entry |name_index| in sloppy mode.
|
| -void Interpreter::DoStaLookupSlotSloppy(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaLookupSlotSloppy(InterpreterAssembler* assembler) {
|
| DoStoreLookupSlot(LanguageMode::SLOPPY, assembler);
|
| }
|
|
|
| @@ -545,8 +537,7 @@ void Interpreter::DoStaLookupSlotSloppy(
|
| //
|
| // Store the object in accumulator to the object with the name in constant
|
| // pool entry |name_index| in strict mode.
|
| -void Interpreter::DoStaLookupSlotStrict(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaLookupSlotStrict(InterpreterAssembler* assembler) {
|
| DoStoreLookupSlot(LanguageMode::STRICT, assembler);
|
| }
|
|
|
| @@ -555,8 +546,7 @@ void Interpreter::DoStaLookupSlotStrict(
|
| //
|
| // Store the object in accumulator to the object with the name in constant
|
| // pool entry |name_index| in sloppy mode.
|
| -void Interpreter::DoStaLookupSlotSloppyWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaLookupSlotSloppyWide(InterpreterAssembler* assembler) {
|
| DoStaLookupSlotSloppy(assembler);
|
| }
|
|
|
| @@ -565,14 +555,11 @@ void Interpreter::DoStaLookupSlotSloppyWide(
|
| //
|
| // Store the object in accumulator to the object with the name in constant
|
| // pool entry |name_index| in strict mode.
|
| -void Interpreter::DoStaLookupSlotStrictWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStaLookupSlotStrictWide(InterpreterAssembler* assembler) {
|
| DoStaLookupSlotStrict(assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoLoadIC(Callable ic,
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLoadIC(Callable ic, InterpreterAssembler* assembler) {
|
| Node* code_target = __ HeapConstant(ic.code());
|
| Node* register_index = __ BytecodeOperandReg(0);
|
| Node* object = __ LoadRegister(register_index);
|
| @@ -581,8 +568,9 @@ void Interpreter::DoLoadIC(Callable ic,
|
| Node* raw_slot = __ BytecodeOperandIdx(2);
|
| Node* smi_slot = __ SmiTag(raw_slot);
|
| Node* type_feedback_vector = __ LoadTypeFeedbackVector();
|
| - Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot,
|
| - type_feedback_vector);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallStub(ic.descriptor(), code_target, context, object,
|
| + name, smi_slot, type_feedback_vector);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -592,7 +580,7 @@ void Interpreter::DoLoadIC(Callable ic,
|
| //
|
| // Calls the sloppy mode LoadIC at FeedBackVector slot <slot> for <object> and
|
| // the name at constant pool entry <name_index>.
|
| -void Interpreter::DoLoadICSloppy(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLoadICSloppy(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
|
| SLOPPY, UNINITIALIZED);
|
| DoLoadIC(ic, assembler);
|
| @@ -603,7 +591,7 @@ void Interpreter::DoLoadICSloppy(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Calls the sloppy mode LoadIC at FeedBackVector slot <slot> for <object> and
|
| // the name at constant pool entry <name_index>.
|
| -void Interpreter::DoLoadICStrict(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLoadICStrict(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
|
| STRICT, UNINITIALIZED);
|
| DoLoadIC(ic, assembler);
|
| @@ -614,8 +602,7 @@ void Interpreter::DoLoadICStrict(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Calls the sloppy mode LoadIC at FeedBackVector slot <slot> for <object> and
|
| // the name at constant pool entry <name_index>.
|
| -void Interpreter::DoLoadICSloppyWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLoadICSloppyWide(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
|
| SLOPPY, UNINITIALIZED);
|
| DoLoadIC(ic, assembler);
|
| @@ -626,16 +613,13 @@ void Interpreter::DoLoadICSloppyWide(
|
| //
|
| // Calls the sloppy mode LoadIC at FeedBackVector slot <slot> for <object> and
|
| // the name at constant pool entry <name_index>.
|
| -void Interpreter::DoLoadICStrictWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLoadICStrictWide(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF,
|
| STRICT, UNINITIALIZED);
|
| DoLoadIC(ic, assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoKeyedLoadIC(Callable ic,
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedLoadIC(Callable ic, InterpreterAssembler* assembler) {
|
| Node* code_target = __ HeapConstant(ic.code());
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* object = __ LoadRegister(reg_index);
|
| @@ -643,8 +627,9 @@ void Interpreter::DoKeyedLoadIC(Callable ic,
|
| Node* raw_slot = __ BytecodeOperandIdx(1);
|
| Node* smi_slot = __ SmiTag(raw_slot);
|
| Node* type_feedback_vector = __ LoadTypeFeedbackVector();
|
| - Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot,
|
| - type_feedback_vector);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallStub(ic.descriptor(), code_target, context, object,
|
| + name, smi_slot, type_feedback_vector);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -654,8 +639,7 @@ void Interpreter::DoKeyedLoadIC(Callable ic,
|
| //
|
| // Calls the sloppy mode KeyedLoadIC at FeedBackVector slot <slot> for <object>
|
| // and the key in the accumulator.
|
| -void Interpreter::DoKeyedLoadICSloppy(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedLoadICSloppy(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
|
| DoKeyedLoadIC(ic, assembler);
|
| @@ -666,8 +650,7 @@ void Interpreter::DoKeyedLoadICSloppy(
|
| //
|
| // Calls the strict mode KeyedLoadIC at FeedBackVector slot <slot> for <object>
|
| // and the key in the accumulator.
|
| -void Interpreter::DoKeyedLoadICStrict(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedLoadICStrict(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::KeyedLoadICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
|
| DoKeyedLoadIC(ic, assembler);
|
| @@ -678,8 +661,7 @@ void Interpreter::DoKeyedLoadICStrict(
|
| //
|
| // Calls the sloppy mode KeyedLoadIC at FeedBackVector slot <slot> for <object>
|
| // and the key in the accumulator.
|
| -void Interpreter::DoKeyedLoadICSloppyWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedLoadICSloppyWide(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
|
| DoKeyedLoadIC(ic, assembler);
|
| @@ -690,16 +672,13 @@ void Interpreter::DoKeyedLoadICSloppyWide(
|
| //
|
| // Calls the strict mode KeyedLoadIC at FeedBackVector slot <slot> for <object>
|
| // and the key in the accumulator.
|
| -void Interpreter::DoKeyedLoadICStrictWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedLoadICStrictWide(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::KeyedLoadICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
|
| DoKeyedLoadIC(ic, assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoStoreIC(Callable ic,
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStoreIC(Callable ic, InterpreterAssembler* assembler) {
|
| Node* code_target = __ HeapConstant(ic.code());
|
| Node* object_reg_index = __ BytecodeOperandReg(0);
|
| Node* object = __ LoadRegister(object_reg_index);
|
| @@ -709,8 +688,9 @@ void Interpreter::DoStoreIC(Callable ic,
|
| Node* raw_slot = __ BytecodeOperandIdx(2);
|
| Node* smi_slot = __ SmiTag(raw_slot);
|
| Node* type_feedback_vector = __ LoadTypeFeedbackVector();
|
| - __ CallIC(ic.descriptor(), code_target, object, name, value, smi_slot,
|
| - type_feedback_vector);
|
| + Node* context = __ GetContext();
|
| + __ CallStub(ic.descriptor(), code_target, context, object, name, value,
|
| + smi_slot, type_feedback_vector);
|
| __ Dispatch();
|
| }
|
|
|
| @@ -720,7 +700,7 @@ void Interpreter::DoStoreIC(Callable ic,
|
| // Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and
|
| // the name in constant pool entry <name_index> with the value in the
|
| // accumulator.
|
| -void Interpreter::DoStoreICSloppy(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStoreICSloppy(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
|
| DoStoreIC(ic, assembler);
|
| @@ -732,7 +712,7 @@ void Interpreter::DoStoreICSloppy(compiler::InterpreterAssembler* assembler) {
|
| // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and
|
| // the name in constant pool entry <name_index> with the value in the
|
| // accumulator.
|
| -void Interpreter::DoStoreICStrict(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStoreICStrict(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
|
| DoStoreIC(ic, assembler);
|
| @@ -744,8 +724,7 @@ void Interpreter::DoStoreICStrict(compiler::InterpreterAssembler* assembler) {
|
| // Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and
|
| // the name in constant pool entry <name_index> with the value in the
|
| // accumulator.
|
| -void Interpreter::DoStoreICSloppyWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStoreICSloppyWide(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
|
| DoStoreIC(ic, assembler);
|
| @@ -757,16 +736,13 @@ void Interpreter::DoStoreICSloppyWide(
|
| // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and
|
| // the name in constant pool entry <name_index> with the value in the
|
| // accumulator.
|
| -void Interpreter::DoStoreICStrictWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStoreICStrictWide(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
|
| DoStoreIC(ic, assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoKeyedStoreIC(Callable ic,
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedStoreIC(Callable ic, InterpreterAssembler* assembler) {
|
| Node* code_target = __ HeapConstant(ic.code());
|
| Node* object_reg_index = __ BytecodeOperandReg(0);
|
| Node* object = __ LoadRegister(object_reg_index);
|
| @@ -776,8 +752,9 @@ void Interpreter::DoKeyedStoreIC(Callable ic,
|
| Node* raw_slot = __ BytecodeOperandIdx(2);
|
| Node* smi_slot = __ SmiTag(raw_slot);
|
| Node* type_feedback_vector = __ LoadTypeFeedbackVector();
|
| - __ CallIC(ic.descriptor(), code_target, object, name, value, smi_slot,
|
| - type_feedback_vector);
|
| + Node* context = __ GetContext();
|
| + __ CallStub(ic.descriptor(), code_target, context, object, name, value,
|
| + smi_slot, type_feedback_vector);
|
| __ Dispatch();
|
| }
|
|
|
| @@ -786,8 +763,7 @@ void Interpreter::DoKeyedStoreIC(Callable ic,
|
| //
|
| // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object>
|
| // and the key <key> with the value in the accumulator.
|
| -void Interpreter::DoKeyedStoreICSloppy(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedStoreICSloppy(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
|
| DoKeyedStoreIC(ic, assembler);
|
| @@ -798,8 +774,7 @@ void Interpreter::DoKeyedStoreICSloppy(
|
| //
|
| // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object>
|
| // and the key <key> with the value in the accumulator.
|
| -void Interpreter::DoKeyedStoreICStrict(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedStoreICStrict(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
|
| DoKeyedStoreIC(ic, assembler);
|
| @@ -810,8 +785,7 @@ void Interpreter::DoKeyedStoreICStrict(
|
| //
|
| // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object>
|
| // and the key <key> with the value in the accumulator.
|
| -void Interpreter::DoKeyedStoreICSloppyWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedStoreICSloppyWide(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED);
|
| DoKeyedStoreIC(ic, assembler);
|
| @@ -822,8 +796,7 @@ void Interpreter::DoKeyedStoreICSloppyWide(
|
| //
|
| // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object>
|
| // and the key <key> with the value in the accumulator.
|
| -void Interpreter::DoKeyedStoreICStrictWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoKeyedStoreICStrictWide(InterpreterAssembler* assembler) {
|
| Callable ic =
|
| CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED);
|
| DoKeyedStoreIC(ic, assembler);
|
| @@ -833,7 +806,7 @@ void Interpreter::DoKeyedStoreICStrictWide(
|
| //
|
| // Saves the current context in <context>, and pushes the accumulator as the
|
| // new current context.
|
| -void Interpreter::DoPushContext(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoPushContext(InterpreterAssembler* assembler) {
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* new_context = __ GetAccumulator();
|
| Node* old_context = __ GetContext();
|
| @@ -846,22 +819,22 @@ void Interpreter::DoPushContext(compiler::InterpreterAssembler* assembler) {
|
| // PopContext <context>
|
| //
|
| // Pops the current context and sets <context> as the new context.
|
| -void Interpreter::DoPopContext(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoPopContext(InterpreterAssembler* assembler) {
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* context = __ LoadRegister(reg_index);
|
| __ SetContext(context);
|
| __ Dispatch();
|
| }
|
|
|
| -
|
| void Interpreter::DoBinaryOp(Runtime::FunctionId function_id,
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| // TODO(rmcilroy): Call ICs which back-patch bytecode with type specialized
|
| // operations, instead of calling builtins directly.
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* lhs = __ LoadRegister(reg_index);
|
| Node* rhs = __ GetAccumulator();
|
| - Node* result = __ CallRuntime(function_id, lhs, rhs);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(function_id, context, lhs, rhs);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -870,7 +843,7 @@ void Interpreter::DoBinaryOp(Runtime::FunctionId function_id,
|
| // Add <src>
|
| //
|
| // Add register <src> to accumulator.
|
| -void Interpreter::DoAdd(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoAdd(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kAdd, assembler);
|
| }
|
|
|
| @@ -878,7 +851,7 @@ void Interpreter::DoAdd(compiler::InterpreterAssembler* assembler) {
|
| // Sub <src>
|
| //
|
| // Subtract register <src> from accumulator.
|
| -void Interpreter::DoSub(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoSub(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kSubtract, assembler);
|
| }
|
|
|
| @@ -886,7 +859,7 @@ void Interpreter::DoSub(compiler::InterpreterAssembler* assembler) {
|
| // Mul <src>
|
| //
|
| // Multiply accumulator by register <src>.
|
| -void Interpreter::DoMul(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoMul(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kMultiply, assembler);
|
| }
|
|
|
| @@ -894,7 +867,7 @@ void Interpreter::DoMul(compiler::InterpreterAssembler* assembler) {
|
| // Div <src>
|
| //
|
| // Divide register <src> by accumulator.
|
| -void Interpreter::DoDiv(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoDiv(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kDivide, assembler);
|
| }
|
|
|
| @@ -902,7 +875,7 @@ void Interpreter::DoDiv(compiler::InterpreterAssembler* assembler) {
|
| // Mod <src>
|
| //
|
| // Modulo register <src> by accumulator.
|
| -void Interpreter::DoMod(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoMod(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kModulus, assembler);
|
| }
|
|
|
| @@ -910,7 +883,7 @@ void Interpreter::DoMod(compiler::InterpreterAssembler* assembler) {
|
| // BitwiseOr <src>
|
| //
|
| // BitwiseOr register <src> to accumulator.
|
| -void Interpreter::DoBitwiseOr(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoBitwiseOr(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kBitwiseOr, assembler);
|
| }
|
|
|
| @@ -918,7 +891,7 @@ void Interpreter::DoBitwiseOr(compiler::InterpreterAssembler* assembler) {
|
| // BitwiseXor <src>
|
| //
|
| // BitwiseXor register <src> to accumulator.
|
| -void Interpreter::DoBitwiseXor(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoBitwiseXor(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kBitwiseXor, assembler);
|
| }
|
|
|
| @@ -926,7 +899,7 @@ void Interpreter::DoBitwiseXor(compiler::InterpreterAssembler* assembler) {
|
| // BitwiseAnd <src>
|
| //
|
| // BitwiseAnd register <src> to accumulator.
|
| -void Interpreter::DoBitwiseAnd(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoBitwiseAnd(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kBitwiseAnd, assembler);
|
| }
|
|
|
| @@ -937,7 +910,7 @@ void Interpreter::DoBitwiseAnd(compiler::InterpreterAssembler* assembler) {
|
| // Register <src> is converted to an int32 and the accumulator to uint32
|
| // before the operation. 5 lsb bits from the accumulator are used as count
|
| // i.e. <src> << (accumulator & 0x1F).
|
| -void Interpreter::DoShiftLeft(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoShiftLeft(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kShiftLeft, assembler);
|
| }
|
|
|
| @@ -948,7 +921,7 @@ void Interpreter::DoShiftLeft(compiler::InterpreterAssembler* assembler) {
|
| // Result is sign extended. Register <src> is converted to an int32 and the
|
| // accumulator to uint32 before the operation. 5 lsb bits from the accumulator
|
| // are used as count i.e. <src> >> (accumulator & 0x1F).
|
| -void Interpreter::DoShiftRight(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoShiftRight(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kShiftRight, assembler);
|
| }
|
|
|
| @@ -959,17 +932,16 @@ void Interpreter::DoShiftRight(compiler::InterpreterAssembler* assembler) {
|
| // Result is zero-filled. The accumulator and register <src> are converted to
|
| // uint32 before the operation 5 lsb bits from the accumulator are used as
|
| // count i.e. <src> << (accumulator & 0x1F).
|
| -void Interpreter::DoShiftRightLogical(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kShiftRightLogical, assembler);
|
| }
|
|
|
| -
|
| void Interpreter::DoCountOp(Runtime::FunctionId function_id,
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Node* value = __ GetAccumulator();
|
| Node* one = __ NumberConstant(1);
|
| - Node* result = __ CallRuntime(function_id, value, one);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(function_id, context, value, one);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -978,7 +950,7 @@ void Interpreter::DoCountOp(Runtime::FunctionId function_id,
|
| // Inc
|
| //
|
| // Increments value in the accumulator by one.
|
| -void Interpreter::DoInc(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoInc(InterpreterAssembler* assembler) {
|
| DoCountOp(Runtime::kAdd, assembler);
|
| }
|
|
|
| @@ -986,7 +958,7 @@ void Interpreter::DoInc(compiler::InterpreterAssembler* assembler) {
|
| // Dec
|
| //
|
| // Decrements value in the accumulator by one.
|
| -void Interpreter::DoDec(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoDec(InterpreterAssembler* assembler) {
|
| DoCountOp(Runtime::kSubtract, assembler);
|
| }
|
|
|
| @@ -995,9 +967,11 @@ void Interpreter::DoDec(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Perform logical-not on the accumulator, first casting the
|
| // accumulator to a boolean value if required.
|
| -void Interpreter::DoLogicalNot(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoLogicalNot(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| - Node* result = __ CallRuntime(Runtime::kInterpreterLogicalNot, accumulator);
|
| + Node* context = __ GetContext();
|
| + Node* result =
|
| + __ CallRuntime(Runtime::kInterpreterLogicalNot, context, accumulator);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1007,20 +981,22 @@ void Interpreter::DoLogicalNot(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Load the accumulator with the string representating type of the
|
| // object in the accumulator.
|
| -void Interpreter::DoTypeOf(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTypeOf(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| - Node* result = __ CallRuntime(Runtime::kInterpreterTypeOf, accumulator);
|
| + Node* context = __ GetContext();
|
| + Node* result =
|
| + __ CallRuntime(Runtime::kInterpreterTypeOf, context, accumulator);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
|
|
| -
|
| void Interpreter::DoDelete(Runtime::FunctionId function_id,
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Node* reg_index = __ BytecodeOperandReg(0);
|
| Node* object = __ LoadRegister(reg_index);
|
| Node* key = __ GetAccumulator();
|
| - Node* result = __ CallRuntime(function_id, object, key);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(function_id, context, object, key);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1030,8 +1006,7 @@ void Interpreter::DoDelete(Runtime::FunctionId function_id,
|
| //
|
| // Delete the property specified in the accumulator from the object
|
| // referenced by the register operand following strict mode semantics.
|
| -void Interpreter::DoDeletePropertyStrict(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoDeletePropertyStrict(InterpreterAssembler* assembler) {
|
| DoDelete(Runtime::kDeleteProperty_Strict, assembler);
|
| }
|
|
|
| @@ -1040,8 +1015,7 @@ void Interpreter::DoDeletePropertyStrict(
|
| //
|
| // Delete the property specified in the accumulator from the object
|
| // referenced by the register operand following sloppy mode semantics.
|
| -void Interpreter::DoDeletePropertySloppy(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoDeletePropertySloppy(InterpreterAssembler* assembler) {
|
| DoDelete(Runtime::kDeleteProperty_Sloppy, assembler);
|
| }
|
|
|
| @@ -1050,17 +1024,16 @@ void Interpreter::DoDeletePropertySloppy(
|
| //
|
| // Delete the variable with the name specified in the accumulator by dynamically
|
| // looking it up.
|
| -void Interpreter::DoDeleteLookupSlot(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoDeleteLookupSlot(InterpreterAssembler* assembler) {
|
| Node* name = __ GetAccumulator();
|
| Node* context = __ GetContext();
|
| - Node* result = __ CallRuntime(Runtime::kDeleteLookupSlot, context, name);
|
| + Node* result =
|
| + __ CallRuntime(Runtime::kDeleteLookupSlot, context, context, name);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
|
|
| -
|
| -void Interpreter::DoJSCall(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJSCall(InterpreterAssembler* assembler) {
|
| Node* function_reg = __ BytecodeOperandReg(0);
|
| Node* function = __ LoadRegister(function_reg);
|
| Node* receiver_reg = __ BytecodeOperandReg(1);
|
| @@ -1068,8 +1041,9 @@ void Interpreter::DoJSCall(compiler::InterpreterAssembler* assembler) {
|
| Node* receiver_args_count = __ BytecodeOperandCount(2);
|
| Node* receiver_count = __ Int32Constant(1);
|
| Node* args_count = __ Int32Sub(receiver_args_count, receiver_count);
|
| - // TODO(rmcilroy): Use the call type feedback slot to call via CallIC.
|
| - Node* result = __ CallJS(function, receiver_arg, args_count);
|
| + Node* context = __ GetContext();
|
| + // TODO(rmcilroy): Use the call type feedback slot to call via CallStub.
|
| + Node* result = __ CallJS(function, context, receiver_arg, args_count);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1079,7 +1053,7 @@ void Interpreter::DoJSCall(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Call a JSfunction or Callable in |callable| with the |receiver| and
|
| // |arg_count| arguments in subsequent registers.
|
| -void Interpreter::DoCall(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCall(InterpreterAssembler* assembler) {
|
| DoJSCall(assembler);
|
| }
|
|
|
| @@ -1088,18 +1062,17 @@ void Interpreter::DoCall(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Call a JSfunction or Callable in |callable| with the |receiver| and
|
| // |arg_count| arguments in subsequent registers.
|
| -void Interpreter::DoCallWide(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallWide(InterpreterAssembler* assembler) {
|
| DoJSCall(assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoCallRuntimeCommon(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallRuntimeCommon(InterpreterAssembler* assembler) {
|
| Node* function_id = __ BytecodeOperandIdx(0);
|
| Node* first_arg_reg = __ BytecodeOperandReg(1);
|
| Node* first_arg = __ RegisterLocation(first_arg_reg);
|
| Node* args_count = __ BytecodeOperandCount(2);
|
| - Node* result = __ CallRuntime(function_id, first_arg, args_count);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntimeN(function_id, context, first_arg, args_count);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1110,7 +1083,7 @@ void Interpreter::DoCallRuntimeCommon(
|
| // Call the runtime function |function_id| with the first argument in
|
| // register |first_arg| and |arg_count| arguments in subsequent
|
| // registers.
|
| -void Interpreter::DoCallRuntime(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallRuntime(InterpreterAssembler* assembler) {
|
| DoCallRuntimeCommon(assembler);
|
| }
|
|
|
| @@ -1120,19 +1093,19 @@ void Interpreter::DoCallRuntime(compiler::InterpreterAssembler* assembler) {
|
| // Call the runtime function |function_id| with the first argument in
|
| // register |first_arg| and |arg_count| arguments in subsequent
|
| // registers.
|
| -void Interpreter::DoCallRuntimeWide(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallRuntimeWide(InterpreterAssembler* assembler) {
|
| DoCallRuntimeCommon(assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoCallRuntimeForPairCommon(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallRuntimeForPairCommon(InterpreterAssembler* assembler) {
|
| // Call the runtime function.
|
| Node* function_id = __ BytecodeOperandIdx(0);
|
| Node* first_arg_reg = __ BytecodeOperandReg(1);
|
| Node* first_arg = __ RegisterLocation(first_arg_reg);
|
| Node* args_count = __ BytecodeOperandCount(2);
|
| - Node* result_pair = __ CallRuntime(function_id, first_arg, args_count, 2);
|
| + Node* context = __ GetContext();
|
| + Node* result_pair =
|
| + __ CallRuntimeN(function_id, context, first_arg, args_count, 2);
|
|
|
| // Store the results in <first_return> and <first_return + 1>
|
| Node* first_return_reg = __ BytecodeOperandReg(3);
|
| @@ -1151,8 +1124,7 @@ void Interpreter::DoCallRuntimeForPairCommon(
|
| // first argument in register |first_arg| and |arg_count| arguments in
|
| // subsequent registers. Returns the result in <first_return> and
|
| // <first_return + 1>
|
| -void Interpreter::DoCallRuntimeForPair(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallRuntimeForPair(InterpreterAssembler* assembler) {
|
| DoCallRuntimeForPairCommon(assembler);
|
| }
|
|
|
| @@ -1163,14 +1135,11 @@ void Interpreter::DoCallRuntimeForPair(
|
| // first argument in register |first_arg| and |arg_count| arguments in
|
| // subsequent registers. Returns the result in <first_return> and
|
| // <first_return + 1>
|
| -void Interpreter::DoCallRuntimeForPairWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallRuntimeForPairWide(InterpreterAssembler* assembler) {
|
| DoCallRuntimeForPairCommon(assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoCallJSRuntimeCommon(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallJSRuntimeCommon(InterpreterAssembler* assembler) {
|
| Node* context_index = __ BytecodeOperandIdx(0);
|
| Node* receiver_reg = __ BytecodeOperandReg(1);
|
| Node* first_arg = __ RegisterLocation(receiver_reg);
|
| @@ -1185,7 +1154,7 @@ void Interpreter::DoCallJSRuntimeCommon(
|
| Node* function = __ LoadContextSlot(native_context, context_index);
|
|
|
| // Call the function.
|
| - Node* result = __ CallJS(function, first_arg, args_count);
|
| + Node* result = __ CallJS(function, context, first_arg, args_count);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1195,7 +1164,7 @@ void Interpreter::DoCallJSRuntimeCommon(
|
| //
|
| // Call the JS runtime function that has the |context_index| with the receiver
|
| // in register |receiver| and |arg_count| arguments in subsequent registers.
|
| -void Interpreter::DoCallJSRuntime(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallJSRuntime(InterpreterAssembler* assembler) {
|
| DoCallJSRuntimeCommon(assembler);
|
| }
|
|
|
| @@ -1204,21 +1173,20 @@ void Interpreter::DoCallJSRuntime(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Call the JS runtime function that has the |context_index| with the receiver
|
| // in register |receiver| and |arg_count| arguments in subsequent registers.
|
| -void Interpreter::DoCallJSRuntimeWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallJSRuntimeWide(InterpreterAssembler* assembler) {
|
| DoCallJSRuntimeCommon(assembler);
|
| }
|
|
|
| -
|
| -void Interpreter::DoCallConstruct(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCallConstruct(InterpreterAssembler* assembler) {
|
| Callable ic = CodeFactory::InterpreterPushArgsAndConstruct(isolate_);
|
| Node* constructor_reg = __ BytecodeOperandReg(0);
|
| Node* constructor = __ LoadRegister(constructor_reg);
|
| Node* first_arg_reg = __ BytecodeOperandReg(1);
|
| Node* first_arg = __ RegisterLocation(first_arg_reg);
|
| Node* args_count = __ BytecodeOperandCount(2);
|
| - Node* result =
|
| - __ CallConstruct(constructor, constructor, first_arg, args_count);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallConstruct(constructor, context, constructor, first_arg,
|
| + args_count);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1229,7 +1197,7 @@ void Interpreter::DoCallConstruct(compiler::InterpreterAssembler* assembler) {
|
| // Call operator new with |constructor| and the first argument in
|
| // register |first_arg| and |arg_count| arguments in subsequent
|
| //
|
| -void Interpreter::DoNew(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoNew(InterpreterAssembler* assembler) {
|
| DoCallConstruct(assembler);
|
| }
|
|
|
| @@ -1239,7 +1207,7 @@ void Interpreter::DoNew(compiler::InterpreterAssembler* assembler) {
|
| // Call operator new with |constructor| and the first argument in
|
| // register |first_arg| and |arg_count| arguments in subsequent
|
| //
|
| -void Interpreter::DoNewWide(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoNewWide(InterpreterAssembler* assembler) {
|
| DoCallConstruct(assembler);
|
| }
|
|
|
| @@ -1247,7 +1215,7 @@ void Interpreter::DoNewWide(compiler::InterpreterAssembler* assembler) {
|
| // TestEqual <src>
|
| //
|
| // Test if the value in the <src> register equals the accumulator.
|
| -void Interpreter::DoTestEqual(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestEqual(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInterpreterEquals, assembler);
|
| }
|
|
|
| @@ -1255,7 +1223,7 @@ void Interpreter::DoTestEqual(compiler::InterpreterAssembler* assembler) {
|
| // TestNotEqual <src>
|
| //
|
| // Test if the value in the <src> register is not equal to the accumulator.
|
| -void Interpreter::DoTestNotEqual(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestNotEqual(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInterpreterNotEquals, assembler);
|
| }
|
|
|
| @@ -1263,7 +1231,7 @@ void Interpreter::DoTestNotEqual(compiler::InterpreterAssembler* assembler) {
|
| // TestEqualStrict <src>
|
| //
|
| // Test if the value in the <src> register is strictly equal to the accumulator.
|
| -void Interpreter::DoTestEqualStrict(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestEqualStrict(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInterpreterStrictEquals, assembler);
|
| }
|
|
|
| @@ -1272,8 +1240,7 @@ void Interpreter::DoTestEqualStrict(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Test if the value in the <src> register is not strictly equal to the
|
| // accumulator.
|
| -void Interpreter::DoTestNotEqualStrict(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestNotEqualStrict(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInterpreterStrictNotEquals, assembler);
|
| }
|
|
|
| @@ -1281,7 +1248,7 @@ void Interpreter::DoTestNotEqualStrict(
|
| // TestLessThan <src>
|
| //
|
| // Test if the value in the <src> register is less than the accumulator.
|
| -void Interpreter::DoTestLessThan(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestLessThan(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInterpreterLessThan, assembler);
|
| }
|
|
|
| @@ -1289,7 +1256,7 @@ void Interpreter::DoTestLessThan(compiler::InterpreterAssembler* assembler) {
|
| // TestGreaterThan <src>
|
| //
|
| // Test if the value in the <src> register is greater than the accumulator.
|
| -void Interpreter::DoTestGreaterThan(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestGreaterThan(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInterpreterGreaterThan, assembler);
|
| }
|
|
|
| @@ -1298,8 +1265,7 @@ void Interpreter::DoTestGreaterThan(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Test if the value in the <src> register is less than or equal to the
|
| // accumulator.
|
| -void Interpreter::DoTestLessThanOrEqual(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestLessThanOrEqual(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInterpreterLessThanOrEqual, assembler);
|
| }
|
|
|
| @@ -1308,8 +1274,7 @@ void Interpreter::DoTestLessThanOrEqual(
|
| //
|
| // Test if the value in the <src> register is greater than or equal to the
|
| // accumulator.
|
| -void Interpreter::DoTestGreaterThanOrEqual(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestGreaterThanOrEqual(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInterpreterGreaterThanOrEqual, assembler);
|
| }
|
|
|
| @@ -1318,7 +1283,7 @@ void Interpreter::DoTestGreaterThanOrEqual(
|
| //
|
| // Test if the object referenced by the register operand is a property of the
|
| // object referenced by the accumulator.
|
| -void Interpreter::DoTestIn(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestIn(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kHasProperty, assembler);
|
| }
|
|
|
| @@ -1327,7 +1292,7 @@ void Interpreter::DoTestIn(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Test if the object referenced by the <src> register is an an instance of type
|
| // referenced by the accumulator.
|
| -void Interpreter::DoTestInstanceOf(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoTestInstanceOf(InterpreterAssembler* assembler) {
|
| DoBinaryOp(Runtime::kInstanceOf, assembler);
|
| }
|
|
|
| @@ -1335,9 +1300,10 @@ void Interpreter::DoTestInstanceOf(compiler::InterpreterAssembler* assembler) {
|
| // ToName
|
| //
|
| // Cast the object referenced by the accumulator to a name.
|
| -void Interpreter::DoToName(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoToName(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| - Node* result = __ CallRuntime(Runtime::kToName, accumulator);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(Runtime::kToName, context, accumulator);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1346,9 +1312,10 @@ void Interpreter::DoToName(compiler::InterpreterAssembler* assembler) {
|
| // ToNumber
|
| //
|
| // Cast the object referenced by the accumulator to a number.
|
| -void Interpreter::DoToNumber(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoToNumber(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| - Node* result = __ CallRuntime(Runtime::kToNumber, accumulator);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(Runtime::kToNumber, context, accumulator);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1357,9 +1324,10 @@ void Interpreter::DoToNumber(compiler::InterpreterAssembler* assembler) {
|
| // ToObject
|
| //
|
| // Cast the object referenced by the accumulator to a JSObject.
|
| -void Interpreter::DoToObject(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoToObject(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| - Node* result = __ CallRuntime(Runtime::kToObject, accumulator);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(Runtime::kToObject, context, accumulator);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1368,7 +1336,7 @@ void Interpreter::DoToObject(compiler::InterpreterAssembler* assembler) {
|
| // Jump <imm8>
|
| //
|
| // Jump by number of bytes represented by the immediate operand |imm8|.
|
| -void Interpreter::DoJump(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJump(InterpreterAssembler* assembler) {
|
| Node* relative_jump = __ BytecodeOperandImm(0);
|
| __ Jump(relative_jump);
|
| }
|
| @@ -1377,7 +1345,7 @@ void Interpreter::DoJump(compiler::InterpreterAssembler* assembler) {
|
| // JumpConstant <idx8>
|
| //
|
| // Jump by number of bytes in the Smi in the |idx8| entry in the constant pool.
|
| -void Interpreter::DoJumpConstant(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpConstant(InterpreterAssembler* assembler) {
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* constant = __ LoadConstantPoolEntry(index);
|
| Node* relative_jump = __ SmiUntag(constant);
|
| @@ -1389,8 +1357,7 @@ void Interpreter::DoJumpConstant(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Jump by number of bytes in the Smi in the |idx16| entry in the
|
| // constant pool.
|
| -void Interpreter::DoJumpConstantWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpConstantWide(InterpreterAssembler* assembler) {
|
| DoJumpConstant(assembler);
|
| }
|
|
|
| @@ -1399,7 +1366,7 @@ void Interpreter::DoJumpConstantWide(
|
| //
|
| // Jump by number of bytes represented by an immediate operand if the
|
| // accumulator contains true.
|
| -void Interpreter::DoJumpIfTrue(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfTrue(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* relative_jump = __ BytecodeOperandImm(0);
|
| Node* true_value = __ BooleanConstant(true);
|
| @@ -1411,8 +1378,7 @@ void Interpreter::DoJumpIfTrue(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Jump by number of bytes in the Smi in the |idx8| entry in the constant pool
|
| // if the accumulator contains true.
|
| -void Interpreter::DoJumpIfTrueConstant(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfTrueConstant(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* constant = __ LoadConstantPoolEntry(index);
|
| @@ -1426,8 +1392,7 @@ void Interpreter::DoJumpIfTrueConstant(
|
| //
|
| // Jump by number of bytes in the Smi in the |idx16| entry in the constant pool
|
| // if the accumulator contains true.
|
| -void Interpreter::DoJumpIfTrueConstantWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfTrueConstantWide(InterpreterAssembler* assembler) {
|
| DoJumpIfTrueConstant(assembler);
|
| }
|
|
|
| @@ -1436,7 +1401,7 @@ void Interpreter::DoJumpIfTrueConstantWide(
|
| //
|
| // Jump by number of bytes represented by an immediate operand if the
|
| // accumulator contains false.
|
| -void Interpreter::DoJumpIfFalse(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfFalse(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* relative_jump = __ BytecodeOperandImm(0);
|
| Node* false_value = __ BooleanConstant(false);
|
| @@ -1448,8 +1413,7 @@ void Interpreter::DoJumpIfFalse(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Jump by number of bytes in the Smi in the |idx8| entry in the constant pool
|
| // if the accumulator contains false.
|
| -void Interpreter::DoJumpIfFalseConstant(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfFalseConstant(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* constant = __ LoadConstantPoolEntry(index);
|
| @@ -1463,8 +1427,7 @@ void Interpreter::DoJumpIfFalseConstant(
|
| //
|
| // Jump by number of bytes in the Smi in the |idx16| entry in the constant pool
|
| // if the accumulator contains false.
|
| -void Interpreter::DoJumpIfFalseConstantWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfFalseConstantWide(InterpreterAssembler* assembler) {
|
| DoJumpIfFalseConstant(assembler);
|
| }
|
|
|
| @@ -1473,11 +1436,11 @@ void Interpreter::DoJumpIfFalseConstantWide(
|
| //
|
| // Jump by number of bytes represented by an immediate operand if the object
|
| // referenced by the accumulator is true when the object is cast to boolean.
|
| -void Interpreter::DoJumpIfToBooleanTrue(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfToBooleanTrue(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| + Node* context = __ GetContext();
|
| Node* to_boolean_value =
|
| - __ CallRuntime(Runtime::kInterpreterToBoolean, accumulator);
|
| + __ CallRuntime(Runtime::kInterpreterToBoolean, context, accumulator);
|
| Node* relative_jump = __ BytecodeOperandImm(0);
|
| Node* true_value = __ BooleanConstant(true);
|
| __ JumpIfWordEqual(to_boolean_value, true_value, relative_jump);
|
| @@ -1490,10 +1453,11 @@ void Interpreter::DoJumpIfToBooleanTrue(
|
| // if the object referenced by the accumulator is true when the object is cast
|
| // to boolean.
|
| void Interpreter::DoJumpIfToBooleanTrueConstant(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| + Node* context = __ GetContext();
|
| Node* to_boolean_value =
|
| - __ CallRuntime(Runtime::kInterpreterToBoolean, accumulator);
|
| + __ CallRuntime(Runtime::kInterpreterToBoolean, context, accumulator);
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* constant = __ LoadConstantPoolEntry(index);
|
| Node* relative_jump = __ SmiUntag(constant);
|
| @@ -1508,7 +1472,7 @@ void Interpreter::DoJumpIfToBooleanTrueConstant(
|
| // if the object referenced by the accumulator is true when the object is cast
|
| // to boolean.
|
| void Interpreter::DoJumpIfToBooleanTrueConstantWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| DoJumpIfToBooleanTrueConstant(assembler);
|
| }
|
|
|
| @@ -1517,11 +1481,11 @@ void Interpreter::DoJumpIfToBooleanTrueConstantWide(
|
| //
|
| // Jump by number of bytes represented by an immediate operand if the object
|
| // referenced by the accumulator is false when the object is cast to boolean.
|
| -void Interpreter::DoJumpIfToBooleanFalse(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfToBooleanFalse(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| + Node* context = __ GetContext();
|
| Node* to_boolean_value =
|
| - __ CallRuntime(Runtime::kInterpreterToBoolean, accumulator);
|
| + __ CallRuntime(Runtime::kInterpreterToBoolean, context, accumulator);
|
| Node* relative_jump = __ BytecodeOperandImm(0);
|
| Node* false_value = __ BooleanConstant(false);
|
| __ JumpIfWordEqual(to_boolean_value, false_value, relative_jump);
|
| @@ -1534,10 +1498,11 @@ void Interpreter::DoJumpIfToBooleanFalse(
|
| // if the object referenced by the accumulator is false when the object is cast
|
| // to boolean.
|
| void Interpreter::DoJumpIfToBooleanFalseConstant(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| + Node* context = __ GetContext();
|
| Node* to_boolean_value =
|
| - __ CallRuntime(Runtime::kInterpreterToBoolean, accumulator);
|
| + __ CallRuntime(Runtime::kInterpreterToBoolean, context, accumulator);
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* constant = __ LoadConstantPoolEntry(index);
|
| Node* relative_jump = __ SmiUntag(constant);
|
| @@ -1552,7 +1517,7 @@ void Interpreter::DoJumpIfToBooleanFalseConstant(
|
| // if the object referenced by the accumulator is false when the object is cast
|
| // to boolean.
|
| void Interpreter::DoJumpIfToBooleanFalseConstantWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| DoJumpIfToBooleanFalseConstant(assembler);
|
| }
|
|
|
| @@ -1561,7 +1526,7 @@ void Interpreter::DoJumpIfToBooleanFalseConstantWide(
|
| //
|
| // Jump by number of bytes represented by an immediate operand if the object
|
| // referenced by the accumulator is the null constant.
|
| -void Interpreter::DoJumpIfNull(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfNull(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* null_value = __ HeapConstant(isolate_->factory()->null_value());
|
| Node* relative_jump = __ BytecodeOperandImm(0);
|
| @@ -1573,8 +1538,7 @@ void Interpreter::DoJumpIfNull(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Jump by number of bytes in the Smi in the |idx8| entry in the constant pool
|
| // if the object referenced by the accumulator is the null constant.
|
| -void Interpreter::DoJumpIfNullConstant(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfNullConstant(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* null_value = __ HeapConstant(isolate_->factory()->null_value());
|
| Node* index = __ BytecodeOperandIdx(0);
|
| @@ -1588,8 +1552,7 @@ void Interpreter::DoJumpIfNullConstant(
|
| //
|
| // Jump by number of bytes in the Smi in the |idx16| entry in the constant pool
|
| // if the object referenced by the accumulator is the null constant.
|
| -void Interpreter::DoJumpIfNullConstantWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfNullConstantWide(InterpreterAssembler* assembler) {
|
| DoJumpIfNullConstant(assembler);
|
| }
|
|
|
| @@ -1597,7 +1560,7 @@ void Interpreter::DoJumpIfNullConstantWide(
|
| //
|
| // Jump by number of bytes represented by an immediate operand if the object
|
| // referenced by the accumulator is the undefined constant.
|
| -void Interpreter::DoJumpIfUndefined(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfUndefined(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* undefined_value =
|
| __ HeapConstant(isolate_->factory()->undefined_value());
|
| @@ -1610,8 +1573,7 @@ void Interpreter::DoJumpIfUndefined(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Jump by number of bytes in the Smi in the |idx8| entry in the constant pool
|
| // if the object referenced by the accumulator is the undefined constant.
|
| -void Interpreter::DoJumpIfUndefinedConstant(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfUndefinedConstant(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* undefined_value =
|
| __ HeapConstant(isolate_->factory()->undefined_value());
|
| @@ -1627,7 +1589,7 @@ void Interpreter::DoJumpIfUndefinedConstant(
|
| // Jump by number of bytes in the Smi in the |idx16| entry in the constant pool
|
| // if the object referenced by the accumulator is the undefined constant.
|
| void Interpreter::DoJumpIfUndefinedConstantWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| DoJumpIfUndefinedConstant(assembler);
|
| }
|
|
|
| @@ -1635,7 +1597,7 @@ void Interpreter::DoJumpIfUndefinedConstantWide(
|
| //
|
| // Jump by number of bytes represented by an immediate operand if the object
|
| // referenced by the accumulator is the hole.
|
| -void Interpreter::DoJumpIfHole(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfHole(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value());
|
| Node* relative_jump = __ BytecodeOperandImm(0);
|
| @@ -1646,7 +1608,7 @@ void Interpreter::DoJumpIfHole(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Jump by number of bytes represented by an immediate operand if the object
|
| // referenced by the accumulator is not the hole.
|
| -void Interpreter::DoJumpIfNotHole(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoJumpIfNotHole(InterpreterAssembler* assembler) {
|
| Node* accumulator = __ GetAccumulator();
|
| Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value());
|
| Node* relative_jump = __ BytecodeOperandImm(0);
|
| @@ -1654,7 +1616,7 @@ void Interpreter::DoJumpIfNotHole(compiler::InterpreterAssembler* assembler) {
|
| }
|
|
|
| void Interpreter::DoCreateLiteral(Runtime::FunctionId function_id,
|
| - compiler::InterpreterAssembler* assembler) {
|
| + InterpreterAssembler* assembler) {
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* constant_elements = __ LoadConstantPoolEntry(index);
|
| Node* literal_index_raw = __ BytecodeOperandIdx(1);
|
| @@ -1662,7 +1624,8 @@ void Interpreter::DoCreateLiteral(Runtime::FunctionId function_id,
|
| Node* flags_raw = __ BytecodeOperandImm(2);
|
| Node* flags = __ SmiTag(flags_raw);
|
| Node* closure = __ LoadRegister(Register::function_closure());
|
| - Node* result = __ CallRuntime(function_id, closure, literal_index,
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(function_id, context, closure, literal_index,
|
| constant_elements, flags);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| @@ -1673,8 +1636,7 @@ void Interpreter::DoCreateLiteral(Runtime::FunctionId function_id,
|
| //
|
| // Creates a regular expression literal for literal index <literal_idx> with
|
| // <flags> and the pattern in <pattern_idx>.
|
| -void Interpreter::DoCreateRegExpLiteral(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) {
|
| DoCreateLiteral(Runtime::kCreateRegExpLiteral, assembler);
|
| }
|
|
|
| @@ -1683,8 +1645,7 @@ void Interpreter::DoCreateRegExpLiteral(
|
| //
|
| // Creates a regular expression literal for literal index <literal_idx> with
|
| // <flags> and the pattern in <pattern_idx>.
|
| -void Interpreter::DoCreateRegExpLiteralWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateRegExpLiteralWide(InterpreterAssembler* assembler) {
|
| DoCreateLiteral(Runtime::kCreateRegExpLiteral, assembler);
|
| }
|
|
|
| @@ -1693,8 +1654,7 @@ void Interpreter::DoCreateRegExpLiteralWide(
|
| //
|
| // Creates an array literal for literal index <literal_idx> with flags <flags>
|
| // and constant elements in <element_idx>.
|
| -void Interpreter::DoCreateArrayLiteral(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) {
|
| DoCreateLiteral(Runtime::kCreateArrayLiteral, assembler);
|
| }
|
|
|
| @@ -1703,8 +1663,7 @@ void Interpreter::DoCreateArrayLiteral(
|
| //
|
| // Creates an array literal for literal index <literal_idx> with flags <flags>
|
| // and constant elements in <element_idx>.
|
| -void Interpreter::DoCreateArrayLiteralWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateArrayLiteralWide(InterpreterAssembler* assembler) {
|
| DoCreateLiteral(Runtime::kCreateArrayLiteral, assembler);
|
| }
|
|
|
| @@ -1713,8 +1672,7 @@ void Interpreter::DoCreateArrayLiteralWide(
|
| //
|
| // Creates an object literal for literal index <literal_idx> with flags <flags>
|
| // and constant elements in <element_idx>.
|
| -void Interpreter::DoCreateObjectLiteral(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateObjectLiteral(InterpreterAssembler* assembler) {
|
| DoCreateLiteral(Runtime::kCreateObjectLiteral, assembler);
|
| }
|
|
|
| @@ -1723,8 +1681,7 @@ void Interpreter::DoCreateObjectLiteral(
|
| //
|
| // Creates an object literal for literal index <literal_idx> with flags <flags>
|
| // and constant elements in <element_idx>.
|
| -void Interpreter::DoCreateObjectLiteralWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateObjectLiteralWide(InterpreterAssembler* assembler) {
|
| DoCreateLiteral(Runtime::kCreateObjectLiteral, assembler);
|
| }
|
|
|
| @@ -1733,15 +1690,16 @@ void Interpreter::DoCreateObjectLiteralWide(
|
| //
|
| // Creates a new closure for SharedFunctionInfo at position |index| in the
|
| // constant pool and with the PretenureFlag <tenured>.
|
| -void Interpreter::DoCreateClosure(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateClosure(InterpreterAssembler* assembler) {
|
| // TODO(rmcilroy): Possibly call FastNewClosureStub when possible instead of
|
| // calling into the runtime.
|
| Node* index = __ BytecodeOperandIdx(0);
|
| Node* shared = __ LoadConstantPoolEntry(index);
|
| Node* tenured_raw = __ BytecodeOperandImm(1);
|
| Node* tenured = __ SmiTag(tenured_raw);
|
| + Node* context = __ GetContext();
|
| Node* result =
|
| - __ CallRuntime(Runtime::kInterpreterNewClosure, shared, tenured);
|
| + __ CallRuntime(Runtime::kInterpreterNewClosure, context, shared, tenured);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1751,8 +1709,7 @@ void Interpreter::DoCreateClosure(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Creates a new closure for SharedFunctionInfo at position |index| in the
|
| // constant pool and with the PretenureFlag <tenured>.
|
| -void Interpreter::DoCreateClosureWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateClosureWide(InterpreterAssembler* assembler) {
|
| return DoCreateClosure(assembler);
|
| }
|
|
|
| @@ -1760,10 +1717,11 @@ void Interpreter::DoCreateClosureWide(
|
| // CreateMappedArguments
|
| //
|
| // Creates a new mapped arguments object.
|
| -void Interpreter::DoCreateMappedArguments(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateMappedArguments(InterpreterAssembler* assembler) {
|
| Node* closure = __ LoadRegister(Register::function_closure());
|
| - Node* result = __ CallRuntime(Runtime::kNewSloppyArguments_Generic, closure);
|
| + Node* context = __ GetContext();
|
| + Node* result =
|
| + __ CallRuntime(Runtime::kNewSloppyArguments_Generic, context, closure);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1772,10 +1730,11 @@ void Interpreter::DoCreateMappedArguments(
|
| // CreateUnmappedArguments
|
| //
|
| // Creates a new unmapped arguments object.
|
| -void Interpreter::DoCreateUnmappedArguments(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateUnmappedArguments(InterpreterAssembler* assembler) {
|
| Node* closure = __ LoadRegister(Register::function_closure());
|
| - Node* result = __ CallRuntime(Runtime::kNewStrictArguments_Generic, closure);
|
| + Node* context = __ GetContext();
|
| + Node* result =
|
| + __ CallRuntime(Runtime::kNewStrictArguments_Generic, context, closure);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1783,11 +1742,11 @@ void Interpreter::DoCreateUnmappedArguments(
|
| // CreateRestParameter
|
| //
|
| // Creates a new rest parameter array.
|
| -void Interpreter::DoCreateRestParameter(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoCreateRestParameter(InterpreterAssembler* assembler) {
|
| // TODO(ignition): Use FastNewRestParameterStub here.
|
| Node* closure = __ LoadRegister(Register::function_closure());
|
| - Node* result = __ CallRuntime(Runtime::kNewRestParameter, closure);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(Runtime::kNewRestParameter, context, closure);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1795,7 +1754,7 @@ void Interpreter::DoCreateRestParameter(
|
| // StackCheck
|
| //
|
| // Performs a stack guard check.
|
| -void Interpreter::DoStackCheck(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoStackCheck(InterpreterAssembler* assembler) {
|
| __ StackCheck();
|
| __ Dispatch();
|
| }
|
| @@ -1803,9 +1762,10 @@ void Interpreter::DoStackCheck(compiler::InterpreterAssembler* assembler) {
|
| // Throw
|
| //
|
| // Throws the exception in the accumulator.
|
| -void Interpreter::DoThrow(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoThrow(InterpreterAssembler* assembler) {
|
| Node* exception = __ GetAccumulator();
|
| - __ CallRuntime(Runtime::kThrow, exception);
|
| + Node* context = __ GetContext();
|
| + __ CallRuntime(Runtime::kThrow, context, exception);
|
| // We shouldn't ever return from a throw.
|
| __ Abort(kUnexpectedReturnFromThrow);
|
| }
|
| @@ -1814,9 +1774,10 @@ void Interpreter::DoThrow(compiler::InterpreterAssembler* assembler) {
|
| // ReThrow
|
| //
|
| // Re-throws the exception in the accumulator.
|
| -void Interpreter::DoReThrow(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoReThrow(InterpreterAssembler* assembler) {
|
| Node* exception = __ GetAccumulator();
|
| - __ CallRuntime(Runtime::kReThrow, exception);
|
| + Node* context = __ GetContext();
|
| + __ CallRuntime(Runtime::kReThrow, context, exception);
|
| // We shouldn't ever return from a throw.
|
| __ Abort(kUnexpectedReturnFromThrow);
|
| }
|
| @@ -1825,15 +1786,16 @@ void Interpreter::DoReThrow(compiler::InterpreterAssembler* assembler) {
|
| // Return
|
| //
|
| // Return the value in the accumulator.
|
| -void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) {
|
| - __ Return();
|
| +void Interpreter::DoReturn(InterpreterAssembler* assembler) {
|
| + __ InterpreterReturn();
|
| }
|
|
|
| // Debugger
|
| //
|
| // Call runtime to handle debugger statement.
|
| -void Interpreter::DoDebugger(compiler::InterpreterAssembler* assembler) {
|
| - __ CallRuntime(Runtime::kHandleDebuggerStatement);
|
| +void Interpreter::DoDebugger(InterpreterAssembler* assembler) {
|
| + Node* context = __ GetContext();
|
| + __ CallRuntime(Runtime::kHandleDebuggerStatement, context);
|
| __ Dispatch();
|
| }
|
|
|
| @@ -1843,9 +1805,10 @@ void Interpreter::DoDebugger(compiler::InterpreterAssembler* assembler) {
|
| // accumulator. The result is output in registers |cache_info_triple| to
|
| // |cache_info_triple + 2|, with the registers holding cache_type, cache_array,
|
| // and cache_length respectively.
|
| -void Interpreter::DoForInPrepare(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoForInPrepare(InterpreterAssembler* assembler) {
|
| Node* object = __ GetAccumulator();
|
| - Node* result_triple = __ CallRuntime(Runtime::kForInPrepare, object);
|
| + Node* context = __ GetContext();
|
| + Node* result_triple = __ CallRuntime(Runtime::kForInPrepare, context, object);
|
|
|
| // Set output registers:
|
| // 0 == cache_type, 1 == cache_array, 2 == cache_length
|
| @@ -1865,8 +1828,7 @@ void Interpreter::DoForInPrepare(compiler::InterpreterAssembler* assembler) {
|
| // accumulator. The result is output in registers |cache_info_triple| to
|
| // |cache_info_triple + 2|, with the registers holding cache_type, cache_array,
|
| // and cache_length respectively.
|
| -void Interpreter::DoForInPrepareWide(
|
| - compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoForInPrepareWide(InterpreterAssembler* assembler) {
|
| DoForInPrepare(assembler);
|
| }
|
|
|
| @@ -1874,7 +1836,7 @@ void Interpreter::DoForInPrepareWide(
|
| // ForInNext <receiver> <index> <cache_info_pair>
|
| //
|
| // Returns the next enumerable property in the the accumulator.
|
| -void Interpreter::DoForInNext(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoForInNext(InterpreterAssembler* assembler) {
|
| Node* receiver_reg = __ BytecodeOperandReg(0);
|
| Node* receiver = __ LoadRegister(receiver_reg);
|
| Node* index_reg = __ BytecodeOperandReg(1);
|
| @@ -1883,8 +1845,9 @@ void Interpreter::DoForInNext(compiler::InterpreterAssembler* assembler) {
|
| Node* cache_type = __ LoadRegister(cache_type_reg);
|
| Node* cache_array_reg = __ NextRegister(cache_type_reg);
|
| Node* cache_array = __ LoadRegister(cache_array_reg);
|
| - Node* result = __ CallRuntime(Runtime::kForInNext, receiver, cache_array,
|
| - cache_type, index);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(Runtime::kForInNext, context, receiver,
|
| + cache_array, cache_type, index);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1893,7 +1856,7 @@ void Interpreter::DoForInNext(compiler::InterpreterAssembler* assembler) {
|
| // ForInNextWide <receiver> <index> <cache_info_pair>
|
| //
|
| // Returns the next enumerable property in the the accumulator.
|
| -void Interpreter::DoForInNextWide(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoForInNextWide(InterpreterAssembler* assembler) {
|
| return DoForInNext(assembler);
|
| }
|
|
|
| @@ -1901,13 +1864,15 @@ void Interpreter::DoForInNextWide(compiler::InterpreterAssembler* assembler) {
|
| // ForInDone <index> <cache_length>
|
| //
|
| // Returns true if the end of the enumerable properties has been reached.
|
| -void Interpreter::DoForInDone(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoForInDone(InterpreterAssembler* assembler) {
|
| // TODO(oth): Implement directly rather than making a runtime call.
|
| Node* index_reg = __ BytecodeOperandReg(0);
|
| Node* index = __ LoadRegister(index_reg);
|
| Node* cache_length_reg = __ BytecodeOperandReg(1);
|
| Node* cache_length = __ LoadRegister(cache_length_reg);
|
| - Node* result = __ CallRuntime(Runtime::kForInDone, index, cache_length);
|
| + Node* context = __ GetContext();
|
| + Node* result =
|
| + __ CallRuntime(Runtime::kForInDone, context, index, cache_length);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
| @@ -1917,11 +1882,12 @@ void Interpreter::DoForInDone(compiler::InterpreterAssembler* assembler) {
|
| //
|
| // Increments the loop counter in register |index| and stores the result
|
| // in the accumulator.
|
| -void Interpreter::DoForInStep(compiler::InterpreterAssembler* assembler) {
|
| +void Interpreter::DoForInStep(InterpreterAssembler* assembler) {
|
| // TODO(oth): Implement directly rather than making a runtime call.
|
| Node* index_reg = __ BytecodeOperandReg(0);
|
| Node* index = __ LoadRegister(index_reg);
|
| - Node* result = __ CallRuntime(Runtime::kForInStep, index);
|
| + Node* context = __ GetContext();
|
| + Node* result = __ CallRuntime(Runtime::kForInStep, context, index);
|
| __ SetAccumulator(result);
|
| __ Dispatch();
|
| }
|
|
|