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:
parent
17634d7507
commit
52f4cda439
@ -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<SDL_Event_>(JSContext* cx, JS::Value& ret, SDL_Event_ const& val)
|
||||
template<> void ScriptInterface::ToJSVal<SDL_Event_>(JSContext* cx, JS::MutableHandleValue ret, SDL_Event_ const& val)
|
||||
{
|
||||
JSAutoRequest rq(cx);
|
||||
const char* typeName;
|
||||
@ -52,10 +52,10 @@ template<> void ScriptInterface::ToJSVal<SDL_Event_>(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<SDL_Event_>(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<SDL_Event_>(JSContext* cx, JS::Value& r
|
||||
}
|
||||
}
|
||||
|
||||
ret = JS::ObjectValue(*obj);
|
||||
ret.setObject(*obj);
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<IGUIObject*>(JSContext* UNUSED(cx), JS::Value& ret, IGUIObject* const& val)
|
||||
template<> void ScriptInterface::ToJSVal<IGUIObject*>(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());
|
||||
}
|
||||
|
@ -214,7 +214,7 @@ JSBool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Hand
|
||||
{
|
||||
CGUIString value;
|
||||
GUI<CGUIString>::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<CStr>::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<CStrW>::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<CGUISpriteInstance>::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<CGUIList>::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());
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ template <typename R>
|
||||
struct ScriptInterface_NativeWrapper {
|
||||
#define OVERLOADS(z, i, data) \
|
||||
template<TYPENAME_T0_HEAD(z,i) typename F> \
|
||||
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<R>(cx, rval, fptr(ScriptInterface::GetScriptInterfaceAndCBData(cx) A0_TAIL(z,i))); \
|
||||
}
|
||||
|
||||
@ -39,7 +39,7 @@ template <>
|
||||
struct ScriptInterface_NativeWrapper<void> {
|
||||
#define OVERLOADS(z, i, data) \
|
||||
template<TYPENAME_T0_HEAD(z,i) typename F> \
|
||||
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 <typename R, typename TC>
|
||||
struct ScriptInterface_NativeMethodWrapper {
|
||||
#define OVERLOADS(z, i, data) \
|
||||
template<TYPENAME_T0_HEAD(z,i) typename F> \
|
||||
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<R>(cx, rval, (c->*fptr)( A0(z,i) )); \
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ template <typename TC>
|
||||
struct ScriptInterface_NativeMethodWrapper<void, TC> {
|
||||
#define OVERLOADS(z, i, data) \
|
||||
template<TYPENAME_T0_HEAD(z,i) typename F> \
|
||||
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<void, TC> {
|
||||
template <typename R, TYPENAME_T0_HEAD(z,i) R (*fptr) ( ScriptInterface::CxPrivate* T0_TAIL(z,i) )> \
|
||||
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<R>::call(cx, rval, fptr A0_TAIL(z,i)); \
|
||||
JS::RootedValue rval(cx); \
|
||||
ScriptInterface_NativeWrapper<R>::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 <typename R, TYPENAME_T0_HEAD(z,i) JSClass* CLS, typename TC, R (TC::*fptr) ( T0(z,i) )> \
|
||||
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<TC*>(ScriptInterface::GetPrivate(JS_THIS_OBJECT(cx, vp))); \
|
||||
if (! c) return false; \
|
||||
BOOST_PP_REPEAT_##z (i, CONVERT_ARG, ~) \
|
||||
jsval rval = JSVAL_VOID; \
|
||||
ScriptInterface_NativeMethodWrapper<R, TC>::call(cx, rval, c, fptr A0_TAIL(z,i)); \
|
||||
JS::RootedValue rval(cx); \
|
||||
ScriptInterface_NativeMethodWrapper<R, TC>::call(cx, &rval, c, fptr A0_TAIL(z,i)); \
|
||||
args.rval().set(rval); \
|
||||
return !ScriptInterface::IsExceptionPending(cx); \
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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<i32>(cx, val0, 0);
|
||||
ScriptInterface::ToJSVal<i32>(cx, val1, 2147483646); // JSVAL_INT_MAX-1
|
||||
ScriptInterface::ToJSVal<i32>(cx, val2, 2147483647); // JSVAL_INT_MAX
|
||||
ScriptInterface::ToJSVal<i32>(cx, val3, -2147483647); // JSVAL_INT_MIN+1
|
||||
ScriptInterface::ToJSVal<i32>(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<i32>(cx, &val0, 0);
|
||||
ScriptInterface::ToJSVal<i32>(cx, &val1, 2147483646); // JSVAL_INT_MAX-1
|
||||
ScriptInterface::ToJSVal<i32>(cx, &val2, 2147483647); // JSVAL_INT_MAX
|
||||
ScriptInterface::ToJSVal<i32>(cx, &val3, -2147483647); // JSVAL_INT_MIN+1
|
||||
ScriptInterface::ToJSVal<i32>(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<u32>(cx, val5, 0);
|
||||
ScriptInterface::ToJSVal<u32>(cx, val6, 2147483646u); // JSVAL_INT_MAX-1
|
||||
ScriptInterface::ToJSVal<u32>(cx, val7, 2147483647u); // JSVAL_INT_MAX
|
||||
ScriptInterface::ToJSVal<u32>(cx, val8, 2147483648u); // JSVAL_INT_MAX+1
|
||||
ScriptInterface::ToJSVal<u32>(cx, &val5, 0);
|
||||
ScriptInterface::ToJSVal<u32>(cx, &val6, 2147483646u); // JSVAL_INT_MAX-1
|
||||
ScriptInterface::ToJSVal<u32>(cx, &val7, 2147483647u); // JSVAL_INT_MAX
|
||||
ScriptInterface::ToJSVal<u32>(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));
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -41,9 +41,9 @@ CScriptVal ICmpFootprint::GetShape_wrapper()
|
||||
JS::RootedValue ptype(cx);
|
||||
JS::RootedValue pradius(cx);
|
||||
JS::RootedValue pheight(cx);
|
||||
ScriptInterface::ToJSVal<std::string>(cx, ptype.get(), "circle");
|
||||
ScriptInterface::ToJSVal(cx, pradius.get(), size0);
|
||||
ScriptInterface::ToJSVal(cx, pheight.get(), height);
|
||||
ScriptInterface::ToJSVal<std::string>(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<std::string>(cx, ptype.get(), "square");
|
||||
ScriptInterface::ToJSVal(cx, pwidth.get(), size0);
|
||||
ScriptInterface::ToJSVal(cx, pdepth.get(), size1);
|
||||
ScriptInterface::ToJSVal(cx, pheight.get(), height);
|
||||
ScriptInterface::ToJSVal<std::string>(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());
|
||||
|
@ -32,12 +32,12 @@
|
||||
|
||||
#define FAIL(msg) STMT(JS_ReportError(cx, msg); return false)
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<IComponent*>(JSContext* cx, JS::Value& ret, IComponent* const& val)
|
||||
template<> void ScriptInterface::ToJSVal<IComponent*>(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<IComponent*>(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<IComponent*>(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<void*>(val));
|
||||
ret = JS::ObjectValue(*obj);
|
||||
ret.setObject(*obj);
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<CParamNode>(JSContext* cx, JS::Value& ret, CParamNode const& val)
|
||||
template<> void ScriptInterface::ToJSVal<CParamNode>(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<CParamNode>(JSContext* cx, JS::Value& r
|
||||
JS_DeepFreezeObject(cx, &ret.toObject());
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<const CParamNode*>(JSContext* cx, JS::Value& ret, const CParamNode* const& val)
|
||||
template<> void ScriptInterface::ToJSVal<const CParamNode*>(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<CColor>(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<CColor>(JSContext* cx, JS::HandleValu
|
||||
return true;
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<CColor>(JSContext* cx, JS::Value& ret, CColor const& val)
|
||||
template<> void ScriptInterface::ToJSVal<CColor>(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<CColor>(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<fixed>(JSContext* cx, JS::HandleValue v, fixed& out)
|
||||
@ -146,9 +146,9 @@ template<> bool ScriptInterface::FromJSVal<fixed>(JSContext* cx, JS::HandleValue
|
||||
return true;
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<fixed>(JSContext* UNUSED(cx), JS::Value& ret, const fixed& val)
|
||||
template<> void ScriptInterface::ToJSVal<fixed>(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const fixed& val)
|
||||
{
|
||||
ret = JS::NumberValue(val.ToDouble());
|
||||
ret.set(JS::NumberValue(val.ToDouble()));
|
||||
}
|
||||
|
||||
template<> bool ScriptInterface::FromJSVal<CFixedVector3D>(JSContext* cx, JS::HandleValue v, CFixedVector3D& out)
|
||||
@ -172,7 +172,7 @@ template<> bool ScriptInterface::FromJSVal<CFixedVector3D>(JSContext* cx, JS::Ha
|
||||
return true;
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<CFixedVector3D>(JSContext* cx, JS::Value& ret, const CFixedVector3D& val)
|
||||
template<> void ScriptInterface::ToJSVal<CFixedVector3D>(JSContext* cx, JS::MutableHandleValue ret, const CFixedVector3D& val)
|
||||
{
|
||||
JSAutoRequest rq(cx);
|
||||
|
||||
@ -184,22 +184,22 @@ template<> void ScriptInterface::ToJSVal<CFixedVector3D>(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<CFixedVector2D>(JSContext* cx, JS::HandleValue v, CFixedVector2D& out)
|
||||
@ -220,7 +220,7 @@ template<> bool ScriptInterface::FromJSVal<CFixedVector2D>(JSContext* cx, JS::Ha
|
||||
return true;
|
||||
}
|
||||
|
||||
template<> void ScriptInterface::ToJSVal<CFixedVector2D>(JSContext* cx, JS::Value& ret, const CFixedVector2D& val)
|
||||
template<> void ScriptInterface::ToJSVal<CFixedVector2D>(JSContext* cx, JS::MutableHandleValue ret, const CFixedVector2D& val)
|
||||
{
|
||||
JSAutoRequest rq(cx);
|
||||
|
||||
@ -231,22 +231,22 @@ template<> void ScriptInterface::ToJSVal<CFixedVector2D>(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<Grid<u8> >(JSContext* cx, JS::Value& ret, const Grid<u8>& val)
|
||||
template<> void ScriptInterface::ToJSVal<Grid<u8> >(JSContext* cx, JS::MutableHandleValue ret, const Grid<u8>& val)
|
||||
{
|
||||
JSAutoRequest rq(cx);
|
||||
u32 length = (u32)(val.m_W * val.m_H);
|
||||
@ -257,18 +257,18 @@ template<> void ScriptInterface::ToJSVal<Grid<u8> >(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<Grid<u16> >(JSContext* cx, JS::Value& ret, const Grid<u16>& val)
|
||||
template<> void ScriptInterface::ToJSVal<Grid<u16> >(JSContext* cx, JS::MutableHandleValue ret, const Grid<u16>& val)
|
||||
{
|
||||
JSAutoRequest rq(cx);
|
||||
u32 length = (u32)(val.m_W * val.m_H);
|
||||
@ -279,13 +279,13 @@ template<> void ScriptInterface::ToJSVal<Grid<u16> >(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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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\"})");
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user