diff --git a/source/graphics/MapGenerator.cpp b/source/graphics/MapGenerator.cpp index 1f10bf8bef..046a26c532 100644 --- a/source/graphics/MapGenerator.cpp +++ b/source/graphics/MapGenerator.cpp @@ -323,7 +323,7 @@ JS::Value CMapGeneratorWorker::LoadHeightmap(const VfsPath& filename) ScriptRequest rq(m_ScriptInterface); JS::RootedValue returnValue(rq.cx); - ToJSVal_vector(rq, &returnValue, heightmap); + Script::ToJSVal(rq, &returnValue, heightmap); return returnValue; } diff --git a/source/gui/CGUISetting.cpp b/source/gui/CGUISetting.cpp index 56b8256172..588468d558 100644 --- a/source/gui/CGUISetting.cpp +++ b/source/gui/CGUISetting.cpp @@ -72,7 +72,7 @@ bool CGUISimpleSetting::DoFromJSVal(const ScriptRequest& rq, JS::Hand if (value.isString()) { CStr name; - if (!ScriptInterface::FromJSVal(rq, value, name)) + if (!Script::FromJSVal(rq, value, name)) return false; if (!m_Setting.ParseString(m_pObject.GetGUI(), name)) @@ -82,20 +82,19 @@ bool CGUISimpleSetting::DoFromJSVal(const ScriptRequest& rq, JS::Hand } return true; } - - return ScriptInterface::FromJSVal(rq, value, m_Setting); + return Script::FromJSVal(rq, value, m_Setting); }; template bool CGUISimpleSetting::DoFromJSVal(const ScriptRequest& rq, JS::HandleValue value) { - return ScriptInterface::FromJSVal(rq, value, m_Setting); + return Script::FromJSVal(rq, value, m_Setting); }; template void CGUISimpleSetting::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue value) { - ScriptInterface::ToJSVal(rq, value, m_Setting); + Script::ToJSVal(rq, value, m_Setting); }; /** diff --git a/source/gui/CGUISetting.h b/source/gui/CGUISetting.h index a7126139d4..eb9ef2233e 100644 --- a/source/gui/CGUISetting.h +++ b/source/gui/CGUISetting.h @@ -41,12 +41,12 @@ public: bool FromString(const CStrW& value, const bool sendMessage); /** - * Parses the given JS::Value using ScriptInterface::FromJSVal and assigns it to the setting data. + * Parses the given JS::Value using Script::FromJSVal and assigns it to the setting data. */ bool FromJSVal(const ScriptRequest& rq, JS::HandleValue value, const bool sendMessage); /** - * Converts the setting data to a JS::Value using ScriptInterface::ToJSVal. + * Converts the setting data to a JS::Value using Script::ToJSVal. */ virtual void ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue value) = 0; diff --git a/source/gui/ObjectTypes/CHotkeyPicker.cpp b/source/gui/ObjectTypes/CHotkeyPicker.cpp index faa9f9e0e4..08445357df 100644 --- a/source/gui/ObjectTypes/CHotkeyPicker.cpp +++ b/source/gui/ObjectTypes/CHotkeyPicker.cpp @@ -31,13 +31,13 @@ const CStr CHotkeyPicker::EventNameCombination = "Combination"; const CStr CHotkeyPicker::EventNameKeyChange = "KeyChange"; // Don't send the scancode, JS doesn't care. -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CHotkeyPicker::Key& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CHotkeyPicker::Key& val) { - ScriptInterface::ToJSVal(rq, ret, val.scancodeName); + Script::ToJSVal(rq, ret, val.scancodeName); } // Unused, but JSVAL_VECTOR requires it. -template<> bool ScriptInterface::FromJSVal(const ScriptRequest&, const JS::HandleValue, CHotkeyPicker::Key&) +template<> bool Script::FromJSVal(const ScriptRequest&, const JS::HandleValue, CHotkeyPicker::Key&) { LOGWARNING("FromJSVal: Not implemented"); return false; @@ -61,7 +61,7 @@ void CHotkeyPicker::FireEvent(const CStr& event) JS::RootedValueArray<1> args(rq.cx); JS::RootedValue keys(rq.cx); - m_pGUI.GetScriptInterface()->ToJSVal(rq, &keys, m_KeysPressed); + Script::ToJSVal(rq, &keys, m_KeysPressed); args[0].set(keys); ScriptEvent(event, args); } diff --git a/source/gui/ObjectTypes/CHotkeyPicker.h b/source/gui/ObjectTypes/CHotkeyPicker.h index 0325c423a7..b00aca751b 100644 --- a/source/gui/ObjectTypes/CHotkeyPicker.h +++ b/source/gui/ObjectTypes/CHotkeyPicker.h @@ -38,7 +38,6 @@ class CHotkeyPicker : public IGUIObject { GUI_OBJECT(CHotkeyPicker) - friend class ScriptInterface; public: CHotkeyPicker(CGUI& pGUI); virtual ~CHotkeyPicker(); @@ -54,6 +53,14 @@ public: // Pre-empt events: this is our sole purpose. virtual InReaction PreemptEvent(const SDL_Event_* ev); + + struct Key + { + // The scancode is used for fast comparisons. + SDL_Scancode code; + // This is the name ultimately stored in the config file. + CStr scancodeName; + }; protected: // Fire an event with m_KeysPressed as argument. void FireEvent(const CStr& event); @@ -64,13 +71,6 @@ protected: double m_LastKeyChange; // Keep track of which keys we are pressing, and precompute their name for JS code. - struct Key - { - // The scancode is used for fast comparisons. - SDL_Scancode code; - // This is the name ultimately stored in the config file. - CStr scancodeName; - }; std::vector m_KeysPressed; static const CStr EventNameCombination; diff --git a/source/gui/ObjectTypes/CMiniMap.cpp b/source/gui/ObjectTypes/CMiniMap.cpp index 4166f4b29e..d06580d149 100644 --- a/source/gui/ObjectTypes/CMiniMap.cpp +++ b/source/gui/ObjectTypes/CMiniMap.cpp @@ -284,7 +284,7 @@ bool CMiniMap::FireWorldClickEvent(int button, int UNUSED(clicks)) ScriptInterface::CreateObject(rq, &coords, "x", x, "z", z); JS::RootedValue buttonJs(rq.cx); - ScriptInterface::ToJSVal(rq, &buttonJs, button); + Script::ToJSVal(rq, &buttonJs, button); JS::RootedValueVector paramData(rq.cx); ignore_result(paramData.append(coords)); diff --git a/source/gui/Scripting/GuiScriptConversions.cpp b/source/gui/Scripting/GuiScriptConversions.cpp index 1e5f2b9fab..9534a55397 100644 --- a/source/gui/Scripting/GuiScriptConversions.cpp +++ b/source/gui/Scripting/GuiScriptConversions.cpp @@ -29,14 +29,15 @@ #include "ps/Hotkey.h" #include "ps/CLogger.h" #include "scriptinterface/ScriptConversions.h" +#include "scriptinterface/ScriptInterface.h" // CreateObject #include -#define SET(obj, name, value) STMT(JS::RootedValue v_(rq.cx); AssignOrToJSVal(rq, &v_, (value)); JS_SetProperty(rq.cx, obj, (name), v_)) +#define SET(obj, name, value) STMT(JS::RootedValue v_(rq.cx); Script::ToJSVal(rq, &v_, (value)); JS_SetProperty(rq.cx, obj, (name), v_)) // ignore JS_SetProperty return value, because errors should be impossible // and we can't do anything useful in the case of errors anyway -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, SDL_Event_ const& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, SDL_Event_ const& val) { const char* typeName; @@ -129,7 +130,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS ret.setObject(*obj); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, IGUIObject* const& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, IGUIObject* const& val) { if (val == nullptr) ret.setNull(); @@ -137,7 +138,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSE ret.setObject(*val->GetJSObject()); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, IGUIObject*& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, IGUIObject*& out) { if (!v.isObject()) { @@ -153,12 +154,12 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUIString& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUIString& val) { - ScriptInterface::ToJSVal(rq, ret, val.GetOriginalString()); + Script::ToJSVal(rq, ret, val.GetOriginalString()); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUIString& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUIString& out) { std::wstring val; if (!FromJSVal(rq, v, val)) @@ -171,7 +172,7 @@ JSVAL_VECTOR(CVector2D) JSVAL_VECTOR(std::vector) JSVAL_VECTOR(CGUIString) -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUIColor& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUIColor& val) { ToJSVal(rq, ret, val); } @@ -179,11 +180,11 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS: /** * The color depends on the predefined color database stored in the current GUI page. */ -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUIColor& out) = delete; +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUIColor& out) = delete; -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CRect& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CRect& val) { - CreateObject( + ScriptInterface::CreateObject( rq, ret, "left", val.left, @@ -192,37 +193,37 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::Mut "bottom", val.bottom); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUISize& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUISize& val) { val.ToJSVal(rq, ret); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUISize& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUISize& out) { return out.FromJSVal(rq, v); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUIList& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUIList& val) { ToJSVal(rq, ret, val.m_Items); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUIList& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUIList& out) { return FromJSVal(rq, v, out.m_Items); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUISeries& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUISeries& val) { ToJSVal(rq, ret, val.m_Series); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUISeries& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUISeries& out) { return FromJSVal(rq, v, out.m_Series); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const EVAlign& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const EVAlign& val) { std::string word; switch (val) @@ -247,7 +248,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::M ToJSVal(rq, ret, word); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, EVAlign& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, EVAlign& out) { std::string word; FromJSVal(rq, v, word); @@ -267,7 +268,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS: return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const EAlign& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const EAlign& val) { std::string word; switch (val) @@ -289,7 +290,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::Mu ToJSVal(rq, ret, word); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, EAlign& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, EAlign& out) { std::string word; FromJSVal(rq, v, word); @@ -309,12 +310,12 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS:: return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUISpriteInstance& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CGUISpriteInstance& val) { ToJSVal(rq, ret, val.GetName()); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUISpriteInstance& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CGUISpriteInstance& out) { std::string name; if (!FromJSVal(rq, v, name)) @@ -324,12 +325,12 @@ template<> bool ScriptInterface::FromJSVal(const ScriptReque return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CSize2D& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CSize2D& val) { - CreateObject(rq, ret, "width", val.Width, "height", val.Height); + ScriptInterface::CreateObject(rq, ret, "width", val.Width, "height", val.Height); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CSize2D& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CSize2D& out) { if (!v.isObject()) { @@ -352,12 +353,12 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS: return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CVector2D& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CVector2D& val) { - CreateObject(rq, ret, "x", val.X, "y", val.Y); + ScriptInterface::CreateObject(rq, ret, "x", val.X, "y", val.Y); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CVector2D& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CVector2D& out) { if (!v.isObject()) { diff --git a/source/gui/Scripting/JSInterface_GUIProxy_impl.h b/source/gui/Scripting/JSInterface_GUIProxy_impl.h index 202076dbd0..224851435f 100644 --- a/source/gui/Scripting/JSInterface_GUIProxy_impl.h +++ b/source/gui/Scripting/JSInterface_GUIProxy_impl.h @@ -176,7 +176,7 @@ bool JSI_GUIProxy::get(JSContext* cx, JS::HandleObject proxy, JS::HandleValue return false; std::string propName; - if (!ScriptInterface::FromJSVal(rq, idval, propName)) + if (!Script::FromJSVal(rq, idval, propName)) return false; // Return function properties. Specializable. @@ -217,7 +217,7 @@ bool JSI_GUIProxy::get(JSContext* cx, JS::HandleObject proxy, JS::HandleValue } else if (propName == "name") { - ScriptInterface::ToJSVal(rq, vp, e->GetName()); + Script::ToJSVal(rq, vp, e->GetName()); return true; } else if (e->SettingExists(propName)) @@ -249,13 +249,13 @@ bool JSI_GUIProxy::set(JSContext* cx, JS::HandleObject proxy, JS::HandleId id return result.fail(JSMSG_BAD_PROP_ID); std::string propName; - if (!ScriptInterface::FromJSVal(rq, idval, propName)) + if (!Script::FromJSVal(rq, idval, propName)) return result.fail(JSMSG_BAD_PROP_ID); if (propName == "name") { std::string value; - if (!ScriptInterface::FromJSVal(rq, vp, value)) + if (!Script::FromJSVal(rq, vp, value)) return result.fail(JSMSG_BAD_PROP_ID); e->SetName(value); return result.succeed(); @@ -304,7 +304,7 @@ bool JSI_GUIProxy::delete_(JSContext* cx, JS::HandleObject proxy, JS::HandleI return result.fail(JSMSG_BAD_PROP_ID); std::string propName; - if (!ScriptInterface::FromJSVal(rq, idval, propName)) + if (!Script::FromJSVal(rq, idval, propName)) return result.fail(JSMSG_BAD_PROP_ID); // event handlers diff --git a/source/gui/Scripting/JSInterface_GUISize.cpp b/source/gui/Scripting/JSInterface_GUISize.cpp index 9678bd688b..ed2edc6473 100644 --- a/source/gui/Scripting/JSInterface_GUISize.cpp +++ b/source/gui/Scripting/JSInterface_GUISize.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -124,6 +124,6 @@ bool JSI_GUISize::toString(JSContext* cx, uint argc, JS::Value* vp) SIDE(bottom); #undef SIDE - ScriptInterface::ToJSVal(rq, args.rval(), buffer); + Script::ToJSVal(rq, args.rval(), buffer); return true; } diff --git a/source/gui/SettingTypes/CGUIHotkey.cpp b/source/gui/SettingTypes/CGUIHotkey.cpp index 0f358ad296..a0684837f4 100644 --- a/source/gui/SettingTypes/CGUIHotkey.cpp +++ b/source/gui/SettingTypes/CGUIHotkey.cpp @@ -21,7 +21,7 @@ #include "gui/CGUI.h" #include "gui/ObjectBases/IGUIObject.h" -#include "scriptinterface/ScriptInterface.h" +#include "scriptinterface/ScriptConversions.h" bool CGUIHotkey::DoFromString(const CStrW& value) { @@ -34,7 +34,7 @@ bool CGUIHotkey::DoFromString(const CStrW& value) bool CGUIHotkey::DoFromJSVal(const ScriptRequest& rq, JS::HandleValue value) { m_pObject.GetGUI().UnsetObjectHotkey(&m_pObject, m_Setting); - if (!ScriptInterface::FromJSVal(rq, value, m_Setting)) + if (!Script::FromJSVal(rq, value, m_Setting)) return false; m_pObject.GetGUI().SetObjectHotkey(&m_pObject, m_Setting); return true; diff --git a/source/gui/SettingTypes/CGUISize.cpp b/source/gui/SettingTypes/CGUISize.cpp index 3dde75b7fe..8b08963e90 100644 --- a/source/gui/SettingTypes/CGUISize.cpp +++ b/source/gui/SettingTypes/CGUISize.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -182,7 +182,7 @@ bool CGUISize::FromJSVal(const ScriptRequest& rq, JS::HandleValue v) if (v.isString()) { CStrW str; - if (!ScriptInterface::FromJSVal(rq, v, str)) + if (!Script::FromJSVal(rq, v, str)) { LOGERROR("CGUISize could not read JS string"); return false; diff --git a/source/gui/SettingTypes/MouseEventMask.cpp b/source/gui/SettingTypes/MouseEventMask.cpp index ff346a19dd..88967db792 100644 --- a/source/gui/SettingTypes/MouseEventMask.cpp +++ b/source/gui/SettingTypes/MouseEventMask.cpp @@ -26,7 +26,7 @@ #include "ps/Filesystem.h" #include "ps/CLogger.h" #include "ps/CStr.h" -#include "scriptinterface/ScriptInterface.h" +#include "scriptinterface/ScriptConversions.h" class IGUIObject; class IGUISetting; @@ -53,13 +53,13 @@ CGUIMouseEventMask::~CGUIMouseEventMask() void CGUIMouseEventMask::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue Value) { - ScriptInterface::ToJSVal(rq, Value, m_Spec); + Script::ToJSVal(rq, Value, m_Spec); } bool CGUIMouseEventMask::DoFromJSVal(const ScriptRequest& rq, JS::HandleValue value) { CStrW spec; - if (!ScriptInterface::FromJSVal(rq, value, spec)) + if (!Script::FromJSVal(rq, value, spec)) return false; return DoFromString(spec); } diff --git a/source/gui/tests/test_GuiManager.h b/source/gui/tests/test_GuiManager.h index b5e8a6429d..ad57db8ff7 100755 --- a/source/gui/tests/test_GuiManager.h +++ b/source/gui/tests/test_GuiManager.h @@ -83,37 +83,37 @@ public: // called, to avoid infinite additions of objects. g_GUI->TickObjects(); pageScriptInterface.GetProperty(global, "called1", &js_called_value); - ScriptInterface::FromJSVal(prq, js_called_value, called_value); + Script::FromJSVal(prq, js_called_value, called_value); TS_ASSERT_EQUALS(called_value, 1); pageScriptInterface.GetProperty(global, "called2", &js_called_value); - ScriptInterface::FromJSVal(prq, js_called_value, called_value); + Script::FromJSVal(prq, js_called_value, called_value); TS_ASSERT_EQUALS(called_value, 1); pageScriptInterface.GetProperty(global, "called3", &js_called_value); - ScriptInterface::FromJSVal(prq, js_called_value, called_value); + Script::FromJSVal(prq, js_called_value, called_value); TS_ASSERT_EQUALS(called_value, 0); pageScriptInterface.GetProperty(global, "called4", &js_called_value); - ScriptInterface::FromJSVal(prq, js_called_value, called_value); + Script::FromJSVal(prq, js_called_value, called_value); TS_ASSERT_EQUALS(called_value, 0); // Ticking again will still call the second object, but also the fourth. g_GUI->TickObjects(); pageScriptInterface.GetProperty(global, "called1", &js_called_value); - ScriptInterface::FromJSVal(prq, js_called_value, called_value); + Script::FromJSVal(prq, js_called_value, called_value); TS_ASSERT_EQUALS(called_value, 1); pageScriptInterface.GetProperty(global, "called2", &js_called_value); - ScriptInterface::FromJSVal(prq, js_called_value, called_value); + Script::FromJSVal(prq, js_called_value, called_value); TS_ASSERT_EQUALS(called_value, 2); pageScriptInterface.GetProperty(global, "called3", &js_called_value); - ScriptInterface::FromJSVal(prq, js_called_value, called_value); + Script::FromJSVal(prq, js_called_value, called_value); TS_ASSERT_EQUALS(called_value, 0); pageScriptInterface.GetProperty(global, "called4", &js_called_value); - ScriptInterface::FromJSVal(prq, js_called_value, called_value); + Script::FromJSVal(prq, js_called_value, called_value); TS_ASSERT_EQUALS(called_value, 1); } @@ -155,12 +155,12 @@ public: JS::RootedValue js_hotkey_pressed_value(prq.cx); pageScriptInterface.GetProperty(global, "state_before", &js_hotkey_pressed_value); - ScriptInterface::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); + Script::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); TS_ASSERT_EQUALS(hotkey_pressed_value, true); hotkey_pressed_value = false; pageScriptInterface.GetProperty(global, "state_after", &js_hotkey_pressed_value); - ScriptInterface::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); + Script::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); TS_ASSERT_EQUALS(hotkey_pressed_value, true); // We are listening to KeyDown events, so repeat shouldn't matter. @@ -171,12 +171,12 @@ public: hotkey_pressed_value = false; pageScriptInterface.GetProperty(global, "state_before", &js_hotkey_pressed_value); - ScriptInterface::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); + Script::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); TS_ASSERT_EQUALS(hotkey_pressed_value, true); hotkey_pressed_value = false; pageScriptInterface.GetProperty(global, "state_after", &js_hotkey_pressed_value); - ScriptInterface::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); + Script::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); TS_ASSERT_EQUALS(hotkey_pressed_value, true); hotkeyNotification.ev.type = SDL_KEYUP; @@ -186,12 +186,12 @@ public: hotkey_pressed_value = true; pageScriptInterface.GetProperty(global, "state_before", &js_hotkey_pressed_value); - ScriptInterface::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); + Script::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); TS_ASSERT_EQUALS(hotkey_pressed_value, false); hotkey_pressed_value = true; pageScriptInterface.GetProperty(global, "state_after", &js_hotkey_pressed_value); - ScriptInterface::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); + Script::FromJSVal(prq, js_hotkey_pressed_value, hotkey_pressed_value); TS_ASSERT_EQUALS(hotkey_pressed_value, false); UnloadHotkeys(); diff --git a/source/lobby/XmppClient.cpp b/source/lobby/XmppClient.cpp index fcf24679a3..f78fc11480 100644 --- a/source/lobby/XmppClient.cpp +++ b/source/lobby/XmppClient.cpp @@ -692,7 +692,7 @@ template void SetGUIMessageProperty(const ScriptRequest& rq, JS::HandleObject messageObj, const std::string& propertyName, const T& propertyValue, Args const&... args) { JS::RootedValue scriptPropertyValue(rq.cx); - ScriptInterface::AssignOrToJSVal(rq, &scriptPropertyValue, propertyValue); + Script::ToJSVal(rq, &scriptPropertyValue, propertyValue); JS_DefineProperty(rq.cx, messageObj, propertyName.c_str(), scriptPropertyValue, JSPROP_ENUMERATE); SetGUIMessageProperty(rq, messageObj, args...); } diff --git a/source/lobby/scripting/GlooxScriptConversions.cpp b/source/lobby/scripting/GlooxScriptConversions.cpp index e3c5decb43..52adfee853 100644 --- a/source/lobby/scripting/GlooxScriptConversions.cpp +++ b/source/lobby/scripting/GlooxScriptConversions.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -23,37 +23,37 @@ #include "lobby/XmppClient.h" #include "scriptinterface/ScriptInterface.h" -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const glooxwrapper::string& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const glooxwrapper::string& val) { ToJSVal(rq, ret, wstring_from_utf8(val.to_string())); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::Presence::PresenceType& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::Presence::PresenceType& val) { ToJSVal(rq, ret, XmppClient::GetPresenceString(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::MUCRoomRole& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::MUCRoomRole& val) { ToJSVal(rq, ret, XmppClient::GetRoleString(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::StanzaError& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::StanzaError& val) { ToJSVal(rq, ret, wstring_from_utf8(XmppClient::StanzaErrorToString(val))); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::ConnectionError& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::ConnectionError& val) { ToJSVal(rq, ret, wstring_from_utf8(XmppClient::ConnectionErrorToString(val))); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::RegistrationResult& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::RegistrationResult& val) { ToJSVal(rq, ret, wstring_from_utf8(XmppClient::RegistrationResultToString(val))); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::CertStatus& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const gloox::CertStatus& val) { ToJSVal(rq, ret, wstring_from_utf8(XmppClient::CertificateErrorToString(val))); } diff --git a/source/main.cpp b/source/main.cpp index 805f95fb30..c619f5689d 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -250,7 +250,7 @@ static void PumpEvents() if (g_GUI) { JS::RootedValue tmpVal(rq.cx); - ScriptInterface::ToJSVal(rq, &tmpVal, ev); + Script::ToJSVal(rq, &tmpVal, ev); std::string data = g_GUI->GetScriptInterface()->StringifyJSON(&tmpVal); PROFILE2_ATTR("%s", data.c_str()); } diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index 5b955a9e94..2fde8fff38 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -197,7 +197,7 @@ void GUI_DisplayLoadProgress(int percent, const wchar_t* pending_task) ignore_result(paramData.append(JS::NumberValue(percent))); JS::RootedValue valPendingTask(rq.cx); - scriptInterface.ToJSVal(rq, &valPendingTask, pending_task); + Script::ToJSVal(rq, &valPendingTask, pending_task); ignore_result(paramData.append(valPendingTask)); g_GUI->SendEventToAll(g_EventNameGameLoadProgress, paramData); @@ -1493,7 +1493,7 @@ bool Autostart(const CmdLineArgs& args) if (scriptInterface.HasProperty(settings, "TriggerScripts")) { scriptInterface.GetProperty(settings, "TriggerScripts", &triggerScripts); - FromJSVal_vector(rq, triggerScripts, triggerScriptsVector); + Script::FromJSVal(rq, triggerScripts, triggerScriptsVector); } if (!CRenderer::IsInitialised()) @@ -1523,7 +1523,7 @@ bool Autostart(const CmdLineArgs& args) && scriptInterface.GetProperty(data, "Scripts", &victoryScripts) && !victoryScripts.isUndefined()) { std::vector victoryScriptsVector; - FromJSVal_vector(rq, victoryScripts, victoryScriptsVector); + Script::FromJSVal(rq, victoryScripts, victoryScriptsVector); triggerScriptsVector.insert(triggerScriptsVector.end(), victoryScriptsVector.begin(), victoryScriptsVector.end()); } else @@ -1533,7 +1533,7 @@ bool Autostart(const CmdLineArgs& args) } } - ToJSVal_vector(rq, &triggerScripts, triggerScriptsVector); + Script::ToJSVal(rq, &triggerScripts, triggerScriptsVector); scriptInterface.SetProperty(settings, "TriggerScripts", triggerScripts); int wonderDuration = 10; diff --git a/source/ps/Mod.cpp b/source/ps/Mod.cpp index e21ddaeacd..a3c3b3d0ec 100644 --- a/source/ps/Mod.cpp +++ b/source/ps/Mod.cpp @@ -314,7 +314,7 @@ JS::Value Mod::GetLoadedModsWithVersions(const ScriptInterface& scriptInterface) { ScriptRequest rq(scriptInterface); JS::RootedValue returnValue(rq.cx); - scriptInterface.ToJSVal(rq, &returnValue, g_LoadedModVersions); + Script::ToJSVal(rq, &returnValue, g_LoadedModVersions); return returnValue; } diff --git a/source/ps/ModInstaller.cpp b/source/ps/ModInstaller.cpp index 4cb4c5fd74..4629828153 100644 --- a/source/ps/ModInstaller.cpp +++ b/source/ps/ModInstaller.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -75,7 +75,7 @@ CModInstaller::ModInstallationResult CModInstaller::Install( JS::RootedValue name_val(rq.cx); if (!JS_GetProperty(rq.cx, json_obj, "name", &name_val)) return FAIL_ON_EXTRACT_NAME; - ScriptInterface::FromJSVal(rq, name_val, modName); + Script::FromJSVal(rq, name_val, modName); if (modName.empty()) return FAIL_ON_EXTRACT_NAME; } diff --git a/source/ps/ModIo.cpp b/source/ps/ModIo.cpp index 365b155b44..6cf86ce600 100644 --- a/source/ps/ModIo.cpp +++ b/source/ps/ModIo.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -632,7 +632,7 @@ bool ModIo::ParseGameIdResponse(const ScriptInterface& scriptInterface, const st FAIL("id property not a number."); id = -1; - if (!ScriptInterface::FromJSVal(rq, idProperty, id) || id <= 0) + if (!Script::FromJSVal(rq, idProperty, id) || id <= 0) FAIL("Invalid id."); return true; @@ -705,7 +705,7 @@ bool ModIo::ParseModsResponse(const ScriptInterface& scriptInterface, const std: for (const std::string& prop : { __VA_ARGS__ }) \ { \ std::string val; \ - if (!ScriptInterface::FromJSProperty(rq, obj, prop.c_str(), val, true)) \ + if (!Script::FromJSProperty(rq, obj, prop.c_str(), val, true)) \ { \ ok = false; \ copyStringError = "Failed to get " + prop + " from " + #obj + "."; \ @@ -745,7 +745,7 @@ bool ModIo::ParseModsResponse(const ScriptInterface& scriptInterface, const std: // Parse metadata_blob (sig+deps) std::string metadata_blob; - if (!ScriptInterface::FromJSProperty(rq, modFile, "metadata_blob", metadata_blob, true)) + if (!Script::FromJSProperty(rq, modFile, "metadata_blob", metadata_blob, true)) INVALIDATE_DATA_AND_CONTINUE("Failed to get metadata_blob from modFile."); JS::RootedValue metadata(rq.cx); @@ -755,11 +755,11 @@ bool ModIo::ParseModsResponse(const ScriptInterface& scriptInterface, const std: if (!metadata.isObject()) INVALIDATE_DATA_AND_CONTINUE("metadata_blob is not decoded as an object."); - if (!ScriptInterface::FromJSProperty(rq, metadata, "dependencies", data.dependencies, true)) + if (!Script::FromJSProperty(rq, metadata, "dependencies", data.dependencies, true)) INVALIDATE_DATA_AND_CONTINUE("Failed to get dependencies from metadata_blob."); std::vector minisigs; - if (!ScriptInterface::FromJSProperty(rq, metadata, "minisigs", minisigs, true)) + if (!Script::FromJSProperty(rq, metadata, "minisigs", minisigs, true)) INVALIDATE_DATA_AND_CONTINUE("Failed to get minisigs from metadata_blob."); // Check we did find a valid matching signature. diff --git a/source/ps/Replay.cpp b/source/ps/Replay.cpp index 24345fdd15..1382fa0962 100644 --- a/source/ps/Replay.cpp +++ b/source/ps/Replay.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 Wildfire Games. +/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -169,7 +169,7 @@ void CReplayPlayer::CheckReplayMods(const ScriptInterface& scriptInterface, JS:: std::vector> enabledMods; JS::RootedValue enabledModsJS(rq.cx, Mod::GetLoadedModsWithVersions(scriptInterface)); - scriptInterface.FromJSVal(rq, enabledModsJS, enabledMods); + Script::FromJSVal(rq, enabledModsJS, enabledMods); CStr warn; if (replayMods.size() != enabledMods.size()) diff --git a/source/ps/XMB/XMBStorage.cpp b/source/ps/XMB/XMBStorage.cpp index 2dcd8e1b39..04f141500e 100644 --- a/source/ps/XMB/XMBStorage.cpp +++ b/source/ps/XMB/XMBStorage.cpp @@ -22,6 +22,7 @@ #include "lib/file/io/write_buffer.h" #include "lib/file/vfs/vfs.h" #include "ps/CLogger.h" +#include "scriptinterface/ScriptConversions.h" #include "scriptinterface/ScriptExtraHeaders.h" #include "scriptinterface/ScriptInterface.h" @@ -251,7 +252,7 @@ bool JSNodeData::Setup(XMBStorageWriter& xmb, JS::HandleValue value) if (attrib) { std::string attrVal; - if (!ScriptInterface::FromJSVal(rq, child, attrVal)) + if (!Script::FromJSVal(rq, child, attrVal)) { LOGERROR("Attributes must be convertible to string"); return false; @@ -305,7 +306,7 @@ bool JSNodeData::Output(WriteBuffer& writeBuffer, JS::HandleValue value) const if (!scriptInterface.GetProperty(value, "_string", &actualValue)) return false; std::string strVal; - if (!ScriptInterface::FromJSVal(rq, actualValue, strVal)) + if (!Script::FromJSVal(rq, actualValue, strVal)) { LOGERROR("'_string' value must be convertible to string"); return false; @@ -317,7 +318,7 @@ bool JSNodeData::Output(WriteBuffer& writeBuffer, JS::HandleValue value) const case JSTYPE_NUMBER: { std::string strVal; - if (!ScriptInterface::FromJSVal(rq, value, strVal)) + if (!Script::FromJSVal(rq, value, strVal)) return false; WriteStringAndLineNumber(writeBuffer, strVal, 0); diff --git a/source/ps/scripting/JSInterface_Hotkey.cpp b/source/ps/scripting/JSInterface_Hotkey.cpp index 5d54300698..859b19a8e3 100644 --- a/source/ps/scripting/JSInterface_Hotkey.cpp +++ b/source/ps/scripting/JSInterface_Hotkey.cpp @@ -49,20 +49,20 @@ static void ToJSVal_unordered_map(const ScriptRequest& rq, JS::MutableHandleValu for (const std::pair& item : val) { JS::RootedValue el(rq.cx); - ScriptInterface::ToJSVal(rq, &el, item.second); + Script::ToJSVal(rq, &el, item.second); JS_SetProperty(rq.cx, obj, item.first.c_str(), el); } ret.setObject(*obj); } template<> -void ScriptInterface::ToJSVal>>>(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::unordered_map>>& val) +void Script::ToJSVal>>>(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::unordered_map>>& val) { ToJSVal_unordered_map(rq, ret, val); } template<> -void ScriptInterface::ToJSVal>(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::unordered_map& val) +void Script::ToJSVal>(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::unordered_map& val) { ToJSVal_unordered_map(rq, ret, val); } @@ -90,7 +90,7 @@ JS::Value GetHotkeyMap(const ScriptRequest& rq) if (keymap.size() < 2 || keymap[0] < keymap[1]) hotkeys[mapping.name].emplace_back(keymap); } - ScriptInterface::ToJSVal(rq, &hotkeyMap, hotkeys); + Script::ToJSVal(rq, &hotkeyMap, hotkeys); return hotkeyMap; } @@ -107,7 +107,7 @@ JS::Value GetScancodeKeyNames(const ScriptRequest& rq) // This is slightly wasteful but should be fine overall, they are dense. for (int i = 0; i < MOUSE_LAST; ++i) map[FindScancodeName(static_cast(i))] = FindKeyName(static_cast(i)); - ScriptInterface::ToJSVal(rq, &obj, map); + Script::ToJSVal(rq, &obj, map); return obj; } @@ -121,7 +121,7 @@ void ReloadHotkeys() JS::Value GetConflicts(const ScriptRequest& rq, JS::HandleValue combination) { std::vector keys; - if (!ScriptInterface::FromJSVal(rq, combination, keys)) + if (!Script::FromJSVal(rq, combination, keys)) { LOGERROR("Invalid hotkey combination"); return JS::NullValue(); @@ -157,7 +157,7 @@ JS::Value GetConflicts(const ScriptRequest& rq, JS::HandleValue combination) return JS::NullValue(); JS::RootedValue ret(rq.cx); - ScriptInterface::ToJSVal(rq, &ret, conflicts); + Script::ToJSVal(rq, &ret, conflicts); return ret; } } diff --git a/source/ps/scripting/JSInterface_VFS.cpp b/source/ps/scripting/JSInterface_VFS.cpp index c7ef580640..d508c3340e 100644 --- a/source/ps/scripting/JSInterface_VFS.cpp +++ b/source/ps/scripting/JSInterface_VFS.cpp @@ -94,7 +94,7 @@ static Status BuildDirEntListCB(const VfsPath& pathname, const CFileInfo& UNUSED JS::RootedObject filenameArrayObj(s->rq.cx, s->filename_array); JS::RootedValue val(s->rq.cx); - ScriptInterface::ToJSVal(s->rq, &val, CStrW(pathname.string()) ); + Script::ToJSVal(s->rq, &val, CStrW(pathname.string()) ); JS_SetElement(s->rq.cx, filenameArrayObj, s->cur_idx++, val); return INFO::OK; } @@ -164,7 +164,7 @@ JS::Value ReadFile(const ScriptRequest& rq, const std::wstring& filename) // Decode as UTF-8 JS::RootedValue ret(rq.cx); - ScriptInterface::ToJSVal(rq, &ret, contents.FromUTF8()); + Script::ToJSVal(rq, &ret, contents.FromUTF8()); return ret; } @@ -195,7 +195,7 @@ JS::Value ReadFileLines(const ScriptInterface& scriptInterface, const std::wstri { // Decode each line as UTF-8 JS::RootedValue val(rq.cx); - ScriptInterface::ToJSVal(rq, &val, CStr(line).FromUTF8()); + Script::ToJSVal(rq, &val, CStr(line).FromUTF8()); scriptInterface.SetPropertyInt(line_array, cur_line++, val); } diff --git a/source/scriptinterface/FunctionWrapper.h b/source/scriptinterface/FunctionWrapper.h index 53a82f829a..941e718347 100644 --- a/source/scriptinterface/FunctionWrapper.h +++ b/source/scriptinterface/FunctionWrapper.h @@ -18,14 +18,15 @@ #ifndef INCLUDED_FUNCTIONWRAPPER #define INCLUDED_FUNCTIONWRAPPER -#include "ScriptInterface.h" +#include "ScriptConversions.h" #include "ScriptExceptions.h" +#include "ScriptInterface.h" /** * This class introduces templates to conveniently wrap C++ functions in JSNative functions. * This _is_ rather template heavy, so compilation times beware. * The C++ code can have arbitrary arguments and arbitrary return types, so long - * as they can be converted to/from JS using ScriptInterface::ToJSVal (FromJSVal respectively), + * as they can be converted to/from JS using Script::ToJSVal (FromJSVal respectively), * and they are default-constructible (TODO: that can probably changed). * (This could be a namespace, but I like being able to specify public/private). */ @@ -107,7 +108,7 @@ private: else { T ret; - went_ok &= ScriptInterface::FromJSVal(rq, args[idx], ret); + went_ok &= Script::FromJSVal(rq, args[idx], ret); return std::forward_as_tuple(ret); } } @@ -217,7 +218,7 @@ private: template static void AssignOrToJSValHelper(const ScriptRequest& rq, JS::MutableHandleValueVector argv, const T& a, const Ts&... params) { - ScriptInterface::AssignOrToJSVal(rq, argv[i], a); + Script::ToJSVal(rq, argv[i], a); AssignOrToJSValHelper(rq, argv, params...); } @@ -261,7 +262,7 @@ private: if constexpr (!std::is_same_v) { if (success) - ScriptInterface::FromJSVal(rq, jsRet, ret); + Script::FromJSVal(rq, jsRet, ret); } else UNUSED2(ret); // VS2017 complains. @@ -339,7 +340,7 @@ public: else if constexpr (std::is_same_v::return_type>) args.rval().set(call(obj, outs)); else - ScriptInterface::ToJSVal(rq, args.rval(), call(obj, outs)); + Script::ToJSVal(rq, args.rval(), call(obj, outs)); return !ScriptException::IsPending(rq); } diff --git a/source/scriptinterface/ScriptConversions.cpp b/source/scriptinterface/ScriptConversions.cpp index 3cbf1120c5..c2b38cfa92 100644 --- a/source/scriptinterface/ScriptConversions.cpp +++ b/source/scriptinterface/ScriptConversions.cpp @@ -22,6 +22,7 @@ #include "ScriptExtraHeaders.h" #include "graphics/Entity.h" +#include "lib/file/vfs/vfs_path.h" #include "maths/Vector2D.h" #include "ps/utf16string.h" #include "ps/CLogger.h" @@ -37,14 +38,14 @@ return false; \ }) -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, bool& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, bool& out) { FAIL_IF_NOT(v.isBoolean(), v); out = JS::ToBoolean(v); return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, float& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, float& out) { double tmp; FAIL_IF_NOT(v.isNumber(), v); @@ -54,7 +55,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::H return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, double& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, double& out) { FAIL_IF_NOT(v.isNumber(), v); if (!JS::ToNumber(rq.cx, v, &out)) @@ -62,7 +63,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS: return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, i32& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, i32& out) { FAIL_IF_NOT(v.isNumber(), v); if (!JS::ToInt32(rq.cx, v, &out)) @@ -70,7 +71,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::Ha return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, u32& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, u32& out) { FAIL_IF_NOT(v.isNumber(), v); if (!JS::ToUint32(rq.cx, v, &out)) @@ -78,7 +79,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::Ha return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, u16& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, u16& out) { FAIL_IF_NOT(v.isNumber(), v); if (!JS::ToUint16(rq.cx, v, &out)) @@ -86,7 +87,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::Ha return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, u8& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, u8& out) { u16 tmp; FAIL_IF_NOT(v.isNumber(), v); @@ -96,7 +97,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::Han return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, std::wstring& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, std::wstring& out) { FAIL_IF_NOT(v.isString() || v.isNumber() || v.isBoolean(), v); // allow implicit boolean/number conversions JS::RootedString str(rq.cx, JS::ToString(rq.cx, v)); @@ -126,7 +127,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, Path& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, Path& out) { std::wstring string; if (!FromJSVal(rq, v, string)) @@ -135,7 +136,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::H return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, std::string& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, std::string& out) { std::wstring wideout; if (!FromJSVal(rq, v, wideout)) @@ -144,17 +145,17 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CStr8& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CStr8& out) { - return ScriptInterface::FromJSVal(rq, v, static_cast(out)); + return Script::FromJSVal(rq, v, static_cast(out)); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CStrW& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CStrW& out) { - return ScriptInterface::FromJSVal(rq, v, static_cast(out)); + return Script::FromJSVal(rq, v, static_cast(out)); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, Entity& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, Entity& out) { if (!v.isObject()) FAIL("Argument must be an object"); @@ -184,42 +185,42 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS: //////////////////////////////////////////////////////////////// // Primitive types: -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const bool& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const bool& val) { ret.setBoolean(val); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const float& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const float& val) { ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const double& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const double& val) { ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const i32& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const i32& val) { ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const u16& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const u16& val) { ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const u8& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const u8& val) { ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const u32& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const u32& val) { ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::wstring& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::wstring& val) { utf16string utf16(val.begin(), val.end()); JS::RootedString str(rq.cx, JS_NewUCStringCopyN(rq.cx, reinterpret_cast (utf16.c_str()), utf16.length())); @@ -229,22 +230,22 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, ret.setUndefined(); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const Path& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const Path& val) { ToJSVal(rq, ret, val.string()); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::string& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::string& val) { ToJSVal(rq, ret, static_cast(CStr(val).FromUTF8())); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const wchar_t* const& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const wchar_t* const& val) { ToJSVal(rq, ret, std::wstring(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const char* const& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const char* const& val) { JS::RootedString str(rq.cx, JS_NewStringCopyZ(rq.cx, val)); if (str) @@ -254,11 +255,11 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, } #define TOJSVAL_CHAR(N) \ -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const wchar_t (&val)[N]) \ +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const wchar_t (&val)[N]) \ { \ ToJSVal(rq, ret, static_cast(val)); \ } \ -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const char (&val)[N]) \ +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const char (&val)[N]) \ { \ ToJSVal(rq, ret, static_cast(val)); \ } @@ -287,12 +288,12 @@ TOJSVAL_CHAR(35) TOJSVAL_CHAR(256) #undef TOJSVAL_CHAR -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CStrW& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CStrW& val) { ToJSVal(rq, ret, static_cast(val)); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CStr8& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CStr8& val) { ToJSVal(rq, ret, static_cast(val)); } @@ -308,17 +309,18 @@ JSVAL_VECTOR(std::string) JSVAL_VECTOR(std::wstring) JSVAL_VECTOR(std::vector) JSVAL_VECTOR(CStr8) +JSVAL_VECTOR(CStrW) JSVAL_VECTOR(std::vector) JSVAL_VECTOR(std::vector) class IComponent; -template<> void ScriptInterface::ToJSVal>(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::vector& val) +template<> void Script::ToJSVal>(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::vector& val) { ToJSVal_vector(rq, ret, val); } -template<> bool ScriptInterface::FromJSVal>(const ScriptRequest& rq, JS::HandleValue v, std::vector& out) +template<> bool Script::FromJSVal>(const ScriptRequest& rq, JS::HandleValue v, std::vector& out) { return FromJSVal_vector(rq, v, out); } diff --git a/source/scriptinterface/ScriptConversions.h b/source/scriptinterface/ScriptConversions.h index ce39cea6f0..c8c993e8f0 100644 --- a/source/scriptinterface/ScriptConversions.h +++ b/source/scriptinterface/ScriptConversions.h @@ -18,12 +18,77 @@ #ifndef INCLUDED_SCRIPTCONVERSIONS #define INCLUDED_SCRIPTCONVERSIONS -#include "ScriptInterface.h" -#include "scriptinterface/ScriptExtraHeaders.h" // for typed arrays +#include "ScriptRequest.h" +#include "ScriptExceptions.h" +#include "ScriptExtraHeaders.h" // for typed arrays #include -template static void ToJSVal_vector(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::vector& val) +namespace Script +{ +/** + * Convert a JS::Value to a C++ type. (This might trigger GC.) + */ +template bool FromJSVal(const ScriptRequest& rq, const JS::HandleValue val, T& ret); + +/** + * Convert a C++ type to a JS::Value. (This might trigger GC. The return + * value must be rooted if you don't want it to be collected.) + * NOTE: We are passing the JS::Value by reference instead of returning it by value. + * The reason is a memory corruption problem that appears to be caused by a bug in Visual Studio. + * Details here: http://www.wildfiregames.com/forum/index.php?showtopic=17289&p=285921 + */ +template void ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, T const& val); + +template<> +inline void ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::PersistentRootedValue& a) +{ + handle.set(a); +} + +template<> +inline void ToJSVal >(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::Heap& a) +{ + handle.set(a); +} + +template<> +inline void ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::RootedValue& a) +{ + handle.set(a); +} + +template <> +inline void ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::HandleValue& a) +{ + handle.set(a); +} + +/** + * Convert a named property of an object to a C++ type. + */ +template inline bool FromJSProperty(const ScriptRequest& rq, const JS::HandleValue val, const char* name, T& ret, bool strict = false) +{ + if (!val.isObject()) + return false; + + JS::RootedObject obj(rq.cx, &val.toObject()); + + bool hasProperty; + if (!JS_HasProperty(rq.cx, obj, name, &hasProperty) || !hasProperty) + return false; + + JS::RootedValue value(rq.cx); + if (!JS_GetProperty(rq.cx, obj, name, &value)) + return false; + + if (strict && value.isNull()) + return false; + + return FromJSVal(rq, value, ret); +} + +template inline void ToJSVal_vector(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::vector& val) { JS::RootedObject obj(rq.cx, JS::NewArrayObject(rq.cx, 0)); if (!obj) @@ -36,7 +101,7 @@ template static void ToJSVal_vector(const ScriptRequest& rq, JS::Mut for (u32 i = 0; i < val.size(); ++i) { JS::RootedValue el(rq.cx); - ScriptInterface::ToJSVal(rq, &el, val[i]); + Script::ToJSVal(rq, &el, val[i]); JS_SetElement(rq.cx, obj, i, el); } ret.setObject(*obj); @@ -44,7 +109,7 @@ template static void ToJSVal_vector(const ScriptRequest& rq, JS::Mut #define FAIL(msg) STMT(ScriptException::Raise(rq, msg); return false) -template static bool FromJSVal_vector(const ScriptRequest& rq, JS::HandleValue v, std::vector& out) +template inline bool FromJSVal_vector(const ScriptRequest& rq, JS::HandleValue v, std::vector& out) { JS::RootedObject obj(rq.cx); if (!v.isObject()) @@ -67,7 +132,7 @@ template static bool FromJSVal_vector(const ScriptRequest& rq, JS::H if (!JS_GetElement(rq.cx, obj, i, &el)) FAIL("Failed to read array element"); T el2; - if (!ScriptInterface::FromJSVal(rq, el, el2)) + if (!Script::FromJSVal(rq, el, el2)) return false; out.push_back(el2); } @@ -77,34 +142,15 @@ template static bool FromJSVal_vector(const ScriptRequest& rq, JS::H #undef FAIL #define JSVAL_VECTOR(T) \ -template<> void ScriptInterface::ToJSVal >(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::vector& val) \ +template<> void Script::ToJSVal >(const ScriptRequest& rq, JS::MutableHandleValue ret, const std::vector& val) \ { \ ToJSVal_vector(rq, ret, val); \ } \ -template<> bool ScriptInterface::FromJSVal >(const ScriptRequest& rq, JS::HandleValue v, std::vector& out) \ +template<> bool Script::FromJSVal >(const ScriptRequest& rq, JS::HandleValue v, std::vector& out) \ { \ return FromJSVal_vector(rq, v, out); \ } -template bool ScriptInterface::FromJSProperty(const ScriptRequest& rq, const JS::HandleValue val, const char* name, T& ret, bool strict) -{ - if (!val.isObject()) - return false; - - JS::RootedObject obj(rq.cx, &val.toObject()); - - bool hasProperty; - if (!JS_HasProperty(rq.cx, obj, name, &hasProperty) || !hasProperty) - return false; - - JS::RootedValue value(rq.cx); - if (!JS_GetProperty(rq.cx, obj, name, &value)) - return false; - - if (strict && value.isNull()) - return false; - - return FromJSVal(rq, value, ret); -} +} // namespace Script #endif //INCLUDED_SCRIPTCONVERSIONS diff --git a/source/scriptinterface/ScriptExceptions.cpp b/source/scriptinterface/ScriptExceptions.cpp index e1c96bcc20..7176a946cd 100644 --- a/source/scriptinterface/ScriptExceptions.cpp +++ b/source/scriptinterface/ScriptExceptions.cpp @@ -23,7 +23,7 @@ #include "ps/CLogger.h" #include "ps/CStr.h" #include "scriptinterface/FunctionWrapper.h" -#include "scriptinterface/ScriptInterface.h" +#include "scriptinterface/ScriptRequest.h" bool ScriptException::IsPending(const ScriptRequest& rq) { @@ -49,7 +49,7 @@ bool ScriptException::CatchPending(const ScriptRequest& rq) if (!excn.isObject()) { CStr error; - ScriptInterface::FromJSVal(rq, excn, error); + Script::FromJSVal(rq, excn, error); LOGERROR("JavaScript error: %s", error); return true; } @@ -60,7 +60,7 @@ bool ScriptException::CatchPending(const ScriptRequest& rq) if (!report) { CStr error; - ScriptInterface::FromJSVal(rq, excn, error); + Script::FromJSVal(rq, excn, error); LOGERROR("JavaScript error: %s", error); return true; } diff --git a/source/scriptinterface/ScriptInterface.cpp b/source/scriptinterface/ScriptInterface.cpp index 3b324748b9..e2475e166c 100644 --- a/source/scriptinterface/ScriptInterface.cpp +++ b/source/scriptinterface/ScriptInterface.cpp @@ -117,7 +117,7 @@ bool print(JSContext* cx, uint argc, JS::Value* vp) for (uint i = 0; i < args.length(); ++i) { std::wstring str; - if (!ScriptInterface::FromJSVal(rq, args[i], str)) + if (!Script::FromJSVal(rq, args[i], str)) return false; debug_printf("%s", utf8_from_wstring(str).c_str()); } @@ -137,7 +137,7 @@ bool logmsg(JSContext* cx, uint argc, JS::Value* vp) ScriptRequest rq(*ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface); \ std::wstring str; - if (!ScriptInterface::FromJSVal(rq, args[0], str)) + if (!Script::FromJSVal(rq, args[0], str)) return false; LOGMESSAGE("%s", utf8_from_wstring(str)); args.rval().setUndefined(); @@ -155,7 +155,7 @@ bool warn(JSContext* cx, uint argc, JS::Value* vp) ScriptRequest rq(*ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface); \ std::wstring str; - if (!ScriptInterface::FromJSVal(rq, args[0], str)) + if (!Script::FromJSVal(rq, args[0], str)) return false; LOGWARNING("%s", utf8_from_wstring(str)); args.rval().setUndefined(); @@ -173,7 +173,7 @@ bool error(JSContext* cx, uint argc, JS::Value* vp) ScriptRequest rq(*ScriptInterface::GetScriptInterfaceAndCBData(cx)->pScriptInterface); \ std::wstring str; - if (!ScriptInterface::FromJSVal(rq, args[0], str)) + if (!Script::FromJSVal(rq, args[0], str)) return false; LOGERROR("%s", utf8_from_wstring(str)); args.rval().setUndefined(); @@ -712,7 +712,7 @@ bool ScriptInterface::EnumeratePropertyNames(JS::HandleValue objVal, bool enumer continue; std::string propName; - if (!FromJSVal(rq, val, propName)) + if (!Script::FromJSVal(rq, val, propName)) return false; out.emplace_back(std::move(propName)); diff --git a/source/scriptinterface/ScriptInterface.h b/source/scriptinterface/ScriptInterface.h index 1b5c9130c8..1def439195 100644 --- a/source/scriptinterface/ScriptInterface.h +++ b/source/scriptinterface/ScriptInterface.h @@ -21,6 +21,7 @@ #include "lib/file/vfs/vfs_path.h" #include "maths/Fixed.h" #include "ps/Errors.h" +#include "scriptinterface/ScriptConversions.h" #include "scriptinterface/ScriptExceptions.h" #include "scriptinterface/ScriptRequest.h" #include "scriptinterface/ScriptTypes.h" @@ -285,25 +286,6 @@ public: bool Eval(const char* code, JS::MutableHandleValue out) const; template bool Eval(const char* code, T& out) const; - /** - * Convert a JS::Value to a C++ type. (This might trigger GC.) - */ - template static bool FromJSVal(const ScriptRequest& rq, const JS::HandleValue val, T& ret); - - /** - * Convert a C++ type to a JS::Value. (This might trigger GC. The return - * value must be rooted if you don't want it to be collected.) - * NOTE: We are passing the JS::Value by reference instead of returning it by value. - * The reason is a memory corruption problem that appears to be caused by a bug in Visual Studio. - * Details here: http://www.wildfiregames.com/forum/index.php?showtopic=17289&p=285921 - */ - template static void ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, T const& val); - - /** - * Convert a named property of an object to a C++ type. - */ - template static bool FromJSProperty(const ScriptRequest& rq, const JS::HandleValue val, const char* name, T& ret, bool strict = false); - /** * MathRandom (this function) calls the random number generator assigned to this ScriptInterface instance and * returns the generated number. @@ -348,38 +330,6 @@ public: return value; } - /** - * Converts |a| if needed and assigns it to |handle|. - * This is meant for use in other templates where we want to use the same code for JS::RootedValue&/JS::HandleValue and - * other types. Note that functions are meant to take JS::HandleValue instead of JS::RootedValue&, but this implicit - * conversion does not work for templates (exact type matches required for type deduction). - * A similar functionality could also be implemented as a ToJSVal specialization. The current approach was preferred - * because "conversions" from JS::HandleValue to JS::MutableHandleValue are unusual and should not happen "by accident". - */ - template - static void AssignOrToJSVal(const ScriptRequest& rq, JS::MutableHandleValue handle, const T& a); - - /** - * The same as AssignOrToJSVal, but also allows JS::Value for T. - * In most cases it's not safe to use the plain (unrooted) JS::Value type, but this can happen quite - * easily with template functions. The idea is that the linker prints an error if AssignOrToJSVal is - * used with JS::Value. If the specialization for JS::Value should be allowed, you can use this - * "unrooted" version of AssignOrToJSVal. - */ - template - static void AssignOrToJSValUnrooted(const ScriptRequest& rq, JS::MutableHandleValue handle, const T& a) - { - AssignOrToJSVal(rq, handle, a); - } - - /** - * Converts |val| to T if needed or just returns it if it's a handle. - * This is meant for use in other templates where we want to use the same code for JS::HandleValue and - * other types. - */ - template - static T AssignOrFromJSVal(const ScriptRequest& rq, const JS::HandleValue& val, bool& ret); - private: static bool CreateObject_(const ScriptRequest& rq, JS::MutableHandleObject obj); @@ -388,7 +338,7 @@ private: static bool CreateObject_(const ScriptRequest& rq, JS::MutableHandleObject obj, const char* propertyName, const T& propertyValue, Args const&... args) { JS::RootedValue val(rq.cx); - AssignOrToJSVal(rq, &val, propertyValue); + Script::ToJSVal(rq, &val, propertyValue); return CreateObject_(rq, obj, args...) && JS_DefineProperty(rq.cx, obj, propertyName, val, JSPROP_ENUMERATE); } @@ -413,63 +363,12 @@ private: std::map m_CustomObjectTypes; }; -template -inline void ScriptInterface::AssignOrToJSVal(const ScriptRequest& rq, JS::MutableHandleValue handle, const T& a) -{ - ToJSVal(rq, handle, a); -} - -template<> -inline void ScriptInterface::AssignOrToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::PersistentRootedValue& a) -{ - handle.set(a); -} - -template<> -inline void ScriptInterface::AssignOrToJSVal >(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::Heap& a) -{ - handle.set(a); -} - -template<> -inline void ScriptInterface::AssignOrToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::RootedValue& a) -{ - handle.set(a); -} - -template <> -inline void ScriptInterface::AssignOrToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::HandleValue& a) -{ - handle.set(a); -} - -template <> -inline void ScriptInterface::AssignOrToJSValUnrooted(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue handle, const JS::Value& a) -{ - handle.set(a); -} - -template -inline T ScriptInterface::AssignOrFromJSVal(const ScriptRequest& rq, const JS::HandleValue& val, bool& ret) -{ - T retVal; - ret = FromJSVal(rq, val, retVal); - return retVal; -} - -template<> -inline JS::HandleValue ScriptInterface::AssignOrFromJSVal(const ScriptRequest& UNUSED(rq), const JS::HandleValue& val, bool& ret) -{ - ret = true; - return val; -} - template bool ScriptInterface::SetGlobal(const char* name, const T& value, bool replace, bool constant, bool enumerate) { ScriptRequest rq(this); JS::RootedValue val(rq.cx); - AssignOrToJSVal(rq, &val, value); + Script::ToJSVal(rq, &val, value); return SetGlobal_(name, val, replace, constant, enumerate); } @@ -478,7 +377,7 @@ bool ScriptInterface::SetProperty(JS::HandleValue obj, const char* name, const T { ScriptRequest rq(this); JS::RootedValue val(rq.cx); - AssignOrToJSVal(rq, &val, value); + Script::ToJSVal(rq, &val, value); return SetProperty_(obj, name, val, constant, enumerate); } @@ -487,7 +386,7 @@ bool ScriptInterface::SetProperty(JS::HandleValue obj, const wchar_t* name, cons { ScriptRequest rq(this); JS::RootedValue val(rq.cx); - AssignOrToJSVal(rq, &val, value); + Script::ToJSVal(rq, &val, value); return SetProperty_(obj, name, val, constant, enumerate); } @@ -496,7 +395,7 @@ bool ScriptInterface::SetPropertyInt(JS::HandleValue obj, int name, const T& val { ScriptRequest rq(this); JS::RootedValue val(rq.cx); - AssignOrToJSVal(rq, &val, value); + Script::ToJSVal(rq, &val, value); return SetPropertyInt_(obj, name, val, constant, enumerate); } @@ -513,7 +412,7 @@ bool ScriptInterface::GetProperty(const ScriptRequest& rq, JS::HandleValue obj, JS::RootedValue val(rq.cx); if (!GetProperty(rq, obj, name, &val)) return false; - return FromJSVal(rq, val, out); + return Script::FromJSVal(rq, val, out); } template @@ -529,7 +428,7 @@ bool ScriptInterface::GetPropertyInt(const ScriptRequest& rq, JS::HandleValue ob JS::RootedValue val(rq.cx); if (!GetPropertyInt(rq, obj, name, &val)) return false; - return FromJSVal(rq, val, out); + return Script::FromJSVal(rq, val, out); } @@ -540,7 +439,7 @@ bool ScriptInterface::Eval(const char* code, T& ret) const JS::RootedValue rval(rq.cx); if (!Eval(code, &rval)) return false; - return FromJSVal(rq, rval, ret); + return Script::FromJSVal(rq, rval, ret); } #endif // INCLUDED_SCRIPTINTERFACE diff --git a/source/scriptinterface/tests/test_ScriptConversions.h b/source/scriptinterface/tests/test_ScriptConversions.h index 71acaf7b13..98ce6c08d2 100644 --- a/source/scriptinterface/tests/test_ScriptConversions.h +++ b/source/scriptinterface/tests/test_ScriptConversions.h @@ -39,7 +39,7 @@ class TestScriptConversions : public CxxTest::TestSuite ScriptRequest rq(script); JS::RootedValue v1(rq.cx); - ScriptInterface::ToJSVal(rq, &v1, value); + Script::ToJSVal(rq, &v1, value); // We want to convert values to strings, but can't just call toSource() on them // since they might not be objects. So just use uneval. @@ -58,7 +58,7 @@ class TestScriptConversions : public CxxTest::TestSuite ScriptRequest rq(script); JS::RootedValue v1(rq.cx); - ScriptInterface::ToJSVal(rq, &v1, value); + Script::ToJSVal(rq, &v1, value); std::string source; JS::RootedValue global(rq.cx, rq.globalValue()); @@ -68,7 +68,7 @@ class TestScriptConversions : public CxxTest::TestSuite TS_ASSERT_STR_EQUALS(source, expected); T v2 = T(); - TS_ASSERT(ScriptInterface::FromJSVal(rq, v1, v2)); + TS_ASSERT(Script::FromJSVal(rq, v1, v2)); TS_ASSERT_EQUALS(value, v2); } @@ -80,15 +80,15 @@ class TestScriptConversions : public CxxTest::TestSuite ScriptRequest rq(script); JS::RootedValue v1(rq.cx); - ScriptInterface::ToJSVal(rq, &v1, v); + Script::ToJSVal(rq, &v1, v); JS::RootedValue u1(rq.cx); - ScriptInterface::ToJSVal(rq, &u1, u); + Script::ToJSVal(rq, &u1, u); T r; JS::RootedValue r1(rq.cx); TS_ASSERT(ScriptFunction::Call(rq, u1, func.c_str(), r, v1)); - ScriptInterface::ToJSVal(rq, &r1, r); + Script::ToJSVal(rq, &r1, r); std::string source; JS::RootedValue global(rq.cx, rq.globalValue()); @@ -174,21 +174,21 @@ public: // using new uninitialized variables each time to be sure the test doesn't succeeed if ToJSVal doesn't touch the value at all. JS::RootedValue val0(rq.cx), val1(rq.cx), val2(rq.cx), val3(rq.cx), val4(rq.cx), val5(rq.cx), val6(rq.cx), val7(rq.cx), val8(rq.cx); - ScriptInterface::ToJSVal(rq, &val0, 0); - ScriptInterface::ToJSVal(rq, &val1, JSVAL_INT_MAX - 1); - ScriptInterface::ToJSVal(rq, &val2, JSVAL_INT_MAX); - ScriptInterface::ToJSVal(rq, &val3, JSVAL_INT_MIN + 1); - ScriptInterface::ToJSVal(rq, &val4, -(i64)2147483648u); // JSVAL_INT_MIN + Script::ToJSVal(rq, &val0, 0); + Script::ToJSVal(rq, &val1, JSVAL_INT_MAX - 1); + Script::ToJSVal(rq, &val2, JSVAL_INT_MAX); + Script::ToJSVal(rq, &val3, JSVAL_INT_MIN + 1); + Script::ToJSVal(rq, &val4, -(i64)2147483648u); // JSVAL_INT_MIN TS_ASSERT(val0.isInt32()); TS_ASSERT(val1.isInt32()); TS_ASSERT(val2.isInt32()); TS_ASSERT(val3.isInt32()); TS_ASSERT(val4.isInt32()); - ScriptInterface::ToJSVal(rq, &val5, 0); - ScriptInterface::ToJSVal(rq, &val6, 2147483646u); // JSVAL_INT_MAX-1 - ScriptInterface::ToJSVal(rq, &val7, 2147483647u); // JSVAL_INT_MAX - ScriptInterface::ToJSVal(rq, &val8, 2147483648u); // JSVAL_INT_MAX+1 + Script::ToJSVal(rq, &val5, 0); + Script::ToJSVal(rq, &val6, 2147483646u); // JSVAL_INT_MAX-1 + Script::ToJSVal(rq, &val7, 2147483647u); // JSVAL_INT_MAX + Script::ToJSVal(rq, &val8, 2147483648u); // JSVAL_INT_MAX+1 TS_ASSERT(val5.isInt32()); TS_ASSERT(val6.isInt32()); TS_ASSERT(val7.isInt32()); @@ -206,8 +206,8 @@ public: float f = 0; JS::RootedValue testNANVal(rq.cx); - ScriptInterface::ToJSVal(rq, &testNANVal, NAN); - TS_ASSERT(ScriptInterface::FromJSVal(rq, testNANVal, f)); + Script::ToJSVal(rq, &testNANVal, NAN); + TS_ASSERT(Script::FromJSVal(rq, testNANVal, f)); TS_ASSERT(isnan(f)); } @@ -259,15 +259,15 @@ public: std::wstring in_utf16(L"éè!§$-aezi134900°°©©¢¢ÇÇ'{¶«¡Ç'[å»ÛÁØ"); JS::RootedValue v1(rq.cx); - ScriptInterface::ToJSVal(rq, &v1, in_utf8); + Script::ToJSVal(rq, &v1, in_utf8); std::wstring test_out_utf16; - TS_ASSERT(ScriptInterface::FromJSVal(rq, v1, test_out_utf16)); + TS_ASSERT(Script::FromJSVal(rq, v1, test_out_utf16)); TS_ASSERT_EQUALS(test_out_utf16, in_utf16); JS::RootedValue v2(rq.cx); - ScriptInterface::ToJSVal(rq, &v2, in_utf16); + Script::ToJSVal(rq, &v2, in_utf16); std::string test_out_utf8; - TS_ASSERT(ScriptInterface::FromJSVal(rq, v2, test_out_utf8)); + TS_ASSERT(Script::FromJSVal(rq, v2, test_out_utf8)); TS_ASSERT_EQUALS(test_out_utf8, in_utf8); } }; diff --git a/source/scriptinterface/tests/test_ScriptInterface.h b/source/scriptinterface/tests/test_ScriptInterface.h index c1652da6ce..292e05f5fd 100644 --- a/source/scriptinterface/tests/test_ScriptInterface.h +++ b/source/scriptinterface/tests/test_ScriptInterface.h @@ -160,7 +160,7 @@ public: // Test that a mutable handle value as return value works. ScriptFunction::Call(rq, val, "inc", &out); - ScriptInterface::FromJSVal(rq, out, nbr); + Script::FromJSVal(rq, out, nbr); TS_ASSERT_EQUALS(4, nbr); ScriptFunction::Call(rq, val, "add", nbr, nbrVal); @@ -169,13 +169,13 @@ public: // GetProperty JS::RootedValue* overload nbr = 0; script.GetProperty(val, "0", &out); - ScriptInterface::FromJSVal(rq, out, nbr); + Script::FromJSVal(rq, out, nbr); TS_ASSERT_EQUALS(nbr, 7); // GetPropertyInt JS::RootedValue* overload nbr = 0; script.GetPropertyInt(val, 0, &out); - ScriptInterface::FromJSVal(rq, out, nbr); + Script::FromJSVal(rq, out, nbr); TS_ASSERT_EQUALS(nbr, 7); handle_templates_test(script, val, &out, nbrVal); @@ -190,7 +190,7 @@ public: ScriptFunction::CallVoid(rq, val, "setTo", nbrVal); ScriptFunction::Call(rq, val, "inc", out); - ScriptInterface::FromJSVal(rq, out, nbr); + Script::FromJSVal(rq, out, nbr); TS_ASSERT_EQUALS(4, nbr); ScriptFunction::Call(rq, val, "add", nbr, nbrVal); @@ -199,13 +199,13 @@ public: // GetProperty JS::MutableHandleValue overload nbr = 0; script.GetProperty(val, "0", out); - ScriptInterface::FromJSVal(rq, out, nbr); + Script::FromJSVal(rq, out, nbr); TS_ASSERT_EQUALS(nbr, 7); // GetPropertyInt JS::MutableHandleValue overload nbr = 0; script.GetPropertyInt(val, 0, out); - ScriptInterface::FromJSVal(rq, out, nbr); + Script::FromJSVal(rq, out, nbr); TS_ASSERT_EQUALS(nbr, 7); } @@ -263,7 +263,7 @@ public: TS_ASSERT(script.Eval("f()", &out)); int outNbr = 0; - ScriptInterface::FromJSVal(rq, out, outNbr); + Script::FromJSVal(rq, out, outNbr); TS_ASSERT_EQUALS(2, outNbr); } }; diff --git a/source/simulation2/components/CCmpAIManager.cpp b/source/simulation2/components/CCmpAIManager.cpp index ea6c25d516..ca40074512 100644 --- a/source/simulation2/components/CCmpAIManager.cpp +++ b/source/simulation2/components/CCmpAIManager.cpp @@ -313,11 +313,11 @@ public: std::vector waypoints; JS::RootedValue retVal(rq.cx); - m_ScriptInterface->FromJSVal(rq, position, pos); - m_ScriptInterface->FromJSVal(rq, goal, goalPos); + Script::FromJSVal(rq, position, pos); + Script::FromJSVal(rq, goal, goalPos); ComputePath(pos, goalPos, passClass, waypoints); - m_ScriptInterface->ToJSVal >(rq, &retVal, waypoints); + Script::ToJSVal(rq, &retVal, waypoints); return retVal; } @@ -426,7 +426,7 @@ public: for (size_t i = 0; i < m_Players.size(); ++i) { JS::RootedValue val(rq.cx); - m_ScriptInterface->ToJSVal(rq, &val, m_Players[i]->m_Player); + Script::ToJSVal(rq, &val, m_Players[i]->m_Player); m_ScriptInterface->SetPropertyInt(playersID, i, val, true); } @@ -477,8 +477,8 @@ public: JS::RootedValue state(rq.cx); Script::ReadStructuredClone(rq, gameState, &state); - ScriptInterface::ToJSVal(rq, &m_PassabilityMapVal, passabilityMap); - ScriptInterface::ToJSVal(rq, &m_TerritoryMapVal, territoryMap); + Script::ToJSVal(rq, &m_PassabilityMapVal, passabilityMap); + Script::ToJSVal(rq, &m_TerritoryMapVal, territoryMap); m_PassabilityMap = passabilityMap; m_NonPathfindingPassClasses = nonPathfindingPassClassMasks; @@ -529,7 +529,7 @@ public: ScriptRequest rq(m_ScriptInterface); if (dimensionChange || justDeserialized) - ScriptInterface::ToJSVal(rq, &m_PassabilityMapVal, m_PassabilityMap); + Script::ToJSVal(rq, &m_PassabilityMapVal, m_PassabilityMap); else { // Avoid a useless memory reallocation followed by a garbage collection. @@ -557,7 +557,7 @@ public: ScriptRequest rq(m_ScriptInterface); if (dimensionChange) - ScriptInterface::ToJSVal(rq, &m_TerritoryMapVal, m_TerritoryMap); + Script::ToJSVal(rq, &m_TerritoryMapVal, m_TerritoryMap); else { // Avoid a useless memory reallocation followed by a garbage collection. diff --git a/source/simulation2/components/ICmpFootprint.cpp b/source/simulation2/components/ICmpFootprint.cpp index 2934cbe851..fff17ae9b9 100644 --- a/source/simulation2/components/ICmpFootprint.cpp +++ b/source/simulation2/components/ICmpFootprint.cpp @@ -41,9 +41,9 @@ JS::Value ICmpFootprint::GetShape_wrapper() const JS::RootedValue ptype(rq.cx); JS::RootedValue pradius(rq.cx); JS::RootedValue pheight(rq.cx); - ScriptInterface::ToJSVal(rq, &ptype, "circle"); - ScriptInterface::ToJSVal(rq, &pradius, size0); - ScriptInterface::ToJSVal(rq, &pheight, height); + Script::ToJSVal(rq, &ptype, "circle"); + Script::ToJSVal(rq, &pradius, size0); + Script::ToJSVal(rq, &pheight, height); JS_SetProperty(rq.cx, obj, "type", ptype); JS_SetProperty(rq.cx, obj, "radius", pradius); JS_SetProperty(rq.cx, obj, "height", pheight); @@ -54,10 +54,10 @@ JS::Value ICmpFootprint::GetShape_wrapper() const JS::RootedValue pwidth(rq.cx); JS::RootedValue pdepth(rq.cx); JS::RootedValue pheight(rq.cx); - ScriptInterface::ToJSVal(rq, &ptype, "square"); - ScriptInterface::ToJSVal(rq, &pwidth, size0); - ScriptInterface::ToJSVal(rq, &pdepth, size1); - ScriptInterface::ToJSVal(rq, &pheight, height); + Script::ToJSVal(rq, &ptype, "square"); + Script::ToJSVal(rq, &pwidth, size0); + Script::ToJSVal(rq, &pdepth, size1); + Script::ToJSVal(rq, &pheight, height); JS_SetProperty(rq.cx, obj, "type", ptype); JS_SetProperty(rq.cx, obj, "width", pwidth); JS_SetProperty(rq.cx, obj, "depth", pdepth); diff --git a/source/simulation2/scripting/EngineScriptConversions.cpp b/source/simulation2/scripting/EngineScriptConversions.cpp index 2572e2d4cc..639351737e 100644 --- a/source/simulation2/scripting/EngineScriptConversions.cpp +++ b/source/simulation2/scripting/EngineScriptConversions.cpp @@ -18,6 +18,7 @@ #include "precompiled.h" #include "scriptinterface/ScriptConversions.h" +#include "scriptinterface/ScriptInterface.h" #include "graphics/Color.h" #include "maths/Fixed.h" @@ -34,7 +35,7 @@ #define FAIL(msg) STMT(LOGERROR(msg); return false) #define FAIL_VOID(msg) STMT(ScriptException::Raise(rq, msg); return) -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, IComponent* const& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, IComponent* const& val) { if (val == NULL) { @@ -65,7 +66,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, ret.setObject(*obj); } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, CParamNode const& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, CParamNode const& val) { val.ToJSVal(rq, true, ret); @@ -78,7 +79,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, J } } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CParamNode* const& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CParamNode* const& val) { if (val) ToJSVal(rq, ret, *val); @@ -86,7 +87,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& ret.setUndefined(); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CColor& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CColor& out) { if (!v.isObject()) FAIL("CColor has to be an object"); @@ -109,9 +110,9 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS: return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, CColor const& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, CColor const& val) { - CreateObject( + ScriptInterface::CreateObject( rq, ret, "r", val.r, @@ -120,7 +121,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::M "a", val.a); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, fixed& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, fixed& out) { double ret; if (!JS::ToNumber(rq.cx, v, &ret)) @@ -131,12 +132,12 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS:: return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const fixed& val) +template<> void Script::ToJSVal(const ScriptRequest& UNUSED(rq), JS::MutableHandleValue ret, const fixed& val) { ret.set(JS::NumberValue(val.ToDouble())); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CFixedVector3D& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CFixedVector3D& out) { if (!v.isObject()) return false; // TODO: report type error @@ -156,7 +157,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CFixedVector3D& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CFixedVector3D& val) { JS::RootedObject global(rq.cx, rq.glob); JS::RootedValue valueVector3D(rq.cx); @@ -175,7 +176,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq ret.setObject(*objVec); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CFixedVector2D& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CFixedVector2D& out) { if (!v.isObject()) return false; // TODO: report type error @@ -192,7 +193,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& return true; } -template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CFixedVector2D& val) +template<> void Script::ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue ret, const CFixedVector2D& val) { JS::RootedObject global(rq.cx, rq.glob); JS::RootedValue valueVector2D(rq.cx); @@ -210,7 +211,7 @@ template<> void ScriptInterface::ToJSVal(const ScriptRequest& rq ret.setObject(*objVec); } -template<> void ScriptInterface::ToJSVal >(const ScriptRequest& rq, JS::MutableHandleValue ret, const Grid& val) +template<> void Script::ToJSVal >(const ScriptRequest& rq, JS::MutableHandleValue ret, const Grid& val) { u32 length = (u32)(val.m_W * val.m_H); u32 nbytes = (u32)(length * sizeof(u8)); @@ -223,7 +224,7 @@ template<> void ScriptInterface::ToJSVal >(const ScriptRequest& rq, JS } JS::RootedValue data(rq.cx, JS::ObjectValue(*objArr)); - CreateObject( + ScriptInterface::CreateObject( rq, ret, "width", val.m_W, @@ -231,7 +232,7 @@ template<> void ScriptInterface::ToJSVal >(const ScriptRequest& rq, JS "data", data); } -template<> void ScriptInterface::ToJSVal >(const ScriptRequest& rq, JS::MutableHandleValue ret, const Grid& val) +template<> void Script::ToJSVal >(const ScriptRequest& rq, JS::MutableHandleValue ret, const Grid& val) { u32 length = (u32)(val.m_W * val.m_H); u32 nbytes = (u32)(length * sizeof(u16)); @@ -244,7 +245,7 @@ template<> void ScriptInterface::ToJSVal >(const ScriptRequest& rq, J } JS::RootedValue data(rq.cx, JS::ObjectValue(*objArr)); - CreateObject( + ScriptInterface::CreateObject( rq, ret, "width", val.m_W, @@ -252,7 +253,7 @@ template<> void ScriptInterface::ToJSVal >(const ScriptRequest& rq, J "data", data); } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, TNSpline& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, TNSpline& out) { if (!v.isObject()) FAIL("Argument must be an object"); @@ -289,7 +290,7 @@ template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, J return true; } -template<> bool ScriptInterface::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CCinemaPath& out) +template<> bool Script::FromJSVal(const ScriptRequest& rq, JS::HandleValue v, CCinemaPath& out) { if (!v.isObject()) FAIL("Argument must be an object"); diff --git a/source/simulation2/scripting/MessageTypeConversions.cpp b/source/simulation2/scripting/MessageTypeConversions.cpp index a231ac35bb..8138ad518d 100644 --- a/source/simulation2/scripting/MessageTypeConversions.cpp +++ b/source/simulation2/scripting/MessageTypeConversions.cpp @@ -29,7 +29,7 @@ #define SET_MSG_PROPERTY(name) \ do { \ JS::RootedValue prop(rq.cx);\ - ScriptInterface::ToJSVal(rq, &prop, this->name); \ + Script::ToJSVal(rq, &prop, this->name); \ if (! JS_SetProperty(rq.cx, obj, #name, prop)) \ return JS::UndefinedValue(); \ } while (0); @@ -46,7 +46,7 @@ { \ if (! JS_GetProperty(rq.cx, obj, #name, &prop)) \ return NULL; \ - if (! ScriptInterface::FromJSVal(rq, prop, name)) \ + if (! Script::FromJSVal(rq, prop, name)) \ return NULL; \ } diff --git a/source/simulation2/serialization/StdDeserializer.cpp b/source/simulation2/serialization/StdDeserializer.cpp index 3d30b00df6..611718f798 100644 --- a/source/simulation2/serialization/StdDeserializer.cpp +++ b/source/simulation2/serialization/StdDeserializer.cpp @@ -23,6 +23,7 @@ #include "ps/CLogger.h" #include "ps/CStr.h" #include "scriptinterface/FunctionWrapper.h" +#include "scriptinterface/ScriptConversions.h" #include "scriptinterface/ScriptInterface.h" #include "scriptinterface/ScriptExtraHeaders.h" // For typed arrays and ArrayBuffer #include "simulation2/serialization/ISerializer.h" diff --git a/source/simulation2/system/InterfaceScripted.h b/source/simulation2/system/InterfaceScripted.h index 53df238326..8903e95c48 100644 --- a/source/simulation2/system/InterfaceScripted.h +++ b/source/simulation2/system/InterfaceScripted.h @@ -19,6 +19,7 @@ #define INCLUDED_INTERFACE_SCRIPTED #include "scriptinterface/FunctionWrapper.h" +#include "scriptinterface/ScriptConversions.h" #include "scriptinterface/ScriptInterface.h" #define BEGIN_INTERFACE_WRAPPER(iname) \ diff --git a/source/simulation2/system/ReplayTurnManager.cpp b/source/simulation2/system/ReplayTurnManager.cpp index 958faea248..b905d92a01 100644 --- a/source/simulation2/system/ReplayTurnManager.cpp +++ b/source/simulation2/system/ReplayTurnManager.cpp @@ -95,11 +95,11 @@ void CReplayTurnManager::NotifyFinishedUpdate(u32 turn) ignore_result(paramData.append(JS::NumberValue(turn))); JS::RootedValue hashVal(rq.cx); - ScriptInterface::ToJSVal(rq, &hashVal, hash); + Script::ToJSVal(rq, &hashVal, hash); ignore_result(paramData.append(hashVal)); JS::RootedValue expectedHashVal(rq.cx); - ScriptInterface::ToJSVal(rq, &expectedHashVal, expectedHash); + Script::ToJSVal(rq, &expectedHashVal, expectedHash); ignore_result(paramData.append(expectedHashVal)); g_GUI->SendEventToAll(EventNameReplayOutOfSync, paramData); diff --git a/source/simulation2/tests/test_CmpTemplateManager.h b/source/simulation2/tests/test_CmpTemplateManager.h index 6d46a75e85..196111149a 100644 --- a/source/simulation2/tests/test_CmpTemplateManager.h +++ b/source/simulation2/tests/test_CmpTemplateManager.h @@ -105,19 +105,19 @@ public: const CParamNode* inherit1 = tempMan->LoadTemplate(ent2, "inherit1"); JS::RootedValue val(rq.cx); - ScriptInterface::ToJSVal(rq, &val, inherit1); + Script::ToJSVal(rq, &val, inherit1); TS_ASSERT_STR_EQUALS(man.GetScriptInterface().ToString(&val), "({Test1A:{'@a':\"a1\", '@b':\"b1\", '@c':\"c1\", d:\"d1\", e:\"e1\", f:\"f1\"}})"); const CParamNode* inherit2 = tempMan->LoadTemplate(ent2, "inherit2"); - ScriptInterface::ToJSVal(rq, &val, inherit2); + Script::ToJSVal(rq, &val, inherit2); TS_ASSERT_STR_EQUALS(man.GetScriptInterface().ToString(&val), "({'@parent':\"inherit1\", Test1A:{'@a':\"a2\", '@b':\"b1\", '@c':\"c1\", d:\"d2\", e:\"e1\", f:\"f1\", g:\"g2\"}})"); const CParamNode* actor = tempMan->LoadTemplate(ent2, "actor|example1"); - ScriptInterface::ToJSVal(rq, &val, &actor->GetChild("VisualActor")); + Script::ToJSVal(rq, &val, &actor->GetChild("VisualActor")); TS_ASSERT_STR_EQUALS(man.GetScriptInterface().ToString(&val), "({Actor:\"example1\", ActorOnly:(void 0), SilhouetteDisplay:\"false\", SilhouetteOccluder:\"false\", VisibleInAtlasOnly:\"false\"})"); const CParamNode* foundation = tempMan->LoadTemplate(ent2, "foundation|actor|example1"); - ScriptInterface::ToJSVal(rq, &val, &foundation->GetChild("VisualActor")); + Script::ToJSVal(rq, &val, &foundation->GetChild("VisualActor")); TS_ASSERT_STR_EQUALS(man.GetScriptInterface().ToString(&val), "({Actor:\"example1\", ActorOnly:(void 0), Foundation:(void 0), SilhouetteDisplay:\"false\", SilhouetteOccluder:\"false\", VisibleInAtlasOnly:\"false\"})"); #define GET_FIRST_ELEMENT(n, templateName) \ @@ -126,7 +126,7 @@ public: { \ if (it->first[0] == '@') \ continue; \ - ScriptInterface::ToJSVal(rq, &val, it->second); \ + Script::ToJSVal(rq, &val, it->second); \ break; \ }