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.
This commit is contained in:
Yves
2014-07-14 19:52:35 +00:00
parent 17634d7507
commit 52f4cda439
13 changed files with 193 additions and 179 deletions
+26 -23
View File
@@ -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<typename T> static void ToJSVal(JSContext* cx, JS::Value& ret, T const& val);
template<typename T> 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<typename T>
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<typename T>
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<typename T>
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);
}