Index: src/interpreter/interpreter-assembler.cc |
diff --git a/src/interpreter/interpreter-assembler.cc b/src/interpreter/interpreter-assembler.cc |
index 1ccd342f0662470b54d283ea416cc361244ba2ef..c50bcba24b9f2a80bacc4bec649ee069ff8b2c58 100644 |
--- a/src/interpreter/interpreter-assembler.cc |
+++ b/src/interpreter/interpreter-assembler.cc |
@@ -1183,6 +1183,25 @@ void InterpreterAssembler::AbortIfWordNotEqual(Node* lhs, Node* rhs, |
Bind(&ok); |
} |
+void InterpreterAssembler::MaybeDropFrames(Node* context) { |
+ Node* new_fp_address = |
+ ExternalConstant(ExternalReference::debug_new_fp_address(isolate())); |
+ Node* new_fp = Load(MachineType::TaggedPointer(), new_fp_address); |
jgruber
2017/01/17 13:29:58
Is new_fp really a TaggedPointer? Looking at the F
Michael Starzinger
2017/01/17 14:45:27
+1, nice catch, I totally missed that!
Yang
2017/01/18 07:49:08
Done.
|
+ Node* null = IntPtrConstant(static_cast<intptr_t>(0)); |
jgruber
2017/01/17 13:29:58
Nit: we don't need the static_cast.
Yang
2017/01/18 07:49:08
Done.
|
+ |
+ Label ok(this), drop_frames(this); |
+ Branch(IntPtrEqual(new_fp, null), &ok, &drop_frames); |
+ |
+ Bind(&drop_frames); |
+ // We don't expect this call to return since the frame dropper tears down |
+ // the stack and jumps into the function on the target frame to restart it. |
+ CallStub(CodeFactory::FrameDropperTrampoline(isolate()), context, new_fp); |
+ Abort(kUnexpectedReturnFromFrameDropper); |
+ Goto(&ok); |
+ |
+ Bind(&ok); |
+} |
+ |
void InterpreterAssembler::TraceBytecode(Runtime::FunctionId function_id) { |
CallRuntime(function_id, GetContext(), BytecodeArrayTaggedPointer(), |
SmiTag(BytecodeOffset()), GetAccumulatorUnchecked()); |