aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2023-12-01 15:55:58 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2023-12-01 16:45:31 +0000
commitb1d6a0518a38bf37928233d31f764132081f85ed (patch)
treeba5694900dae0155f7de8bdc406700b5f828c62f
parent36e230e0bafdbe11bd31bd294ae745403c553c74 (diff)
Evaluator: Do not let C++ exceptions travel through QuickJSv2.2.1
We have to turn them into JS values at the API border. Task-number: QBS-1770 Change-Id: Ia3178c9cc7611b9609cb8d006c742434d299873c Reviewed-by: Ivan Komissarov <ABBAPOH@gmail.com>
-rw-r--r--src/lib/corelib/language/evaluator.cpp14
1 files changed, 13 insertions, 1 deletions
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