summaryrefslogtreecommitdiff
path: root/deps/v8/src/frames.h
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2016-09-06 22:49:51 +0200
committerMichaël Zasso <targos@protonmail.com>2016-09-22 09:51:19 +0200
commitec02b811a8a5c999bab4de312be2d732b7d9d50b (patch)
treeca3068017254f238cf413a451c57a803572983a4 /deps/v8/src/frames.h
parentd2eb7ce0105369a9cad82787cb33a665e9bd00ad (diff)
downloadandroid-node-v8-ec02b811a8a5c999bab4de312be2d732b7d9d50b.tar.gz
android-node-v8-ec02b811a8a5c999bab4de312be2d732b7d9d50b.tar.bz2
android-node-v8-ec02b811a8a5c999bab4de312be2d732b7d9d50b.zip
deps: update V8 to 5.4.500.27
Pick up latest commit from the 5.4-lkgr branch. deps: edit V8 gitignore to allow trace event copy deps: update V8 trace event to 315bf1e2d45be7d53346c31cfcc37424a32c30c8 deps: edit V8 gitignore to allow gtest_prod.h copy deps: update V8 gtest to 6f8a66431cb592dad629028a50b3dd418a408c87 PR-URL: https://github.com/nodejs/node/pull/8317 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Diffstat (limited to 'deps/v8/src/frames.h')
-rw-r--r--deps/v8/src/frames.h244
1 files changed, 181 insertions, 63 deletions
diff --git a/deps/v8/src/frames.h b/deps/v8/src/frames.h
index f6806d7563..12770231cf 100644
--- a/deps/v8/src/frames.h
+++ b/deps/v8/src/frames.h
@@ -111,7 +111,9 @@ class StackHandler BASE_EMBEDDED {
V(STUB_FAILURE_TRAMPOLINE, StubFailureTrampolineFrame) \
V(INTERNAL, InternalFrame) \
V(CONSTRUCT, ConstructFrame) \
- V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame)
+ V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame) \
+ V(BUILTIN, BuiltinFrame) \
+ V(BUILTIN_EXIT, BuiltinExitFrame)
// Every pointer in a frame has a slot id. On 32-bit platforms, doubles consume
// two slots.
@@ -280,6 +282,14 @@ class ArgumentsAdaptorFrameConstants : public TypedFrameConstants {
DEFINE_TYPED_FRAME_SIZES(2);
};
+class BuiltinFrameConstants : public TypedFrameConstants {
+ public:
+ // FP-relative.
+ static const int kFunctionOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0);
+ static const int kLengthOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1);
+ DEFINE_TYPED_FRAME_SIZES(2);
+};
+
class InternalFrameConstants : public TypedFrameConstants {
public:
// FP-relative.
@@ -314,41 +324,46 @@ 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;
+ static const int kArgcOffset = kTargetOffset + 1 * kPointerSize;
+};
class InterpreterFrameConstants : public AllStatic {
public:
- // Fixed frame includes new.target and bytecode offset.
+ // Fixed frame includes new.target, bytecode array, and bytecode offset.
static const int kFixedFrameSize =
StandardFrameConstants::kFixedFrameSize + 3 * kPointerSize;
static const int kFixedFrameSizeFromFp =
StandardFrameConstants::kFixedFrameSizeFromFp + 3 * kPointerSize;
// FP-relative.
+ static const int kLastParamFromFp = StandardFrameConstants::kCallerSPOffset;
+ static const int kCallerPCOffsetFromFp =
+ StandardFrameConstants::kCallerPCOffset;
static const int kNewTargetFromFp =
-StandardFrameConstants::kFixedFrameSizeFromFp - 1 * kPointerSize;
static const int kBytecodeArrayFromFp =
-StandardFrameConstants::kFixedFrameSizeFromFp - 2 * kPointerSize;
static const int kBytecodeOffsetFromFp =
-StandardFrameConstants::kFixedFrameSizeFromFp - 3 * kPointerSize;
- static const int kRegisterFilePointerFromFp =
+ static const int kRegisterFileFromFp =
-StandardFrameConstants::kFixedFrameSizeFromFp - 4 * kPointerSize;
- static const int kExpressionsOffset = kRegisterFilePointerFromFp;
+ static const int kExpressionsOffset = kRegisterFileFromFp;
+
+ // Number of fixed slots in addition to a {StandardFrame}.
+ static const int kExtraSlotCount =
+ InterpreterFrameConstants::kFixedFrameSize / kPointerSize -
+ StandardFrameConstants::kFixedFrameSize / kPointerSize;
// Expression index for {StandardFrame::GetExpressionAddress}.
static const int kBytecodeArrayExpressionIndex = -2;
static const int kBytecodeOffsetExpressionIndex = -1;
static const int kRegisterFileExpressionIndex = 0;
-
- // Register file pointer relative.
- static const int kLastParamFromRegisterPointer =
- StandardFrameConstants::kFixedFrameSize + 4 * kPointerSize;
-
- static const int kBytecodeOffsetFromRegisterPointer = 1 * kPointerSize;
- static const int kBytecodeArrayFromRegisterPointer = 2 * kPointerSize;
- static const int kNewTargetFromRegisterPointer = 3 * kPointerSize;
- static const int kFunctionFromRegisterPointer = 4 * kPointerSize;
- static const int kContextFromRegisterPointer = 5 * kPointerSize;
};
inline static int FPOffsetToFrameSlot(int frame_offset) {
@@ -418,17 +433,19 @@ class StackFrame BASE_EMBEDDED {
bool is_wasm_to_js() const { return type() == WASM_TO_JS; }
bool is_js_to_wasm() const { return type() == JS_TO_WASM; }
bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; }
+ bool is_builtin() const { return type() == BUILTIN; }
bool is_internal() const { return type() == INTERNAL; }
bool is_stub_failure_trampoline() const {
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 {
Type type = this->type();
return (type == JAVA_SCRIPT) || (type == OPTIMIZED) ||
- (type == INTERPRETED);
+ (type == INTERPRETED) || (type == BUILTIN);
}
// Accessors.
@@ -627,6 +644,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:
@@ -640,22 +658,98 @@ 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);
+ }
+
+ JSFunction* function() const;
+ Object* receiver() const;
+
+ bool IsConstructor() const;
+
+ void Print(StringStream* accumulator, PrintMode mode,
+ int index) const override;
+
+ protected:
+ inline explicit BuiltinExitFrame(StackFrameIteratorBase* iterator);
+
+ private:
+ Object* GetParameter(int i) const;
+ int ComputeParametersCount() const;
-class StandardFrame: public StackFrame {
+ inline Object* receiver_slot_object() const;
+ inline Object* argc_slot_object() const;
+ inline Object* target_slot_object() const;
+ inline Object* new_target_slot_object() const;
+
+ friend class StackFrameIteratorBase;
+};
+
+class JavaScriptFrame;
+
+class FrameSummary BASE_EMBEDDED {
+ public:
+ // Mode for JavaScriptFrame::Summarize. Exact summary is required to produce
+ // an exact stack trace. It will trigger an assertion failure if that is not
+ // possible, e.g., because of missing deoptimization information. The
+ // approximate mode should produce a summary even without deoptimization
+ // information, but it might miss frames.
+ enum Mode { kExactSummary, kApproximateSummary };
+
+ FrameSummary(Object* receiver, JSFunction* function,
+ AbstractCode* abstract_code, int code_offset,
+ bool is_constructor, Mode mode = kExactSummary);
+
+ static FrameSummary GetFirst(JavaScriptFrame* frame);
+
+ Handle<Object> receiver() const { return receiver_; }
+ Handle<JSFunction> function() const { return function_; }
+ Handle<AbstractCode> abstract_code() const { return abstract_code_; }
+ int code_offset() const { return code_offset_; }
+ bool is_constructor() const { return is_constructor_; }
+
+ void Print();
+
+ private:
+ Handle<Object> receiver_;
+ Handle<JSFunction> function_;
+ Handle<AbstractCode> abstract_code_;
+ int code_offset_;
+ bool is_constructor_;
+};
+
+class StandardFrame : public StackFrame {
public:
// Testers.
bool is_standard() const override { return true; }
// Accessors.
- inline Object* context() const;
+ virtual Object* receiver() const;
+ virtual Script* script() const;
+ virtual Object* context() const;
// Access the expressions in the stack frame including locals.
inline Object* GetExpression(int index) const;
inline void SetExpression(int index, Object* value);
int ComputeExpressionsCount() const;
+ // Access the parameters.
+ virtual Object* GetParameter(int index) const;
+ virtual int ComputeParametersCount() const;
+
void SetCallerFp(Address caller_fp) override;
+ // Check if this frame is a constructor frame invoked through 'new'.
+ virtual bool IsConstructor() const;
+
static StandardFrame* cast(StackFrame* frame) {
DCHECK(frame->is_standard());
return static_cast<StandardFrame*>(frame);
@@ -701,44 +795,27 @@ class StandardFrame: public StackFrame {
friend class SafeStackFrameIterator;
};
-
-class FrameSummary BASE_EMBEDDED {
- public:
- FrameSummary(Object* receiver, JSFunction* function,
- AbstractCode* abstract_code, int code_offset,
- bool is_constructor);
-
- Handle<Object> receiver() { return receiver_; }
- Handle<JSFunction> function() { return function_; }
- Handle<AbstractCode> abstract_code() { return abstract_code_; }
- int code_offset() { return code_offset_; }
- bool is_constructor() { return is_constructor_; }
-
- void Print();
-
- private:
- Handle<Object> receiver_;
- Handle<JSFunction> function_;
- Handle<AbstractCode> abstract_code_;
- int code_offset_;
- bool is_constructor_;
-};
-
class JavaScriptFrame : public StandardFrame {
public:
Type type() const override { return JAVA_SCRIPT; }
+ // Build a list with summaries for this frame including all inlined frames.
+ virtual void Summarize(
+ List<FrameSummary>* frames,
+ FrameSummary::Mode mode = FrameSummary::kExactSummary) const;
+
// Accessors.
- inline JSFunction* function() const;
- inline Object* receiver() const;
+ virtual JSFunction* function() const;
+ Object* receiver() const override;
+ Object* context() const override;
+ Script* script() const override;
+
inline void set_receiver(Object* value);
// Access the parameters.
inline Address GetParameterSlot(int index) const;
- inline Object* GetParameter(int index) const;
- inline int ComputeParametersCount() const {
- return GetNumberOfIncomingArguments();
- }
+ Object* GetParameter(int index) const override;
+ int ComputeParametersCount() const override;
// Access the operand stack.
inline Address GetOperandSlot(int index) const;
@@ -747,13 +824,12 @@ class JavaScriptFrame : public StandardFrame {
// Generator support to preserve operand stack.
void SaveOperandStack(FixedArray* store) const;
- void RestoreOperandStack(FixedArray* store);
// Debugger access.
void SetParameterValue(int index, Object* value) const;
// Check if this frame is a constructor frame invoked through 'new'.
- bool IsConstructor() const;
+ bool IsConstructor() const override;
// Determines whether this frame includes inlined activations. To get details
// about the inlined frames use {GetFunctions} and {Summarize}.
@@ -778,9 +854,6 @@ class JavaScriptFrame : public StandardFrame {
// Return a list with JSFunctions of this frame.
virtual void GetFunctions(List<JSFunction*>* functions) const;
- // Build a list with summaries for this frame including all inlined frames.
- virtual void Summarize(List<FrameSummary>* frames);
-
// Lookup exception handler for current {pc}, returns -1 if none found. Also
// returns data associated with the handler site specific to the frame type:
// - JavaScriptFrame : Data is the stack depth at entry of the try-block.
@@ -817,6 +890,8 @@ class JavaScriptFrame : public StandardFrame {
// receiver, and any callee-saved registers.
void IterateArguments(ObjectVisitor* v) const;
+ virtual void PrintFrameKind(StringStream* accumulator) const {}
+
private:
inline Object* function_slot_object() const;
@@ -857,7 +932,9 @@ class OptimizedFrame : public JavaScriptFrame {
// is the top-most activation)
void GetFunctions(List<JSFunction*>* functions) const override;
- void Summarize(List<FrameSummary>* frames) override;
+ void Summarize(
+ List<FrameSummary>* frames,
+ FrameSummary::Mode mode = FrameSummary::kExactSummary) const override;
// Lookup exception handler for current {pc}, returns -1 if none found.
int LookupExceptionHandlerInTable(
@@ -893,17 +970,20 @@ class InterpretedFrame : public JavaScriptFrame {
void PatchBytecodeOffset(int new_offset);
// Returns the frame's current bytecode array.
- Object* GetBytecodeArray() const;
+ BytecodeArray* GetBytecodeArray() const;
// Updates the frame's BytecodeArray with |bytecode_array|. Used by the
// debugger to swap execution onto a BytecodeArray patched with breakpoints.
- void PatchBytecodeArray(Object* bytecode_array);
+ void PatchBytecodeArray(BytecodeArray* bytecode_array);
// Access to the interpreter register file for this frame.
- Object* GetInterpreterRegister(int register_index) const;
+ Object* ReadInterpreterRegister(int register_index) const;
+ void WriteInterpreterRegister(int register_index, Object* value);
// Build a list with summaries for this frame including all inlined frames.
- void Summarize(List<FrameSummary>* frames) override;
+ void Summarize(
+ List<FrameSummary>* frames,
+ FrameSummary::Mode mode = FrameSummary::kExactSummary) const override;
protected:
inline explicit InterpretedFrame(StackFrameIteratorBase* iterator);
@@ -941,7 +1021,26 @@ class ArgumentsAdaptorFrame: public JavaScriptFrame {
int GetNumberOfIncomingArguments() const override;
- Address GetCallerStackPointer() const override;
+ private:
+ friend class StackFrameIteratorBase;
+};
+
+// Builtin frames are built for builtins with JavaScript linkage, such as
+// various standard library functions (i.e. Math.asin, Math.floor, etc.).
+class BuiltinFrame final : public JavaScriptFrame {
+ public:
+ Type type() const final { return BUILTIN; }
+
+ static BuiltinFrame* cast(StackFrame* frame) {
+ DCHECK(frame->is_builtin());
+ return static_cast<BuiltinFrame*>(frame);
+ }
+
+ protected:
+ inline explicit BuiltinFrame(StackFrameIteratorBase* iterator);
+
+ int GetNumberOfIncomingArguments() const final;
+ void PrintFrameKind(StringStream* accumulator) const override;
private:
friend class StackFrameIteratorBase;
@@ -961,6 +1060,11 @@ class WasmFrame : public StandardFrame {
// Determine the code for the frame.
Code* unchecked_code() const override;
+ // Accessors.
+ Object* wasm_obj() const;
+ uint32_t function_index() const;
+ Script* script() const override;
+
static WasmFrame* cast(StackFrame* frame) {
DCHECK(frame->is_wasm());
return static_cast<WasmFrame*>(frame);
@@ -1143,17 +1247,31 @@ class JavaScriptFrameIterator BASE_EMBEDDED {
StackFrameIterator iterator_;
};
-// NOTE: The stack trace frame iterator is an iterator that only
-// traverse proper JavaScript frames; that is JavaScript frames that
-// have proper JavaScript functions. This excludes the problematic
-// functions in runtime.js.
-class StackTraceFrameIterator: public JavaScriptFrameIterator {
+// NOTE: The stack trace frame iterator is an iterator that only traverse proper
+// JavaScript frames that have proper JavaScript functions and WASM frames.
+// This excludes the problematic functions in runtime.js.
+class StackTraceFrameIterator BASE_EMBEDDED {
public:
explicit StackTraceFrameIterator(Isolate* isolate);
+ StackTraceFrameIterator(Isolate* isolate, StackFrame::Id id);
+ bool done() const { return iterator_.done(); }
void Advance();
+ inline StandardFrame* frame() const;
+
+ inline bool is_javascript() const;
+ inline bool is_wasm() const;
+ inline JavaScriptFrame* javascript_frame() const;
+ inline WasmFrame* wasm_frame() const;
+
+ // Advance to the frame holding the arguments for the current
+ // frame. This only affects the current frame if it is a javascript frame and
+ // has adapted arguments.
+ void AdvanceToArgumentsFrame();
+
private:
- bool IsValidFrame();
+ StackFrameIterator iterator_;
+ bool IsValidFrame(StackFrame* frame) const;
};