From c9dc3c161206457656be671a14b0b1917eefe522 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 25 Jul 2024 17:04:22 +0200 Subject: [PATCH] QtScripting: log also errors happening in JS lambda functions --- CMakeLists.txt | 4 ++++ src/app/dialog_exec_script.cpp | 11 +---------- src/qtscripting/script_document.cpp | 9 ++++++--- src/qtscripting/script_global.cpp | 14 ++++++++++++++ src/qtscripting/script_global.h | 2 ++ 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ba38160..0d0f1a64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,8 +134,12 @@ set(CMAKE_CXX_STANDARD 17) set( Mayo_CompileDefinitions + # Disable Qt functions deprecated in version 5.15 and earlier QT_DISABLE_DEPRECATED_BEFORE=0x050F00 + # Make QFileInfo constructors implicit instead of explicit QT_IMPLICIT_QFILEINFO_CONSTRUCTION + # Force Qt to provide information about source code location for qDebug, qInfo(), ... + QT_MESSAGELOGCONTEXT ) set(Mayo_CompileOptions) diff --git a/src/app/dialog_exec_script.cpp b/src/app/dialog_exec_script.cpp index 2a7f3a9d..2b6960c8 100644 --- a/src/app/dialog_exec_script.cpp +++ b/src/app/dialog_exec_script.cpp @@ -96,16 +96,7 @@ void DialogExecScript::startScript() // Evaluate script program this->recreateScriptEngine(); auto jsVal = m_jsEngine->evaluate(scriptProgram(m_scriptFilePath), m_scriptFilePath); - if (jsVal.isError()) { - const QString name = jsVal.property("name").toString(); - const QString message = jsVal.property("message").toString(); - fnAddConsoleOutput( - QtCriticalMsg, - tr("%1: %2").arg(name, message), - jsVal.property("fileName").toString(), - jsVal.property("lineNumber").toInt() - ); - } + logScriptError(jsVal); }); m_taskMgr.run(m_scriptExecTaskId); } diff --git a/src/qtscripting/script_document.cpp b/src/qtscripting/script_document.cpp index d13452bb..b4b68235 100644 --- a/src/qtscripting/script_document.cpp +++ b/src/qtscripting/script_document.cpp @@ -12,13 +12,14 @@ #include "../qtcommon/qstring_conv.h" #include "../app/qtgui_utils.h" #include "script_application.h" +#include "script_global.h" #include "script_shape.h" #include "script_tree_node.h" #include -#include #include +#include namespace Mayo { @@ -68,7 +69,8 @@ void ScriptDocument::traverseModelTree(QJSValue fn) return; // Skip: tree node is a product(or "referred" shape) } #endif - fn.call({ QJSValue{nodeId} }); + auto jsVal = fn.call({ QJSValue{nodeId} }); + logScriptError(jsVal, "traverseModelTree()"); }); } @@ -99,7 +101,8 @@ void ScriptDocument::traverseShape(QJSValue shape, unsigned shapeTypeFilter, QJS const auto scriptShape = m_jsApp->jsEngine()->fromScriptValue(shape); BRepUtils::forEachSubShape(scriptShape.shape(), shapeTypeEnum, [&](const TopoDS_Shape& subShape) { auto jsSubShape = m_jsApp->jsEngine()->toScriptValue(ScriptShape(subShape)); - fn.call({ jsSubShape }); + auto jsVal = fn.call({ jsSubShape }); + logScriptError(jsVal, "traverseShape()"); }); } diff --git a/src/qtscripting/script_global.cpp b/src/qtscripting/script_global.cpp index 8790b9f0..00f73806 100644 --- a/src/qtscripting/script_global.cpp +++ b/src/qtscripting/script_global.cpp @@ -9,7 +9,9 @@ #include "../qtcommon/qstring_conv.h" #include "script_application.h" +#include #include +#include #include #include #include @@ -133,4 +135,16 @@ QJSEngine* createScriptEngine(const ApplicationPtr& app, QObject* parent) return jsEngine; } +void logScriptError(const QJSValue& jsVal, const char* functionName) +{ + if (jsVal.isError()) { + const QByteArray name = jsVal.property("name").toString().toUtf8(); + const QByteArray message = jsVal.property("message").toString().toUtf8(); + const QByteArray fileName = jsVal.property("fileName").toString().toUtf8(); + const int lineNumber = jsVal.property("lineNumber").toInt(); + const QMessageLogger msgLogger(fileName.constData(), lineNumber, functionName, "js"); + msgLogger.critical("%s: %s", name.constData(), message.constData()); + } +} + } // namespace Mayo diff --git a/src/qtscripting/script_global.h b/src/qtscripting/script_global.h index e6531f38..f72092cf 100644 --- a/src/qtscripting/script_global.h +++ b/src/qtscripting/script_global.h @@ -7,6 +7,7 @@ #include "../base/application_ptr.h" class QJSEngine; +class QJSValue; class QObject; namespace Mayo { @@ -14,5 +15,6 @@ namespace Mayo { class Application; QJSEngine* createScriptEngine(const ApplicationPtr& app, QObject* parent = nullptr); +void logScriptError(const QJSValue& jsVal, const char* functionName = nullptr); } // namespace Mayo