mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-09-21 20:06:40 +00:00
Second (main) commit for the SpiderMonkey upgrade.
This commit contains all the required changes to our source files and build scripts (hopefully). A next commit will remove the old stuff of SpiderMonkey 1.8.5. Spcial thanks to: - H4writer who helped a lot mainly with the performance issues we had/have, but also with other problems or questions. - Leper for the review. - Historic_bruno for implementing the build scripts on Mac OS X and testing on the Mac. - The people from the #jsapi channel and from mozilla.dev.tech.js-engine who answered a lot of questions and helped solving problems. - All the other people who helped Refs #1886 Fixes #2442 Fixes #2416 This was SVN commit r14877.
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
#include "maths/MathUtil.h"
|
||||
#include "ps/CLogger.h"
|
||||
|
||||
#include "js/jsapi.h"
|
||||
#include "jsapi.h"
|
||||
|
||||
class TestScriptConversions : public CxxTest::TestSuite
|
||||
{
|
||||
@@ -32,13 +32,15 @@ class TestScriptConversions : public CxxTest::TestSuite
|
||||
{
|
||||
ScriptInterface script("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
JSContext* cx = script.GetContext();
|
||||
JSAutoRequest rq(cx);
|
||||
|
||||
jsval v1 = ScriptInterface::ToJSVal(cx, value);
|
||||
JS::Value v1;
|
||||
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_GetGlobalObject(cx)), "uneval", CScriptVal(v1), source));
|
||||
TS_ASSERT(script.CallFunction(OBJECT_TO_JSVAL(JS_GetGlobalForScopeChain(cx)), "uneval", CScriptVal(v1), source));
|
||||
|
||||
TS_ASSERT_STR_EQUALS(source, expected);
|
||||
}
|
||||
@@ -48,11 +50,13 @@ class TestScriptConversions : public CxxTest::TestSuite
|
||||
{
|
||||
ScriptInterface script("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
JSContext* cx = script.GetContext();
|
||||
JSAutoRequest rq(cx);
|
||||
|
||||
jsval v1 = ScriptInterface::ToJSVal(cx, value);
|
||||
JS::Value v1;
|
||||
ScriptInterface::ToJSVal(cx, v1, value);
|
||||
|
||||
std::string source;
|
||||
TS_ASSERT(script.CallFunction(OBJECT_TO_JSVAL(JS_GetGlobalObject(cx)), "uneval", CScriptVal(v1), source));
|
||||
TS_ASSERT(script.CallFunction(OBJECT_TO_JSVAL(JS_GetGlobalForScopeChain(cx)), "uneval", CScriptVal(v1), source));
|
||||
|
||||
if (expected)
|
||||
TS_ASSERT_STR_EQUALS(source, expected);
|
||||
@@ -101,12 +105,12 @@ public:
|
||||
|
||||
roundtrip<std::string>("", "\"\"");
|
||||
roundtrip<std::string>("test", "\"test\"");
|
||||
roundtrip<std::string>(s1, "\"t\\0st\"");
|
||||
roundtrip<std::string>(s1, "\"t\\x00st\"");
|
||||
// TODO: should test non-ASCII strings
|
||||
|
||||
roundtrip<std::wstring>(L"", "\"\"");
|
||||
roundtrip<std::wstring>(L"test", "\"test\"");
|
||||
roundtrip<std::wstring>(w1, "\"t\\0st\"");
|
||||
roundtrip<std::wstring>(w1, "\"t\\x00st\"");
|
||||
// TODO: should test non-ASCII strings
|
||||
|
||||
convert_to<const char*>("", "\"\"");
|
||||
@@ -123,19 +127,29 @@ public:
|
||||
{
|
||||
ScriptInterface script("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
JSContext* cx = script.GetContext();
|
||||
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
|
||||
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));
|
||||
|
||||
TS_ASSERT(JSVAL_IS_INT(ScriptInterface::ToJSVal<i32>(cx, 0)));
|
||||
|
||||
TS_ASSERT(JSVAL_IS_INT(ScriptInterface::ToJSVal<i32>(cx, 2147483646))); // JSVAL_INT_MAX-1
|
||||
TS_ASSERT(JSVAL_IS_INT(ScriptInterface::ToJSVal<i32>(cx, 2147483647))); // JSVAL_INT_MAX
|
||||
TS_ASSERT(JSVAL_IS_INT(ScriptInterface::ToJSVal<i32>(cx, -2147483647))); // JSVAL_INT_MIN+1
|
||||
TS_ASSERT(JSVAL_IS_INT(ScriptInterface::ToJSVal<i32>(cx, -(i64)2147483648u))); // JSVAL_INT_MIN
|
||||
|
||||
TS_ASSERT(JSVAL_IS_INT(ScriptInterface::ToJSVal<u32>(cx, 0)));
|
||||
|
||||
TS_ASSERT(JSVAL_IS_INT(ScriptInterface::ToJSVal<u32>(cx, 2147483646u))); // JSVAL_INT_MAX-1
|
||||
TS_ASSERT(JSVAL_IS_INT(ScriptInterface::ToJSVal<u32>(cx, 2147483647u))); // JSVAL_INT_MAX
|
||||
TS_ASSERT(JSVAL_IS_DOUBLE(ScriptInterface::ToJSVal<u32>(cx, 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));
|
||||
TS_ASSERT(JSVAL_IS_DOUBLE(val8));
|
||||
}
|
||||
|
||||
void test_nonfinite()
|
||||
@@ -146,9 +160,12 @@ public:
|
||||
|
||||
ScriptInterface script("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
JSContext* cx = script.GetContext();
|
||||
JSAutoRequest rq(cx);
|
||||
|
||||
float f = 0;
|
||||
TS_ASSERT(ScriptInterface::FromJSVal(cx, ScriptInterface::ToJSVal(cx, NAN), f));
|
||||
JS::Value testNANVal;
|
||||
ScriptInterface::ToJSVal(cx, testNANVal, NAN);
|
||||
TS_ASSERT(ScriptInterface::FromJSVal(cx, testNANVal, f));
|
||||
TS_ASSERT(isnan(f));
|
||||
}
|
||||
|
||||
|
||||
@@ -61,8 +61,9 @@ public:
|
||||
|
||||
void test_clone_basic()
|
||||
{
|
||||
ScriptInterface script1("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
ScriptInterface script2("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
shared_ptr<ScriptRuntime> runtime = ScriptInterface::CreateRuntime();
|
||||
ScriptInterface script1("Test", "Test", runtime);
|
||||
ScriptInterface script2("Test", "Test", runtime);
|
||||
|
||||
CScriptVal obj1;
|
||||
TS_ASSERT(script1.Eval("({'x': 123, 'y': [1, 1.5, '2', 'test', undefined, null, true, false]})", obj1));
|
||||
@@ -78,8 +79,9 @@ public:
|
||||
{
|
||||
// The tests should be run with JS_SetGCZeal so this can try to find GC bugs
|
||||
|
||||
ScriptInterface script1("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
ScriptInterface script2("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
shared_ptr<ScriptRuntime> runtime = ScriptInterface::CreateRuntime();
|
||||
ScriptInterface script1("Test", "Test", runtime);
|
||||
ScriptInterface script2("Test", "Test", runtime);
|
||||
|
||||
CScriptVal obj1;
|
||||
TS_ASSERT(script1.Eval("var s = '?'; var v = ({get x() { return 123 }, 'y': {'w':{get z() { delete v.y; delete v.n; v = null; s += s; return 4 }}}, 'n': 100}); v", obj1));
|
||||
@@ -88,22 +90,33 @@ public:
|
||||
|
||||
std::string source;
|
||||
TS_ASSERT(script2.CallFunction(obj2.get(), "toSource", source));
|
||||
TS_ASSERT_STR_EQUALS(source, "({x:123, y:{w:{z:4}}, n:(void 0)})");
|
||||
TS_ASSERT_STR_EQUALS(source, "({x:123, y:{w:{z:4}}})");
|
||||
}
|
||||
|
||||
void test_clone_cyclic()
|
||||
{
|
||||
ScriptInterface script1("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
ScriptInterface script2("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
shared_ptr<ScriptRuntime> runtime = ScriptInterface::CreateRuntime();
|
||||
ScriptInterface script1("Test", "Test", runtime);
|
||||
ScriptInterface script2("Test", "Test", runtime);
|
||||
|
||||
CScriptVal obj1;
|
||||
TS_ASSERT(script1.Eval("var x = []; x[0] = x; ({'a': x, 'b': x})", obj1));
|
||||
|
||||
CScriptVal obj2 = script2.CloneValueFromOtherContext(script1, obj1.get());
|
||||
|
||||
std::string source;
|
||||
TS_ASSERT(script2.CallFunction(obj2.get(), "toSource", source));
|
||||
TS_ASSERT_STR_EQUALS(source, "({a:#1=[#1#], b:#1#})");
|
||||
// Use JSAPI function to check if the values of the properties "a", "b" are equals a.x[0]
|
||||
JSContext* cx2 = script2.GetContext();
|
||||
JSAutoRequest rq(cx2);
|
||||
JS::RootedValue prop_a(cx2);
|
||||
JS::RootedValue prop_b(cx2);
|
||||
JS::RootedValue prop_x1(cx2);
|
||||
TS_ASSERT(JS_GetProperty(cx2, &(obj2.get().toObject()), "a", prop_a.address()));
|
||||
TS_ASSERT(JS_GetProperty(cx2, &(obj2.get().toObject()), "b", prop_b.address()));
|
||||
TS_ASSERT(prop_a.get().isObject());
|
||||
TS_ASSERT(prop_b.get().isObject());
|
||||
TS_ASSERT(JS_GetProperty(cx2, &(prop_a.get().toObject()), "0", prop_x1.address()));
|
||||
TS_ASSERT_EQUALS(prop_x1.get(), prop_a.get());
|
||||
TS_ASSERT_EQUALS(prop_x1.get(), prop_b.get());
|
||||
}
|
||||
|
||||
void test_random()
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include "scriptinterface/ScriptInterface.h"
|
||||
#include "scriptinterface/ScriptVal.h"
|
||||
|
||||
#include "js/jsapi.h"
|
||||
#include "jsapi.h"
|
||||
|
||||
class TestScriptVal : public CxxTest::TestSuite
|
||||
{
|
||||
@@ -29,18 +29,19 @@ public:
|
||||
{
|
||||
ScriptInterface script("Test", "Test", ScriptInterface::CreateRuntime());
|
||||
JSContext* cx = script.GetContext();
|
||||
JSAutoRequest rq(cx);
|
||||
|
||||
JSObject* obj = JS_NewObject(cx, NULL, NULL, NULL);
|
||||
TS_ASSERT(obj);
|
||||
|
||||
CScriptValRooted root(cx, OBJECT_TO_JSVAL(obj));
|
||||
|
||||
JS_GC(cx);
|
||||
JS_GC(script.GetJSRuntime());
|
||||
|
||||
jsval val = INT_TO_JSVAL(123);
|
||||
TS_ASSERT(JS_SetProperty(cx, obj, "test", &val));
|
||||
|
||||
JS_GC(cx);
|
||||
JS_GC(script.GetJSRuntime());
|
||||
|
||||
jsval rval;
|
||||
TS_ASSERT(JS_GetProperty(cx, obj, "test", &rval));
|
||||
|
||||
Reference in New Issue
Block a user