diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-08-03 13:41:13 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2017-08-04 07:08:02 +0000 |
commit | be70a025c19bfbfadcab957df7b1185109f5e88e (patch) | |
tree | 103bfd243bd7bd786214bac7a2d7f41fda243284 /src/qml/jsruntime/qv4engine.cpp | |
parent | 40aa22e0fd8234a7a71abf0ef8f42524d306e0df (diff) |
Don't store the current line number in the ExecutionContext
Instead modify our StackFrame struct to hold the
QV4::Function and have a linked list of those for
the frames.
Change-Id: I8676e16bc51a5ba6cf25a5b3423576d44e8a926a
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 62 |
1 files changed, 20 insertions, 42 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 61b8d7e68d..167e38f04a 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -804,54 +804,32 @@ QQmlContextData *ExecutionEngine::callingQmlContext() const return ctx->qml()->context->contextData(); } +QString StackFrame::source() const +{ + return v4Function->sourceFile(); +} + +QString StackFrame::function() const +{ + return v4Function->name()->toQString(); +} + QVector<StackFrame> ExecutionEngine::stackTrace(int frameLimit) const { Scope scope(const_cast<ExecutionEngine *>(this)); ScopedString name(scope); QVector<StackFrame> stack; - ExecutionContext *c = currentContext; - while (c && frameLimit) { - QV4::Function *function = c->getFunction(); - if (function) { - StackFrame frame; - frame.source = function->sourceFile(); - name = function->name(); - frame.function = name->toQString(); - - // line numbers can be negative for places where you can't set a real breakpoint - frame.line = qAbs(c->d()->lineNumber); - frame.column = -1; - - stack.append(frame); - --frameLimit; - } - c = parentContext(c); - } - - if (frameLimit && globalCode) { - StackFrame frame; - frame.source = globalCode->sourceFile(); - frame.function = globalCode->name()->toQString(); - frame.line = rootContext()->d()->lineNumber; - frame.column = -1; - + StackFrame *f = currentStackFrame; + while (f && frameLimit) { + StackFrame frame = *f; + frame.parent = 0; stack.append(frame); + --frameLimit; + f = f->parent; } - return stack; -} -StackFrame ExecutionEngine::currentStackFrame() const -{ - StackFrame frame; - frame.line = -1; - frame.column = -1; - - QVector<StackFrame> trace = stackTrace(/*limit*/ 1); - if (!trace.isEmpty()) - frame = trace.first(); - - return frame; + return stack; } /* Helper and "C" linkage exported function to format a GDBMI stacktrace for @@ -871,9 +849,9 @@ static inline char *v4StackTrace(const ExecutionContext *context) for (int i = 0; i < stackTrace.size(); ++i) { if (i) str << ','; - const QUrl url(stackTrace.at(i).source); + const QUrl url(stackTrace.at(i).source()); const QString fileName = url.isLocalFile() ? url.toLocalFile() : url.toString(); - str << "frame={level=\"" << i << "\",func=\"" << stackTrace.at(i).function + str << "frame={level=\"" << i << "\",func=\"" << stackTrace.at(i).function() << "\",file=\"" << fileName << "\",fullname=\"" << fileName << "\",line=\"" << stackTrace.at(i).line << "\",language=\"js\"}"; } @@ -1088,7 +1066,7 @@ QQmlError ExecutionEngine::catchExceptionAsQmlError() QQmlError error; if (!trace.isEmpty()) { QV4::StackFrame frame = trace.constFirst(); - error.setUrl(QUrl(frame.source)); + error.setUrl(QUrl(frame.source())); error.setLine(frame.line); error.setColumn(frame.column); } |