mirror of
https://github.com/tc39/test262.git
synced 2025-05-04 06:50:32 +02:00
* [javascriptcore-test262-automation] changes from git@github.com:WebKit/webkit.git at sha 949e26452cfa153a7f4afe593da97e2fe9e1b706 on Tue Jul 03 2018 14:35:15 GMT-0400 (Eastern Daylight Time)
114 lines
3.1 KiB
JavaScript
114 lines
3.1 KiB
JavaScript
import Builder from '../Builder.js'
|
|
import * as assert from '../assert.js'
|
|
|
|
const count = 10;
|
|
const pages = 6;
|
|
const memoryDescription = {initial:1};
|
|
const pageSize = 64 * 1024;
|
|
|
|
function createWasmInstance(memory) {
|
|
const builder = new Builder()
|
|
.Type().End()
|
|
.Import()
|
|
.Memory("imp", "memory", memoryDescription)
|
|
.End()
|
|
.Function().End()
|
|
.Export()
|
|
.Function("current")
|
|
.Function("get")
|
|
.Function("grow")
|
|
.End()
|
|
.Code()
|
|
.Function("current", { params: [], ret: "i32" })
|
|
.CurrentMemory(0)
|
|
.Return()
|
|
.End()
|
|
.Function("get", { params: ["i32"], ret: "i32" })
|
|
.GetLocal(0)
|
|
.I32Load(2, 0)
|
|
.Return()
|
|
.End()
|
|
.Function("grow", { params: ["i32"], ret: "i32" })
|
|
.GetLocal(0)
|
|
.GrowMemory(0)
|
|
.Return()
|
|
.End()
|
|
.End();
|
|
|
|
const bin = builder.WebAssembly().get();
|
|
const module = new WebAssembly.Module(bin);
|
|
return new WebAssembly.Instance(module, {imp: {memory}});
|
|
}
|
|
|
|
function doFillMemory(mem, length) {
|
|
const buf = new Uint32Array(mem.buffer);
|
|
|
|
for (let i = 0; i < length; ++i) {
|
|
buf[i * 4] = i + 1;
|
|
}
|
|
}
|
|
|
|
function doCheckTrap(instances, mem, numPages, length) {
|
|
const buf = new Uint32Array(mem.buffer);
|
|
|
|
for (let instance of instances) {
|
|
const foo = instance.exports.get;
|
|
for (let i = 0; i < length; i++) {
|
|
assert.eq(foo(i * 4), buf[i]);
|
|
}
|
|
assert.throws(() => foo(numPages * pageSize + 1), WebAssembly.RuntimeError, "Out of bounds memory access");
|
|
}
|
|
}
|
|
|
|
function doCheckNoTrap(instances, mem, numPages, length) {
|
|
const buf = new Uint32Array(mem.buffer);
|
|
|
|
for (let instance of instances) {
|
|
const foo = instance.exports.get;
|
|
for (let i = 0; i < length; i++) {
|
|
assert.eq(foo(i * 4), buf[i]);
|
|
}
|
|
assert.eq(foo(numPages * pageSize + 1), 0);
|
|
}
|
|
}
|
|
|
|
function doMemoryGrow(instances) {
|
|
const instance = instances[0]; // Take first instance and grow shared memory
|
|
instance.exports.grow(1);
|
|
}
|
|
|
|
function doCheck(mem, instances, numPages) {
|
|
const length = mem.buffer.byteLength / 4;
|
|
|
|
doFillMemory(mem, length);
|
|
doCheckTrap(instances, mem, numPages, length);
|
|
doMemoryGrow(instances);
|
|
doCheckNoTrap(instances, mem, numPages, length);
|
|
}
|
|
|
|
function checkWasmInstancesWithSharedMemory() {
|
|
const mem = new WebAssembly.Memory(memoryDescription);
|
|
|
|
const instances = [];
|
|
for (let i = 0; i < count; i++) {
|
|
instances.push(createWasmInstance(mem));
|
|
}
|
|
|
|
for(let i = 1; i < pages; i++) {
|
|
doCheck(mem, instances, i);
|
|
}
|
|
|
|
let instance;
|
|
for (let i = 0; i < count; i++) {
|
|
instance = instances.shift();
|
|
}
|
|
|
|
fullGC();
|
|
|
|
const survivedInstances = [ instance ]; // Should survive only one instance after full GC
|
|
|
|
doCheck(mem, survivedInstances, pages); // Recheck only for survie instances
|
|
}
|
|
|
|
checkWasmInstancesWithSharedMemory();
|