aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2019-01-22 10:35:09 +0100
committerLiang Qi <liang.qi@qt.io>2019-01-22 11:20:29 +0100
commit1b4d2741f90d3f4daf79940b9c8713dda0fb7f3d (patch)
tree40cee4f6af7bf9a5fc87c43f024f417a5d09e18d /src/qml/jsruntime
parent536868fad50778ec5bf4c6c7269c721b05d8a2d5 (diff)
parent84e15a609b37a64baf82ed20f8d4f79474989226 (diff)
Merge remote-tracking branch 'origin/5.12' into dev
Conflicts: .qmake.conf tests/auto/quick/qquickpathview/tst_qquickpathview.cpp Change-Id: Ic1f5e219a255d0613f7654368a5ce3eccb8f0ee9
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r--src/qml/jsruntime/qv4engine.cpp5
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp1
-rw-r--r--src/qml/jsruntime/qv4stackframe_p.h2
3 files changed, 8 insertions, 0 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index ff7bcb63fa..a482cc6a67 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -1011,6 +1011,11 @@ StackTrace ExecutionEngine::stackTrace(int frameLimit) const
frame.line = qAbs(f->lineNumber());
frame.column = -1;
stack.append(frame);
+ if (f->isTailCalling) {
+ QV4::StackFrame frame;
+ frame.function = QStringLiteral("[elided tail calls]");
+ stack.append(frame);
+ }
--frameLimit;
f = f->parent;
}
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp
index dfe9d35194..41a21ba379 100644
--- a/src/qml/jsruntime/qv4functionobject.cpp
+++ b/src/qml/jsruntime/qv4functionobject.cpp
@@ -518,6 +518,7 @@ ReturnedValue ArrowFunction::virtualCall(const FunctionObject *fo, const Value *
do {
frame.pendingTailCall = false;
result = Moth::VME::exec(&frame, engine);
+ frame.isTailCalling = true;
} while (frame.pendingTailCall);
frame.pop();
diff --git a/src/qml/jsruntime/qv4stackframe_p.h b/src/qml/jsruntime/qv4stackframe_p.h
index a97ae0e7c9..44cfef9173 100644
--- a/src/qml/jsruntime/qv4stackframe_p.h
+++ b/src/qml/jsruntime/qv4stackframe_p.h
@@ -125,6 +125,7 @@ struct Q_QML_EXPORT CppStackFrame {
bool yieldIsIterator;
bool callerCanHandleTailCall;
bool pendingTailCall;
+ bool isTailCalling;
void init(EngineBase *engine, Function *v4Function, const Value *argv, int argc, bool callerCanHandleTailCall = false) {
this->engine = engine;
@@ -140,6 +141,7 @@ struct Q_QML_EXPORT CppStackFrame {
yieldIsIterator = false;
this->callerCanHandleTailCall = callerCanHandleTailCall;
pendingTailCall = false;
+ isTailCalling = false;
}
void push() {