From b1d6a0518a38bf37928233d31f764132081f85ed Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Dec 2023 15:55:58 +0100 Subject: Evaluator: Do not let C++ exceptions travel through QuickJS We have to turn them into JS values at the API border. Task-number: QBS-1770 Change-Id: Ia3178c9cc7611b9609cb8d006c742434d299873c Reviewed-by: Ivan Komissarov --- src/lib/corelib/language/evaluator.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lib/corelib/language/evaluator.cpp b/src/lib/corelib/language/evaluator.cpp index ef9376194..084f2f4a9 100644 --- a/src/lib/corelib/language/evaluator.cpp +++ b/src/lib/corelib/language/evaluator.cpp @@ -77,13 +77,15 @@ static int getEvalPropertyNames(JSContext *ctx, JSPropertyEnum **ptab, uint32_t JSValueConst obj); static int getEvalProperty(JSContext *ctx, JSPropertyDescriptor *desc, JSValueConst obj, JSAtom prop); +static int getEvalPropertySafe(JSContext *ctx, JSPropertyDescriptor *desc, + JSValueConst obj, JSAtom prop); static bool debugProperties = false; Evaluator::Evaluator(ScriptEngine *scriptEngine) : m_scriptEngine(scriptEngine) , m_scriptClass(scriptEngine->registerClass("Evaluator", nullptr, nullptr, JS_UNDEFINED, - getEvalPropertyNames, getEvalProperty)) + getEvalPropertyNames, getEvalPropertySafe)) { scriptEngine->registerEvaluator(this); } @@ -995,5 +997,15 @@ static int getEvalProperty(JSContext *ctx, JSPropertyDescriptor *desc, JSValue o return 0; } +static int getEvalPropertySafe(JSContext *ctx, JSPropertyDescriptor *desc, JSValue obj, JSAtom prop) +{ + try { + return getEvalProperty(ctx, desc, obj, prop); + } catch (const ErrorInfo &e) { + ScopedJsValue error(ctx, throwError(ctx, e.toString())); + return -1; + } +} + } // namespace Internal } // namespace qbs -- cgit v1.2.3