From 52f4cda439372e57e439eccbdae10be07ca45685 Mon Sep 17 00:00:00 2001 From: Yves Date: Mon, 14 Jul 2014 19:52:35 +0000 Subject: [PATCH] Changes ToJSVal to take JS::MutableHandleValue instead of JS::Value&. JS::MutableHandleValue is similar to JS::HandleValue, but the whole JS::Value it points to can be replaced. This change is needed for support of exact stack rooting and moving GC. Contains a few other trivial API adjustments and style improvements too. Refs #2462 Refs #2415 This was SVN commit r15534. --- source/gui/scripting/GuiScriptConversions.cpp | 20 ++--- .../gui/scripting/JSInterface_IGUIObject.cpp | 16 ++-- source/main.cpp | 7 +- source/ps/scripting/JSInterface_VFS.cpp | 21 +++-- source/scriptinterface/NativeWrapperDefns.h | 18 ++-- source/scriptinterface/ScriptConversions.cpp | 90 +++++++++---------- source/scriptinterface/ScriptInterface.h | 49 +++++----- .../tests/test_ScriptConversions.h | 32 +++---- .../simulation2/components/CCmpAIManager.cpp | 19 ++-- .../simulation2/components/ICmpFootprint.cpp | 14 +-- .../scripting/EngineScriptConversions.cpp | 76 ++++++++-------- .../scripting/MessageTypeConversions.cpp | 2 +- .../tests/test_CmpTemplateManager.h | 8 +- 13 files changed, 193 insertions(+), 179 deletions(-) diff --git a/source/gui/scripting/GuiScriptConversions.cpp b/source/gui/scripting/GuiScriptConversions.cpp index a9814d7b44..2d006e40c9 100644 --- a/source/gui/scripting/GuiScriptConversions.cpp +++ b/source/gui/scripting/GuiScriptConversions.cpp @@ -23,11 +23,11 @@ #include "lib/external_libraries/libsdl.h" #include "ps/Hotkey.h" -#define SET(obj, name, value) STMT(JS::RootedValue v_(cx); ToJSVal(cx, v_.get(), (value)); JS_SetProperty(cx, (obj), (name), v_.address())) +#define SET(obj, name, value) STMT(JS::RootedValue v_(cx); ToJSVal(cx, &v_, (value)); JS_SetProperty(cx, (obj), (name), v_.address())) // 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(JSContext* cx, JS::Value& ret, SDL_Event_ const& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, SDL_Event_ const& val) { JSAutoRequest rq(cx); const char* typeName; @@ -52,10 +52,10 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& r default: typeName = "(unknown)"; break; } - JSObject* obj = JS_NewObject(cx, NULL, NULL, NULL); - if (! obj) + JS::RootedObject obj(cx, JS_NewObject(cx, NULL, NULL, NULL)); + if (!obj) { - ret = JSVAL_VOID; + ret.setUndefined(); return; } @@ -80,7 +80,7 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& r JSObject* keysym = JS_NewObject(cx, NULL, NULL, NULL); if (! keysym) { - ret = JSVAL_VOID; + ret.setUndefined(); return; } JS::RootedValue keysymVal(cx, JS::ObjectValue(*keysym)); @@ -131,13 +131,13 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& r } } - ret = JS::ObjectValue(*obj); + ret.setObject(*obj); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, IGUIObject* const& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, IGUIObject* const& val) { if (val == NULL) - ret = JSVAL_NULL; + ret.setNull(); else - ret = JS::ObjectValue(*val->GetJSObject()); + ret.setObject(*val->GetJSObject()); } diff --git a/source/gui/scripting/JSInterface_IGUIObject.cpp b/source/gui/scripting/JSInterface_IGUIObject.cpp index 0d0cb9ccf6..0f1dded778 100644 --- a/source/gui/scripting/JSInterface_IGUIObject.cpp +++ b/source/gui/scripting/JSInterface_IGUIObject.cpp @@ -214,7 +214,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Hand { CGUIString value; GUI::GetSetting(e, propName, value); - ScriptInterface::ToJSVal(cx, *vp.address(), value.GetOriginalString()); + ScriptInterface::ToJSVal(cx, vp, value.GetOriginalString()); break; } @@ -222,7 +222,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Hand { CStr value; GUI::GetSetting(e, propName, value); - ScriptInterface::ToJSVal(cx, *vp.address(), value); + ScriptInterface::ToJSVal(cx, vp, value); break; } @@ -230,7 +230,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Hand { CStrW value; GUI::GetSetting(e, propName, value); - ScriptInterface::ToJSVal(cx, *vp.address(), value); + ScriptInterface::ToJSVal(cx, vp, value); break; } @@ -238,7 +238,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Hand { CGUISpriteInstance *value; GUI::GetSettingPointer(e, propName, value); - ScriptInterface::ToJSVal(cx, *vp.address(), value->GetName()); + ScriptInterface::ToJSVal(cx, vp, value->GetName()); break; } @@ -254,7 +254,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Hand case EAlign_Center: word = "center"; break; default: debug_warn(L"Invalid EAlign!"); word = "error"; break; } - ScriptInterface::ToJSVal(cx, *vp.address(), word); + ScriptInterface::ToJSVal(cx, vp, word); break; } @@ -270,7 +270,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Hand case EVAlign_Center: word = "center"; break; default: debug_warn(L"Invalid EVAlign!"); word = "error"; break; } - ScriptInterface::ToJSVal(cx, *vp.address(), word); + ScriptInterface::ToJSVal(cx, vp, word); break; } @@ -280,12 +280,12 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Hand GUI::GetSetting(e, propName, value); JS::RootedObject obj(cx, JS_NewArrayObject(cx, 0, NULL)); - vp.set(JS::ObjectValue(*obj)); + vp.setObject(*obj); for (u32 i = 0; i < value.m_Items.size(); ++i) { JS::RootedValue val(cx); - ScriptInterface::ToJSVal(cx, val.get(), value.m_Items[i].GetOriginalString()); + ScriptInterface::ToJSVal(cx, &val, value.m_Items[i].GetOriginalString()); JS_SetElement(cx, obj, i, val.address()); } diff --git a/source/main.cpp b/source/main.cpp index db8feca3f5..b4d3530216 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -177,6 +177,9 @@ static InReaction MainInputHandler(const SDL_Event_* ev) // dispatch all pending events to the various receivers. static void PumpEvents() { + JSContext* cx = g_GUI->GetScriptInterface()->GetContext(); + JSAutoRequest rq(cx); + PROFILE3("dispatch events"); SDL_Event_ ev; @@ -185,8 +188,8 @@ static void PumpEvents() PROFILE2("event"); if (g_GUI) { - JS::Value tmpVal; - ScriptInterface::ToJSVal(g_GUI->GetScriptInterface()->GetContext(), tmpVal, ev); + JS::RootedValue tmpVal(cx); + ScriptInterface::ToJSVal(cx, &tmpVal, ev); std::string data = g_GUI->GetScriptInterface()->StringifyJSON(tmpVal); PROFILE2_ATTR("%s", data.c_str()); } diff --git a/source/ps/scripting/JSInterface_VFS.cpp b/source/ps/scripting/JSInterface_VFS.cpp index 6f83c667a6..ccc804b8ec 100644 --- a/source/ps/scripting/JSInterface_VFS.cpp +++ b/source/ps/scripting/JSInterface_VFS.cpp @@ -69,7 +69,7 @@ static Status BuildDirEntListCB(const VfsPath& pathname, const CFileInfo& UNUSED BuildDirEntListState* s = (BuildDirEntListState*)cbData; JS::RootedValue val(s->cx); - ScriptInterface::ToJSVal( s->cx, val.get(), CStrW(pathname.string()) ); + ScriptInterface::ToJSVal( s->cx, &val, CStrW(pathname.string()) ); JS_SetElement(s->cx, s->filename_array, s->cur_idx++, val.address()); return INFO::OK; } @@ -146,9 +146,12 @@ unsigned int JSI_VFS::GetFileSize(ScriptInterface::CxPrivate* UNUSED(pCxPrivate) // filename: VFS filename (may include path) CScriptVal JSI_VFS::ReadFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename) { + JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); + JSAutoRequest rq(cx); + CVFSFile file; if (file.Load(g_VFS, filename) != PSRETURN_OK) - return JSVAL_NULL; + return JS::NullValue(); CStr contents = file.DecodeUTF8(); // assume it's UTF-8 @@ -156,9 +159,9 @@ CScriptVal JSI_VFS::ReadFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstrin contents.Replace("\r\n", "\n"); // Decode as UTF-8 - JS::Value ret; - ScriptInterface::ToJSVal( pCxPrivate->pScriptInterface->GetContext(), ret, contents.FromUTF8() ); - return ret; + JS::RootedValue ret(cx); + ScriptInterface::ToJSVal(cx, &ret, contents.FromUTF8()); + return ret.get(); } @@ -168,6 +171,8 @@ CScriptVal JSI_VFS::ReadFile(ScriptInterface::CxPrivate* pCxPrivate, std::wstrin // filename: VFS filename (may include path) CScriptVal JSI_VFS::ReadFileLines(ScriptInterface::CxPrivate* pCxPrivate, std::wstring filename) { + JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); + JSAutoRequest rq(cx); // // read file // @@ -185,8 +190,6 @@ CScriptVal JSI_VFS::ReadFileLines(ScriptInterface::CxPrivate* pCxPrivate, std::w // std::stringstream ss(contents); - - JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); JSObject* line_array = JS_NewArrayObject(cx, 0, NULL); std::string line; @@ -195,9 +198,9 @@ CScriptVal JSI_VFS::ReadFileLines(ScriptInterface::CxPrivate* pCxPrivate, std::w { // Decode each line as UTF-8 JS::RootedValue val(cx); - ScriptInterface::ToJSVal(cx, val.get(), CStr(line).FromUTF8()); + ScriptInterface::ToJSVal(cx, &val, CStr(line).FromUTF8()); JS_SetElement(cx, line_array, cur_line++, val.address()); } - return OBJECT_TO_JSVAL( line_array ); + return JS::ObjectValue(*line_array); } diff --git a/source/scriptinterface/NativeWrapperDefns.h b/source/scriptinterface/NativeWrapperDefns.h index 7fb218813c..dc0aa37ebb 100644 --- a/source/scriptinterface/NativeWrapperDefns.h +++ b/source/scriptinterface/NativeWrapperDefns.h @@ -26,7 +26,7 @@ template struct ScriptInterface_NativeWrapper { #define OVERLOADS(z, i, data) \ template \ - static void call(JSContext* cx, jsval& rval, F fptr T0_A0(z,i)) { \ + static void call(JSContext* cx, JS::MutableHandleValue rval, F fptr T0_A0(z,i)) { \ ScriptInterface::ToJSVal(cx, rval, fptr(ScriptInterface::GetScriptInterfaceAndCBData(cx) A0_TAIL(z,i))); \ } @@ -39,7 +39,7 @@ template <> struct ScriptInterface_NativeWrapper { #define OVERLOADS(z, i, data) \ template \ - static void call(JSContext* cx, jsval& /*rval*/, F fptr T0_A0(z,i)) { \ + static void call(JSContext* cx, JS::MutableHandleValue /*rval*/, F fptr T0_A0(z,i)) { \ fptr(ScriptInterface::GetScriptInterfaceAndCBData(cx) A0_TAIL(z,i)); \ } BOOST_PP_REPEAT(SCRIPT_INTERFACE_MAX_ARGS, OVERLOADS, ~) @@ -52,7 +52,7 @@ template struct ScriptInterface_NativeMethodWrapper { #define OVERLOADS(z, i, data) \ template \ - static void call(JSContext* cx, jsval& rval, TC* c, F fptr T0_A0(z,i)) { \ + static void call(JSContext* cx, JS::MutableHandleValue rval, TC* c, F fptr T0_A0(z,i)) { \ ScriptInterface::ToJSVal(cx, rval, (c->*fptr)( A0(z,i) )); \ } @@ -64,7 +64,7 @@ template struct ScriptInterface_NativeMethodWrapper { #define OVERLOADS(z, i, data) \ template \ - static void call(JSContext* /*cx*/, jsval& /*rval*/, TC* c, F fptr T0_A0(z,i)) { \ + static void call(JSContext* /*cx*/, JS::MutableHandleValue /*rval*/, TC* c, F fptr T0_A0(z,i)) { \ (c->*fptr)( A0(z,i) ); \ } BOOST_PP_REPEAT(SCRIPT_INTERFACE_MAX_ARGS, OVERLOADS, ~) @@ -93,10 +93,11 @@ struct ScriptInterface_NativeMethodWrapper { template \ JSBool ScriptInterface::call(JSContext* cx, uint argc, jsval* vp) { \ JS::CallArgs args = JS::CallArgsFromVp(argc, vp); \ + JSAutoRequest rq(cx); \ SCRIPT_PROFILE \ BOOST_PP_REPEAT_##z (i, CONVERT_ARG, ~) \ - jsval rval = JSVAL_VOID; \ - ScriptInterface_NativeWrapper::call(cx, rval, fptr A0_TAIL(z,i)); \ + JS::RootedValue rval(cx); \ + ScriptInterface_NativeWrapper::call(cx, &rval, fptr A0_TAIL(z,i)); \ args.rval().set(rval); \ return !ScriptInterface::IsExceptionPending(cx); \ } @@ -108,13 +109,14 @@ BOOST_PP_REPEAT(SCRIPT_INTERFACE_MAX_ARGS, OVERLOADS, ~) template \ JSBool ScriptInterface::callMethod(JSContext* cx, uint argc, jsval* vp) { \ JS::CallArgs args = JS::CallArgsFromVp(argc, vp); \ + JSAutoRequest rq(cx); \ SCRIPT_PROFILE \ if (ScriptInterface::GetClass(JS_THIS_OBJECT(cx, vp)) != CLS) return false; \ TC* c = static_cast(ScriptInterface::GetPrivate(JS_THIS_OBJECT(cx, vp))); \ if (! c) return false; \ BOOST_PP_REPEAT_##z (i, CONVERT_ARG, ~) \ - jsval rval = JSVAL_VOID; \ - ScriptInterface_NativeMethodWrapper::call(cx, rval, c, fptr A0_TAIL(z,i)); \ + JS::RootedValue rval(cx); \ + ScriptInterface_NativeMethodWrapper::call(cx, &rval, c, fptr A0_TAIL(z,i)); \ args.rval().set(rval); \ return !ScriptInterface::IsExceptionPending(cx); \ } diff --git a/source/scriptinterface/ScriptConversions.cpp b/source/scriptinterface/ScriptConversions.cpp index 633986a991..d778193e5c 100644 --- a/source/scriptinterface/ScriptConversions.cpp +++ b/source/scriptinterface/ScriptConversions.cpp @@ -231,49 +231,49 @@ template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValu //////////////////////////////////////////////////////////////// // Primitive types: -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const bool& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const bool& val) { - ret = val ? JSVAL_TRUE : JSVAL_FALSE; + ret.setBoolean(val); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const float& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const float& val) { - ret = JS::NumberValue(val); + ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const double& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const double& val) { - ret = JS::NumberValue(val); + ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const i32& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const i32& val) { - ret = JS::NumberValue(val); + ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const u16& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const u16& val) { - ret = JS::NumberValue(val); + ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const u8& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const u8& val) { - ret = JS::NumberValue(val); + ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const u32& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const u32& val) { - ret = JS::NumberValue(val); + ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const long& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const long& val) { - ret = JS::NumberValue((int)val); + ret.set(JS::NumberValue((int)val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const unsigned long& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const unsigned long& val) { - ret = JS::NumberValue((int)val); + ret.set(JS::NumberValue((int)val)); } // (s)size_t are considered to be identical to (unsigned) int by GCC and @@ -283,75 +283,75 @@ template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), J // for some reason, x64 MSC treats size_t as distinct from unsigned long: #if MSC_VERSION && ARCH_AMD64 -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const size_t& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const size_t& val) { - ret = JS::NumberValue((int)val); + ret.set(JS::NumberValue((int)val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const ssize_t& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const ssize_t& val) { - ret = JS::NumberValue((int)val); + ret.set(JS::NumberValue((int)val)); } #endif -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const CScriptVal& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const CScriptVal& val) { - ret = val.get(); + ret.set(val.get()); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const CScriptValRooted& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const CScriptValRooted& val) { - ret = val.get(); + ret.set(val.get()); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const std::wstring& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const std::wstring& val) { JSAutoRequest rq(cx); utf16string utf16(val.begin(), val.end()); JSString* str = JS_NewUCStringCopyN(cx, reinterpret_cast (utf16.c_str()), utf16.length()); if (str) - ret = JS::StringValue(str); + ret.setString(str); else - ret = JS::UndefinedValue(); + ret.setUndefined(); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const Path& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const Path& val) { ToJSVal(cx, ret, val.string()); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const std::string& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const std::string& val) { JSAutoRequest rq(cx); JSString* str = JS_NewStringCopyN(cx, val.c_str(), val.length()); if (str) - ret = JS::StringValue(str); + ret.setString(str); else - ret = JS::UndefinedValue(); + ret.setUndefined(); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const wchar_t* const& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const wchar_t* const& val) { ToJSVal(cx, ret, std::wstring(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const char* const& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const char* const& val) { JSAutoRequest rq(cx); JSString* str = JS_NewStringCopyZ(cx, val); if (str) - ret = JS::StringValue(str); + ret.setString(str); else - ret = JS::UndefinedValue(); + ret.setUndefined(); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const CStrW& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const CStrW& val) { ToJSVal(cx, ret, static_cast(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const CStr8& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const CStr8& val) { ToJSVal(cx, ret, static_cast(val)); } @@ -359,22 +359,22 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, c //////////////////////////////////////////////////////////////// // Compound types: -template static void ToJSVal_vector(JSContext* cx, JS::Value& ret, const std::vector& val) +template static void ToJSVal_vector(JSContext* cx, JS::MutableHandleValue ret, const std::vector& val) { JSAutoRequest rq(cx); JSObject* obj = JS_NewArrayObject(cx, val.size(), NULL); if (!obj) { - ret = JS::UndefinedValue(); + ret.setUndefined(); return; } for (u32 i = 0; i < val.size(); ++i) { JS::RootedValue el(cx); - ScriptInterface::ToJSVal(cx, el.get(), val[i]); + ScriptInterface::ToJSVal(cx, &el, val[i]); JS_SetElement(cx, obj, i, el.address()); } - ret = JS::ObjectValue(*obj); + ret.setObject(*obj); } template static bool FromJSVal_vector(JSContext* cx, JS::HandleValue v, std::vector& out) @@ -407,7 +407,7 @@ template static bool FromJSVal_vector(JSContext* cx, JS::HandleValue // Instantiate various vector types: #define VECTOR(T) \ - template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::Value& ret, const std::vector& val) \ + template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::MutableHandleValue ret, const std::vector& val) \ { \ ToJSVal_vector(cx, ret, val); \ } \ @@ -425,7 +425,7 @@ VECTOR(CScriptValRooted) class IComponent; -template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::Value& ret, const std::vector& val) +template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::MutableHandleValue ret, const std::vector& val) { ToJSVal_vector(cx, ret, val); } diff --git a/source/scriptinterface/ScriptInterface.h b/source/scriptinterface/ScriptInterface.h index 699945543a..b18e890c77 100644 --- a/source/scriptinterface/ScriptInterface.h +++ b/source/scriptinterface/ScriptInterface.h @@ -337,7 +337,7 @@ public: * 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(JSContext* cx, JS::Value& ret, T const& val); + template static void ToJSVal(JSContext* cx, JS::MutableHandleValue ret, T const& val); AutoGCRooter* ReplaceAutoGCRooter(AutoGCRooter* rooter); @@ -466,7 +466,7 @@ bool ScriptInterface::CallFunctionVoid(jsval val, const char* name, const T0& a0 JS::RootedValue val1(cx, val); JS::AutoValueVector argv(cx); argv.resize(1); - ToJSVal(cx, argv[0], a0); + ToJSVal(cx, argv.handleAt(0), a0); return CallFunction_(val1, name, 1, argv.begin(), &jsRet); } @@ -479,8 +479,8 @@ bool ScriptInterface::CallFunctionVoid(jsval val, const char* name, const T0& a0 JS::RootedValue val1(cx, val); JS::AutoValueVector argv(cx); argv.resize(2); - ToJSVal(cx, argv[0], a0); - ToJSVal(cx, argv[1], a1); + ToJSVal(cx, argv.handleAt(0), a0); + ToJSVal(cx, argv.handleAt(1), a1); return CallFunction_(val1, name, 2, argv.begin(), &jsRet); } @@ -493,9 +493,9 @@ bool ScriptInterface::CallFunctionVoid(jsval val, const char* name, const T0& a0 JS::RootedValue val1(cx, val); JS::AutoValueVector argv(cx); argv.resize(3); - ToJSVal(cx, argv[0], a0); - ToJSVal(cx, argv[1], a1); - ToJSVal(cx, argv[2], a2); + ToJSVal(cx, argv.handleAt(0), a0); + ToJSVal(cx, argv.handleAt(1), a1); + ToJSVal(cx, argv.handleAt(2), a2); return CallFunction_(val1, name, 3, argv.begin(), &jsRet); } @@ -508,7 +508,7 @@ bool ScriptInterface::CallFunction(jsval val, const char* name, const T0& a0, R& JS::RootedValue val1(cx, val); JS::AutoValueVector argv(cx); argv.resize(1); - ToJSVal(cx, argv[0], a0); + ToJSVal(cx, argv.handleAt(0), a0); bool ok = CallFunction_(val1, name, 1, argv.begin(), &jsRet); if (!ok) return false; @@ -524,8 +524,8 @@ bool ScriptInterface::CallFunction(jsval val, const char* name, const T0& a0, co JS::RootedValue val1(cx, val); JS::AutoValueVector argv(cx); argv.resize(2); - ToJSVal(cx, argv[0], a0); - ToJSVal(cx, argv[1], a1); + ToJSVal(cx, argv.handleAt(0), a0); + ToJSVal(cx, argv.handleAt(1), a1); bool ok = CallFunction_(val1, name, 2, argv.begin(), &jsRet); if (!ok) return false; @@ -541,9 +541,9 @@ bool ScriptInterface::CallFunction(jsval val, const char* name, const T0& a0, co JS::RootedValue val1(cx, val); JS::AutoValueVector argv(cx); argv.resize(3); - ToJSVal(cx, argv[0], a0); - ToJSVal(cx, argv[1], a1); - ToJSVal(cx, argv[2], a2); + ToJSVal(cx, argv.handleAt(0), a0); + ToJSVal(cx, argv.handleAt(1), a1); + ToJSVal(cx, argv.handleAt(2), a2); bool ok = CallFunction_(val1, name, 3, argv.begin(), &jsRet); if (!ok) return false; @@ -559,10 +559,10 @@ bool ScriptInterface::CallFunction(jsval val, const char* name, const T0& a0, co JS::RootedValue val1(cx, val); JS::AutoValueVector argv(cx); argv.resize(4); - ToJSVal(cx, argv[0], a0); - ToJSVal(cx, argv[1], a1); - ToJSVal(cx, argv[2], a2); - ToJSVal(cx, argv[3], a3); + ToJSVal(cx, argv.handleAt(0), a0); + ToJSVal(cx, argv.handleAt(1), a1); + ToJSVal(cx, argv.handleAt(2), a2); + ToJSVal(cx, argv.handleAt(3), a3); bool ok = CallFunction_(val1, name, 4, argv.begin(), &jsRet); if (!ok) return false; @@ -572,16 +572,18 @@ bool ScriptInterface::CallFunction(jsval val, const char* name, const T0& a0, co template bool ScriptInterface::SetGlobal(const char* name, const T& value, bool replace) { - JS::Value val; - ToJSVal(GetContext(), val, value); + JSAutoRequest rq(GetContext()); + JS::RootedValue val(GetContext()); + ToJSVal(GetContext(), &val, value); return SetGlobal_(name, val, replace); } template bool ScriptInterface::SetProperty(jsval obj, const char* name, const T& value, bool readonly, bool enumerate) { - JS::Value val; - ToJSVal(GetContext(), val, value); + JSAutoRequest rq(GetContext()); + JS::RootedValue val(GetContext()); + ToJSVal(GetContext(), &val, value); return SetProperty_(obj, name, val, readonly, enumerate); } @@ -594,8 +596,9 @@ bool ScriptInterface::SetProperty(jsval obj, const wchar_t* name, const T& value template bool ScriptInterface::SetPropertyInt(jsval obj, int name, const T& value, bool readonly, bool enumerate) { - JS::Value val; - ToJSVal(GetContext(), val, value); + JSAutoRequest rq(GetContext()); + JS::RootedValue val(GetContext()); + ToJSVal(GetContext(), &val, value); return SetPropertyInt_(obj, name, val, readonly, enumerate); } diff --git a/source/scriptinterface/tests/test_ScriptConversions.h b/source/scriptinterface/tests/test_ScriptConversions.h index b389c33507..643c6f4077 100644 --- a/source/scriptinterface/tests/test_ScriptConversions.h +++ b/source/scriptinterface/tests/test_ScriptConversions.h @@ -34,13 +34,13 @@ class TestScriptConversions : public CxxTest::TestSuite JSContext* cx = script.GetContext(); JSAutoRequest rq(cx); - JS::Value v1; - ScriptInterface::ToJSVal(cx, v1, value); + JS::RootedValue v1(cx); + ScriptInterface::ToJSVal(cx, &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. std::string source; - TS_ASSERT(script.CallFunction(OBJECT_TO_JSVAL(JS_GetGlobalForScopeChain(cx)), "uneval", CScriptVal(v1), source)); + TS_ASSERT(script.CallFunction(JS::ObjectValue(*JS_GetGlobalForScopeChain(cx)), "uneval", CScriptVal(v1), source)); TS_ASSERT_STR_EQUALS(source, expected); } @@ -53,10 +53,10 @@ class TestScriptConversions : public CxxTest::TestSuite JSAutoRequest rq(cx); JS::RootedValue v1(cx); - ScriptInterface::ToJSVal(cx, v1.get(), value); + ScriptInterface::ToJSVal(cx, &v1, value); std::string source; - TS_ASSERT(script.CallFunction(OBJECT_TO_JSVAL(JS_GetGlobalForScopeChain(cx)), "uneval", CScriptVal(v1), source)); + TS_ASSERT(script.CallFunction(JS::ObjectValue(*JS_GetGlobalForScopeChain(cx)), "uneval", CScriptVal(v1), source)); if (expected) TS_ASSERT_STR_EQUALS(source, expected); @@ -130,22 +130,22 @@ public: JSAutoRequest rq(cx); // using new uninitialized variables each time to be sure the test doesn't succeeed if ToJSVal doesn't touch the value at all. - JS::Value val0, val1, val2, val3, val4, val5, val6, val7, val8; - ScriptInterface::ToJSVal(cx, val0, 0); - ScriptInterface::ToJSVal(cx, val1, 2147483646); // JSVAL_INT_MAX-1 - ScriptInterface::ToJSVal(cx, val2, 2147483647); // JSVAL_INT_MAX - ScriptInterface::ToJSVal(cx, val3, -2147483647); // JSVAL_INT_MIN+1 - ScriptInterface::ToJSVal(cx, val4, -(i64)2147483648u); // JSVAL_INT_MIN + JS::RootedValue val0(cx), val1(cx), val2(cx), val3(cx), val4(cx), val5(cx), val6(cx), val7(cx), val8(cx); + ScriptInterface::ToJSVal(cx, &val0, 0); + ScriptInterface::ToJSVal(cx, &val1, 2147483646); // JSVAL_INT_MAX-1 + ScriptInterface::ToJSVal(cx, &val2, 2147483647); // JSVAL_INT_MAX + ScriptInterface::ToJSVal(cx, &val3, -2147483647); // JSVAL_INT_MIN+1 + ScriptInterface::ToJSVal(cx, &val4, -(i64)2147483648u); // JSVAL_INT_MIN TS_ASSERT(JSVAL_IS_INT(val0)); TS_ASSERT(JSVAL_IS_INT(val1)); TS_ASSERT(JSVAL_IS_INT(val2)); TS_ASSERT(JSVAL_IS_INT(val3)); TS_ASSERT(JSVAL_IS_INT(val4)); - ScriptInterface::ToJSVal(cx, val5, 0); - ScriptInterface::ToJSVal(cx, val6, 2147483646u); // JSVAL_INT_MAX-1 - ScriptInterface::ToJSVal(cx, val7, 2147483647u); // JSVAL_INT_MAX - ScriptInterface::ToJSVal(cx, val8, 2147483648u); // JSVAL_INT_MAX+1 + ScriptInterface::ToJSVal(cx, &val5, 0); + ScriptInterface::ToJSVal(cx, &val6, 2147483646u); // JSVAL_INT_MAX-1 + ScriptInterface::ToJSVal(cx, &val7, 2147483647u); // JSVAL_INT_MAX + ScriptInterface::ToJSVal(cx, &val8, 2147483648u); // JSVAL_INT_MAX+1 TS_ASSERT(JSVAL_IS_INT(val5)); TS_ASSERT(JSVAL_IS_INT(val6)); TS_ASSERT(JSVAL_IS_INT(val7)); @@ -164,7 +164,7 @@ public: float f = 0; JS::RootedValue testNANVal(cx); - ScriptInterface::ToJSVal(cx, testNANVal.get(), NAN); + ScriptInterface::ToJSVal(cx, &testNANVal, NAN); TS_ASSERT(ScriptInterface::FromJSVal(cx, testNANVal, f)); TS_ASSERT(isnan(f)); } diff --git a/source/simulation2/components/CCmpAIManager.cpp b/source/simulation2/components/CCmpAIManager.cpp index 8de286493b..ea9f6a75d2 100644 --- a/source/simulation2/components/CCmpAIManager.cpp +++ b/source/simulation2/components/CCmpAIManager.cpp @@ -350,6 +350,9 @@ public: bool TryLoadSharedComponent(bool hasTechs) { + JSContext* cx = m_ScriptInterface->GetContext(); + JSAutoRequest rq(cx); + // we don't need to load it. if (!m_HasSharedComponent) return false; @@ -390,8 +393,8 @@ public: for (size_t i = 0; i < m_Players.size(); ++i) { - JS::Value val; - m_ScriptInterface->ToJSVal(m_ScriptInterface->GetContext(), val, m_Players[i]->m_Player); + JS::RootedValue val(cx); + m_ScriptInterface->ToJSVal(cx, &val, m_Players[i]->m_Player); m_ScriptInterface->SetPropertyInt(playersID.get(), i, CScriptVal(val), true); } @@ -411,9 +414,9 @@ public: m_ScriptInterface->SetProperty(settings.get(), "techTemplates", fakeTech, false); } - JS::AutoValueVector argv(m_ScriptInterface->GetContext()); + JS::AutoValueVector argv(cx); argv.append(settings.get()); - m_SharedAIObj = CScriptValRooted(m_ScriptInterface->GetContext(),m_ScriptInterface->CallConstructor(ctor.get(), argv.length(), argv.handleAt(0))); + m_SharedAIObj = CScriptValRooted(cx, m_ScriptInterface->CallConstructor(ctor.get(), argv.length(), argv.handleAt(0))); if (m_SharedAIObj.undefined()) @@ -449,9 +452,9 @@ public: JSContext* cx = m_ScriptInterface->GetContext(); JS::RootedValue tmpVal(cx); - ScriptInterface::ToJSVal(cx, tmpVal.get(), passabilityMap); + ScriptInterface::ToJSVal(cx, &tmpVal, passabilityMap); m_PassabilityMapVal = CScriptValRooted(cx, tmpVal.get()); - ScriptInterface::ToJSVal(cx, tmpVal.get(), territoryMap); + ScriptInterface::ToJSVal(cx, &tmpVal, territoryMap); m_TerritoryMapVal = CScriptValRooted(cx, tmpVal); if (m_HasSharedComponent) { @@ -482,7 +485,7 @@ public: { m_PassabilityMap = passabilityMap; JS::RootedValue tmpVal(cx); - ScriptInterface::ToJSVal(cx, tmpVal.get(), m_PassabilityMap); + ScriptInterface::ToJSVal(cx, &tmpVal, m_PassabilityMap); m_PassabilityMapVal = CScriptValRooted(cx, tmpVal); } @@ -490,7 +493,7 @@ public: { m_TerritoryMap = territoryMap; JS::RootedValue tmpVal(cx); - ScriptInterface::ToJSVal(cx, tmpVal.get(), m_TerritoryMap); + ScriptInterface::ToJSVal(cx, &tmpVal, m_TerritoryMap); m_TerritoryMapVal = CScriptValRooted(cx, tmpVal); } diff --git a/source/simulation2/components/ICmpFootprint.cpp b/source/simulation2/components/ICmpFootprint.cpp index 0c100ca252..dcbe44ced4 100644 --- a/source/simulation2/components/ICmpFootprint.cpp +++ b/source/simulation2/components/ICmpFootprint.cpp @@ -41,9 +41,9 @@ CScriptVal ICmpFootprint::GetShape_wrapper() JS::RootedValue ptype(cx); JS::RootedValue pradius(cx); JS::RootedValue pheight(cx); - ScriptInterface::ToJSVal(cx, ptype.get(), "circle"); - ScriptInterface::ToJSVal(cx, pradius.get(), size0); - ScriptInterface::ToJSVal(cx, pheight.get(), height); + ScriptInterface::ToJSVal(cx, &ptype, "circle"); + ScriptInterface::ToJSVal(cx, &pradius, size0); + ScriptInterface::ToJSVal(cx, &pheight, height); JS_SetProperty(cx, obj, "type", ptype.address()); JS_SetProperty(cx, obj, "radius", pradius.address()); JS_SetProperty(cx, obj, "height", pheight.address()); @@ -54,10 +54,10 @@ CScriptVal ICmpFootprint::GetShape_wrapper() JS::RootedValue pwidth(cx); JS::RootedValue pdepth(cx); JS::RootedValue pheight(cx); - ScriptInterface::ToJSVal(cx, ptype.get(), "square"); - ScriptInterface::ToJSVal(cx, pwidth.get(), size0); - ScriptInterface::ToJSVal(cx, pdepth.get(), size1); - ScriptInterface::ToJSVal(cx, pheight.get(), height); + ScriptInterface::ToJSVal(cx, &ptype, "square"); + ScriptInterface::ToJSVal(cx, &pwidth, size0); + ScriptInterface::ToJSVal(cx, &pdepth, size1); + ScriptInterface::ToJSVal(cx, &pheight, height); JS_SetProperty(cx, obj, "type", ptype.address()); JS_SetProperty(cx, obj, "width", pwidth.address()); JS_SetProperty(cx, obj, "depth", pdepth.address()); diff --git a/source/simulation2/scripting/EngineScriptConversions.cpp b/source/simulation2/scripting/EngineScriptConversions.cpp index f38a6c465a..d107977ead 100644 --- a/source/simulation2/scripting/EngineScriptConversions.cpp +++ b/source/simulation2/scripting/EngineScriptConversions.cpp @@ -32,12 +32,12 @@ #define FAIL(msg) STMT(JS_ReportError(cx, msg); return false) -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, IComponent* const& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, IComponent* const& val) { JSAutoRequest rq(cx); if (val == NULL) { - ret = JS::NullValue(); + ret.setNull(); return; } @@ -45,7 +45,7 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& JS::RootedValue instance(cx, val->GetJSInstance()); if (!instance.isNull()) { - ret = instance; + ret.set(instance); return; } @@ -56,18 +56,18 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& { // Report as an error, since scripts really shouldn't try to use unscriptable interfaces LOGERROR(L"IComponent does not have a scriptable interface"); - ret = JS::UndefinedValue(); + ret.setUndefined(); return; } JS_SetPrivate(obj, static_cast(val)); - ret = JS::ObjectValue(*obj); + ret.setObject(*obj); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, CParamNode const& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, CParamNode const& val) { JSAutoRequest rq(cx); - ret = val.ToJSVal(cx, true); + ret.set(val.ToJSVal(cx, true)); // Prevent modifications to the object, so that it's safe to share between // components and to reconstruct on deserialization @@ -75,18 +75,18 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& r JS_DeepFreezeObject(cx, &ret.toObject()); } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const CParamNode* const& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const CParamNode* const& val) { if (val) ToJSVal(cx, ret, *val); else - ret = JSVAL_VOID; + ret.setUndefined(); } template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, CColor& out) { if (!v.isObject()) - FAIL("jsval not an object"); + FAIL("JS::HandleValue not an object"); JSAutoRequest rq(cx); JS::RootedObject obj(cx, &v.toObject()); @@ -107,13 +107,13 @@ template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValu return true; } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, CColor const& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, CColor const& val) { JSAutoRequest rq(cx); JS::RootedObject obj(cx, JS_NewObject(cx, NULL, NULL, NULL)); if (!obj) { - ret = JSVAL_VOID; + ret.setUndefined(); return; } @@ -121,17 +121,17 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, JS::RootedValue g(cx); JS::RootedValue b(cx); JS::RootedValue a(cx); - ToJSVal(cx, r.get(), val.r); - ToJSVal(cx, g.get(), val.g); - ToJSVal(cx, b.get(), val.b); - ToJSVal(cx, a.get(), val.a); + ToJSVal(cx, &r, val.r); + ToJSVal(cx, &g, val.g); + ToJSVal(cx, &b, val.b); + ToJSVal(cx, &a, val.a); JS_SetProperty(cx, obj, "r", r.address()); JS_SetProperty(cx, obj, "g", g.address()); JS_SetProperty(cx, obj, "b", b.address()); JS_SetProperty(cx, obj, "a", a.address()); - ret = JS::ObjectValue(*obj); + ret.setObject(*obj); } template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, fixed& out) @@ -146,9 +146,9 @@ template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue return true; } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Value& ret, const fixed& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const fixed& val) { - ret = JS::NumberValue(val.ToDouble()); + ret.set(JS::NumberValue(val.ToDouble())); } template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, CFixedVector3D& out) @@ -172,7 +172,7 @@ template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::Ha return true; } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const CFixedVector3D& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const CFixedVector3D& val) { JSAutoRequest rq(cx); @@ -184,22 +184,22 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Valu if (!obj) { - ret = JSVAL_VOID; + ret.setUndefined(); return; } JS::RootedValue x(cx); JS::RootedValue y(cx); JS::RootedValue z(cx); - ToJSVal(cx, x.get(), val.X); - ToJSVal(cx, y.get(), val.Y); - ToJSVal(cx, z.get(), val.Z); + ToJSVal(cx, &x, val.X); + ToJSVal(cx, &y, val.Y); + ToJSVal(cx, &z, val.Z); JS_SetProperty(cx, obj, "x", x.address()); JS_SetProperty(cx, obj, "y", y.address()); JS_SetProperty(cx, obj, "z", z.address()); - ret = JS::ObjectValue(*obj); + ret.setObject(*obj); } template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, CFixedVector2D& out) @@ -220,7 +220,7 @@ template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::Ha return true; } -template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Value& ret, const CFixedVector2D& val) +template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const CFixedVector2D& val) { JSAutoRequest rq(cx); @@ -231,22 +231,22 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::Valu NULL)); if (!obj) { - ret = JSVAL_VOID; + ret.setUndefined(); return; } JS::RootedValue x(cx); JS::RootedValue y(cx); - ToJSVal(cx, x.get(), val.X); - ToJSVal(cx, y.get(), val.Y); + ToJSVal(cx, &x, val.X); + ToJSVal(cx, &y, val.Y); JS_SetProperty(cx, obj, "x", x.address()); JS_SetProperty(cx, obj, "y", y.address()); - ret = JS::ObjectValue(*obj); + ret.setObject(*obj); } -template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::Value& ret, const Grid& val) +template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::MutableHandleValue ret, const Grid& val) { JSAutoRequest rq(cx); u32 length = (u32)(val.m_W * val.m_H); @@ -257,18 +257,18 @@ template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::Value& re JS::RootedValue data(cx, JS::ObjectValue(*objArr)); JS::RootedValue w(cx); JS::RootedValue h(cx); - ScriptInterface::ToJSVal(cx, w.get(), val.m_W); - ScriptInterface::ToJSVal(cx, h.get(), val.m_H); + ScriptInterface::ToJSVal(cx, &w, val.m_W); + ScriptInterface::ToJSVal(cx, &h, val.m_H); JS::RootedObject obj(cx, JS_NewObject(cx, NULL, NULL, NULL)); JS_SetProperty(cx, obj, "width", w.address()); JS_SetProperty(cx, obj, "height", h.address()); JS_SetProperty(cx, obj, "data", data.address()); - ret = JS::ObjectValue(*obj); + ret.setObject(*obj); } -template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::Value& ret, const Grid& val) +template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::MutableHandleValue ret, const Grid& val) { JSAutoRequest rq(cx); u32 length = (u32)(val.m_W * val.m_H); @@ -279,13 +279,13 @@ template<> void ScriptInterface::ToJSVal >(JSContext* cx, JS::Value& r JS::RootedValue data(cx, JS::ObjectValue(*objArr)); JS::RootedValue w(cx); JS::RootedValue h(cx); - ScriptInterface::ToJSVal(cx, w.get(), val.m_W); - ScriptInterface::ToJSVal(cx, h.get(), val.m_H); + ScriptInterface::ToJSVal(cx, &w, val.m_W); + ScriptInterface::ToJSVal(cx, &h, val.m_H); JS::RootedObject obj(cx, JS_NewObject(cx, NULL, NULL, NULL)); JS_SetProperty(cx, obj, "width", w.address()); JS_SetProperty(cx, obj, "height", h.address()); JS_SetProperty(cx, obj, "data", data.address()); - ret = JS::ObjectValue(*obj); + ret.setObject(*obj); } diff --git a/source/simulation2/scripting/MessageTypeConversions.cpp b/source/simulation2/scripting/MessageTypeConversions.cpp index b4f4b41f91..116cda917c 100644 --- a/source/simulation2/scripting/MessageTypeConversions.cpp +++ b/source/simulation2/scripting/MessageTypeConversions.cpp @@ -35,7 +35,7 @@ JSAutoRequest rq(scriptInterface.GetContext()); \ JSContext* cx = scriptInterface.GetContext(); \ JS::RootedValue prop(cx);\ - ScriptInterface::ToJSVal(cx, prop.get(), this->name); \ + ScriptInterface::ToJSVal(cx, &prop, this->name); \ if (! JS_SetProperty(cx, obj, #name, prop.address())) \ return JSVAL_VOID; \ } while (0); diff --git a/source/simulation2/tests/test_CmpTemplateManager.h b/source/simulation2/tests/test_CmpTemplateManager.h index 89e8394332..2cdffe6941 100644 --- a/source/simulation2/tests/test_CmpTemplateManager.h +++ b/source/simulation2/tests/test_CmpTemplateManager.h @@ -134,19 +134,19 @@ public: const CParamNode* inherit1 = tempMan->LoadTemplate(ent2, "inherit1", -1); JS::RootedValue val(cx); - ScriptInterface::ToJSVal(cx, val.get(), inherit1); + ScriptInterface::ToJSVal(cx, &val, inherit1); TS_ASSERT_WSTR_EQUALS(man.GetScriptInterface().ToString(val.get()), L"({Test1A:{'@a':\"a1\", '@b':\"b1\", '@c':\"c1\", d:\"d1\", e:\"e1\", f:\"f1\"}})"); const CParamNode* inherit2 = tempMan->LoadTemplate(ent2, "inherit2", -1); - ScriptInterface::ToJSVal(cx, val.get(), inherit2); + ScriptInterface::ToJSVal(cx, &val, inherit2); TS_ASSERT_WSTR_EQUALS(man.GetScriptInterface().ToString(val.get()), L"({'@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", -1); - ScriptInterface::ToJSVal(cx, val.get(), &actor->GetChild("VisualActor")); + ScriptInterface::ToJSVal(cx, &val, &actor->GetChild("VisualActor")); TS_ASSERT_WSTR_EQUALS(man.GetScriptInterface().ToString(val.get()), L"({Actor:\"example1\", ActorOnly:(void 0), SilhouetteDisplay:\"false\", SilhouetteOccluder:\"false\", VisibleInAtlasOnly:\"false\"})"); const CParamNode* foundation = tempMan->LoadTemplate(ent2, "foundation|actor|example1", -1); - ScriptInterface::ToJSVal(cx, val.get(), &foundation->GetChild("VisualActor")); + ScriptInterface::ToJSVal(cx, &val, &foundation->GetChild("VisualActor")); TS_ASSERT_WSTR_EQUALS(man.GetScriptInterface().ToString(val.get()), L"({Actor:\"example1\", ActorOnly:(void 0), Foundation:(void 0), SilhouetteDisplay:\"false\", SilhouetteOccluder:\"false\", VisibleInAtlasOnly:\"false\"})"); }