diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-03-21 15:16:07 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2013-04-02 17:38:11 +0200 |
commit | fadb9ae5ab87b905522a6cbd6b7d439ba9407eca (patch) | |
tree | 563dc1f90ad803773291a2f273a8092197339bf4 /src | |
parent | 2ce472d744d504034bf944c00f9037829050d737 (diff) |
Implement v8::StackFrame and v8::StackTrace
Change-Id: Ib0f210f1d30a0681c3d741544206bbe0d9d26f95
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/v4/qv4v8.cpp | 47 | ||||
-rw-r--r-- | src/v4/qv4v8.h | 18 |
2 files changed, 47 insertions, 18 deletions
diff --git a/src/v4/qv4v8.cpp b/src/v4/qv4v8.cpp index 09ab67d3bd..ada6fd1413 100644 --- a/src/v4/qv4v8.cpp +++ b/src/v4/qv4v8.cpp @@ -314,14 +314,14 @@ int Message::GetLineNumber() const Local<StackFrame> StackTrace::GetFrame(uint32_t index) const { - Q_UNIMPLEMENTED(); - return Local<StackFrame>(); + if (index >= (uint)frames.size()) + return Local<StackFrame>(); + return frames.at(index); } int StackTrace::GetFrameCount() const { - Q_UNIMPLEMENTED(); - return 0; + return frames.size(); } Local<Array> StackTrace::AsArray() @@ -332,39 +332,54 @@ Local<Array> StackTrace::AsArray() Local<StackTrace> StackTrace::CurrentStackTrace(int frame_limit, StackTrace::StackTraceOptions options) { - Q_UNIMPLEMENTED(); - return Local<StackTrace>(); + StackTrace *trace = new StackTrace; + VM::ExecutionEngine *engine = currentEngine(); + VM::ExecutionContext **root = engine->contextStack; + VM::ExecutionContext **current = root + engine->contextStackPosition; + while (current >= root && frame_limit) { + StackFrame *frame = new StackFrame(Value::fromVmValue(VM::Value::fromString(engine->id_null)), + Value::fromVmValue(VM::Value::fromString((*current)->function ? (*current)->function->name : engine->id_null)), + 0, 0); + trace->frames.append(frame); + --frame_limit; + --current; + } + + return Local<StackTrace>::New(Handle<StackTrace>(trace)); } int StackFrame::GetLineNumber() const { - Q_UNIMPLEMENTED(); - return 0; + return m_lineNumber; } int StackFrame::GetColumn() const { - Q_UNIMPLEMENTED(); - return 0; + return m_columnNumber; } Local<String> StackFrame::GetScriptName() const { - Q_UNIMPLEMENTED(); - return Local<String>(); + return Local<String>::New(m_scriptName); } Local<String> StackFrame::GetScriptNameOrSourceURL() const { - Q_UNIMPLEMENTED(); - return Local<String>(); + return Local<String>::New(m_scriptName); } Local<String> StackFrame::GetFunctionName() const { - Q_UNIMPLEMENTED(); - return Local<String>(); + return Local<String>::New(m_functionName); +} + +StackFrame::StackFrame(Handle<String> script, Handle<String> function, int line, int column) + : m_lineNumber(line) + , m_columnNumber(column) +{ + m_scriptName = Persistent<String>::New(script); + m_functionName = Persistent<String>::New(function); } diff --git a/src/v4/qv4v8.h b/src/v4/qv4v8.h index 8a2b0196b1..0860a32f4c 100644 --- a/src/v4/qv4v8.h +++ b/src/v4/qv4v8.h @@ -780,7 +780,8 @@ DEFINE_REFCOUNTED_HANDLE_OPERATIONS(Message) * snapshot of the execution stack and the information remains valid after * execution continues. */ -class V8EXPORT StackTrace { +class V8EXPORT StackTrace : public QSharedData +{ public: /** * Flags that determine what information is placed captured for each @@ -823,13 +824,18 @@ class V8EXPORT StackTrace { static Local<StackTrace> CurrentStackTrace( int frame_limit, StackTraceOptions options = kOverview); + + private: + QVector<Local<StackFrame> > frames; }; +DEFINE_REFCOUNTED_HANDLE_OPERATIONS(StackTrace) + /** * A single JavaScript stack frame. */ -class V8EXPORT StackFrame { +class V8EXPORT StackFrame : public QSharedData { public: /** * Returns the number, 1-based, of the line for the associate function call. @@ -866,8 +872,16 @@ class V8EXPORT StackFrame { */ Local<String> GetFunctionName() const; +private: + friend class StackTrace; + StackFrame(Handle<String> script, Handle<String> function, int line, int column); + int m_lineNumber; + int m_columnNumber; + Persistent<String> m_scriptName; + Persistent<String> m_functionName; }; +DEFINE_REFCOUNTED_HANDLE_OPERATIONS(StackFrame) // --- Value --- |