| 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(); | 
| } | 
|  |