Index: src/compiler/interpreter-assembler.cc |
diff --git a/src/compiler/interpreter-assembler.cc b/src/compiler/interpreter-assembler.cc |
index 93d857c0e404560adb34ae364bcf1fb7a38d8cf0..128837b4531503fa9eacf976777ef2ff9e48b7cf 100644 |
--- a/src/compiler/interpreter-assembler.cc |
+++ b/src/compiler/interpreter-assembler.cc |
@@ -127,6 +127,24 @@ Node* InterpreterAssembler::StoreRegister(Node* value, Node* index) { |
} |
+void InterpreterAssembler::Return() { |
+ Node* exit_trampoline_code_object = |
+ HeapConstant(Unique<HeapObject>::CreateImmovable( |
+ isolate()->builtins()->InterpreterExitTrampoline())); |
+ // If the order of the parameters you need to change the call signature below. |
+ STATIC_ASSERT(0 == Linkage::kInterpreterBytecodeOffsetParameter); |
+ STATIC_ASSERT(1 == Linkage::kInterpreterBytecodeArrayParameter); |
+ STATIC_ASSERT(2 == Linkage::kInterpreterDispatchTableParameter); |
+ Node* tail_call = graph()->NewNode( |
+ common()->TailCall(call_descriptor()), exit_trampoline_code_object, |
+ BytecodeOffset(), BytecodeArrayPointer(), DispatchTablePointer(), |
+ graph()->start(), graph()->start()); |
+ schedule()->AddTailCall(raw_assembler_->CurrentBlock(), tail_call); |
+ // This should always be the end node. |
+ SetEndInput(tail_call); |
+} |
+ |
+ |
Node* InterpreterAssembler::Advance(int delta) { |
return raw_assembler_->IntPtrAdd(BytecodeOffset(), Int32Constant(delta)); |
} |
@@ -153,7 +171,6 @@ void InterpreterAssembler::Dispatch() { |
new_bytecode_offset, BytecodeArrayPointer(), DispatchTablePointer(), |
graph()->start(), graph()->start()); |
schedule()->AddTailCall(raw_assembler_->CurrentBlock(), tail_call); |
- |
// This should always be the end node. |
SetEndInput(tail_call); |
} |
@@ -210,6 +227,11 @@ Node* InterpreterAssembler::NumberConstant(double value) { |
} |
+Node* InterpreterAssembler::HeapConstant(Unique<HeapObject> object) { |
+ return raw_assembler_->HeapConstant(object); |
+} |
+ |
+ |
} // namespace interpreter |
} // namespace internal |
} // namespace v8 |