diff --git a/source/scriptinterface/ScriptVal.cpp b/source/scriptinterface/ScriptVal.cpp index 93eb66a1c5..b62ce51a75 100644 --- a/source/scriptinterface/ScriptVal.cpp +++ b/source/scriptinterface/ScriptVal.cpp @@ -52,5 +52,9 @@ jsval CScriptValRooted::get() const bool CScriptValRooted::undefined() const { return (!m_Val || *m_Val == JSVAL_VOID); - +} + +bool CScriptValRooted::uninitialised() const +{ + return !m_Val; } diff --git a/source/scriptinterface/ScriptVal.h b/source/scriptinterface/ScriptVal.h index 772be08e24..8a7c3b8222 100644 --- a/source/scriptinterface/ScriptVal.h +++ b/source/scriptinterface/ScriptVal.h @@ -49,6 +49,8 @@ public: bool undefined() const; + bool uninitialised() const; + private: boost::shared_ptr m_Val; }; diff --git a/source/simulation2/scripting/MessageTypeConversions.cpp b/source/simulation2/scripting/MessageTypeConversions.cpp index 660e6805d8..e9f31d650c 100644 --- a/source/simulation2/scripting/MessageTypeConversions.cpp +++ b/source/simulation2/scripting/MessageTypeConversions.cpp @@ -50,6 +50,14 @@ jsval prop; if (! ScriptInterface::FromJSVal(scriptInterface.GetContext(), prop, name)) \ return NULL; +jsval CMessage::ToJSValCached(ScriptInterface& scriptInterface) const +{ + if (m_Cached.uninitialised()) + m_Cached = CScriptValRooted(scriptInterface.GetContext(), ToJSVal(scriptInterface)); + + return m_Cached.get(); +} + //////////////////////////////// jsval CMessageTurnStart::ToJSVal(ScriptInterface& UNUSED(scriptInterface)) const diff --git a/source/simulation2/scripting/ScriptComponent.cpp b/source/simulation2/scripting/ScriptComponent.cpp index f6f96da1d1..e896275e11 100644 --- a/source/simulation2/scripting/ScriptComponent.cpp +++ b/source/simulation2/scripting/ScriptComponent.cpp @@ -53,9 +53,7 @@ void CComponentTypeScript::HandleMessage(const CSimContext& UNUSED(context), con { const char* name = global ? msg.GetScriptGlobalHandlerName() : msg.GetScriptHandlerName(); - CScriptVal msgVal = msg.ToJSVal(m_ScriptInterface); - // TODO: repeated conversions are exceedingly inefficient. Should - // cache this once per message (if it's used by >= 1 scripted component) + CScriptVal msgVal = msg.ToJSValCached(m_ScriptInterface); if (!m_ScriptInterface.CallFunctionVoid(m_Instance, name, msgVal)) LOGERROR(L"Script message handler %hs failed", name);