From c0ca70efd275ec7e1f037556b13b07e9903435e2 Mon Sep 17 00:00:00 2001 From: Itms Date: Mon, 30 Jan 2017 10:21:08 +0000 Subject: [PATCH] Fix 64-bit integer script conversions by removing the discrepancy between Windows and Linux. Patch by echotangoecho, fixes #3848. Reviewed By: Itms Differential Revision: https://code.wildfiregames.com/D84 This was SVN commit r19189. --- source/scriptinterface/ScriptConversions.cpp | 12 +++--- .../tests/test_ScriptConversions.h | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/source/scriptinterface/ScriptConversions.cpp b/source/scriptinterface/ScriptConversions.cpp index fd75a8b497..b1a89c6c1a 100644 --- a/source/scriptinterface/ScriptConversions.cpp +++ b/source/scriptinterface/ScriptConversions.cpp @@ -116,21 +116,21 @@ template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, return true; } -template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, long& out) +template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, i64& out) { JSAutoRequest rq(cx); i64 tmp; bool ok = JS::ToInt64(cx, v, &tmp); - out = (long)tmp; + out = (i64)tmp; return ok; } -template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, unsigned long& out) +template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, u64& out) { JSAutoRequest rq(cx); u64 tmp; bool ok = JS::ToUint64(cx, v, &tmp); - out = (unsigned long)tmp; + out = (u64)tmp; return ok; } @@ -294,12 +294,12 @@ template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::Mutable ret.set(JS::NumberValue(val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const long& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const i64& val) { ret.set(JS::NumberValue((int)val)); } -template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const unsigned long& val) +template<> void ScriptInterface::ToJSVal(JSContext* UNUSED(cx), JS::MutableHandleValue ret, const u64& val) { ret.set(JS::NumberValue((int)val)); } diff --git a/source/scriptinterface/tests/test_ScriptConversions.h b/source/scriptinterface/tests/test_ScriptConversions.h index b7b0f7a629..e6bc7abe0c 100644 --- a/source/scriptinterface/tests/test_ScriptConversions.h +++ b/source/scriptinterface/tests/test_ScriptConversions.h @@ -141,6 +141,22 @@ public: roundtrip(1073741824, "1073741824"); // JSVAL_INT_MAX+1 } + roundtrip(0, "0"); + roundtrip(123, "123"); + roundtrip(-123, "-123"); + roundtrip(1073741822, "1073741822"); // JSVAL_INT_MAX-1 + roundtrip(1073741823, "1073741823"); // JSVAL_INT_MAX + roundtrip(-1073741823, "-1073741823"); // JSVAL_INT_MIN+1 + roundtrip(-1073741824, "-1073741824"); // JSVAL_INT_MIN + roundtrip(1073741824, "1073741824"); // JSVAL_INT_MAX+1 + roundtrip(-1073741825, "-1073741825"); // JSVAL_INT_MIN-1 + + roundtrip(0, "0"); + roundtrip(123, "123"); + roundtrip(1073741822, "1073741822"); // JSVAL_INT_MAX-1 + roundtrip(1073741823, "1073741823"); // JSVAL_INT_MAX + roundtrip(1073741824, "1073741824"); // JSVAL_INT_MAX+1 + std::string s1 = "test"; s1[1] = '\0'; std::string s2 = "ั‚ะตัั‚"; @@ -202,6 +218,27 @@ public: TS_ASSERT(val6.isInt32()); TS_ASSERT(val7.isInt32()); TS_ASSERT(val8.isDouble()); + + JS::RootedValue val9(cx), val10(cx), val11(cx), val12(cx), val13(cx), val14(cx), val15(cx), val16(cx), val17(cx); + ScriptInterface::ToJSVal(cx, &val9, 0); + ScriptInterface::ToJSVal(cx, &val10, 2147483646); // JSVAL_INT_MAX-1 + ScriptInterface::ToJSVal(cx, &val11, 2147483647); // JSVAL_INT_MAX + ScriptInterface::ToJSVal(cx, &val12, -2147483647); // JSVAL_INT_MIN+1 + ScriptInterface::ToJSVal(cx, &val13, -(i64)2147483648u); // JSVAL_INT_MIN + TS_ASSERT(val9.isInt32()); + TS_ASSERT(val10.isInt32()); + TS_ASSERT(val11.isInt32()); + TS_ASSERT(val12.isInt32()); + TS_ASSERT(val13.isInt32()); + + ScriptInterface::ToJSVal(cx, &val14, 0); + ScriptInterface::ToJSVal(cx, &val15, 2147483646u); // JSVAL_INT_MAX-1 + ScriptInterface::ToJSVal(cx, &val16, 2147483647u); // JSVAL_INT_MAX + ScriptInterface::ToJSVal(cx, &val17, 2147483648u); // JSVAL_INT_MAX+1 + TS_ASSERT(val14.isInt32()); + TS_ASSERT(val15.isInt32()); + TS_ASSERT(val16.isInt32()); + TS_ASSERT(val17.isInt32()); } void test_nonfinite()