aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-03-21 15:16:07 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2013-04-02 17:38:11 +0200
commitfadb9ae5ab87b905522a6cbd6b7d439ba9407eca (patch)
tree563dc1f90ad803773291a2f273a8092197339bf4 /src
parent2ce472d744d504034bf944c00f9037829050d737 (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.cpp47
-rw-r--r--src/v4/qv4v8.h18
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 ---