diff --git a/source/maths/scripting/JSInterface_Vector3D.cpp b/source/maths/scripting/JSInterface_Vector3D.cpp deleted file mode 100644 index 986c04d0c4..0000000000 --- a/source/maths/scripting/JSInterface_Vector3D.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/* Copyright (C) 2013 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -#include "precompiled.h" - -#include "JSInterface_Vector3D.h" -#include "scripting/JSConversions.h" -#include "scripting/ScriptingHost.h" - -JSClass JSI_Vector3D::JSI_class = { - "Vector3D", JSCLASS_HAS_PRIVATE, - JS_PropertyStub, JS_PropertyStub, - JSI_Vector3D::getProperty, JSI_Vector3D::setProperty, - JS_EnumerateStub, JS_ResolveStub, - JS_ConvertStub, JSI_Vector3D::finalize, - NULL, NULL, NULL, NULL -}; - -JSPropertySpec JSI_Vector3D::JSI_props[] = -{ - { "x", JSI_Vector3D::component_x, JSPROP_ENUMERATE }, - { "y", JSI_Vector3D::component_y, JSPROP_ENUMERATE }, - { "z", JSI_Vector3D::component_z, JSPROP_ENUMERATE }, - { 0 } -}; - -JSFunctionSpec JSI_Vector3D::JSI_methods[] = -{ - { "toString", JSI_Vector3D::toString, 0, 0 }, - { 0 } -}; - -void JSI_Vector3D::init() -{ - g_ScriptingHost.DefineCustomObjectType(&JSI_class, JSI_Vector3D::construct, 0, JSI_props, JSI_methods, NULL, NULL); -} - -JSI_Vector3D::Vector3D_Info::Vector3D_Info() -{ - owner = NULL; - vector = new CVector3D(); -} - -JSI_Vector3D::Vector3D_Info::Vector3D_Info(float x, float y, float z) -{ - owner = NULL; - vector = new CVector3D(x, y, z); -} - -JSI_Vector3D::Vector3D_Info::Vector3D_Info(const CVector3D& copy) -{ - owner = NULL; - vector = new CVector3D(copy.X, copy.Y, copy.Z); -} - -JSI_Vector3D::Vector3D_Info::Vector3D_Info(CVector3D* attach, IPropertyOwner* _owner) -{ - owner = _owner; - updateFn = NULL; - freshenFn = NULL; - vector = attach; -} - -JSI_Vector3D::Vector3D_Info::Vector3D_Info(CVector3D* attach, IPropertyOwner* _owner, void(IPropertyOwner::*_updateFn)(void)) -{ - owner = _owner; - updateFn = _updateFn; - freshenFn = NULL; - vector = attach; -} - -JSI_Vector3D::Vector3D_Info::Vector3D_Info(CVector3D* attach, IPropertyOwner* _owner, void(IPropertyOwner::*_updateFn)(void), - void(IPropertyOwner::*_freshenFn)(void)) -{ - owner = _owner; - updateFn = _updateFn; - freshenFn = _freshenFn; - vector = attach; -} - -JSI_Vector3D::Vector3D_Info::~Vector3D_Info() -{ - if (!owner) - delete (vector); -} - -JSBool JSI_Vector3D::getProperty(JSContext* cx, JSObject* obj, jsid id, jsval* vp) -{ - if (!JSID_IS_INT(id)) - return JS_TRUE; - - Vector3D_Info* vectorInfo = (Vector3D_Info*)JS_GetInstancePrivate(cx, obj, &JSI_Vector3D::JSI_class, NULL); - if (!vectorInfo) - return JS_FALSE; - - CVector3D* vectorData = vectorInfo->vector; - - if (vectorInfo->owner && vectorInfo->freshenFn) - ((vectorInfo->owner)->*(vectorInfo->freshenFn))(); - - switch (JSID_TO_INT(id)) - { - case component_x: - return JS_NewNumberValue(cx, vectorData->X, vp); - case component_y: - return JS_NewNumberValue(cx, vectorData->Y, vp); - case component_z: - return JS_NewNumberValue(cx, vectorData->Z, vp); - } - - return JS_FALSE; -} - -JSBool JSI_Vector3D::setProperty(JSContext* cx, JSObject* obj, jsid id, JSBool UNUSED(strict), jsval* vp) -{ - if (!JSID_IS_INT(id)) - return JS_TRUE; - - Vector3D_Info* vectorInfo = (Vector3D_Info*)JS_GetInstancePrivate(cx, obj, &JSI_Vector3D::JSI_class, NULL); - if (!vectorInfo) - return JS_FALSE; - - CVector3D* vectorData = vectorInfo->vector; - - if (vectorInfo->owner && vectorInfo->freshenFn) - ((vectorInfo->owner)->*(vectorInfo->freshenFn))(); - - switch (JSID_TO_INT(id)) - { - case component_x: - vectorData->X = ToPrimitive (*vp); - break; - case component_y: - vectorData->Y = ToPrimitive (*vp); - break; - case component_z: - vectorData->Z = ToPrimitive (*vp); - break; - } - - if (vectorInfo->owner && vectorInfo->updateFn) - ((vectorInfo->owner)->*(vectorInfo->updateFn))(); - - return JS_TRUE; -} - -JSBool JSI_Vector3D::construct(JSContext* cx, uintN argc, jsval* vp) -{ - JSObject* vector = JS_NewObject(cx, &JSI_Vector3D::JSI_class, NULL, NULL); - - if (argc == 0) - { - JS_SetPrivate(cx, vector, new Vector3D_Info()); - JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(vector)); - return JS_TRUE; - } - - JSU_REQUIRE_PARAMS(3); - try - { - float x = ToPrimitive (JS_ARGV(cx, vp)[0]); - float y = ToPrimitive (JS_ARGV(cx, vp)[1]); - float z = ToPrimitive (JS_ARGV(cx, vp)[2]); - JS_SetPrivate(cx, vector, new Vector3D_Info(x, y, z)); - JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(vector)); - return JS_TRUE; - } - catch (PSERROR_Scripting_ConversionFailed&) - { - // Invalid input (i.e. can't be coerced into doubles) - fail - JS_ReportError(cx, "Invalid parameters to Vector3D constructor"); - return JS_FALSE; - } -} - -void JSI_Vector3D::finalize(JSContext* cx, JSObject* obj) -{ - delete ((Vector3D_Info*)JS_GetPrivate(cx, obj)); -} - -JSBool JSI_Vector3D::toString(JSContext* cx, uintN UNUSED(argc), jsval* vp) -{ - char buffer[256]; - Vector3D_Info* vectorInfo = (Vector3D_Info*)JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx, vp), &JSI_Vector3D::JSI_class, NULL); - if (!vectorInfo) - return JS_FALSE; - - if (vectorInfo->owner && vectorInfo->freshenFn) - ((vectorInfo->owner)->*(vectorInfo->freshenFn))(); - - CVector3D* vectorData = vectorInfo->vector; - sprintf_s(buffer, ARRAY_SIZE(buffer), "[object Vector3D: ( %f, %f, %f )]", vectorData->X, vectorData->Y, vectorData->Z); - JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buffer))); - return JS_TRUE; -} diff --git a/source/maths/scripting/JSInterface_Vector3D.h b/source/maths/scripting/JSInterface_Vector3D.h deleted file mode 100644 index 29a6d8c70b..0000000000 --- a/source/maths/scripting/JSInterface_Vector3D.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (C) 2013 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// JSInterface_Entity.h -// -// -// A JavaScript class representing a Pyrogenesis CVector3D object. -// -// Usage: Used when manipulating objects of class 'Vector3D' in JavaScript. - -#include "scripting/ScriptingHost.h" -#include "maths/Vector3D.h" - -#ifndef INCLUDED_JSI_VECTOR3 -#define INCLUDED_JSI_VECTOR3 - -namespace JSI_Vector3D -{ - enum - { - component_x, - component_y, - component_z - }; - JSBool toString(JSContext* cx, uintN argc, jsval* vp); - - struct Vector3D_Info - { - NONCOPYABLE(Vector3D_Info); - public: - - IPropertyOwner* owner; - void (IPropertyOwner::*updateFn)(); - void (IPropertyOwner::*freshenFn)(); - CVector3D* vector; - Vector3D_Info(); - Vector3D_Info(float x, float y, float z); - Vector3D_Info(const CVector3D& copy); - Vector3D_Info(CVector3D* attach, IPropertyOwner* _owner); - Vector3D_Info(CVector3D* attach, IPropertyOwner* _owner, void(IPropertyOwner::*_updateFn)(void)); - Vector3D_Info(CVector3D* attach, IPropertyOwner* _owner, void(IPropertyOwner::*_updateFn)(void), void(IPropertyOwner::*_freshenFn)(void)); - ~Vector3D_Info(); - }; - extern JSClass JSI_class; - extern JSPropertySpec JSI_props[]; - extern JSFunctionSpec JSI_methods[]; - - JSBool getProperty(JSContext* cx, JSObject* obj, jsid id, jsval* vp); - JSBool setProperty(JSContext* cx, JSObject* obj, jsid id, JSBool strict, jsval* vp); - void finalize(JSContext* cx, JSObject* obj); - JSBool construct(JSContext* cx, uintN argc, jsval* vp); - void init(); -} - -#endif diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index ba0fc8df3e..13a180523d 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -48,7 +48,6 @@ #include "gui/scripting/JSInterface_GUITypes.h" #include "gui/scripting/ScriptFunctions.h" #include "maths/MathUtil.h" -#include "maths/scripting/JSInterface_Vector3D.h" #include "network/NetServer.h" #include "network/NetClient.h" @@ -318,9 +317,6 @@ void Render() static void RegisterJavascriptInterfaces() { - // maths - JSI_Vector3D::init(); - // GUI CGUI::ScriptingInit(); diff --git a/source/ps/scripting/JSInterface_VFS.cpp b/source/ps/scripting/JSInterface_VFS.cpp index 791484a180..877bb14263 100644 --- a/source/ps/scripting/JSInterface_VFS.cpp +++ b/source/ps/scripting/JSInterface_VFS.cpp @@ -23,7 +23,7 @@ #include "ps/Filesystem.h" //#include "lib/res/file/archive/vfs_optimizer.h" // ArchiveBuilderCancel #include "scripting/ScriptingHost.h" -#include "scripting/JSConversions.h" +#include "scriptinterface/ScriptInterface.h" #include "ps/scripting/JSInterface_VFS.h" #include "lib/file/vfs/vfs_util.h" @@ -70,7 +70,7 @@ static Status BuildDirEntListCB(const VfsPath& pathname, const CFileInfo& UNUSED { BuildDirEntListState* s = (BuildDirEntListState*)cbData; - jsval val = ToJSVal( CStrW(pathname.string()) ); + jsval val = ScriptInterface::ToJSVal(s->cx, CStrW(pathname.string())); JS_SetElement(s->cx, s->filename_array, s->cur_idx++, &val); return INFO::OK; } @@ -95,13 +95,13 @@ JSBool JSI_VFS::BuildDirEntList(JSContext* cx, uintN argc, jsval* vp) JSU_REQUIRE_MIN_PARAMS(1); CStrW path; - if (!ToPrimitive (cx, JS_ARGV(cx, vp)[0], path)) + if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], path)) return JS_FALSE; CStrW filter_str = L""; if (argc >= 2) { - if (!ToPrimitive (cx, JS_ARGV(cx, vp)[1], filter_str)) + if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[1], filter_str)) return JS_FALSE; } // convert to const wchar_t*; if there's no filter, pass 0 for speed @@ -113,7 +113,7 @@ JSBool JSI_VFS::BuildDirEntList(JSContext* cx, uintN argc, jsval* vp) bool recursive = false; if (argc >= 3) { - if (!ToPrimitive (cx, JS_ARGV(cx, vp)[2], recursive)) + if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[2], recursive)) return JS_FALSE; } int flags = recursive ? vfs::DIR_RECURSIVE : 0; @@ -137,14 +137,14 @@ JSBool JSI_VFS::GetFileMTime(JSContext* cx, uintN argc, jsval* vp) JSU_REQUIRE_MIN_PARAMS(1); CStrW filename; - if (!ToPrimitive (cx, JS_ARGV(cx, vp)[0], filename)) + if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], filename)) return JS_FALSE; CFileInfo fileInfo; Status err = g_VFS->GetFileInfo(filename, &fileInfo); JS_CHECK_FILE_ERR(err); - JS_SET_RVAL(cx, vp, ToJSVal((double)fileInfo.MTime())); + JS_SET_RVAL(cx, vp, ScriptInterface::ToJSVal(cx, (double)fileInfo.MTime())); return JS_TRUE; } @@ -158,14 +158,14 @@ JSBool JSI_VFS::GetFileSize(JSContext* cx, uintN argc, jsval* vp) JSU_REQUIRE_MIN_PARAMS(1); CStrW filename; - if (!ToPrimitive (cx, JS_ARGV(cx, vp)[0], filename)) + if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], filename)) return JS_FALSE; CFileInfo fileInfo; Status err = g_VFS->GetFileInfo(filename, &fileInfo); JS_CHECK_FILE_ERR(err); - JS_SET_RVAL(cx, vp, ToJSVal( (unsigned)fileInfo.Size() )); + JS_SET_RVAL(cx, vp, ScriptInterface::ToJSVal(cx, (unsigned)fileInfo.Size())); return JS_TRUE; } @@ -179,7 +179,7 @@ JSBool JSI_VFS::ReadFile(JSContext* cx, uintN argc, jsval* vp) JSU_REQUIRE_MIN_PARAMS(1); CStrW filename; - if (!ToPrimitive (cx, JS_ARGV(cx, vp)[0], filename)) + if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], filename)) return JS_FALSE; // @@ -198,7 +198,7 @@ JSBool JSI_VFS::ReadFile(JSContext* cx, uintN argc, jsval* vp) contents.Replace("\r\n", "\n"); // Decode as UTF-8 - JS_SET_RVAL(cx, vp, ToJSVal( contents.FromUTF8() )); + JS_SET_RVAL(cx, vp, ScriptInterface::ToJSVal(cx, contents.FromUTF8())); return JS_TRUE; } @@ -212,7 +212,7 @@ JSBool JSI_VFS::ReadFileLines(JSContext* cx, uintN argc, jsval* vp) JSU_REQUIRE_MIN_PARAMS(1); CStrW filename; - if (!ToPrimitive (cx, JS_ARGV(cx, vp)[0], filename)) + if (!ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], filename)) return (JS_FALSE); // @@ -243,7 +243,7 @@ JSBool JSI_VFS::ReadFileLines(JSContext* cx, uintN argc, jsval* vp) while (std::getline(ss, line)) { // Decode each line as UTF-8 - jsval val = ToJSVal(CStr(line).FromUTF8()); + jsval val = ScriptInterface::ToJSVal(cx, CStr(line).FromUTF8()); JS_SetElement(cx, line_array, cur_line++, &val); } diff --git a/source/scripting/JSConversions.cpp b/source/scripting/JSConversions.cpp deleted file mode 100644 index 09b6a0d00b..0000000000 --- a/source/scripting/JSConversions.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/* Copyright (C) 2013 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -#include "precompiled.h" - -#include "JSConversions.h" -#include "graphics/ObjectManager.h" -#include "maths/scripting/JSInterface_Vector3D.h" -#include "lib/sysdep/sysdep.h" // isfinite -#include "scriptinterface/ScriptInterface.h" -#include -#include - -// CVector3D - -template<> CVector3D* ToNative( JSContext* cx, JSObject* obj ) -{ - JSI_Vector3D::Vector3D_Info* v = (JSI_Vector3D::Vector3D_Info*)JS_GetInstancePrivate( cx, obj, &JSI_Vector3D::JSI_class, NULL ); - return( v ? v->vector : NULL ); -} - -template<> JSObject* ToScript( CVector3D* Native ) -{ - JSObject* Script = JS_NewObject( g_ScriptingHost.GetContext(), &JSI_Vector3D::JSI_class, NULL, NULL ); - JS_SetPrivate( g_ScriptingHost.GetContext(), Script, new JSI_Vector3D::Vector3D_Info( *Native ) ); - return( Script ); -} - -template<> jsval ToJSVal( const CVector3D& Native ) -{ - JSObject* Script = JS_NewObject( g_ScriptingHost.GetContext(), &JSI_Vector3D::JSI_class, NULL, NULL ); - JS_SetPrivate( g_ScriptingHost.GetContext(), Script, new JSI_Vector3D::Vector3D_Info( Native ) ); - return( OBJECT_TO_JSVAL( Script ) ); -} - -// int - -template<> jsval ToJSVal( const int& Native ) -{ - return( INT_TO_JSVAL( Native ) ); -} - -template<> jsval ToJSVal( int& Native ) -{ - return( INT_TO_JSVAL( Native ) ); -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, int& Storage ) -{ - JSBool ok = JS_ValueToInt32(cx, v, (int32*)&Storage); - return ok == JS_TRUE; -} - -// unsigned - -template<> jsval ToJSVal( const unsigned& Native ) -{ - return( INT_TO_JSVAL( Native ) ); -} - -template<> jsval ToJSVal( unsigned& Native ) -{ - return( INT_TO_JSVAL( Native ) ); -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, unsigned& Storage ) -{ - int temp; - if(!ToPrimitive(cx, v, temp)) - return false; - if(temp < 0) - return false; - Storage = (unsigned)temp; - return true; -} - -// long -template<> jsval ToJSVal( const long& Native ) -{ - return( INT_TO_JSVAL( (int)Native ) ); -} - -template<> jsval ToJSVal( long& Native ) -{ - return( INT_TO_JSVAL( (int)Native ) ); -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, long& Storage ) -{ - int32 tmp; - JSBool ok = JS_ValueToInt32(cx, v, &tmp); - Storage = (long)tmp; - return ok == JS_TRUE; -} - -// unsigned long -template<> jsval ToJSVal( const unsigned long& Native ) -{ - return( INT_TO_JSVAL( (int)Native ) ); -} - -template<> jsval ToJSVal( unsigned long& Native ) -{ - return( INT_TO_JSVAL( (int)Native ) ); -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, unsigned long& Storage ) -{ - int32 tmp; - JSBool ok = JS_ValueToInt32(cx, v, &tmp); - Storage = (unsigned long)tmp; - return ok == JS_TRUE; -} - -// see comment at declaration of specialization -#if !GCC_VERSION -#if ARCH_AMD64 - -template<> jsval ToJSVal( const size_t& Native ) -{ - return( INT_TO_JSVAL( (int)Native ) ); -} - -template<> jsval ToJSVal( size_t& Native ) -{ - return( INT_TO_JSVAL( (int)Native ) ); -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, size_t& Storage ) -{ - int temp; - if(!ToPrimitive(cx, v, temp)) - return false; - if(temp < 0) - return false; - Storage = (size_t)temp; - return true; -} - - -template<> jsval ToJSVal( const ssize_t& Native ) -{ - return( INT_TO_JSVAL( (int)Native ) ); -} - -template<> jsval ToJSVal( ssize_t& Native ) -{ - return( INT_TO_JSVAL( (int)Native ) ); -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, ssize_t& Storage ) -{ - int temp; - if(!ToPrimitive(cx, v, temp)) - return false; - if(temp < 0) - return false; - Storage = (ssize_t)temp; - return true; -} - -#endif // #if ARCH_AMD64 -#endif // #if !GCC_VERSION - -// double - -template<> jsval ToJSVal( const double& Native ) -{ - jsval val = JSVAL_VOID; - JS_NewNumberValue( g_ScriptingHost.getContext(), Native, &val ); - return val; -} - -template<> jsval ToJSVal( double& Native ) -{ - jsval val = JSVAL_VOID; - JS_NewNumberValue( g_ScriptingHost.getContext(), Native, &val ); - return val; -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, double& Storage ) -{ - JSBool ok = JS_ValueToNumber(cx, v, &Storage); - if (ok == JS_FALSE || !isfinite( Storage ) ) - return false; - return true; -} - -// float - -template<> jsval ToJSVal( const float& Native ) -{ - jsval val = JSVAL_VOID; - JS_NewNumberValue( g_ScriptingHost.getContext(), Native, &val ); - return val; -} - -template<> jsval ToJSVal( float& Native ) -{ - jsval val = JSVAL_VOID; - JS_NewNumberValue( g_ScriptingHost.getContext(), Native, &val ); - return val; -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, float& Storage ) -{ - double temp; - if(!ToPrimitive(cx, v, temp)) - return false; - Storage = (float)temp; - return true; -} - - -// bool - -template<> jsval ToJSVal( const bool& Native ) -{ - return( BOOLEAN_TO_JSVAL( Native ) ); -} - -template<> jsval ToJSVal( bool& Native ) -{ - return( BOOLEAN_TO_JSVAL( Native ) ); -} - -template<> bool ToPrimitive( JSContext* cx, jsval v, bool& Storage ) -{ - JSBool temp; - JSBool ok = JS_ValueToBoolean(cx, v, &temp); - if(ok == JS_FALSE) - return false; - Storage = (temp == JS_TRUE); - return true; -} - -// CStrW -template<> bool ToPrimitive( JSContext* UNUSED(cx), jsval v, CStrW& Storage ) -{ - try - { - Storage = g_ScriptingHost.ValueToUCString( v ); - } - catch( PSERROR_Scripting_ConversionFailed& ) - { - return( false ); - } - return( true ); -} - -template<> jsval ToJSVal( const CStrW& Native ) -{ - return( STRING_TO_JSVAL( JS_NewUCStringCopyZ( g_ScriptingHost.GetContext(), reinterpret_cast(Native.utf16().c_str()) ) ) ); -} - -template<> jsval ToJSVal( CStrW& Native ) -{ - return( STRING_TO_JSVAL( JS_NewUCStringCopyZ( g_ScriptingHost.GetContext(), reinterpret_cast(Native.utf16().c_str()) ) ) ); -} - -// CStr/CStr8 - -template<> bool ToPrimitive( JSContext* cx, jsval v, CStr8& Storage ) -{ - std::string str; - if (!ScriptInterface::FromJSVal(cx, v, str)) - return false; - Storage = str; - return true; -} - -template<> jsval ToJSVal( const CStr8& Native ) -{ - return( STRING_TO_JSVAL( JS_NewStringCopyZ( g_ScriptingHost.GetContext(), Native.c_str() ) ) ); -} - -template<> jsval ToJSVal( CStr8& Native ) -{ - return( STRING_TO_JSVAL( JS_NewStringCopyZ( g_ScriptingHost.GetContext(), Native.c_str() ) ) ); -} diff --git a/source/scripting/JSConversions.h b/source/scripting/JSConversions.h deleted file mode 100644 index 4865d31713..0000000000 --- a/source/scripting/JSConversions.h +++ /dev/null @@ -1,193 +0,0 @@ -/* Copyright (C) 2009 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// A general system of converting between native objects and their JavaScript representations - -#ifndef INCLUDED_JSCONVERSIONS -#define INCLUDED_JSCONVERSIONS - -#include "scripting/ScriptingHost.h" - -class CStrW; -class CScriptObject; -class CObjectEntry; -class CVector3D; - -// ----- -// -// Defaults -// -// ----- - -template T* ToNative( JSContext* cx, JSObject* obj ) -{ - return( (T*)JS_GetInstancePrivate( cx, obj, &T::JSI_class, NULL ) ); -} - -template JSObject* ToScript( T* Native ) -{ - if( !Native ) - return( (JSObject*)NULL ); - return( Native->GetScript() ); -} - -template T* ToNative( jsval v ) -{ - if( !JSVAL_IS_OBJECT( v ) ) return( NULL ); - if( v == JSVAL_NULL ) return( NULL ); - return( ToNative( g_ScriptingHost.GetContext(), JSVAL_TO_OBJECT( v ) ) ); -} - -template bool ToPrimitive( JSContext* UNUSED(cx), jsval v, T& Storage ) -{ - T* Native = ToNative( v ); - if( !Native ) return( false ); - Storage = *Native; - return( true ); -} - -// Handle pointer-to-objects sensibly (by automatically dereferencing them one level) -template bool ToPrimitive( JSContext* UNUSED(cx), jsval v, T*& Storage ) -{ - T* Native = ToNative( v ); - if( !Native ) return( false ); - Storage = Native; - return( true ); -} - -// Throws PSERROR_Scripting_ConversionFailed on failure. -template inline T ToPrimitive( JSContext* cx, jsval v ) -{ - T Temp; - bool ok = ToPrimitive( cx, v, Temp ); - if( !ok ) throw PSERROR_Scripting_ConversionFailed(); - return( Temp ); -} - -// Throws PSERROR_Scripting_ConversionFailed on failure. -template inline T ToPrimitive( jsval v ) -{ - return( ToPrimitive( g_ScriptingHost.GetContext(), v ) ); -} - -template jsval ToJSVal( T& Native ) -{ - return( OBJECT_TO_JSVAL( ToScript( &Native ) ) ); -} - -template jsval ToJSVal( T*& Native ) -{ - return( OBJECT_TO_JSVAL( ToScript( Native ) ) ); -} - -template jsval ToJSVal( const T& Native ); - -// ----- -// -// Overrides -// -// ----- - -// CVector3D -template<> CVector3D* ToNative( JSContext* cx, JSObject* obj ); -template<> JSObject* ToScript( CVector3D* Native ); -template<> jsval ToJSVal( const CVector3D& Native ); - -// CObjectEntry -template<> bool ToPrimitive( JSContext* cx, jsval v, CObjectEntry*& Storage ); -template<> jsval ToJSVal( CObjectEntry*& Native ); - -// CScriptObject -template<> bool ToPrimitive( JSContext* cx, jsval v, CScriptObject& Storage ); -template<> jsval ToJSVal( CScriptObject& Native ); - -// int -template<> bool ToPrimitive( JSContext* cx, jsval v, int& Storage ); -template<> jsval ToJSVal( const int& Native ); -template<> jsval ToJSVal( int& Native ); - -// unsigned -template<> bool ToPrimitive( JSContext* cx, jsval v, unsigned& Storage ); -template<> jsval ToJSVal( const unsigned& Native ); -template<> jsval ToJSVal( unsigned& Native ); - -// long int -template<> bool ToPrimitive( JSContext* cx, jsval v, long& Storage ); -template<> jsval ToJSVal( const long& Native ); -template<> jsval ToJSVal( long& Native ); - -// unsigned long int -template<> bool ToPrimitive( JSContext* cx, jsval v, unsigned long& Storage ); -template<> jsval ToJSVal( const unsigned long& Native ); -template<> jsval ToJSVal( unsigned long& Native ); - -// (s)size_t are considered to be identical to (unsigned) int by GCC and -// their specializations would cause conflicts there. On x86_64 GCC, s/size_t -// is equivalent to (unsigned) long, but the same solution applies; use the -// long and unsigned long specializations instead of s/size_t. -#if !GCC_VERSION - -// for some reason, x64 MSC treats size_t as distinct from unsigned long: -#if ARCH_AMD64 - -// size_t -template<> bool ToPrimitive( JSContext* cx, jsval v, size_t& Storage ); -template<> jsval ToJSVal( const size_t& Native ); -template<> jsval ToJSVal( size_t& Native ); - -// ssize_t -template<> bool ToPrimitive( JSContext* cx, jsval v, ssize_t& Storage ); -template<> jsval ToJSVal( const ssize_t& Native ); -template<> jsval ToJSVal( ssize_t& Native ); - -#endif - -#endif - -// double -template<> bool ToPrimitive( JSContext* cx, jsval v, double& Storage ); -template<> jsval ToJSVal( const double& Native ); -template<> jsval ToJSVal( double& Native ); - -// float -template<> bool ToPrimitive( JSContext* cx, jsval v, float& Storage ); -template<> jsval ToJSVal( const float& Native ); -template<> jsval ToJSVal( float& Native ); - -// bool -template<> bool ToPrimitive( JSContext* cx, jsval v, bool& Storage ); -template<> jsval ToJSVal( const bool& Native ); -template<> jsval ToJSVal( bool& Native ); - -/* -// char* -template<> bool ToPrimitive( JSContext* cx, jsval v, char*& Storage ); -template<> jsval ToJSVal( const char* Native ); -template<> jsval ToJSVal( char* Native ); -*/ - -// CStrW -template<> bool ToPrimitive( JSContext* cx, jsval v, CStrW& Storage ); -template<> jsval ToJSVal( const CStrW& Native ); -template<> jsval ToJSVal( CStrW& Native ); - -// CStr(8) -template<> bool ToPrimitive( JSContext* cx, jsval v, CStr8& Storage ); -template<> jsval ToJSVal( const CStr8& Native ); -template<> jsval ToJSVal( CStr8& Native ); - -#endif diff --git a/source/scripting/ScriptGlue.cpp b/source/scripting/ScriptGlue.cpp index b2c73530bb..0a75439af1 100644 --- a/source/scripting/ScriptGlue.cpp +++ b/source/scripting/ScriptGlue.cpp @@ -24,7 +24,6 @@ #include "precompiled.h" #include "ScriptGlue.h" -#include "JSConversions.h" #include "graphics/GameView.h" #include "graphics/LightEnv.h" @@ -37,7 +36,6 @@ #include "lib/svn_revision.h" #include "lib/timer.h" #include "lib/sysdep/sysdep.h" // sys_OpenFile -#include "maths/scripting/JSInterface_Vector3D.h" #include "network/NetServer.h" #include "ps/CConsole.h" #include "ps/CLogger.h" @@ -111,7 +109,8 @@ JSBool StartJsTimer(JSContext* cx, uintN argc, jsval* vp) ONCE(InitJsTimers()); JSU_REQUIRE_PARAMS(1); - size_t slot = ToPrimitive(JS_ARGV(cx, vp)[0]); + size_t slot; + ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], slot); if (slot >= MAX_JS_TIMERS) return JS_FALSE; @@ -125,7 +124,8 @@ JSBool StartJsTimer(JSContext* cx, uintN argc, jsval* vp) JSBool StopJsTimer(JSContext* cx, uintN argc, jsval* vp) { JSU_REQUIRE_PARAMS(1); - size_t slot = ToPrimitive(JS_ARGV(cx, vp)[0]); + size_t slot; + ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], slot); if (slot >= MAX_JS_TIMERS) return JS_FALSE; @@ -215,7 +215,8 @@ JSBool GetGUIObjectByName(JSContext* cx, uintN argc, jsval* vp) try { - CStr name = ToPrimitive(cx, JS_ARGV(cx, vp)[0]); + CStr name; + ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], name); IGUIObject* guiObj = g_GUI->FindObjectByName(name); if (guiObj) JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(guiObj->GetJSObject())); @@ -340,7 +341,7 @@ JSBool SetPaused(JSContext* cx, uintN argc, jsval* vp) try { - g_Game->m_Paused = ToPrimitive (JS_ARGV(cx, vp)[0]); + ScriptInterface::FromJSVal(cx, JS_ARGV(cx, vp)[0], g_Game->m_Paused); if ( g_SoundManager ) g_SoundManager->Pause(g_Game->m_Paused); diff --git a/source/scriptinterface/DebuggingServer.cpp b/source/scriptinterface/DebuggingServer.cpp index 1fe8f3f541..d729b85a06 100644 --- a/source/scriptinterface/DebuggingServer.cpp +++ b/source/scriptinterface/DebuggingServer.cpp @@ -21,7 +21,6 @@ #include "ThreadDebugger.h" #include "ps/CLogger.h" #include "ps/Filesystem.h" -#include "scripting/JSConversions.h" CDebuggingServer* g_DebuggingServer = NULL; diff --git a/source/scriptinterface/ScriptConversions.cpp b/source/scriptinterface/ScriptConversions.cpp index b7a22840f7..22e1cf52d1 100644 --- a/source/scriptinterface/ScriptConversions.cpp +++ b/source/scriptinterface/ScriptConversions.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2012 Wildfire Games. +/* Copyright (C) 2013 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -100,6 +100,49 @@ template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, u8& out) return true; } +template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, long& out) +{ + int32 tmp; + JSBool ok = JS_ValueToInt32(cx, v, &tmp); + out = (long)tmp; + return ok == JS_TRUE; +} + +template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, unsigned long& out) +{ + int32 tmp; + JSBool ok = JS_ValueToInt32(cx, v, &tmp); + out = (unsigned long)tmp; + return ok == JS_TRUE; +} + +// see comment below (where the same preprocessor condition is used) +#if MSC_VERSION && ARCH_AMD64 + +template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, size_t& out) +{ + int temp; + if(!FromJSVal(cx, v, temp)) + return false; + if(temp < 0) + return false; + out = (size_t)temp; + return true; +} + +template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, ssize_t& out) +{ + int temp; + if(!FromJSVal(cx, v, temp)) + return false; + if(temp < 0) + return false; + out = (ssize_t)temp; + return true; +} + +#endif + // NOTE: we can't define a jsval specialisation, because that conflicts with integer types template<> bool ScriptInterface::FromJSVal(JSContext* UNUSED(cx), jsval v, CScriptVal& out) { @@ -150,6 +193,16 @@ template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, return true; } +template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, CStr8& out) +{ + return ScriptInterface::FromJSVal(cx, v, static_cast(out)); +} + +template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, CStrW& out) +{ + return ScriptInterface::FromJSVal(cx, v, static_cast(out)); +} + template<> bool ScriptInterface::FromJSVal(JSContext* cx, jsval v, Entity& out) { JSObject* obj; @@ -220,6 +273,35 @@ template<> jsval ScriptInterface::ToJSVal(JSContext* cx, const u32& val) return rval; } +template<> jsval ScriptInterface::ToJSVal(JSContext* UNUSED(cx), const long& val) +{ + return INT_TO_JSVAL((int)val); +} + +template<> jsval ScriptInterface::ToJSVal(JSContext* UNUSED(cx), const unsigned long& val) +{ + return INT_TO_JSVAL((int)val); +} + +// (s)size_t are considered to be identical to (unsigned) int by GCC and +// their specializations would cause conflicts there. On x86_64 GCC, s/size_t +// is equivalent to (unsigned) long, but the same solution applies; use the +// long and unsigned long specializations instead of s/size_t. +// for some reason, x64 MSC treats size_t as distinct from unsigned long: +#if MSC_VERSION && ARCH_AMD64 + +template<> jsval ScriptInterface::ToJSVal(JSContext* UNUSED(cx), const size_t& val) +{ + return INT_TO_JSVAL((int)val); +} + +template<> jsval ScriptInterface::ToJSVal(JSContext* UNUSED(cx), const ssize_t& val) +{ + return INT_TO_JSVAL((int)val); +} + +#endif + // NOTE: we can't define a jsval specialisation, because that conflicts with integer types template<> jsval ScriptInterface::ToJSVal(JSContext* UNUSED(cx), const CScriptVal& val) { @@ -281,7 +363,7 @@ template<> jsval ScriptInterface::ToJSVal(JSContext* cx, const CStr8& val template static jsval ToJSVal_vector(JSContext* cx, const std::vector& val) { - JSObject* obj = JS_NewArrayObject(cx, val.size(), NULL); + JSObject* obj = JS_NewArrayObject(cx, (jsint)val.size(), NULL); if (!obj) return JSVAL_VOID; for (size_t i = 0; i < val.size(); ++i)