Index: src/frames.h |
diff --git a/src/frames.h b/src/frames.h |
index a1e438c6943494684ced2512f82f4ea78f598cfe..cb786202dff880152f419bbe754b5503e9e476a6 100644 |
--- a/src/frames.h |
+++ b/src/frames.h |
@@ -112,7 +112,8 @@ class StackHandler BASE_EMBEDDED { |
V(INTERNAL, InternalFrame) \ |
V(CONSTRUCT, ConstructFrame) \ |
V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame) \ |
- V(BUILTIN, BuiltinFrame) |
+ V(BUILTIN, BuiltinFrame) \ |
+ V(BUILTIN_EXIT, BuiltinExitFrame) |
// Every pointer in a frame has a slot id. On 32-bit platforms, doubles consume |
// two slots. |
@@ -323,6 +324,12 @@ class StubFailureTrampolineFrameConstants : public InternalFrameConstants { |
DEFINE_TYPED_FRAME_SIZES(3); |
}; |
+// Behaves like an exit frame but with target and new target args. |
+class BuiltinExitFrameConstants : public CommonFrameConstants { |
+ public: |
+ static const int kNewTargetOffset = kCallerPCOffset + 1 * kPointerSize; |
+ static const int kTargetOffset = kNewTargetOffset + 1 * kPointerSize; |
+}; |
class InterpreterFrameConstants : public AllStatic { |
public: |
@@ -426,6 +433,7 @@ class StackFrame BASE_EMBEDDED { |
return type() == STUB_FAILURE_TRAMPOLINE; |
} |
bool is_construct() const { return type() == CONSTRUCT; } |
+ bool is_builtin_exit() const { return type() == BUILTIN_EXIT; } |
virtual bool is_standard() const { return false; } |
bool is_java_script() const { |
@@ -630,6 +638,7 @@ class ExitFrame: public StackFrame { |
// iterator and the frames following entry frames. |
static Type GetStateForFramePointer(Address fp, State* state); |
static Address ComputeStackPointer(Address fp); |
+ static StackFrame::Type ComputeFrameType(Address fp); |
static void FillState(Address fp, Address sp, State* state); |
protected: |
@@ -643,6 +652,29 @@ class ExitFrame: public StackFrame { |
friend class StackFrameIteratorBase; |
}; |
+// Builtin exit frames are a special case of exit frames, which are used |
+// whenever C++ builtins (e.g., Math.acos) are called. Their main purpose is |
+// to allow such builtins to appear in stack traces. |
+class BuiltinExitFrame : public ExitFrame { |
+ public: |
+ Type type() const override { return BUILTIN_EXIT; } |
+ |
+ static BuiltinExitFrame* cast(StackFrame* frame) { |
+ DCHECK(frame->is_builtin_exit()); |
+ return static_cast<BuiltinExitFrame*>(frame); |
+ } |
+ |
+ virtual JSFunction* function() const; |
+ |
+ protected: |
+ inline explicit BuiltinExitFrame(StackFrameIteratorBase* iterator); |
+ |
+ private: |
+ inline Object* function_slot_object() const; |
+ |
+ friend class StackFrameIteratorBase; |
+}; |
+ |
class JavaScriptFrame; |
class FrameSummary BASE_EMBEDDED { |