From b62f3e550a8dc3798f26e58c66a102eda795a486 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 25 Jan 2017 16:23:07 -0800 Subject: [PATCH] error check/log on execution, too --- assignment-client/src/entities/EntityServer.cpp | 4 +++- libraries/entities/src/EntityTree.cpp | 9 ++++++--- libraries/entities/src/EntityTree.h | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index ae227ea425..ff93dbae09 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -360,7 +360,9 @@ void EntityServer::scriptRequestFinished() { if (hasCorrectSyntax(program)) { _entityEditFilterEngine.evaluate(scriptContents); if (!hadUncaughtExceptions(_entityEditFilterEngine, urlString)) { - std::static_pointer_cast(_tree)->initEntityEditFilterEngine(&_entityEditFilterEngine); + std::static_pointer_cast(_tree)->initEntityEditFilterEngine(&_entityEditFilterEngine, [this]() { + return hadUncaughtExceptions(_entityEditFilterEngine, _entityEditFilter); + }); scriptRequest->deleteLater(); if (_scriptRequestLoop.isRunning()) { _scriptRequestLoop.quit(); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index b4d209033f..9a0b0a3d1c 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -918,8 +918,9 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList entityEditFilterHadUncaughtExceptions) { _entityEditFilterEngine = engine; + _entityEditFilterHadUncaughtExceptions = entityEditFilterHadUncaughtExceptions; auto global = _entityEditFilterEngine->globalObject(); _entityEditFilterFunction = global.property("filter"); _hasEntityEditFilter = _entityEditFilterFunction.isFunction(); @@ -942,12 +943,14 @@ bool EntityTree::filterProperties(EntityItemProperties& propertiesIn, EntityItem args << inputValues; QScriptValue result = _entityEditFilterFunction.call(_nullObjectForFilter, args); + if (_entityEditFilterHadUncaughtExceptions()) { + result = QScriptValue(); + } - propertiesOut.copyFromScriptValue(result, false); bool accepted = result.isObject(); // filters should return null or false to completely reject edit or add if (accepted) { + propertiesOut.copyFromScriptValue(result, false); // Javascript objects are == only if they are the same object. To compare arbitrary values, we need to use JSON. - auto out = QJsonValue::fromVariant(result.toVariant()); wasChanged = in != out; if (wasChanged) { diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index a643c481cc..16fb0f68e8 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -262,7 +262,7 @@ public: void notifyNewCollisionSoundURL(const QString& newCollisionSoundURL, const EntityItemID& entityID); - void initEntityEditFilterEngine(QScriptEngine* engine); + void initEntityEditFilterEngine(QScriptEngine* engine, std::function entityEditFilterHadUncaughtExceptions); static const float DEFAULT_MAX_TMP_ENTITY_LIFETIME; @@ -356,6 +356,7 @@ protected: QScriptEngine* _entityEditFilterEngine{}; QScriptValue _entityEditFilterFunction{}; QScriptValue _nullObjectForFilter{}; + std::function _entityEditFilterHadUncaughtExceptions; QStringList _entityScriptSourceWhitelist; };