summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/ref-types/externref-global-object.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/ref-types/externref-global-object.js')
-rw-r--r--js/src/jit-test/tests/wasm/ref-types/externref-global-object.js91
1 files changed, 91 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/ref-types/externref-global-object.js b/js/src/jit-test/tests/wasm/ref-types/externref-global-object.js
new file mode 100644
index 0000000000..806896e9b8
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/ref-types/externref-global-object.js
@@ -0,0 +1,91 @@
+// |jit-test| skip-if: typeof WebAssembly.Global !== 'function'
+
+// Dummy object.
+function Baguette(calories) {
+ this.calories = calories;
+}
+
+assertEq(new WebAssembly.Global({value: "externref"}) instanceof WebAssembly.Global, true);
+
+(function() {
+ // Test initialization without a value.
+ let g = new WebAssembly.Global({value: "externref"});
+ assertEq(g.value, void 0);
+ assertErrorMessage(() => g.value = 42, TypeError, /immutable global/);
+})();
+
+(function() {
+ // Test initialization with a value.
+ let g = new WebAssembly.Global({value: "externref"}, null);
+ assertEq(g.value, null);
+ assertErrorMessage(() => g.value = 42, TypeError, /immutable global/);
+
+ let obj = {};
+ g = new WebAssembly.Global({value: "externref"}, obj);
+ assertEq(g.value, obj);
+ assertErrorMessage(() => g.value = 42, TypeError, /immutable global/);
+
+ g = new WebAssembly.Global({value: "externref"}, 1337);
+ assertEq(typeof g.value, "number");
+ assertEq(+g.value, 1337);
+
+ g = new WebAssembly.Global({value: "externref"}, 13.37);
+ assertEq(typeof g.value, "number");
+ assertEq(+g.value, 13.37);
+
+ g = new WebAssembly.Global({value: "externref"}, "string");
+ assertEq(typeof g.value, "string");
+ assertEq(g.value.toString(), "string");
+
+ g = new WebAssembly.Global({value: "externref"}, true);
+ assertEq(typeof g.value, "boolean");
+ assertEq(!!g.value, true);
+
+ g = new WebAssembly.Global({value: "externref"}, Symbol("status"));
+ assertEq(typeof g.value, "symbol");
+ assertEq(g.value.toString(), "Symbol(status)");
+
+ g = new WebAssembly.Global({value: "externref"}, undefined);
+ assertEq(g.value, undefined);
+})();
+
+(function() {
+ // Test mutable property and assignment.
+ let g = new WebAssembly.Global({value: "externref", mutable: true}, null);
+ assertEq(g.value, null);
+
+ let obj = { x: 42 };
+ g.value = obj;
+ assertEq(g.value, obj);
+ assertEq(g.value.x, 42);
+
+ obj = null;
+ assertEq(g.value.x, 42);
+
+ let otherObj = { y : 35 };
+ g.value = otherObj;
+ assertEq(g.value, otherObj);
+})();
+
+(function() {
+ // Test tracing.
+ let nom = new Baguette(1);
+ let g = new WebAssembly.Global({value: "externref"}, nom);
+ nom = null;
+ gc();
+ assertEq(g.value.calories, 1);
+})();
+
+var global = new WebAssembly.Global({ value: "externref", mutable: true }, null);
+
+// GCZeal mode 2 implies that every allocation (second parameter = every single
+// allocation) will trigger a full GC.
+gczeal(2, 1);
+
+{
+ let nomnom = new Baguette(42);
+ global.value = nomnom;
+ nomnom = null;
+}
+new Baguette();
+assertEq(global.value.calories, 42);