blob: 6d7618e99384ebb8b155f53be96754e0effb1699 [file] [log] [blame]
import * as assert from '../assert.js';
import Builder from '../Builder.js';
fullGC()
gc()
const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
.Type().End()
.Import()
.Global().Externref("imp", "ref", "immutable").End()
.End()
.Function().End()
.Global()
.RefNull("externref", "mutable")
.RefNull("externref", "immutable")
.GetGlobal("externref", 0, "mutable")
.End()
.Export()
.Function("set_glob")
.Function("get_glob")
.Function("glob_is_null")
.Function("set_glob_null")
.Function("get_import")
.Global("expglob", 2)
.Global("expglob2", 0)
.End()
.Code()
.Function("set_glob", { params: ["externref"], ret: "void" })
.GetLocal(0)
.SetGlobal(1)
.End()
.Function("get_glob", { params: [], ret: "externref" })
.GetGlobal(1)
.End()
.Function("glob_is_null", { params: [], ret: "i32" })
.Call(1)
.RefIsNull()
.End()
.Function("set_glob_null", { params: [], ret: "void" })
.RefNull("externref")
.Call(0)
.End()
.Function("get_import", { params: [], ret: "externref" })
.GetGlobal(0)
.End()
.End().WebAssembly().get()), { imp: { ref: "hi" } });
assert.eq($1.exports.get_import(), "hi")
assert.eq($1.exports.expglob.value, null)
assert.eq($1.exports.expglob2.value, "hi")
assert.eq($1.exports.get_glob(), null)
const obj = { test: "hi" }
assert.throws(() => $1.exports.expglob2 = null, TypeError, "Attempted to assign to readonly property.")
$1.exports.set_glob(obj); assert.eq($1.exports.get_glob(), obj); assert.eq($1.exports.expglob2.value, "hi")
$1.exports.set_glob(5); assert.eq($1.exports.get_glob(), 5)
$1.exports.set_glob(null); assert.eq($1.exports.get_glob(), null)
$1.exports.set_glob("hi"); assert.eq($1.exports.get_glob(), "hi")
$1.exports.set_glob(undefined); assert.eq($1.exports.get_glob(), undefined)
assert.eq($1.exports.glob_is_null(), 0)
$1.exports.set_glob_null(); assert.eq($1.exports.get_glob(), null)
assert.eq($1.exports.glob_is_null(), 1)
const obj2 = { test: 21 }
$1.exports.set_glob(obj2); assert.eq($1.exports.get_glob(), obj2)
$1.exports.get_glob(obj2).test = 5;
assert.eq($1.exports.get_glob().test, 5)
assert.eq(obj2.test, 5)
function doGCSet() {
fullGC()
$1.exports.set_glob({ test: -1 })
fullGC()
}
function doGCTest() {
for (let i=0; i<1000; ++i) {
assert.eq($1.exports.get_glob().test, -1)
fullGC()
}
}
doGCSet()
doGCTest()
let count = 0
function doBarrierSet() {
++count
$1.exports.set_glob({ test: -count })
}
function doBarrierTest() {
let garbage = { val: "hi", val2: 5, arr: [] }
for (let i=0; i<100; ++i) garbage.arr += ({ field: i })
for (let j=0; j<1000; ++j) {
assert.eq($1.exports.get_glob().test, -count)
edenGC()
}
}
for (let i=0; i<5; ++i) {
doBarrierSet()
doBarrierTest()
doBarrierTest()
}