From a443157dd75b5b112f295642cf565fcebed14c8a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 10:40:46 -0800 Subject: [PATCH] Update ScriptEngine::entityScriptingInterface to be static pointer Statically allocating the EntityScriptingInterface means we can't make sure it is initialized AFTER NodeList has been initialized --- libraries/script-engine/src/ScriptEngine.cpp | 30 +++++++++++++------- libraries/script-engine/src/ScriptEngine.h | 4 +-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 3bdf9a9fa9..944714552a 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -44,7 +44,7 @@ #include "MIDIEvent.h" -EntityScriptingInterface ScriptEngine::_entityScriptingInterface; +EntityScriptingInterface* ScriptEngine::_entityScriptingInterface; static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){ qDebug() << "script:print()<<" << context->argument(0).toString(); @@ -73,6 +73,13 @@ void inputControllerFromScriptValue(const QScriptValue &object, AbstractInputCon out = qobject_cast(object.toQObject()); } +EntityScriptingInterface* ScriptEngine::getEntityScriptingInterface() { + if (ScriptEngine::_entityScriptingInterface == nullptr) { + ScriptEngine::_entityScriptingInterface = new EntityScriptingInterface(); + } + return ScriptEngine::_entityScriptingInterface; +} + ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString, AbstractControllerScriptingInterface* controllerScriptingInterface) : @@ -97,6 +104,7 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam _isUserLoaded(false), _arrayBufferClass(new ArrayBufferClass(this)) { + getEntityScriptingInterface(); _allScriptsMutex.lock(); _allKnownScriptEngines.insert(this); _allScriptsMutex.unlock(); @@ -314,7 +322,7 @@ void ScriptEngine::init() { auto sceneScriptingInterface = DependencyManager::set(); - _entityScriptingInterface.init(); + _entityScriptingInterface->init(); // register various meta-types registerMetaTypes(this); @@ -352,7 +360,7 @@ void ScriptEngine::init() { registerGlobalObject("Script", this); registerGlobalObject("Audio", &AudioScriptingInterface::getInstance()); registerGlobalObject("Controller", _controllerScriptingInterface); - registerGlobalObject("Entities", &_entityScriptingInterface); + registerGlobalObject("Entities", _entityScriptingInterface); registerGlobalObject("Quat", &_quatLibrary); registerGlobalObject("Vec3", &_vec3Library); registerGlobalObject("Uuid", &_uuidLibrary); @@ -489,13 +497,13 @@ void ScriptEngine::run() { break; } - if (!_isFinished && _entityScriptingInterface.getEntityPacketSender()->serversExist()) { + if (!_isFinished && _entityScriptingInterface->getEntityPacketSender()->serversExist()) { // release the queue of edit entity messages. - _entityScriptingInterface.getEntityPacketSender()->releaseQueuedMessages(); + _entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); // since we're in non-threaded mode, call process so that the packets are sent - if (!_entityScriptingInterface.getEntityPacketSender()->isThreaded()) { - _entityScriptingInterface.getEntityPacketSender()->process(); + if (!_entityScriptingInterface->getEntityPacketSender()->isThreaded()) { + _entityScriptingInterface->getEntityPacketSender()->process(); } } @@ -622,13 +630,13 @@ void ScriptEngine::run() { // kill the avatar identity timer delete _avatarIdentityTimer; - if (_entityScriptingInterface.getEntityPacketSender()->serversExist()) { + if (_entityScriptingInterface->getEntityPacketSender()->serversExist()) { // release the queue of edit entity messages. - _entityScriptingInterface.getEntityPacketSender()->releaseQueuedMessages(); + _entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); // since we're in non-threaded mode, call process so that the packets are sent - if (!_entityScriptingInterface.getEntityPacketSender()->isThreaded()) { - _entityScriptingInterface.getEntityPacketSender()->process(); + if (!_entityScriptingInterface->getEntityPacketSender()->isThreaded()) { + _entityScriptingInterface->getEntityPacketSender()->process(); } } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 154fdb88e3..7241baae95 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -47,7 +47,7 @@ public: ~ScriptEngine(); /// Access the EntityScriptingInterface in order to initialize it with a custom packet sender and jurisdiction listener - static EntityScriptingInterface* getEntityScriptingInterface() { return &_entityScriptingInterface; } + static EntityScriptingInterface* getEntityScriptingInterface(); ArrayBufferClass* getArrayBufferClass() { return _arrayBufferClass; } @@ -153,7 +153,7 @@ private: QObject* setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot); void stopTimer(QTimer* timer); - static EntityScriptingInterface _entityScriptingInterface; + static EntityScriptingInterface* _entityScriptingInterface; AbstractControllerScriptingInterface* _controllerScriptingInterface; AvatarData* _avatarData;