-
Bug
-
Resolution: Done
-
P2: Important
-
5.12.0
-
Windows 10 1809
-
-
8fd3cfe7d0f39a731c585334299f5160ad952df9
I've upgrade my project from Qt 5.11.2 to Qt 5.12 and JS engine has changed the stack trace.
Previously, with QJSEngine, the stack trace saved all function executed in stack, but since 5.12, the stack trace skip getter functions in trace.
Code :
StackTest.js
function getStack() { return (new Error().stack.replace(/\n/g, "\n\t")); } function testStackRet() { return (getStack()); } function testStackTmp() { let tmp = getStack(); return (tmp); }
testing.js (loaded by init.js automatically)
function main() { System.log("\n\t" + testStackRet()); // System.log is my own logging system, it works. System.log("\n\t" + testStackTmp()); }
Result :
LOG(testing.js:3) getStack@file:$/Lib/StackTest.js:4 main@file:testing.js:3 %entry@file:init.js:3 LOG(testing.js:4) getStack@file:$/Lib/StackTest.js:4 testStackTmp@file:$/Lib/StackTest.js:13 main@file:testing.js:4 %entry@file:init.js:3
testStackRet() forgets a step while in testStackTmp() doesn't. These are the same functions but in the second, the result of the function is saved in a variable before being returned.
Result in 5.11.2 :
LOG(testing.js:3) getStack@file:$/Lib/StackTest.js:4 testStackRet@file:$/Lib/StackTest.js:9 main@file:testing.js:3 %entry@file:init.js:3 LOG(testing.js:4) getStack@file:$/Lib/StackTest.js:4 testStackTmp@file:$/Lib/StackTest.js:13 main@file:testing.js:4 %entry@file:init.js:3
This is very disturbing because I use the stack trace a lot in my operations.
Details :
main.cpp
#include <QCoreApplication> #include <QJSEngine> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QJSEngine *engine; engine = new QJSEngine(); engine->installExtensions(QJSEngine::Extension::ConsoleExtension); qDebug() << qVersion(); engine->evaluate( "function getStack()\n" "{\n" " return (new Error().stack.replace(/\\n/g, \"\\n\\t\"));\n" "}\n" "function testStackRet()\n" "{\n" " return (getStack());\n" "}\n" "function testStackTmp()\n" "{\n" " let tmp = getStack();\n" " return (tmp);\n" "}\n" "function main()\n" "{\n" " console.log(testStackRet());\n" " console.log(testStackTmp());\n" "}\n" "\n" "main();\n" , "test.js"); qDebug() << endl; engine->evaluate( "'use strict';\n" "function getStack()\n" "{\n" " return (new Error().stack.replace(/\\n/g, \"\\n\\t\"));\n" "}\n" "function testStackRet()\n" "{\n" " return (getStack());\n" "}\n" "function testStackTmp()\n" "{\n" " let tmp = getStack();\n" " return (tmp);\n" "}\n" "function main()\n" "{\n" " console.log(testStackRet());\n" " console.log(testStackTmp());\n" "}\n" "\n" "main();\n" , "testStrict.js"); return (0); }
JSEngine.pro
QT += core qml CONFIG += console