mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-06-22 16:28:19 +00:00
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:
@@ -231,49 +231,49 @@ template<> bool ScriptInterface::FromJSVal<Entity>(JSContext* cx, JS::HandleValu
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Primitive types:
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<bool>(JSContext* UNUSED(cx), JS::Value& ret, const bool& val)
|
||||
template<> void ScriptInterface::ToJSVal<bool>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const bool& val)
|
||||
{
|
||||
ret = val ? JSVAL_TRUE : JSVAL_FALSE;
|
||||
ret.setBoolean(val);
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<float>(JSContext* UNUSED(cx), JS::Value& ret, const float& val)
|
||||
template<> void ScriptInterface::ToJSVal<float>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const float& val)
|
||||
{
|
||||
ret = JS::NumberValue(val);
|
||||
ret.set(JS::NumberValue(val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<double>(JSContext* UNUSED(cx), JS::Value& ret, const double& val)
|
||||
template<> void ScriptInterface::ToJSVal<double>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const double& val)
|
||||
{
|
||||
ret = JS::NumberValue(val);
|
||||
ret.set(JS::NumberValue(val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<i32>(JSContext* UNUSED(cx), JS::Value& ret, const i32& val)
|
||||
template<> void ScriptInterface::ToJSVal<i32>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const i32& val)
|
||||
{
|
||||
ret = JS::NumberValue(val);
|
||||
ret.set(JS::NumberValue(val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<u16>(JSContext* UNUSED(cx), JS::Value& ret, const u16& val)
|
||||
template<> void ScriptInterface::ToJSVal<u16>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const u16& val)
|
||||
{
|
||||
ret = JS::NumberValue(val);
|
||||
ret.set(JS::NumberValue(val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<u8>(JSContext* UNUSED(cx), JS::Value& ret, const u8& val)
|
||||
template<> void ScriptInterface::ToJSVal<u8>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const u8& val)
|
||||
{
|
||||
ret = JS::NumberValue(val);
|
||||
ret.set(JS::NumberValue(val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<u32>(JSContext* UNUSED(cx), JS::Value& ret, const u32& val)
|
||||
template<> void ScriptInterface::ToJSVal<u32>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const u32& val)
|
||||
{
|
||||
ret = JS::NumberValue(val);
|
||||
ret.set(JS::NumberValue(val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<long>(JSContext* UNUSED(cx), JS::Value& ret, const long& val)
|
||||
template<> void ScriptInterface::ToJSVal<long>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const long& val)
|
||||
{
|
||||
ret = JS::NumberValue((int)val);
|
||||
ret.set(JS::NumberValue((int)val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<unsigned long>(JSContext* UNUSED(cx), JS::Value& ret, const unsigned long& val)
|
||||
template<> void ScriptInterface::ToJSVal<unsigned long>(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<unsigned long>(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<size_t>(JSContext* UNUSED(cx), JS::Value& ret, const size_t& val)
|
||||
template<> void ScriptInterface::ToJSVal<size_t>(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<ssize_t>(JSContext* UNUSED(cx), JS::Value& ret, const ssize_t& val)
|
||||
template<> void ScriptInterface::ToJSVal<ssize_t>(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<CScriptVal>(JSContext* UNUSED(cx), JS::Value& ret, const CScriptVal& val)
|
||||
template<> void ScriptInterface::ToJSVal<CScriptVal>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const CScriptVal& val)
|
||||
{
|
||||
ret = val.get();
|
||||
ret.set(val.get());
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<CScriptValRooted>(JSContext* UNUSED(cx), JS::Value& ret, const CScriptValRooted& val)
|
||||
template<> void ScriptInterface::ToJSVal<CScriptValRooted>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const CScriptValRooted& val)
|
||||
{
|
||||
ret = val.get();
|
||||
ret.set(val.get());
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<std::wstring>(JSContext* cx, JS::Value& ret, const std::wstring& val)
|
||||
template<> void ScriptInterface::ToJSVal<std::wstring>(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<const jschar*> (utf16.c_str()), utf16.length());
|
||||
if (str)
|
||||
ret = JS::StringValue(str);
|
||||
ret.setString(str);
|
||||
else
|
||||
ret = JS::UndefinedValue();
|
||||
ret.setUndefined();
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<Path>(JSContext* cx, JS::Value& ret, const Path& val)
|
||||
template<> void ScriptInterface::ToJSVal<Path>(JSContext* cx, JS::MutableHandleValue ret, const Path& val)
|
||||
{
|
||||
ToJSVal(cx, ret, val.string());
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<std::string>(JSContext* cx, JS::Value& ret, const std::string& val)
|
||||
template<> void ScriptInterface::ToJSVal<std::string>(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<const wchar_t*>(JSContext* cx, JS::Value& ret, const wchar_t* const& val)
|
||||
template<> void ScriptInterface::ToJSVal<const wchar_t*>(JSContext* cx, JS::MutableHandleValue ret, const wchar_t* const& val)
|
||||
{
|
||||
ToJSVal(cx, ret, std::wstring(val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<const char*>(JSContext* cx, JS::Value& ret, const char* const& val)
|
||||
template<> void ScriptInterface::ToJSVal<const char*>(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<CStrW>(JSContext* cx, JS::Value& ret, const CStrW& val)
|
||||
template<> void ScriptInterface::ToJSVal<CStrW>(JSContext* cx, JS::MutableHandleValue ret, const CStrW& val)
|
||||
{
|
||||
ToJSVal(cx, ret, static_cast<const std::wstring&>(val));
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<CStr8>(JSContext* cx, JS::Value& ret, const CStr8& val)
|
||||
template<> void ScriptInterface::ToJSVal<CStr8>(JSContext* cx, JS::MutableHandleValue ret, const CStr8& val)
|
||||
{
|
||||
ToJSVal(cx, ret, static_cast<const std::string&>(val));
|
||||
}
|
||||
@@ -359,22 +359,22 @@ template<> void ScriptInterface::ToJSVal<CStr8>(JSContext* cx, JS::Value& ret, c
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Compound types:
|
||||
|
||||
template<typename T> static void ToJSVal_vector(JSContext* cx, JS::Value& ret, const std::vector<T>& val)
|
||||
template<typename T> static void ToJSVal_vector(JSContext* cx, JS::MutableHandleValue ret, const std::vector<T>& 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<T>(cx, el.get(), val[i]);
|
||||
ScriptInterface::ToJSVal<T>(cx, &el, val[i]);
|
||||
JS_SetElement(cx, obj, i, el.address());
|
||||
}
|
||||
ret = JS::ObjectValue(*obj);
|
||||
ret.setObject(*obj);
|
||||
}
|
||||
|
||||
template<typename T> static bool FromJSVal_vector(JSContext* cx, JS::HandleValue v, std::vector<T>& out)
|
||||
@@ -407,7 +407,7 @@ template<typename T> static bool FromJSVal_vector(JSContext* cx, JS::HandleValue
|
||||
// Instantiate various vector types:
|
||||
|
||||
#define VECTOR(T) \
|
||||
template<> void ScriptInterface::ToJSVal<std::vector<T> >(JSContext* cx, JS::Value& ret, const std::vector<T>& val) \
|
||||
template<> void ScriptInterface::ToJSVal<std::vector<T> >(JSContext* cx, JS::MutableHandleValue ret, const std::vector<T>& val) \
|
||||
{ \
|
||||
ToJSVal_vector(cx, ret, val); \
|
||||
} \
|
||||
@@ -425,7 +425,7 @@ VECTOR(CScriptValRooted)
|
||||
|
||||
|
||||
class IComponent;
|
||||
template<> void ScriptInterface::ToJSVal<std::vector<IComponent*> >(JSContext* cx, JS::Value& ret, const std::vector<IComponent*>& val)
|
||||
template<> void ScriptInterface::ToJSVal<std::vector<IComponent*> >(JSContext* cx, JS::MutableHandleValue ret, const std::vector<IComponent*>& val)
|
||||
{
|
||||
ToJSVal_vector(cx, ret, val);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user