diff --git a/JSTests/ChangeLog b/JSTests/ChangeLog
index 232ab44..f2c0f63 100644
--- a/JSTests/ChangeLog
+++ b/JSTests/ChangeLog
@@ -1,3 +1,16 @@
+2019-07-15  Michael Catanzaro  <mcatanzaro@igalia.com>
+
+        Unreviewed, rolling out r247440.
+
+        Broke builds
+
+        Reverted changeset:
+
+        "[JSC] Improve wasm wpt test results by fixing miscellaneous
+        issues"
+        https://bugs.webkit.org/show_bug.cgi?id=199783
+        https://trac.webkit.org/changeset/247440
+
 2019-07-15  Yusuke Suzuki  <ysuzuki@apple.com>
 
         [JSC] Improve wasm wpt test results by fixing miscellaneous issues
diff --git a/JSTests/wasm/js-api/Module-compile.js b/JSTests/wasm/js-api/Module-compile.js
index d5a8599..d723bf4 100644
--- a/JSTests/wasm/js-api/Module-compile.js
+++ b/JSTests/wasm/js-api/Module-compile.js
@@ -2,7 +2,7 @@
 import Builder from '../Builder.js';
 
 assert.isFunction(WebAssembly.compile);
-assert.truthy(WebAssembly.hasOwnProperty('compile'));
+assert.isFunction(WebAssembly.__proto__.compile);
 assert.eq(WebAssembly.compile.length, 1);
 
 async function testPromiseAPI() {
diff --git a/JSTests/wasm/js-api/test_basic_api.js b/JSTests/wasm/js-api/test_basic_api.js
index 5e37210..2158743 100644
--- a/JSTests/wasm/js-api/test_basic_api.js
+++ b/JSTests/wasm/js-api/test_basic_api.js
@@ -78,7 +78,7 @@
         for (const invalid of invalidInstanceImports)
             assert.throws(() => new WebAssembly[c](new WebAssembly.Module(emptyModuleArray), invalid), TypeError, `second argument to WebAssembly.Instance must be undefined or an Object (evaluating 'new WebAssembly[c](new WebAssembly.Module(emptyModuleArray), invalid)')`);
         assert.isNotUndef(instance.exports);
-        checkAccessorOwnPropertyDescriptor(WebAssembly.Instance.prototype, "exports", { configurable: true, enumerable: true });
+        checkAccessorOwnPropertyDescriptor(WebAssembly.Instance.prototype, "exports", { configurable: true, enumerable: false });
         assert.throws(() => WebAssembly.Instance.prototype.exports = undefined, TypeError, `Attempted to assign to readonly property.`);
         assert.throws(() => WebAssembly.Instance.prototype.exports, TypeError, `expected |this| value to be an instance of WebAssembly.Instance`);
         assert.isUndef(instance.exports.__proto__);
diff --git a/JSTests/wasm/js-api/validate.js b/JSTests/wasm/js-api/validate.js
index d5d9e99..4fe83c2 100644
--- a/JSTests/wasm/js-api/validate.js
+++ b/JSTests/wasm/js-api/validate.js
@@ -2,7 +2,7 @@
 import Builder from '../Builder.js';
 
 assert.isFunction(WebAssembly.validate);
-assert.truthy(WebAssembly.hasOwnProperty('validate'));
+assert.isFunction(WebAssembly.__proto__.validate);
 assert.eq(WebAssembly.validate.length, 1);
 
 {
diff --git a/JSTests/wasm/js-api/web-assembly-instantiate.js b/JSTests/wasm/js-api/web-assembly-instantiate.js
index 1b6b714..f606725 100644
--- a/JSTests/wasm/js-api/web-assembly-instantiate.js
+++ b/JSTests/wasm/js-api/web-assembly-instantiate.js
@@ -2,7 +2,7 @@
 import Builder from '../Builder.js';
 
 assert.isFunction(WebAssembly.instantiate);
-assert.truthy(WebAssembly.hasOwnProperty('instantiate'));
+assert.isFunction(WebAssembly.__proto__.instantiate);
 assert.eq(WebAssembly.instantiate.length, 1);
 
 {
diff --git a/JSTests/wasm/spec-tests/jsapi.js b/JSTests/wasm/spec-tests/jsapi.js
index 2969f07..8e5d228 100644
--- a/JSTests/wasm/spec-tests/jsapi.js
+++ b/JSTests/wasm/spec-tests/jsapi.js
@@ -230,7 +230,7 @@
     const moduleImportsDesc = Object.getOwnPropertyDescriptor(Module, 'imports');
     assert_equals(typeof moduleImportsDesc.value, "function");
     assert_equals(moduleImportsDesc.writable, true);
-    assert_equals(moduleImportsDesc.enumerable, true);
+    assert_equals(moduleImportsDesc.enumerable, false);
     assert_equals(moduleImportsDesc.configurable, true);
 }, "'WebAssembly.Module.imports' data property");
 
@@ -265,7 +265,7 @@
     const moduleExportsDesc = Object.getOwnPropertyDescriptor(Module, 'exports');
     assert_equals(typeof moduleExportsDesc.value, "function");
     assert_equals(moduleExportsDesc.writable, true);
-    assert_equals(moduleExportsDesc.enumerable, true);
+    assert_equals(moduleExportsDesc.enumerable, false);
     assert_equals(moduleExportsDesc.configurable, true);
 }, "'WebAssembly.Module.exports' data property");
 
@@ -296,7 +296,7 @@
     const customSectionsDesc = Object.getOwnPropertyDescriptor(Module, 'customSections');
     assert_equals(typeof customSectionsDesc.value, "function");
     assert_equals(customSectionsDesc.writable, true);
-    assert_equals(customSectionsDesc.enumerable, true);
+    assert_equals(customSectionsDesc.enumerable, false);
     assert_equals(customSectionsDesc.configurable, true);
 }, "'WebAssembly.Module.customSections' data property");
 
@@ -307,7 +307,7 @@
     assertThrows(() => moduleCustomSections(), TypeError);
     assertThrows(() => moduleCustomSections(undefined), TypeError);
     assertThrows(() => moduleCustomSections({}), TypeError);
-    var arr = moduleCustomSections(emptyModule, undefined);
+    var arr = moduleCustomSections(emptyModule);
     assert_equals(arr instanceof Array, true);
     assert_equals(arr.length, 0);
 }, "'WebAssembly.Module.customSections' method");
@@ -367,7 +367,7 @@
     const exportsDesc = Object.getOwnPropertyDescriptor(instanceProto, 'exports');
     assert_equals(typeof exportsDesc.get, "function");
     assert_equals(exportsDesc.set, undefined);
-    assert_equals(exportsDesc.enumerable, true);
+    assert_equals(exportsDesc.enumerable, false);
     assert_equals(exportsDesc.configurable, true);
     const exportsGetter = exportsDesc.get;
     assertThrows(() => exportsGetter.call(), TypeError);
@@ -415,11 +415,11 @@
     assertThrows(() => Memory(), TypeError);
     assertThrows(() => new Memory(1), TypeError);
     assertThrows(() => new Memory({initial:{valueOf() { throw new Error("here")}}}), Error);
-    assertThrows(() => new Memory({initial:-1}), TypeError);
-    assertThrows(() => new Memory({initial:Math.pow(2,32)}), TypeError);
+    assertThrows(() => new Memory({initial:-1}), RangeError);
+    assertThrows(() => new Memory({initial:Math.pow(2,32)}), RangeError);
     assertThrows(() => new Memory({initial:1, maximum: Math.pow(2,32)/Math.pow(2,14) }), RangeError);
     assertThrows(() => new Memory({initial:2, maximum:1 }), RangeError);
-    assertThrows(() => new Memory({maximum: -1 }), TypeError);
+    assertThrows(() => new Memory({maximum: -1 }), RangeError);
     assert_equals(new Memory({initial:1}) instanceof Memory, true);
     assert_equals(new Memory({initial:1.5}).buffer.byteLength, WasmPage);
 }, "'WebAssembly.Memory' constructor function");
@@ -451,7 +451,7 @@
     const bufferDesc = Object.getOwnPropertyDescriptor(memoryProto, 'buffer');
     assert_equals(typeof bufferDesc.get, "function");
     assert_equals(bufferDesc.set, undefined);
-    assert_equals(bufferDesc.enumerable, true);
+    assert_equals(bufferDesc.enumerable, false);
     assert_equals(bufferDesc.configurable, true);
 }, "'WebAssembly.Memory.prototype.buffer' accessor property");
 
@@ -467,7 +467,7 @@
 test(() => {
     const memGrowDesc = Object.getOwnPropertyDescriptor(memoryProto, 'grow');
     assert_equals(typeof memGrowDesc.value, "function");
-    assert_equals(memGrowDesc.enumerable, true);
+    assert_equals(memGrowDesc.enumerable, false);
     assert_equals(memGrowDesc.configurable, true);
 }, "'WebAssembly.Memory.prototype.grow' data property");
 
@@ -477,8 +477,8 @@
     assert_equals(memGrow.length, 1);
     assertThrows(() => memGrow.call(), TypeError);
     assertThrows(() => memGrow.call({}), TypeError);
-    assertThrows(() => memGrow.call(mem1, -1), TypeError);
-    assertThrows(() => memGrow.call(mem1, Math.pow(2,32)), TypeError);
+    assertThrows(() => memGrow.call(mem1, -1), RangeError);
+    assertThrows(() => memGrow.call(mem1, Math.pow(2,32)), RangeError);
     var mem = new Memory({initial:1, maximum:2});
     var buf = mem.buffer;
     assert_equals(buf.byteLength, WasmPage);
@@ -516,10 +516,10 @@
     assertThrows(() => new Table({initial:1, element:"any"}), TypeError);
     assertThrows(() => new Table({initial:1, element:{valueOf() { return "funcref" }}}), TypeError);
     assertThrows(() => new Table({initial:{valueOf() { throw new Error("here")}}, element:"funcref"}), Error);
-    assertThrows(() => new Table({initial:-1, element:"funcref"}), TypeError);
-    assertThrows(() => new Table({initial:Math.pow(2,32), element:"funcref"}), TypeError);
+    assertThrows(() => new Table({initial:-1, element:"funcref"}), RangeError);
+    assertThrows(() => new Table({initial:Math.pow(2,32), element:"funcref"}), RangeError);
     assertThrows(() => new Table({initial:2, maximum:1, element:"funcref"}), RangeError);
-    assertThrows(() => new Table({initial:2, maximum:Math.pow(2,32), element:"funcref"}), TypeError);
+    assertThrows(() => new Table({initial:2, maximum:Math.pow(2,32), element:"funcref"}), RangeError);
     assert_equals(new Table({initial:1, element:"funcref"}) instanceof Table, true);
     assert_equals(new Table({initial:1.5, element:"funcref"}) instanceof Table, true);
     assert_equals(new Table({initial:1, maximum:1.5, element:"funcref"}) instanceof Table, true);
@@ -553,7 +553,7 @@
     const lengthDesc = Object.getOwnPropertyDescriptor(tableProto, 'length');
     assert_equals(typeof lengthDesc.get, "function");
     assert_equals(lengthDesc.set, undefined);
-    assert_equals(lengthDesc.enumerable, true);
+    assert_equals(lengthDesc.enumerable, false);
     assert_equals(lengthDesc.configurable, true);
 }, "'WebAssembly.Table.prototype.length' accessor data property");
 
@@ -570,7 +570,7 @@
 test(() => {
     const getDesc = Object.getOwnPropertyDescriptor(tableProto, 'get');
     assert_equals(typeof getDesc.value, "function");
-    assert_equals(getDesc.enumerable, true);
+    assert_equals(getDesc.enumerable, false);
     assert_equals(getDesc.configurable, true);
 }, "'WebAssembly.Table.prototype.get' data property");
 
@@ -585,15 +585,15 @@
     assert_equals(get.call(tbl1, 1.5), null);
     assertThrows(() => get.call(tbl1, 2), RangeError);
     assertThrows(() => get.call(tbl1, 2.5), RangeError);
-    assertThrows(() => get.call(tbl1, -1), TypeError);
-    assertThrows(() => get.call(tbl1, Math.pow(2,33)), TypeError);
+    assertThrows(() => get.call(tbl1, -1), RangeError);
+    assertThrows(() => get.call(tbl1, Math.pow(2,33)), RangeError);
     assertThrows(() => get.call(tbl1, {valueOf() { throw new Error("hi") }}), Error);
 }, "'WebAssembly.Table.prototype.get' method");
 
 test(() => {
     const setDesc = Object.getOwnPropertyDescriptor(tableProto, 'set');
     assert_equals(typeof setDesc.value, "function");
-    assert_equals(setDesc.enumerable, true);
+    assert_equals(setDesc.enumerable, false);
     assert_equals(setDesc.configurable, true);
 }, "'WebAssembly.Table.prototype.set' data property");
 
@@ -605,8 +605,8 @@
     assertThrows(() => set.call({}), TypeError);
     assertThrows(() => set.call(tbl1, 0), TypeError);
     assertThrows(() => set.call(tbl1, 2, null), RangeError);
-    assertThrows(() => set.call(tbl1, -1, null), TypeError);
-    assertThrows(() => set.call(tbl1, Math.pow(2,33), null), TypeError);
+    assertThrows(() => set.call(tbl1, -1, null), RangeError);
+    assertThrows(() => set.call(tbl1, Math.pow(2,33), null), RangeError);
     assertThrows(() => set.call(tbl1, 0, undefined), TypeError);
     assertThrows(() => set.call(tbl1, 0, {}), TypeError);
     assertThrows(() => set.call(tbl1, 0, function() {}), TypeError);
@@ -619,7 +619,7 @@
 test(() => {
     const tblGrowDesc = Object.getOwnPropertyDescriptor(tableProto, 'grow');
     assert_equals(typeof tblGrowDesc.value, "function");
-    assert_equals(tblGrowDesc.enumerable, true);
+    assert_equals(tblGrowDesc.enumerable, false);
     assert_equals(tblGrowDesc.configurable, true);
 }, "'WebAssembly.Table.prototype.grow' data property");
 
@@ -629,8 +629,8 @@
     assert_equals(tblGrow.length, 1);
     assertThrows(() => tblGrow.call(), TypeError);
     assertThrows(() => tblGrow.call({}), TypeError);
-    assertThrows(() => tblGrow.call(tbl1, -1), TypeError);
-    assertThrows(() => tblGrow.call(tbl1, Math.pow(2,32)), TypeError);
+    assertThrows(() => tblGrow.call(tbl1, -1), RangeError);
+    assertThrows(() => tblGrow.call(tbl1, Math.pow(2,32)), RangeError);
     var tbl = new Table({element:"funcref", initial:1, maximum:2});
     assert_equals(tbl.length, 1);
     assert_equals(tbl.grow(0), 1);
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index ad265ff..f359d31 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,16 @@
+2019-07-15  Michael Catanzaro  <mcatanzaro@igalia.com>
+
+        Unreviewed, rolling out r247440.
+
+        Broke builds
+
+        Reverted changeset:
+
+        "[JSC] Improve wasm wpt test results by fixing miscellaneous
+        issues"
+        https://bugs.webkit.org/show_bug.cgi?id=199783
+        https://trac.webkit.org/changeset/247440
+
 2019-07-15  Daniel Bates  <dabates@apple.com>
 
         Typing into a cell in a Google Sheet lags behind by one character
diff --git a/LayoutTests/imported/w3c/ChangeLog b/LayoutTests/imported/w3c/ChangeLog
index c761911..d997e94 100644
--- a/LayoutTests/imported/w3c/ChangeLog
+++ b/LayoutTests/imported/w3c/ChangeLog
@@ -1,3 +1,16 @@
+2019-07-15  Michael Catanzaro  <mcatanzaro@igalia.com>
+
+        Unreviewed, rolling out r247440.
+
+        Broke builds
+
+        Reverted changeset:
+
+        "[JSC] Improve wasm wpt test results by fixing miscellaneous
+        issues"
+        https://bugs.webkit.org/show_bug.cgi?id=199783
+        https://trac.webkit.org/changeset/247440
+
 2019-07-15  Rob Buis  <rbuis@igalia.com>
 
         MathML WPT test for RadicalDegreeBottomRaisePercent fails
diff --git a/LayoutTests/imported/w3c/resources/import-expectations.json b/LayoutTests/imported/w3c/resources/import-expectations.json
index c426228..7957f50 100644
--- a/LayoutTests/imported/w3c/resources/import-expectations.json
+++ b/LayoutTests/imported/w3c/resources/import-expectations.json
@@ -343,7 +343,6 @@
     "web-platform-tests/visual-viewport": "import", 
     "web-platform-tests/wai-aria": "skip", 
     "web-platform-tests/wasm": "skip", 
-    "web-platform-tests/wasm/jsapi": "import", 
     "web-platform-tests/web-animations": "skip", 
     "web-platform-tests/web-nfc": "skip", 
     "web-platform-tests/webaudio": "import", 
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/assertions.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/assertions.js
deleted file mode 100644
index 151a406..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/assertions.js
+++ /dev/null
@@ -1,17 +0,0 @@
-function assert_function_name(fn, name, description) {
-  const propdesc = Object.getOwnPropertyDescriptor(fn, "name");
-  assert_equals(typeof propdesc, "object", `${description} should have name property`);
-  assert_false(propdesc.writable, "writable", `${description} name should not be writable`);
-  assert_false(propdesc.enumerable, "enumerable", `${description} name should not be enumerable`);
-  assert_true(propdesc.configurable, "configurable", `${description} name should be configurable`);
-  assert_equals(propdesc.value, name, `${description} name should be ${name}`);
-}
-
-function assert_function_length(fn, length, description) {
-  const propdesc = Object.getOwnPropertyDescriptor(fn, "length");
-  assert_equals(typeof propdesc, "object", `${description} should have length property`);
-  assert_false(propdesc.writable, "writable", `${description} length should not be writable`);
-  assert_false(propdesc.enumerable, "enumerable", `${description} length should not be enumerable`);
-  assert_true(propdesc.configurable, "configurable", `${description} length should be configurable`);
-  assert_equals(propdesc.value, length, `${description} length should be ${length}`);
-}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/bad-imports.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/bad-imports.js
deleted file mode 100644
index f076baa..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/bad-imports.js
+++ /dev/null
@@ -1,140 +0,0 @@
-function test_bad_imports(t) {
-  for (const value of [null, true, "", Symbol(), 1, 0.1, NaN]) {
-    t(`Non-object imports argument: ${format_value(value)}`,
-      new TypeError(),
-      builder => {},
-      value);
-  }
-
-  for (const value of [undefined, null, true, "", Symbol(), 1, 0.1, NaN]) {
-    const imports = {
-      "module": value,
-    };
-    t(`Non-object module: ${format_value(value)}`,
-      new TypeError(),
-      builder => {
-        builder.addImport("module", "fn", kSig_v_v);
-      },
-      value);
-  }
-
-  t(`Missing imports argument`,
-    new TypeError(),
-    builder => {
-      builder.addImport("module", "fn", kSig_v_v);
-    });
-
-  for (const [value, name] of [[undefined, "undefined"], [{}, "empty object"], [{ "module\0": null }, "wrong property"]]) {
-    t(`Imports argument with missing property: ${name}`,
-      new TypeError(),
-      builder => {
-        builder.addImport("module", "fn", kSig_v_v);
-      },
-      value);
-  }
-
-  t(`Importing an i64 global`,
-    new WebAssembly.LinkError(),
-    builder => {
-      builder.addImportedGlobal("module", "global", kWasmI64);
-    },
-    {
-      "module": {
-        "global": 0,
-      },
-    });
-
-  for (const value of [undefined, null, true, "", Symbol(), 1, 0.1, NaN, {}]) {
-    t(`Importing a function with an incorrectly-typed value: ${format_value(value)}`,
-      new WebAssembly.LinkError(),
-      builder => {
-        builder.addImport("module", "fn", kSig_v_v);
-      },
-      {
-        "module": {
-          "fn": value,
-        },
-      });
-  }
-
-  const nonGlobals = [
-    [undefined],
-    [null],
-    [true],
-    [""],
-    [Symbol()],
-    [{}, "plain object"],
-    [WebAssembly.Global, "WebAssembly.Global"],
-    [WebAssembly.Global.prototype, "WebAssembly.Global.prototype"],
-    [Object.create(WebAssembly.Global.prototype), "Object.create(WebAssembly.Global.prototype)"],
-  ];
-
-  for (const [value, name = format_value(value)] of nonGlobals) {
-    t(`Importing a global with an incorrectly-typed value: ${name}`,
-      new WebAssembly.LinkError(),
-      builder => {
-        builder.addImportedGlobal("module", "global", kWasmI32);
-      },
-      {
-        "module": {
-          "global": value,
-        },
-      });
-  }
-
-  const nonMemories = [
-    [undefined],
-    [null],
-    [true],
-    [""],
-    [Symbol()],
-    [1],
-    [0.1],
-    [NaN],
-    [{}, "plain object"],
-    [WebAssembly.Memory, "WebAssembly.Memory"],
-    [WebAssembly.Memory.prototype, "WebAssembly.Memory.prototype"],
-    [Object.create(WebAssembly.Memory.prototype), "Object.create(WebAssembly.Memory.prototype)"],
-  ];
-
-  for (const [value, name = format_value(value)] of nonMemories) {
-    t(`Importing memory with an incorrectly-typed value: ${name}`,
-      new WebAssembly.LinkError(),
-      builder => {
-        builder.addImportedMemory("module", "memory", 0, 128);
-      },
-      {
-        "module": {
-          "memory": value,
-        },
-      });
-  }
-
-  const nonTables = [
-    [undefined],
-    [null],
-    [true],
-    [""],
-    [Symbol()],
-    [1],
-    [0.1],
-    [NaN],
-    [{}, "plain object"],
-    [WebAssembly.Table, "WebAssembly.Table"],
-    [WebAssembly.Table.prototype, "WebAssembly.Table.prototype"],
-    [Object.create(WebAssembly.Table.prototype), "Object.create(WebAssembly.Table.prototype)"],
-  ];
-
-  for (const [value, name = format_value(value)] of nonTables) {
-    t(`Importing table with an incorrectly-typed value: ${name}`,
-      new WebAssembly.LinkError(),
-      builder => {
-        builder.addImportedTable("module", "table", 0, 128);
-      },
-      {
-        "module": {
-          "table": value,
-        },
-      });
-  }
-}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any-expected.txt
deleted file mode 100644
index 5d37480..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any-expected.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-CONSOLE MESSAGE: line 68: TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-Harness Error (FAIL), message = TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-PASS WebAssembly.instantiate(module): Non-object imports argument: null 
-PASS WebAssembly.instantiate(module): Non-object imports argument: true 
-PASS WebAssembly.instantiate(module): Non-object imports argument: "" 
-PASS WebAssembly.instantiate(module): Non-object imports argument: symbol "Symbol()" 
-PASS WebAssembly.instantiate(module): Non-object imports argument: 1 
-PASS WebAssembly.instantiate(module): Non-object imports argument: 0.1 
-PASS WebAssembly.instantiate(module): Non-object imports argument: NaN 
-PASS WebAssembly.instantiate(module): Non-object module: undefined 
-PASS WebAssembly.instantiate(module): Non-object module: null 
-PASS WebAssembly.instantiate(module): Non-object module: true 
-PASS WebAssembly.instantiate(module): Non-object module: "" 
-PASS WebAssembly.instantiate(module): Non-object module: symbol "Symbol()" 
-PASS WebAssembly.instantiate(module): Non-object module: 1 
-PASS WebAssembly.instantiate(module): Non-object module: 0.1 
-PASS WebAssembly.instantiate(module): Non-object module: NaN 
-PASS WebAssembly.instantiate(module): Missing imports argument 
-PASS WebAssembly.instantiate(module): Imports argument with missing property: undefined 
-PASS WebAssembly.instantiate(module): Imports argument with missing property: empty object 
-PASS WebAssembly.instantiate(module): Imports argument with missing property: wrong property 
-PASS WebAssembly.instantiate(module): Importing an i64 global 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: undefined 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: null 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: true 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: "" 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: symbol "Symbol()" 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: 1 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: 0.1 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: NaN 
-PASS WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: object "[object Object]" 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.js
deleted file mode 100644
index 8670029..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-// META: script=/wasm/jsapi/bad-imports.js
-
-test_bad_imports((name, error, build, ...arguments) => {
-  promise_test(t => {
-    const builder = new WasmModuleBuilder();
-    build(builder);
-    const buffer = builder.toBuffer();
-    const module = new WebAssembly.Module(buffer);
-    return promise_rejects(t, error, WebAssembly.instantiate(module, ...arguments));
-  }, `WebAssembly.instantiate(module): ${name}`);
-});
-
-test_bad_imports((name, error, build, ...arguments) => {
-  promise_test(t => {
-    const builder = new WasmModuleBuilder();
-    build(builder);
-    const buffer = builder.toBuffer();
-    return promise_rejects(t, error, WebAssembly.instantiate(buffer, ...arguments));
-  }, `WebAssembly.instantiate(buffer): ${name}`);
-});
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.worker-expected.txt
deleted file mode 100644
index 5ee9e4d..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.worker-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-
-Harness Error (FAIL), message = Error in remote http://localhost:8800/wasm/jsapi/bad-imports.js: TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-PASS WebAssembly.instantiate(module): Non-object imports argument: null 
-PASS WebAssembly.instantiate(module): Non-object imports argument: true 
-PASS WebAssembly.instantiate(module): Non-object imports argument: "" 
-PASS WebAssembly.instantiate(module): Non-object imports argument: symbol "Symbol()" 
-PASS WebAssembly.instantiate(module): Non-object imports argument: 1 
-PASS WebAssembly.instantiate(module): Non-object imports argument: 0.1 
-PASS WebAssembly.instantiate(module): Non-object imports argument: NaN 
-PASS WebAssembly.instantiate(module): Non-object module: undefined 
-PASS WebAssembly.instantiate(module): Non-object module: null 
-PASS WebAssembly.instantiate(module): Non-object module: true 
-PASS WebAssembly.instantiate(module): Non-object module: "" 
-PASS WebAssembly.instantiate(module): Non-object module: symbol "Symbol()" 
-PASS WebAssembly.instantiate(module): Non-object module: 1 
-PASS WebAssembly.instantiate(module): Non-object module: 0.1 
-PASS WebAssembly.instantiate(module): Non-object module: NaN 
-PASS WebAssembly.instantiate(module): Missing imports argument 
-PASS WebAssembly.instantiate(module): Imports argument with missing property: undefined 
-TIMEOUT WebAssembly.instantiate(module): Imports argument with missing property: empty object Test timed out
-NOTRUN WebAssembly.instantiate(module): Imports argument with missing property: wrong property 
-NOTRUN WebAssembly.instantiate(module): Importing an i64 global 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: undefined 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: null 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: true 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: "" 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: symbol "Symbol()" 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: 1 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: 0.1 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: NaN 
-NOTRUN WebAssembly.instantiate(module): Importing a function with an incorrectly-typed value: object "[object Object]" 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/w3c-import.log
deleted file mode 100644
index 7197fd2..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/w3c-import.log
+++ /dev/null
@@ -1,17 +0,0 @@
-The tests in this directory were imported from the W3C repository.
-Do NOT modify these tests directly in WebKit.
-Instead, create a pull request on the WPT github:
-	https://github.com/web-platform-tests/wpt
-
-Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport
-
-Do NOT modify or remove this file.
-
-------------------------------------------------------------------------
-Properties requiring vendor prefixes:
-None
-Property values requiring vendor prefixes:
-None
-------------------------------------------------------------------------
-List of files:
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate-bad-imports.any.js
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any-expected.txt
deleted file mode 100644
index ae4d28b..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any-expected.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-
-FAIL name undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(fn, "name")')
-FAIL length undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(fn, "length")')
-PASS No arguments 
-PASS Calling 
-FAIL Order of evaluation undefined is not a constructor (evaluating 'new WebAssembly.Global')
-PASS Invalid descriptor argument 
-PASS Invalid type argument 
-FAIL i64 with default undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Default value for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Explicit value undefined for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value null for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value true for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value false for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value 2 for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value "3" for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with toString for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with valueOf for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Default value for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Explicit value undefined for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value null for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value true for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value false for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value 2 for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value "3" for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with toString for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with valueOf for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Default value for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Explicit value undefined for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value null for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value true for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value false for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value 2 for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value "3" for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with toString for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with valueOf for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.js
deleted file mode 100644
index 7a45cc4..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.js
+++ /dev/null
@@ -1,121 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/assertions.js
-
-function assert_Global(actual, expected) {
-  assert_equals(Object.getPrototypeOf(actual), WebAssembly.Global.prototype,
-                "prototype");
-  assert_true(Object.isExtensible(actual), "extensible");
-
-  assert_equals(actual.value, expected, "value");
-  assert_equals(actual.valueOf(), expected, "valueOf");
-}
-
-test(() => {
-  assert_function_name(WebAssembly.Global, "Global", "WebAssembly.Global");
-}, "name");
-
-test(() => {
-  assert_function_length(WebAssembly.Global, 1, "WebAssembly.Global");
-}, "length");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Global());
-}, "No arguments");
-
-test(() => {
-  const argument = { "value": "i32" };
-  assert_throws(new TypeError(), () => WebAssembly.Global(argument));
-}, "Calling");
-
-test(() => {
-  const order = [];
-
-  new WebAssembly.Global({
-    get value() {
-      order.push("descriptor value");
-      return {
-        toString() {
-          order.push("descriptor value toString");
-          return "f64";
-        },
-      };
-    },
-
-    get mutable() {
-      order.push("descriptor mutable");
-      return false;
-    },
-  }, {
-    valueOf() {
-      order.push("value valueOf()");
-    }
-  });
-
-  assert_array_equals(order, [
-    "descriptor mutable",
-    "descriptor value",
-    "descriptor value toString",
-    "value valueOf()",
-  ]);
-}, "Order of evaluation");
-
-test(() => {
-  const invalidArguments = [
-    undefined,
-    null,
-    false,
-    true,
-    "",
-    "test",
-    Symbol(),
-    1,
-    NaN,
-    {},
-  ];
-  for (const invalidArgument of invalidArguments) {
-    assert_throws(new TypeError(),
-                  () => new WebAssembly.Global(invalidArgument),
-                  `new Global(${format_value(invalidArgument)})`);
-  }
-}, "Invalid descriptor argument");
-
-test(() => {
-  const invalidTypes = ["i16", "i128", "f16", "f128", "u32", "u64", "i32\0"];
-  for (const value of invalidTypes) {
-    const argument = { value };
-    assert_throws(new TypeError(), () => new WebAssembly.Global(argument));
-  }
-}, "Invalid type argument");
-
-test(() => {
-  const argument = { "value": "i64" };
-  const global = new WebAssembly.Global(argument);
-  assert_throws(new TypeError(), () => global.value);
-  assert_throws(new TypeError(), () => global.valueOf());
-}, "i64 with default");
-
-for (const type of ["i32", "f32", "f64"]) {
-  test(() => {
-    const argument = { "value": type };
-    const global = new WebAssembly.Global(argument);
-    assert_Global(global, 0);
-  }, `Default value for type ${type}`);
-
-  const valueArguments = [
-    [undefined, 0],
-    [null, 0],
-    [true, 1],
-    [false, 0],
-    [2, 2],
-    ["3", 3],
-    [{ toString() { return "5" } }, 5, "object with toString"],
-    [{ valueOf() { return "8" } }, 8, "object with valueOf"],
-  ];
-  for (const [value, expected, name = format_value(value)] of valueArguments) {
-    test(() => {
-      const argument = { "value": type };
-      const global = new WebAssembly.Global(argument, value);
-      assert_Global(global, expected);
-    }, `Explicit value ${name} for type ${type}`);
-  }
-}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.worker-expected.txt
deleted file mode 100644
index ae4d28b..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.worker-expected.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-
-FAIL name undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(fn, "name")')
-FAIL length undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(fn, "length")')
-PASS No arguments 
-PASS Calling 
-FAIL Order of evaluation undefined is not a constructor (evaluating 'new WebAssembly.Global')
-PASS Invalid descriptor argument 
-PASS Invalid type argument 
-FAIL i64 with default undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Default value for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Explicit value undefined for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value null for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value true for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value false for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value 2 for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value "3" for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with toString for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with valueOf for type i32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Default value for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Explicit value undefined for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value null for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value true for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value false for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value 2 for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value "3" for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with toString for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with valueOf for type f32 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Default value for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Explicit value undefined for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value null for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value true for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value false for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value 2 for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value "3" for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with toString for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-FAIL Explicit value object with valueOf for type f64 undefined is not a constructor (evaluating 'new WebAssembly.Global(argument, value)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any-expected.txt
deleted file mode 100644
index 0e91a9b..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-FAIL Object.prototype.toString on an Global undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.js
deleted file mode 100644
index ca02557..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.js
+++ /dev/null
@@ -1,7 +0,0 @@
-// META: global=jsshell
-
-test(() => {
-  const argument = { "value": "i32" };
-  const global = new WebAssembly.Global(argument);
-  assert_class_string(global, "WebAssembly.Global");
-}, "Object.prototype.toString on an Global");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.worker-expected.txt
deleted file mode 100644
index 0e91a9b..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.worker-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-FAIL Object.prototype.toString on an Global undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any-expected.txt
deleted file mode 100644
index c6d3c41..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any-expected.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-
-FAIL Branding undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-FAIL Immutable i32 (missing) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (undefined) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (null) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (false) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (empty string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (zero) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable i32 (true) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable i32 (one) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable i32 (string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable i32 (true on prototype) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (missing) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (undefined) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (null) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (false) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (empty string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (zero) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f32 (true) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f32 (one) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f32 (string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f32 (true on prototype) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (missing) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (undefined) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (null) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (false) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (empty string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (zero) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f64 (true) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f64 (one) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f64 (string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f64 (true on prototype) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL i64 with default undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Calling setter without argument undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.js
deleted file mode 100644
index b4e6770f..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.js
+++ /dev/null
@@ -1,94 +0,0 @@
-// META: global=jsshell
-
-test(() => {
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Global,
-    WebAssembly.Global.prototype,
-  ];
-
-  const desc = Object.getOwnPropertyDescriptor(WebAssembly.Global.prototype, "value");
-  assert_equals(typeof desc, "object");
-
-  const getter = desc.get;
-  assert_equals(typeof getter, "function");
-
-  const setter = desc.set;
-  assert_equals(typeof setter, "function");
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => getter.call(thisValue), `getter with this=${format_value(thisValue)}`);
-    assert_throws(new TypeError(), () => setter.call(thisValue, 1), `setter with this=${format_value(thisValue)}`);
-  }
-}, "Branding");
-
-for (const type of ["i32", "f32", "f64"]) {
-  const immutableOptions = [
-    [{}, "missing"],
-    [{ "mutable": undefined }, "undefined"],
-    [{ "mutable": null }, "null"],
-    [{ "mutable": false }, "false"],
-    [{ "mutable": "" }, "empty string"],
-    [{ "mutable": 0 }, "zero"],
-  ];
-  for (const [opts, name] of immutableOptions) {
-    test(() => {
-      opts.value = type;
-      const global = new WebAssembly.Global(opts);
-      assert_equals(global.value, 0, "initial value");
-      assert_equals(global.valueOf(), 0, "initial valueOf");
-
-      assert_throws(new TypeError(), () => global.value = 1);
-
-      assert_equals(global.value, 0, "post-set value");
-      assert_equals(global.valueOf(), 0, "post-set valueOf");
-    }, `Immutable ${type} (${name})`);
-  }
-
-  const mutableOptions = [
-    [{ "mutable": true }, "true"],
-    [{ "mutable": 1 }, "one"],
-    [{ "mutable": "x" }, "string"],
-    [Object.create({ "mutable": true }), "true on prototype"],
-  ];
-  for (const [opts, name] of mutableOptions) {
-    test(() => {
-      opts.value = type;
-      const global = new WebAssembly.Global(opts);
-      assert_equals(global.value, 0, "initial value");
-      assert_equals(global.valueOf(), 0, "initial valueOf");
-
-      global.value = 1;
-
-      assert_equals(global.value, 1, "post-set value");
-      assert_equals(global.valueOf(), 1, "post-set valueOf");
-    }, `Mutable ${type} (${name})`);
-  }
-}
-
-test(() => {
-  const argument = { "value": "i64", "mutable": true };
-  const global = new WebAssembly.Global(argument);
-  assert_throws(new TypeError(), () => global.value);
-  assert_throws(new TypeError(), () => global.value = 0);
-  assert_throws(new TypeError(), () => global.valueOf());
-}, "i64 with default");
-
-
-test(() => {
-  const argument = { "value": "i32", "mutable": true };
-  const global = new WebAssembly.Global(argument);
-  const desc = Object.getOwnPropertyDescriptor(WebAssembly.Global.prototype, "value");
-  assert_equals(typeof desc, "object");
-
-  const setter = desc.set;
-  assert_equals(typeof setter, "function");
-
-  assert_throws(new TypeError(), () => setter.call(global));
-}, "Calling setter without argument");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.worker-expected.txt
deleted file mode 100644
index c6d3c41..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.worker-expected.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-
-FAIL Branding undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-FAIL Immutable i32 (missing) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (undefined) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (null) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (false) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (empty string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable i32 (zero) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable i32 (true) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable i32 (one) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable i32 (string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable i32 (true on prototype) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (missing) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (undefined) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (null) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (false) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (empty string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f32 (zero) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f32 (true) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f32 (one) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f32 (string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f32 (true on prototype) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (missing) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (undefined) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (null) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (false) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (empty string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Immutable f64 (zero) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f64 (true) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f64 (one) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f64 (string) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL Mutable f64 (true on prototype) undefined is not a constructor (evaluating 'new WebAssembly.Global(opts)')
-FAIL i64 with default undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-FAIL Calling setter without argument undefined is not a constructor (evaluating 'new WebAssembly.Global(argument)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any-expected.txt
deleted file mode 100644
index 27d5640..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-FAIL Branding undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.js
deleted file mode 100644
index 176c5a7..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// META: global=jsshell
-
-test(() => {
-  const argument = { "value": "i32" };
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Global,
-    WebAssembly.Global.prototype,
-  ];
-
-  const fn = WebAssembly.Global.prototype.valueOf;
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => fn.call(thisValue), `this=${format_value(thisValue)}`);
-  }
-}, "Branding");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.worker-expected.txt
deleted file mode 100644
index 27d5640..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.worker-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-FAIL Branding undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/w3c-import.log
deleted file mode 100644
index ab1f3ef..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/w3c-import.log
+++ /dev/null
@@ -1,20 +0,0 @@
-The tests in this directory were imported from the W3C repository.
-Do NOT modify these tests directly in WebKit.
-Instead, create a pull request on the WPT github:
-	https://github.com/web-platform-tests/wpt
-
-Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport
-
-Do NOT modify or remove this file.
-
-------------------------------------------------------------------------
-Properties requiring vendor prefixes:
-None
-Property values requiring vendor prefixes:
-None
-------------------------------------------------------------------------
-List of files:
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/constructor.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/toString.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/value-set.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/global/valueOf.any.js
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any-expected.txt
deleted file mode 100644
index a01fb3d..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any-expected.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-CONSOLE MESSAGE: line 68: TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-Harness Error (FAIL), message = TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-PASS new WebAssembly.Instance(module): Non-object imports argument: null 
-PASS new WebAssembly.Instance(module): Non-object imports argument: true 
-PASS new WebAssembly.Instance(module): Non-object imports argument: "" 
-PASS new WebAssembly.Instance(module): Non-object imports argument: symbol "Symbol()" 
-PASS new WebAssembly.Instance(module): Non-object imports argument: 1 
-PASS new WebAssembly.Instance(module): Non-object imports argument: 0.1 
-PASS new WebAssembly.Instance(module): Non-object imports argument: NaN 
-PASS new WebAssembly.Instance(module): Non-object module: undefined 
-PASS new WebAssembly.Instance(module): Non-object module: null 
-PASS new WebAssembly.Instance(module): Non-object module: true 
-PASS new WebAssembly.Instance(module): Non-object module: "" 
-PASS new WebAssembly.Instance(module): Non-object module: symbol "Symbol()" 
-PASS new WebAssembly.Instance(module): Non-object module: 1 
-PASS new WebAssembly.Instance(module): Non-object module: 0.1 
-PASS new WebAssembly.Instance(module): Non-object module: NaN 
-PASS new WebAssembly.Instance(module): Missing imports argument 
-PASS new WebAssembly.Instance(module): Imports argument with missing property: undefined 
-PASS new WebAssembly.Instance(module): Imports argument with missing property: empty object 
-PASS new WebAssembly.Instance(module): Imports argument with missing property: wrong property 
-PASS new WebAssembly.Instance(module): Importing an i64 global 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: undefined 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: null 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: true 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: "" 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: symbol "Symbol()" 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: 1 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: 0.1 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: NaN 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: object "[object Object]" 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.js
deleted file mode 100644
index 24c51c1..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-// META: script=/wasm/jsapi/bad-imports.js
-
-test_bad_imports((name, error, build, ...arguments) => {
-  test(() => {
-    const builder = new WasmModuleBuilder();
-    build(builder);
-    const buffer = builder.toBuffer();
-    const module = new WebAssembly.Module(buffer);
-    assert_throws(error, () => new WebAssembly.Instance(module, ...arguments));
-  }, `new WebAssembly.Instance(module): ${name}`);
-});
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.worker-expected.txt
deleted file mode 100644
index a09da4e..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.worker-expected.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
-CONSOLE MESSAGE: line 68: TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-Harness Error (FAIL), message = TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-PASS new WebAssembly.Instance(module): Non-object imports argument: null 
-PASS new WebAssembly.Instance(module): Non-object imports argument: true 
-PASS new WebAssembly.Instance(module): Non-object imports argument: "" 
-PASS new WebAssembly.Instance(module): Non-object imports argument: symbol "Symbol()" 
-PASS new WebAssembly.Instance(module): Non-object imports argument: 1 
-PASS new WebAssembly.Instance(module): Non-object imports argument: 0.1 
-PASS new WebAssembly.Instance(module): Non-object imports argument: NaN 
-PASS new WebAssembly.Instance(module): Non-object module: undefined 
-PASS new WebAssembly.Instance(module): Non-object module: null 
-PASS new WebAssembly.Instance(module): Non-object module: true 
-PASS new WebAssembly.Instance(module): Non-object module: "" 
-PASS new WebAssembly.Instance(module): Non-object module: symbol "Symbol()" 
-PASS new WebAssembly.Instance(module): Non-object module: 1 
-PASS new WebAssembly.Instance(module): Non-object module: 0.1 
-PASS new WebAssembly.Instance(module): Non-object module: NaN 
-PASS new WebAssembly.Instance(module): Missing imports argument 
-PASS new WebAssembly.Instance(module): Imports argument with missing property: undefined 
-PASS new WebAssembly.Instance(module): Imports argument with missing property: empty object 
-PASS new WebAssembly.Instance(module): Imports argument with missing property: wrong property 
-PASS new WebAssembly.Instance(module): Importing an i64 global 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: undefined 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: null 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: true 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: "" 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: symbol "Symbol()" 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: 1 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: 0.1 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: NaN 
-PASS new WebAssembly.Instance(module): Importing a function with an incorrectly-typed value: object "[object Object]" 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any-expected.txt
deleted file mode 100644
index bb97fc8..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any-expected.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-
-PASS name 
-PASS length 
-PASS No arguments 
-PASS Non-Module arguments 
-PASS Non-object imports 
-PASS Calling 
-PASS Empty module 
-PASS getter order for imports object 
-PASS imports 
-FAIL exports WebAssembly.Module doesn't parse at byte 87: 3th Export isn't immutable, named 'global' (evaluating 'new WebAssembly.Module(buffer)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.js
deleted file mode 100644
index 61a8f53..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.js
+++ /dev/null
@@ -1,227 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-// META: script=/wasm/jsapi/assertions.js
-
-function assert_exported_function(fn, { name, length }, description) {
-  assert_equals(Object.getPrototypeOf(fn), Function.prototype,
-                `${description}: prototype`);
-
-  assert_function_name(fn, name, description);
-  assert_function_length(fn, length, description);
-}
-
-function assert_Instance(instance, expected_exports) {
-  assert_equals(Object.getPrototypeOf(instance), WebAssembly.Instance.prototype,
-                "prototype");
-  assert_true(Object.isExtensible(instance), "extensible");
-
-  assert_equals(instance.exports, instance.exports, "exports should be idempotent");
-  const exports = instance.exports;
-
-  assert_equals(Object.getPrototypeOf(exports), null, "exports prototype");
-  assert_false(Object.isExtensible(exports), "extensible exports");
-  for (const [key, expected] of Object.entries(expected_exports)) {
-    const property = Object.getOwnPropertyDescriptor(exports, key);
-    assert_equals(typeof property, "object", `${key} should be present`);
-    assert_false(property.writable, `${key}: writable`);
-    assert_true(property.enumerable, `${key}: enumerable`);
-    assert_false(property.configurable, `${key}: configurable`);
-    const actual = property.value;
-    assert_true(Object.isExtensible(actual), `${key}: extensible`);
-
-    switch (expected.kind) {
-    case "function":
-      assert_exported_function(actual, expected, `value of ${key}`);
-      break;
-    case "global":
-      assert_equals(Object.getPrototypeOf(actual), WebAssembly.Global.prototype,
-                    `value of ${key}: prototype`);
-      assert_equals(actual.value, expected.value, `value of ${key}: value`);
-      assert_equals(actual.valueOf(), expected.value, `value of ${key}: valueOf()`);
-      break;
-    case "memory":
-      assert_equals(Object.getPrototypeOf(actual), WebAssembly.Memory.prototype,
-                    `value of ${key}: prototype`);
-      assert_equals(Object.getPrototypeOf(actual.buffer), ArrayBuffer.prototype,
-                    `value of ${key}: prototype of buffer`);
-      assert_equals(actual.buffer.byteLength, 0x10000 * expected.size, `value of ${key}: size of buffer`);
-      const array = new Uint8Array(actual.buffer);
-      assert_equals(array[0], 0, `value of ${key}: first element of buffer`);
-      assert_equals(array[array.byteLength - 1], 0, `value of ${key}: last element of buffer`);
-      break;
-    case "table":
-      assert_equals(Object.getPrototypeOf(actual), WebAssembly.Table.prototype,
-                    `value of ${key}: prototype`);
-      assert_equals(actual.length, expected.length, `value of ${key}: length of table`);
-      break;
-    }
-  }
-}
-
-let emptyModuleBinary;
-setup(() => {
-  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
-});
-
-test(() => {
-  assert_function_name(WebAssembly.Instance, "Instance", "WebAssembly.Instance");
-}, "name");
-
-test(() => {
-  assert_function_length(WebAssembly.Instance, 1, "WebAssembly.Instance");
-}, "length");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Instance());
-}, "No arguments");
-
-test(() => {
-  const invalidArguments = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Module,
-    WebAssembly.Module.prototype,
-  ];
-  for (const argument of invalidArguments) {
-    assert_throws(new TypeError(), () => new WebAssembly.Instance(argument),
-                  `new Instance(${format_value(argument)})`);
-  }
-}, "Non-Module arguments");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const invalidArguments = [
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-  ];
-  for (const argument of invalidArguments) {
-    assert_throws(new TypeError(), () => new WebAssembly.Instance(module, argument),
-                  `new Instance(module, ${format_value(argument)})`);
-  }
-}, "Non-object imports");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_throws(new TypeError(), () => WebAssembly.Instance(module));
-}, "Calling");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const arguments = [
-    [],
-    [undefined],
-    [{}],
-  ];
-  for (const value of arguments) {
-    const instance = new WebAssembly.Instance(module, ...arguments);
-    assert_Instance(instance, {});
-  }
-}, "Empty module");
-
-test(() => {
-  const builder = new WasmModuleBuilder();
-  builder.addImportedGlobal("module", "global1", kWasmI32);
-  builder.addImportedGlobal("module", "global2", kWasmI32);
-  const buffer = builder.toBuffer();
-  const module = new WebAssembly.Module(buffer);
-  const order = [];
-  const imports = {
-    get module() {
-      order.push("module getter");
-      return {
-        get global1() {
-          order.push("global1 getter");
-          return 0;
-        },
-        get global2() {
-          order.push("global2 getter");
-          return 0;
-        },
-      }
-    },
-  };
-  new WebAssembly.Instance(module, imports);
-  const expected = [
-    "module getter",
-    "global1 getter",
-    "module getter",
-    "global2 getter",
-  ];
-  assert_array_equals(order, expected);
-}, "getter order for imports object");
-
-test(() => {
-  const builder = new WasmModuleBuilder();
-
-  builder.addImport("module", "fn", kSig_v_v);
-  builder.addImportedGlobal("module", "global", kWasmI32);
-  builder.addImportedMemory("module", "memory", 0, 128);
-  builder.addImportedTable("module", "table", 0, 128);
-
-  const buffer = builder.toBuffer();
-  const module = new WebAssembly.Module(buffer);
-  const instance = new WebAssembly.Instance(module, {
-    "module": {
-      "fn": function() {},
-      "global": 0,
-      "memory": new WebAssembly.Memory({ "initial": 64, maximum: 128 }),
-      "table": new WebAssembly.Table({ "element": "anyfunc", "initial": 64, maximum: 128 }),
-    },
-    get "module2"() {
-      assert_unreached("Should not get modules that are not imported");
-    },
-  });
-  assert_Instance(instance, {});
-}, "imports");
-
-test(() => {
-  const builder = new WasmModuleBuilder();
-
-  builder
-    .addFunction("fn", kSig_v_d)
-    .addBody([
-        kExprEnd
-    ])
-    .exportFunc();
-  builder
-    .addFunction("fn2", kSig_v_v)
-    .addBody([
-        kExprEnd
-    ])
-    .exportFunc();
-
-  builder.setFunctionTableLength(1);
-  builder.addExportOfKind("table", kExternalTable, 0);
-
-  builder.addGlobal(kWasmI32, true)
-    .exportAs("global")
-    .init = 7;
-  builder.addGlobal(kWasmF64, true)
-    .exportAs("global2")
-    .init = 1.2;
-
-  builder.addMemory(4, 8, true);
-
-  const buffer = builder.toBuffer()
-  const module = new WebAssembly.Module(buffer);
-
-  const instance = new WebAssembly.Instance(module, {});
-  const expected = {
-    "fn": { "kind": "function", "name": "0", "length": 1 },
-    "fn2": { "kind": "function", "name": "1", "length": 0 },
-    "table": { "kind": "table", "length": 1 },
-    "global": { "kind": "global", "value": 7 },
-    "global2": { "kind": "global", "value": 1.2 },
-    "memory": { "kind": "memory", "size": 4 },
-  };
-  assert_Instance(instance, expected);
-}, "exports");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.worker-expected.txt
deleted file mode 100644
index bb97fc8..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.worker-expected.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-
-PASS name 
-PASS length 
-PASS No arguments 
-PASS Non-Module arguments 
-PASS Non-object imports 
-PASS Calling 
-PASS Empty module 
-PASS getter order for imports object 
-PASS imports 
-FAIL exports WebAssembly.Module doesn't parse at byte 87: 3th Export isn't immutable, named 'global' (evaluating 'new WebAssembly.Module(buffer)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any-expected.txt
deleted file mode 100644
index 670f281..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-
-PASS Branding 
-PASS Setting (sloppy mode) 
-PASS Setting (strict mode) 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.js
deleted file mode 100644
index 3142391..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-
-let emptyModuleBinary;
-setup(() => {
-  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
-});
-
-test(() => {
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Instance,
-    WebAssembly.Instance.prototype,
-  ];
-
-  const desc = Object.getOwnPropertyDescriptor(WebAssembly.Instance.prototype, "exports");
-  assert_equals(typeof desc, "object");
-
-  const getter = desc.get;
-  assert_equals(typeof getter, "function");
-
-  assert_equals(typeof desc.set, "undefined");
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => getter.call(thisValue), `this=${format_value(thisValue)}`);
-  }
-}, "Branding");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const instance = new WebAssembly.Instance(module);
-  const exports = instance.exports;
-  instance.exports = {};
-  assert_equals(instance.exports, exports, "Should not change the exports");
-}, "Setting (sloppy mode)");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const instance = new WebAssembly.Instance(module);
-  const exports = instance.exports;
-  assert_throws(new TypeError(), () => {
-    "use strict";
-    instance.exports = {};
-  });
-  assert_equals(instance.exports, exports, "Should not change the exports");
-}, "Setting (strict mode)");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.worker-expected.txt
deleted file mode 100644
index 670f281..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.worker-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-
-PASS Branding 
-PASS Setting (sloppy mode) 
-PASS Setting (strict mode) 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any-expected.txt
deleted file mode 100644
index 73038a9..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-PASS Object.prototype.toString on an Instance 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.js
deleted file mode 100644
index 08dcb14..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.js
+++ /dev/null
@@ -1,10 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-
-test(() => {
-  const emptyModuleBinary = new WasmModuleBuilder().toBuffer();
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const instance = new WebAssembly.Instance(module);
-  assert_class_string(instance, "WebAssembly.Instance");
-}, "Object.prototype.toString on an Instance");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.worker-expected.txt
deleted file mode 100644
index 73038a9..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.worker-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-PASS Object.prototype.toString on an Instance 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/w3c-import.log
deleted file mode 100644
index e689698..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/w3c-import.log
+++ /dev/null
@@ -1,20 +0,0 @@
-The tests in this directory were imported from the W3C repository.
-Do NOT modify these tests directly in WebKit.
-Instead, create a pull request on the WPT github:
-	https://github.com/web-platform-tests/wpt
-
-Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport
-
-Do NOT modify or remove this file.
-
-------------------------------------------------------------------------
-Properties requiring vendor prefixes:
-None
-Property values requiring vendor prefixes:
-None
-------------------------------------------------------------------------
-List of files:
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor-bad-imports.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/constructor.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/exports.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/instance/toString.any.js
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any-expected.txt
deleted file mode 100644
index a2a92dd..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any-expected.txt
+++ /dev/null
@@ -1,85 +0,0 @@
-CONSOLE MESSAGE: line 154: TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-Harness Error (FAIL), message = TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-PASS WebAssembly: property descriptor 
-PASS WebAssembly: calling 
-PASS WebAssembly: constructing 
-PASS WebAssembly.Module: property descriptor 
-PASS WebAssembly.Module: prototype 
-PASS WebAssembly.Module: prototype.constructor 
-PASS WebAssembly.Instance: property descriptor 
-PASS WebAssembly.Instance: prototype 
-PASS WebAssembly.Instance: prototype.constructor 
-PASS WebAssembly.Memory: property descriptor 
-PASS WebAssembly.Memory: prototype 
-PASS WebAssembly.Memory: prototype.constructor 
-PASS WebAssembly.Table: property descriptor 
-PASS WebAssembly.Table: prototype 
-PASS WebAssembly.Table: prototype.constructor 
-FAIL WebAssembly.Global: property descriptor assert_equals: expected "object" but got "undefined"
-FAIL WebAssembly.Global: prototype undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(interface_object, "prototype")')
-FAIL WebAssembly.Global: prototype.constructor undefined is not an object (evaluating 'interface_object.prototype')
-PASS WebAssembly.CompileError: property descriptor 
-PASS WebAssembly.CompileError: prototype 
-PASS WebAssembly.CompileError: prototype.constructor 
-PASS WebAssembly.LinkError: property descriptor 
-PASS WebAssembly.LinkError: prototype 
-PASS WebAssembly.LinkError: prototype.constructor 
-PASS WebAssembly.RuntimeError: property descriptor 
-PASS WebAssembly.RuntimeError: prototype 
-PASS WebAssembly.RuntimeError: prototype.constructor 
-PASS WebAssembly.validate 
-PASS WebAssembly.validate: name 
-PASS WebAssembly.validate: length 
-PASS WebAssembly.compile 
-PASS WebAssembly.compile: name 
-PASS WebAssembly.compile: length 
-PASS WebAssembly.instantiate 
-PASS WebAssembly.instantiate: name 
-PASS WebAssembly.instantiate: length 
-FAIL WebAssembly.Module.exports assert_equals: expected (undefined) undefined but got (function) function "function exports() {
-    [native code]
-}"
-PASS WebAssembly.Module.exports: name 
-PASS WebAssembly.Module.exports: length 
-FAIL WebAssembly.Module.imports assert_equals: expected (undefined) undefined but got (function) function "function imports() {
-    [native code]
-}"
-PASS WebAssembly.Module.imports: name 
-PASS WebAssembly.Module.imports: length 
-FAIL WebAssembly.Module.customSections assert_equals: expected (undefined) undefined but got (function) function "function customSections() {
-    [native code]
-}"
-PASS WebAssembly.Module.customSections: name 
-PASS WebAssembly.Module.customSections: length 
-PASS WebAssembly.Instance.exports 
-PASS WebAssembly.Instance.exports: getter 
-PASS WebAssembly.Instance.exports: setter 
-FAIL WebAssembly.Memory.grow assert_equals: expected (undefined) undefined but got (function) function "function grow() {
-    [native code]
-}"
-PASS WebAssembly.Memory.grow: name 
-PASS WebAssembly.Memory.grow: length 
-PASS WebAssembly.Memory.buffer 
-PASS WebAssembly.Memory.buffer: getter 
-PASS WebAssembly.Memory.buffer: setter 
-FAIL WebAssembly.Table.grow assert_equals: expected (undefined) undefined but got (function) function "function grow() {
-    [native code]
-}"
-PASS WebAssembly.Table.grow: name 
-PASS WebAssembly.Table.grow: length 
-FAIL WebAssembly.Table.get assert_equals: expected (undefined) undefined but got (function) function "function get() {
-    [native code]
-}"
-PASS WebAssembly.Table.get: name 
-PASS WebAssembly.Table.get: length 
-FAIL WebAssembly.Table.set assert_equals: expected (undefined) undefined but got (function) function "function set() {
-    [native code]
-}"
-PASS WebAssembly.Table.set: name 
-PASS WebAssembly.Table.set: length 
-PASS WebAssembly.Table.length 
-PASS WebAssembly.Table.length: getter 
-PASS WebAssembly.Table.length: setter 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.js
deleted file mode 100644
index 5d76ac5..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.js
+++ /dev/null
@@ -1,160 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/assertions.js
-
-function test_operations(object, object_name, operations) {
-  for (const [name, length] of operations) {
-    test(() => {
-      const propdesc = Object.getOwnPropertyDescriptor(object, name);
-      assert_equals(typeof propdesc, "object");
-      assert_true(propdesc.writable, "writable");
-      assert_true(propdesc.enumerable, "enumerable");
-      assert_true(propdesc.configurable, "configurable");
-      assert_equals(propdesc.value, WebAssembly[name]);
-    }, `${object_name}.${name}`);
-
-    test(() => {
-      assert_function_name(object[name], name, `${object_name}.${name}`);
-    }, `${object_name}.${name}: name`);
-
-    test(() => {
-      assert_function_length(object[name], length, `${object_name}.${name}`);
-    }, `${object_name}.${name}: length`);
-  }
-}
-
-function test_attributes(object, object_name, attributes) {
-  for (const [name, mutable] of attributes) {
-    test(() => {
-      const propdesc = Object.getOwnPropertyDescriptor(object, name);
-      assert_equals(typeof propdesc, "object");
-      assert_true(propdesc.enumerable, "enumerable");
-      assert_true(propdesc.configurable, "configurable");
-    }, `${object_name}.${name}`);
-
-    test(() => {
-      const propdesc = Object.getOwnPropertyDescriptor(object, name);
-      assert_equals(typeof propdesc, "object");
-      assert_equals(typeof propdesc.get, "function");
-      assert_function_name(propdesc.get, "get " + name, `getter for "${name}"`);
-      assert_function_length(propdesc.get, 0, `getter for "${name}"`);
-    }, `${object_name}.${name}: getter`);
-
-    test(() => {
-      const propdesc = Object.getOwnPropertyDescriptor(object, name);
-      assert_equals(typeof propdesc, "object");
-      if (mutable) {
-        assert_equals(typeof propdesc.set, "function");
-        assert_function_name(propdesc.set, "set " + name, `setter for "${name}"`);
-        assert_function_length(propdesc.set, 1, `setter for "${name}"`);
-      } else {
-        assert_equals(typeof propdesc.set, "undefined");
-      }
-    }, `${object_name}.${name}: setter`);
-  }
-}
-
-test(() => {
-  const propdesc = Object.getOwnPropertyDescriptor(this, "WebAssembly");
-  assert_equals(typeof propdesc, "object");
-  assert_true(propdesc.writable, "writable");
-  assert_false(propdesc.enumerable, "enumerable");
-  assert_true(propdesc.configurable, "configurable");
-  assert_equals(propdesc.value, this.WebAssembly);
-}, "WebAssembly: property descriptor");
-
-test(() => {
-  assert_throws(new TypeError(), () => WebAssembly());
-}, "WebAssembly: calling");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly());
-}, "WebAssembly: constructing");
-
-const interfaces = [
-  "Module",
-  "Instance",
-  "Memory",
-  "Table",
-  "Global",
-  "CompileError",
-  "LinkError",
-  "RuntimeError",
-];
-
-for (const name of interfaces) {
-  test(() => {
-    const propdesc = Object.getOwnPropertyDescriptor(WebAssembly, name);
-    assert_equals(typeof propdesc, "object");
-    assert_true(propdesc.writable, "writable");
-    assert_false(propdesc.enumerable, "enumerable");
-    assert_true(propdesc.configurable, "configurable");
-    assert_equals(propdesc.value, WebAssembly[name]);
-  }, `WebAssembly.${name}: property descriptor`);
-
-  test(() => {
-    const interface_object = WebAssembly[name];
-    const propdesc = Object.getOwnPropertyDescriptor(interface_object, "prototype");
-    assert_equals(typeof propdesc, "object");
-    assert_false(propdesc.writable, "writable");
-    assert_false(propdesc.enumerable, "enumerable");
-    assert_false(propdesc.configurable, "configurable");
-  }, `WebAssembly.${name}: prototype`);
-
-  test(() => {
-    const interface_object = WebAssembly[name];
-    const interface_prototype_object = interface_object.prototype;
-    const propdesc = Object.getOwnPropertyDescriptor(interface_prototype_object, "constructor");
-    assert_equals(typeof propdesc, "object");
-    assert_true(propdesc.writable, "writable");
-    assert_false(propdesc.enumerable, "enumerable");
-    assert_true(propdesc.configurable, "configurable");
-    assert_equals(propdesc.value, interface_object);
-  }, `WebAssembly.${name}: prototype.constructor`);
-}
-
-test_operations(WebAssembly, "WebAssembly", [
-  ["validate", 1],
-  ["compile", 1],
-  ["instantiate", 1],
-]);
-
-
-test_operations(WebAssembly.Module, "WebAssembly.Module", [
-  ["exports", 1],
-  ["imports", 1],
-  ["customSections", 2],
-]);
-
-
-test_attributes(WebAssembly.Instance.prototype, "WebAssembly.Instance", [
-  ["exports", false],
-]);
-
-
-test_operations(WebAssembly.Memory.prototype, "WebAssembly.Memory", [
-  ["grow", 1],
-]);
-
-test_attributes(WebAssembly.Memory.prototype, "WebAssembly.Memory", [
-  ["buffer", false],
-]);
-
-
-test_operations(WebAssembly.Table.prototype, "WebAssembly.Table", [
-  ["grow", 1],
-  ["get", 1],
-  ["set", 2],
-]);
-
-test_attributes(WebAssembly.Table.prototype, "WebAssembly.Table", [
-  ["length", false],
-]);
-
-
-test_operations(WebAssembly.Global.prototype, "WebAssembly.Global", [
-  ["valueOf", 0],
-]);
-
-test_attributes(WebAssembly.Global.prototype, "WebAssembly.Global", [
-  ["value", true],
-]);
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.worker-expected.txt
deleted file mode 100644
index 9be5ab6..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.worker-expected.txt
+++ /dev/null
@@ -1,86 +0,0 @@
-CONSOLE MESSAGE: line 1774: TypeError: null is not an object (evaluating 'this.message_target.removeEventListener')
-CONSOLE MESSAGE: line 154: TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-Harness Error (FAIL), message = TypeError: undefined is not an object (evaluating 'WebAssembly.Global.prototype')
-
-PASS WebAssembly: property descriptor 
-PASS WebAssembly: calling 
-PASS WebAssembly: constructing 
-PASS WebAssembly.Module: property descriptor 
-PASS WebAssembly.Module: prototype 
-PASS WebAssembly.Module: prototype.constructor 
-PASS WebAssembly.Instance: property descriptor 
-PASS WebAssembly.Instance: prototype 
-PASS WebAssembly.Instance: prototype.constructor 
-PASS WebAssembly.Memory: property descriptor 
-PASS WebAssembly.Memory: prototype 
-PASS WebAssembly.Memory: prototype.constructor 
-PASS WebAssembly.Table: property descriptor 
-PASS WebAssembly.Table: prototype 
-PASS WebAssembly.Table: prototype.constructor 
-FAIL WebAssembly.Global: property descriptor assert_equals: expected "object" but got "undefined"
-FAIL WebAssembly.Global: prototype undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(interface_object, "prototype")')
-FAIL WebAssembly.Global: prototype.constructor undefined is not an object (evaluating 'interface_object.prototype')
-PASS WebAssembly.CompileError: property descriptor 
-PASS WebAssembly.CompileError: prototype 
-PASS WebAssembly.CompileError: prototype.constructor 
-PASS WebAssembly.LinkError: property descriptor 
-PASS WebAssembly.LinkError: prototype 
-PASS WebAssembly.LinkError: prototype.constructor 
-PASS WebAssembly.RuntimeError: property descriptor 
-PASS WebAssembly.RuntimeError: prototype 
-PASS WebAssembly.RuntimeError: prototype.constructor 
-PASS WebAssembly.validate 
-PASS WebAssembly.validate: name 
-PASS WebAssembly.validate: length 
-PASS WebAssembly.compile 
-PASS WebAssembly.compile: name 
-PASS WebAssembly.compile: length 
-PASS WebAssembly.instantiate 
-PASS WebAssembly.instantiate: name 
-PASS WebAssembly.instantiate: length 
-FAIL WebAssembly.Module.exports assert_equals: expected (undefined) undefined but got (function) function "function exports() {
-    [native code]
-}"
-PASS WebAssembly.Module.exports: name 
-PASS WebAssembly.Module.exports: length 
-FAIL WebAssembly.Module.imports assert_equals: expected (undefined) undefined but got (function) function "function imports() {
-    [native code]
-}"
-PASS WebAssembly.Module.imports: name 
-PASS WebAssembly.Module.imports: length 
-FAIL WebAssembly.Module.customSections assert_equals: expected (undefined) undefined but got (function) function "function customSections() {
-    [native code]
-}"
-PASS WebAssembly.Module.customSections: name 
-PASS WebAssembly.Module.customSections: length 
-PASS WebAssembly.Instance.exports 
-PASS WebAssembly.Instance.exports: getter 
-PASS WebAssembly.Instance.exports: setter 
-FAIL WebAssembly.Memory.grow assert_equals: expected (undefined) undefined but got (function) function "function grow() {
-    [native code]
-}"
-PASS WebAssembly.Memory.grow: name 
-PASS WebAssembly.Memory.grow: length 
-PASS WebAssembly.Memory.buffer 
-PASS WebAssembly.Memory.buffer: getter 
-PASS WebAssembly.Memory.buffer: setter 
-FAIL WebAssembly.Table.grow assert_equals: expected (undefined) undefined but got (function) function "function grow() {
-    [native code]
-}"
-PASS WebAssembly.Table.grow: name 
-PASS WebAssembly.Table.grow: length 
-FAIL WebAssembly.Table.get assert_equals: expected (undefined) undefined but got (function) function "function get() {
-    [native code]
-}"
-PASS WebAssembly.Table.get: name 
-PASS WebAssembly.Table.get: length 
-FAIL WebAssembly.Table.set assert_equals: expected (undefined) undefined but got (function) function "function set() {
-    [native code]
-}"
-PASS WebAssembly.Table.set: name 
-PASS WebAssembly.Table.set: length 
-PASS WebAssembly.Table.length 
-PASS WebAssembly.Table.length: getter 
-PASS WebAssembly.Table.length: setter 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any-expected.txt
deleted file mode 100644
index 670f281..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-
-PASS Branding 
-PASS Setting (sloppy mode) 
-PASS Setting (strict mode) 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.js
deleted file mode 100644
index b04460b..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// META: global=jsshell
-
-test(() => {
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Memory,
-    WebAssembly.Memory.prototype,
-  ];
-
-  const desc = Object.getOwnPropertyDescriptor(WebAssembly.Memory.prototype, "buffer");
-  assert_equals(typeof desc, "object");
-
-  const getter = desc.get;
-  assert_equals(typeof getter, "function");
-
-  assert_equals(typeof desc.set, "undefined");
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => getter.call(thisValue), `this=${format_value(thisValue)}`);
-  }
-}, "Branding");
-
-test(() => {
-  const argument = { "initial": 0 };
-  const memory = new WebAssembly.Memory(argument);
-  const memory2 = new WebAssembly.Memory(argument);
-  const buffer = memory.buffer;
-  assert_not_equals(buffer, memory2.buffer, "Need two distinct buffers");
-  memory.buffer = memory2.buffer;
-  assert_equals(memory.buffer, buffer, "Should not change the buffer");
-}, "Setting (sloppy mode)");
-
-test(() => {
-  const argument = { "initial": 0 };
-  const memory = new WebAssembly.Memory(argument);
-  const memory2 = new WebAssembly.Memory(argument);
-  const buffer = memory.buffer;
-  assert_not_equals(buffer, memory2.buffer, "Need two distinct buffers");
-  assert_throws(new TypeError(), () => {
-    "use strict";
-    memory.buffer = memory2.buffer;
-  });
-  assert_equals(memory.buffer, buffer, "Should not change the buffer");
-}, "Setting (strict mode)");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.worker-expected.txt
deleted file mode 100644
index 670f281..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.worker-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-
-PASS Branding 
-PASS Setting (sloppy mode) 
-PASS Setting (strict mode) 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any-expected.txt
deleted file mode 100644
index 074a2e6..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any-expected.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-
-PASS name 
-PASS length 
-PASS No arguments 
-PASS Calling 
-PASS Invalid descriptor argument 
-PASS Undefined initial value in descriptor 
-PASS Out-of-range initial value in descriptor: NaN 
-PASS Out-of-range maximum value in descriptor: NaN 
-PASS Out-of-range initial value in descriptor: Infinity 
-PASS Out-of-range maximum value in descriptor: Infinity 
-PASS Out-of-range initial value in descriptor: -Infinity 
-PASS Out-of-range maximum value in descriptor: -Infinity 
-PASS Out-of-range initial value in descriptor: -1 
-PASS Out-of-range maximum value in descriptor: -1 
-PASS Out-of-range initial value in descriptor: 4294967296 
-PASS Out-of-range maximum value in descriptor: 4294967296 
-PASS Out-of-range initial value in descriptor: 68719476736 
-PASS Out-of-range maximum value in descriptor: 68719476736 
-PASS Proxy descriptor 
-PASS Order of evaluation for descriptor 
-PASS Zero initial 
-PASS Non-zero initial 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.js
deleted file mode 100644
index f9907ca..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.js
+++ /dev/null
@@ -1,137 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/assertions.js
-
-function assert_Memory(memory, expected) {
-  assert_equals(Object.getPrototypeOf(memory), WebAssembly.Memory.prototype,
-                "prototype");
-  assert_true(Object.isExtensible(memory), "extensible");
-
-  // https://github.com/WebAssembly/spec/issues/840
-  assert_equals(memory.buffer, memory.buffer, "buffer should be idempotent");
-  assert_equals(Object.getPrototypeOf(memory.buffer), ArrayBuffer.prototype,
-                "prototype of buffer");
-  assert_true(Object.isExtensible(memory.buffer), "buffer extensibility");
-  assert_equals(memory.buffer.byteLength, 0x10000 * expected.size, "size of buffer");
-  if (expected.size > 0) {
-    const array = new Uint8Array(memory.buffer);
-    assert_equals(array[0], 0, "first element of buffer");
-    assert_equals(array[array.byteLength - 1], 0, "last element of buffer");
-  }
-}
-
-test(() => {
-  assert_function_name(WebAssembly.Memory, "Memory", "WebAssembly.Memory");
-}, "name");
-
-test(() => {
-  assert_function_length(WebAssembly.Memory, 1, "WebAssembly.Memory");
-}, "length");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Memory());
-}, "No arguments");
-
-test(() => {
-  const argument = { "initial": 0 };
-  assert_throws(new TypeError(), () => WebAssembly.Memory(argument));
-}, "Calling");
-
-test(() => {
-  const invalidArguments = [
-    undefined,
-    null,
-    false,
-    true,
-    "",
-    "test",
-    Symbol(),
-    1,
-    NaN,
-    {},
-  ];
-  for (const invalidArgument of invalidArguments) {
-    assert_throws(new TypeError(),
-                  () => new WebAssembly.Memory(invalidArgument),
-                  `new Memory(${format_value(invalidArgument)})`);
-  }
-}, "Invalid descriptor argument");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Memory({ "initial": undefined }));
-}, "Undefined initial value in descriptor");
-
-const outOfRangeValues = [
-  NaN,
-  Infinity,
-  -Infinity,
-  -1,
-  0x100000000,
-  0x1000000000,
-];
-
-for (const value of outOfRangeValues) {
-  test(() => {
-    assert_throws(new TypeError(), () => new WebAssembly.Memory({ "initial": value }));
-  }, `Out-of-range initial value in descriptor: ${format_value(value)}`);
-
-  test(() => {
-    assert_throws(new TypeError(), () => new WebAssembly.Memory({ "initial": 0, "maximum": value }));
-  }, `Out-of-range maximum value in descriptor: ${format_value(value)}`);
-}
-
-test(() => {
-  const proxy = new Proxy({}, {
-    has(o, x) {
-      assert_unreached(`Should not call [[HasProperty]] with ${x}`);
-    },
-    get(o, x) {
-      return 0;
-    },
-  });
-  new WebAssembly.Memory(proxy);
-}, "Proxy descriptor");
-
-test(() => {
-  const order = [];
-
-  new WebAssembly.Memory({
-    get maximum() {
-      order.push("maximum");
-      return {
-        valueOf() {
-          order.push("maximum valueOf");
-          return 1;
-        },
-      };
-    },
-
-    get initial() {
-      order.push("initial");
-      return {
-        valueOf() {
-          order.push("initial valueOf");
-          return 1;
-        },
-      };
-    },
-  });
-
-  assert_array_equals(order, [
-    "initial",
-    "initial valueOf",
-    "maximum",
-    "maximum valueOf",
-  ]);
-}, "Order of evaluation for descriptor");
-
-test(() => {
-  const argument = { "initial": 0 };
-  const memory = new WebAssembly.Memory(argument);
-  assert_Memory(memory, { "size": 0 });
-}, "Zero initial");
-
-test(() => {
-  const argument = { "initial": 4 };
-  const memory = new WebAssembly.Memory(argument);
-  assert_Memory(memory, { "size": 4 });
-}, "Non-zero initial");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.worker-expected.txt
deleted file mode 100644
index 074a2e6..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.worker-expected.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-
-PASS name 
-PASS length 
-PASS No arguments 
-PASS Calling 
-PASS Invalid descriptor argument 
-PASS Undefined initial value in descriptor 
-PASS Out-of-range initial value in descriptor: NaN 
-PASS Out-of-range maximum value in descriptor: NaN 
-PASS Out-of-range initial value in descriptor: Infinity 
-PASS Out-of-range maximum value in descriptor: Infinity 
-PASS Out-of-range initial value in descriptor: -Infinity 
-PASS Out-of-range maximum value in descriptor: -Infinity 
-PASS Out-of-range initial value in descriptor: -1 
-PASS Out-of-range maximum value in descriptor: -1 
-PASS Out-of-range initial value in descriptor: 4294967296 
-PASS Out-of-range maximum value in descriptor: 4294967296 
-PASS Out-of-range initial value in descriptor: 68719476736 
-PASS Out-of-range maximum value in descriptor: 68719476736 
-PASS Proxy descriptor 
-PASS Order of evaluation for descriptor 
-PASS Zero initial 
-PASS Non-zero initial 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any-expected.txt
deleted file mode 100644
index 33489b6..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-
-PASS Missing arguments 
-PASS Branding 
-PASS Zero initial 
-PASS Zero initial with valueOf 
-PASS Non-zero initial 
-PASS Zero initial with respected maximum 
-PASS Zero initial with respected maximum grown twice 
-PASS Zero initial growing too much 
-PASS Out-of-range argument: undefined 
-PASS Out-of-range argument: NaN 
-PASS Out-of-range argument: Infinity 
-PASS Out-of-range argument: -Infinity 
-PASS Out-of-range argument: -1 
-PASS Out-of-range argument: 4294967296 
-PASS Out-of-range argument: 68719476736 
-PASS Out-of-range argument: "0x100000000" 
-PASS Out-of-range argument: object "[object Object]" 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.js
deleted file mode 100644
index 9530039..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.js
+++ /dev/null
@@ -1,170 +0,0 @@
-// META: global=jsshell
-
-function assert_ArrayBuffer(actual, expected, message) {
-  // https://github.com/WebAssembly/spec/issues/840
-  assert_equals(Object.getPrototypeOf(actual), ArrayBuffer.prototype,
-                `${message}: prototype`);
-  if (expected.detached) {
-    // https://github.com/tc39/ecma262/issues/678
-    let byteLength;
-    try {
-      byteLength = actual.byteLength;
-    } catch (e) {
-      byteLength = 0;
-    }
-    assert_equals(byteLength, 0, `${message}: detached size`);
-  } else {
-    assert_equals(actual.byteLength, 0x10000 * expected.size, `${message}: size`);
-    if (expected.size > 0) {
-      const array = new Uint8Array(actual);
-      assert_equals(array[0], 0, `${message}: first element`);
-      assert_equals(array[array.byteLength - 1], 0, `${message}: last element`);
-    }
-  }
-}
-
-test(() => {
-  const argument = { "initial": 0 };
-  const memory = new WebAssembly.Memory(argument);
-  assert_throws(new TypeError(), () => memory.grow());
-}, "Missing arguments");
-
-test(t => {
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Memory,
-    WebAssembly.Memory.prototype,
-  ];
-
-  const argument = {
-    valueOf: t.unreached_func("Should not touch the argument (valueOf)"),
-    toString: t.unreached_func("Should not touch the argument (toString)"),
-  };
-
-  const fn = WebAssembly.Memory.prototype.grow;
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => fn.call(thisValue, argument), `this=${format_value(thisValue)}`);
-  }
-}, "Branding");
-
-test(() => {
-  const argument = { "initial": 0 };
-  const memory = new WebAssembly.Memory(argument);
-  const oldMemory = memory.buffer;
-  assert_ArrayBuffer(oldMemory, { "size": 0 }, "Buffer before growing");
-
-  const result = memory.grow(2);
-  assert_equals(result, 0);
-
-  const newMemory = memory.buffer;
-  assert_not_equals(oldMemory, newMemory);
-  assert_ArrayBuffer(oldMemory, { "detached": true }, "Old buffer after growing");
-  assert_ArrayBuffer(newMemory, { "size": 2 }, "New buffer after growing");
-}, "Zero initial");
-
-test(() => {
-  const argument = { "initial": { valueOf() { return 0 } } };
-  const memory = new WebAssembly.Memory(argument);
-  const oldMemory = memory.buffer;
-  assert_ArrayBuffer(oldMemory, { "size": 0 }, "Buffer before growing");
-
-  const result = memory.grow({ valueOf() { return 2 } });
-  assert_equals(result, 0);
-
-  const newMemory = memory.buffer;
-  assert_not_equals(oldMemory, newMemory);
-  assert_ArrayBuffer(oldMemory, { "detached": true }, "Old buffer after growing");
-  assert_ArrayBuffer(newMemory, { "size": 2 }, "New buffer after growing");
-}, "Zero initial with valueOf");
-
-test(() => {
-  const argument = { "initial": 3 };
-  const memory = new WebAssembly.Memory(argument);
-  const oldMemory = memory.buffer;
-  assert_ArrayBuffer(oldMemory, { "size": 3 }, "Buffer before growing");
-
-  const result = memory.grow(2);
-  assert_equals(result, 3);
-
-  const newMemory = memory.buffer;
-  assert_not_equals(oldMemory, newMemory);
-  assert_ArrayBuffer(oldMemory, { "detached": true }, "Old buffer after growing");
-  assert_ArrayBuffer(newMemory, { "size": 5 }, "New buffer after growing");
-}, "Non-zero initial");
-
-test(() => {
-  const argument = { "initial": 0, "maximum": 2 };
-  const memory = new WebAssembly.Memory(argument);
-  const oldMemory = memory.buffer;
-  assert_ArrayBuffer(oldMemory, { "size": 0 }, "Buffer before growing");
-
-  const result = memory.grow(2);
-  assert_equals(result, 0);
-
-  const newMemory = memory.buffer;
-  assert_not_equals(oldMemory, newMemory);
-  assert_ArrayBuffer(oldMemory, { "detached": true }, "Old buffer after growing");
-  assert_ArrayBuffer(newMemory, { "size": 2 }, "New buffer after growing");
-}, "Zero initial with respected maximum");
-
-test(() => {
-  const argument = { "initial": 0, "maximum": 2 };
-  const memory = new WebAssembly.Memory(argument);
-  const oldMemory = memory.buffer;
-  assert_ArrayBuffer(oldMemory, { "size": 0 }, "Buffer before growing");
-
-  const result = memory.grow(1);
-  assert_equals(result, 0);
-
-  const newMemory = memory.buffer;
-  assert_not_equals(oldMemory, newMemory);
-  assert_ArrayBuffer(oldMemory, { "detached": true }, "Old buffer after growing once");
-  assert_ArrayBuffer(newMemory, { "size": 1 }, "New buffer after growing once");
-
-  const result2 = memory.grow(1);
-  assert_equals(result2, 1);
-
-  const newestMemory = memory.buffer;
-  assert_not_equals(newMemory, newestMemory);
-  assert_ArrayBuffer(oldMemory, { "detached": true }, "New buffer after growing twice");
-  assert_ArrayBuffer(newMemory, { "detached": true }, "New buffer after growing twice");
-  assert_ArrayBuffer(newestMemory, { "size": 2 }, "Newest buffer after growing twice");
-}, "Zero initial with respected maximum grown twice");
-
-test(() => {
-  const argument = { "initial": 1, "maximum": 2 };
-  const memory = new WebAssembly.Memory(argument);
-  const oldMemory = memory.buffer;
-  assert_ArrayBuffer(oldMemory, { "size": 1 }, "Buffer before growing");
-
-  assert_throws(new RangeError(), () => memory.grow(2));
-  assert_equals(memory.buffer, oldMemory);
-  assert_ArrayBuffer(memory.buffer, { "size": 1 }, "Buffer before trying to grow");
-}, "Zero initial growing too much");
-
-const outOfRangeValues = [
-  undefined,
-  NaN,
-  Infinity,
-  -Infinity,
-  -1,
-  0x100000000,
-  0x1000000000,
-  "0x100000000",
-  { valueOf() { return 0x100000000; } },
-];
-
-for (const value of outOfRangeValues) {
-  test(() => {
-    const argument = { "initial": 0 };
-    const memory = new WebAssembly.Memory(argument);
-    assert_throws(new TypeError(), () => memory.grow(value));
-  }, `Out-of-range argument: ${format_value(value)}`);
-}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.worker-expected.txt
deleted file mode 100644
index 33489b6..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.worker-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-
-PASS Missing arguments 
-PASS Branding 
-PASS Zero initial 
-PASS Zero initial with valueOf 
-PASS Non-zero initial 
-PASS Zero initial with respected maximum 
-PASS Zero initial with respected maximum grown twice 
-PASS Zero initial growing too much 
-PASS Out-of-range argument: undefined 
-PASS Out-of-range argument: NaN 
-PASS Out-of-range argument: Infinity 
-PASS Out-of-range argument: -Infinity 
-PASS Out-of-range argument: -1 
-PASS Out-of-range argument: 4294967296 
-PASS Out-of-range argument: 68719476736 
-PASS Out-of-range argument: "0x100000000" 
-PASS Out-of-range argument: object "[object Object]" 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any-expected.txt
deleted file mode 100644
index 65e4440..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-PASS Object.prototype.toString on an Memory 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.js
deleted file mode 100644
index 4e15d75..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.js
+++ /dev/null
@@ -1,7 +0,0 @@
-// META: global=jsshell
-
-test(() => {
-  const argument = { "initial": 0 };
-  const memory = new WebAssembly.Memory(argument);
-  assert_class_string(memory, "WebAssembly.Memory");
-}, "Object.prototype.toString on an Memory");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.worker-expected.txt
deleted file mode 100644
index 65e4440..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.worker-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-PASS Object.prototype.toString on an Memory 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/w3c-import.log
deleted file mode 100644
index 006643b..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/w3c-import.log
+++ /dev/null
@@ -1,20 +0,0 @@
-The tests in this directory were imported from the W3C repository.
-Do NOT modify these tests directly in WebKit.
-Instead, create a pull request on the WPT github:
-	https://github.com/web-platform-tests/wpt
-
-Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport
-
-Do NOT modify or remove this file.
-
-------------------------------------------------------------------------
-Properties requiring vendor prefixes:
-None
-Property values requiring vendor prefixes:
-None
-------------------------------------------------------------------------
-List of files:
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/buffer.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/constructor.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/grow.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/memory/toString.any.js
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any-expected.txt
deleted file mode 100644
index 6d12237..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any-expected.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-
-PASS name 
-PASS length 
-PASS No arguments 
-PASS Calling 
-PASS Invalid arguments 
-PASS Empty buffer 
-PASS Prototype 
-PASS Extensibility 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.js
deleted file mode 100644
index 32f183f..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-// META: script=/wasm/jsapi/assertions.js
-
-let emptyModuleBinary;
-setup(() => {
-  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
-});
-
-test(() => {
-  assert_function_name(WebAssembly.Module, "Module", "WebAssembly.Module");
-}, "name");
-
-test(() => {
-  assert_function_length(WebAssembly.Module, 1, "WebAssembly.Module");
-}, "length");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Module());
-}, "No arguments");
-
-test(() => {
-  assert_throws(new TypeError(), () => WebAssembly.Module(emptyModuleBinary));
-}, "Calling");
-
-test(() => {
-  const invalidArguments = [
-    undefined,
-    null,
-    true,
-    "test",
-    Symbol(),
-    7,
-    NaN,
-    {},
-    ArrayBuffer,
-    ArrayBuffer.prototype,
-    Array.from(emptyModuleBinary),
-  ];
-  for (const argument of invalidArguments) {
-    assert_throws(new TypeError(), () => new WebAssembly.Module(argument),
-                  `new Module(${format_value(argument)})`);
-  }
-}, "Invalid arguments");
-
-test(() => {
-  const buffer = new Uint8Array();
-  assert_throws(new WebAssembly.CompileError(), () => new WebAssembly.Module(buffer));
-}, "Empty buffer");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_equals(Object.getPrototypeOf(module), WebAssembly.Module.prototype);
-}, "Prototype");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_true(Object.isExtensible(module));
-}, "Extensibility");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.worker-expected.txt
deleted file mode 100644
index 6d12237..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.worker-expected.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-
-PASS name 
-PASS length 
-PASS No arguments 
-PASS Calling 
-PASS Invalid arguments 
-PASS Empty buffer 
-PASS Prototype 
-PASS Extensibility 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any-expected.txt
deleted file mode 100644
index 4c8d91e..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any-expected.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-
-PASS Missing arguments 
-PASS Non-Module arguments 
-PASS Branding 
-PASS Empty module 
-PASS Empty module: array caching 
-PASS Custom sections 
-PASS Custom sections with surrogate pairs 
-FAIL Custom sections with U+FFFD assert_equals: expected 1 but got 0
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.js
deleted file mode 100644
index 58ac63b..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.js
+++ /dev/null
@@ -1,162 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-
-function assert_ArrayBuffer(buffer, expected) {
-  assert_equals(Object.getPrototypeOf(buffer), ArrayBuffer.prototype, "Prototype");
-  assert_true(Object.isExtensible(buffer), "isExtensible");
-  assert_array_equals(new Uint8Array(buffer), expected);
-}
-
-function assert_sections(sections, expected) {
-  assert_true(Array.isArray(sections), "Should be array");
-  assert_equals(Object.getPrototypeOf(sections), Array.prototype, "Prototype");
-  assert_true(Object.isExtensible(sections), "isExtensible");
-
-  assert_equals(sections.length, expected.length);
-  for (let i = 0; i < expected.length; ++i) {
-    assert_ArrayBuffer(sections[i], expected[i]);
-  }
-}
-
-let emptyModuleBinary;
-setup(() => {
-  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
-});
-
-test(() => {
-  assert_throws(new TypeError(), () => WebAssembly.Module.customSections());
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_throws(new TypeError(), () => WebAssembly.Module.customSections(module));
-}, "Missing arguments");
-
-test(() => {
-  const invalidArguments = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Module,
-    WebAssembly.Module.prototype,
-  ];
-  for (const argument of invalidArguments) {
-    assert_throws(new TypeError(), () => WebAssembly.Module.customSections(argument, ""),
-                  `customSections(${format_value(argument)})`);
-  }
-}, "Non-Module arguments");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const fn = WebAssembly.Module.customSections;
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Module,
-    WebAssembly.Module.prototype,
-  ];
-  for (const thisValue of thisValues) {
-    assert_sections(fn.call(thisValue, module, ""), []);
-  }
-}, "Branding");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_sections(WebAssembly.Module.customSections(module, ""), []);
-}, "Empty module");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_not_equals(WebAssembly.Module.customSections(module, ""),
-                    WebAssembly.Module.customSections(module, ""));
-}, "Empty module: array caching");
-
-test(() => {
-  const bytes1 = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121];
-  const bytes2 = [74, 83, 65, 80, 73];
-
-  const binary = new Binary;
-  binary.emit_section(kUnknownSectionCode, section => {
-    section.emit_string("name");
-    section.emit_bytes(bytes1);
-  });
-  binary.emit_section(kUnknownSectionCode, section => {
-    section.emit_string("name");
-    section.emit_bytes(bytes2);
-  });
-  binary.emit_section(kUnknownSectionCode, section => {
-    section.emit_string("foo");
-    section.emit_bytes(bytes1);
-  });
-
-  const builder = new WasmModuleBuilder();
-  builder.addExplicitSection(binary);
-  const buffer = builder.toBuffer()
-  const module = new WebAssembly.Module(buffer);
-
-  assert_sections(WebAssembly.Module.customSections(module, "name"), [
-    bytes1,
-    bytes2,
-  ])
-
-  assert_sections(WebAssembly.Module.customSections(module, "foo"), [
-    bytes1,
-  ])
-
-  assert_sections(WebAssembly.Module.customSections(module, ""), [])
-  assert_sections(WebAssembly.Module.customSections(module, "\0"), [])
-  assert_sections(WebAssembly.Module.customSections(module, "name\0"), [])
-  assert_sections(WebAssembly.Module.customSections(module, "foo\0"), [])
-}, "Custom sections");
-
-test(() => {
-  const bytes = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121];
-  const name = "yee\uD801\uDC37eey"
-
-  const binary = new Binary;
-  binary.emit_section(kUnknownSectionCode, section => {
-    section.emit_string(name);
-    section.emit_bytes(bytes);
-  });
-
-  const builder = new WasmModuleBuilder();
-  builder.addExplicitSection(binary);
-  const buffer = builder.toBuffer();
-  const module = new WebAssembly.Module(buffer);
-
-  assert_sections(WebAssembly.Module.customSections(module, name), [
-    bytes,
-  ]);
-  assert_sections(WebAssembly.Module.customSections(module, "yee\uFFFDeey"), []);
-  assert_sections(WebAssembly.Module.customSections(module, "yee\uFFFD\uFFFDeey"), []);
-}, "Custom sections with surrogate pairs");
-
-test(() => {
-  const bytes = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121];
-
-  const binary = new Binary;
-  binary.emit_section(kUnknownSectionCode, section => {
-    section.emit_string("na\uFFFDme");
-    section.emit_bytes(bytes);
-  });
-
-  const builder = new WasmModuleBuilder();
-  builder.addExplicitSection(binary);
-  const buffer = builder.toBuffer();
-  const module = new WebAssembly.Module(buffer);
-
-  assert_sections(WebAssembly.Module.customSections(module, "name"), []);
-  assert_sections(WebAssembly.Module.customSections(module, "na\uFFFDme"), [
-    bytes,
-  ]);
-  assert_sections(WebAssembly.Module.customSections(module, "na\uDC01me"), [
-    bytes,
-  ]);
-}, "Custom sections with U+FFFD");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.worker-expected.txt
deleted file mode 100644
index 4c8d91e..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.worker-expected.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-
-PASS Missing arguments 
-PASS Non-Module arguments 
-PASS Branding 
-PASS Empty module 
-PASS Empty module: array caching 
-PASS Custom sections 
-PASS Custom sections with surrogate pairs 
-FAIL Custom sections with U+FFFD assert_equals: expected 1 but got 0
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any-expected.txt
deleted file mode 100644
index da4156c..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-
-PASS Missing arguments 
-PASS Non-Module arguments 
-PASS Branding 
-PASS Empty module 
-PASS Empty module: array caching 
-FAIL exports WebAssembly.Module doesn't parse at byte 87: 3th Export isn't immutable, named 'global' (evaluating 'new WebAssembly.Module(buffer)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.js
deleted file mode 100644
index e63a885..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.js
+++ /dev/null
@@ -1,130 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-
-let emptyModuleBinary;
-setup(() => {
-  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
-});
-
-function assert_ModuleExportDescriptor(export_, expected) {
-  assert_equals(Object.getPrototypeOf(export_), Object.prototype, "Prototype");
-  assert_true(Object.isExtensible(export_), "isExtensible");
-
-  const name = Object.getOwnPropertyDescriptor(export_, "name");
-  assert_true(name.writable, "name: writable");
-  assert_true(name.enumerable, "name: enumerable");
-  assert_true(name.configurable, "name: configurable");
-  assert_equals(name.value, expected.name);
-
-  const kind = Object.getOwnPropertyDescriptor(export_, "kind");
-  assert_true(kind.writable, "kind: writable");
-  assert_true(kind.enumerable, "kind: enumerable");
-  assert_true(kind.configurable, "kind: configurable");
-  assert_equals(kind.value, expected.kind);
-}
-
-function assert_exports(exports, expected) {
-  assert_true(Array.isArray(exports), "Should be array");
-  assert_equals(Object.getPrototypeOf(exports), Array.prototype, "Prototype");
-  assert_true(Object.isExtensible(exports), "isExtensible");
-
-  assert_equals(exports.length, expected.length);
-  for (let i = 0; i < expected.length; ++i) {
-    assert_ModuleExportDescriptor(exports[i], expected[i]);
-  }
-}
-
-test(() => {
-  assert_throws(new TypeError(), () => WebAssembly.Module.exports());
-}, "Missing arguments");
-
-test(() => {
-  const invalidArguments = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Module,
-    WebAssembly.Module.prototype,
-  ];
-  for (const argument of invalidArguments) {
-    assert_throws(new TypeError(), () => WebAssembly.Module.exports(argument),
-                  `exports(${format_value(argument)})`);
-  }
-}, "Non-Module arguments");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const fn = WebAssembly.Module.exports;
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Module,
-    WebAssembly.Module.prototype,
-  ];
-  for (const thisValue of thisValues) {
-    assert_array_equals(fn.call(thisValue, module), []);
-  }
-}, "Branding");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const exports = WebAssembly.Module.exports(module);
-  assert_exports(exports, []);
-}, "Empty module");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_not_equals(WebAssembly.Module.exports(module), WebAssembly.Module.exports(module));
-}, "Empty module: array caching");
-
-test(() => {
-  const builder = new WasmModuleBuilder();
-
-  builder
-    .addFunction("fn", kSig_v_v)
-    .addBody([
-        kExprEnd
-    ])
-    .exportFunc();
-  builder
-    .addFunction("fn2", kSig_v_v)
-    .addBody([
-        kExprEnd
-    ])
-    .exportFunc();
-
-  builder.setFunctionTableLength(1);
-  builder.addExportOfKind("table", kExternalTable, 0);
-
-  builder.addGlobal(kWasmI32, true)
-    .exportAs("global")
-    .init = 7;
-  builder.addGlobal(kWasmF64, true)
-    .exportAs("global2")
-    .init = 1.2;
-
-  builder.addMemory(0, 256, true);
-
-  const buffer = builder.toBuffer()
-  const module = new WebAssembly.Module(buffer);
-  const exports = WebAssembly.Module.exports(module);
-  const expected = [
-    { "kind": "function", "name": "fn" },
-    { "kind": "function", "name": "fn2" },
-    { "kind": "table", "name": "table" },
-    { "kind": "global", "name": "global" },
-    { "kind": "global", "name": "global2" },
-    { "kind": "memory", "name": "memory" },
-  ];
-  assert_exports(exports, expected);
-}, "exports");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.worker-expected.txt
deleted file mode 100644
index da4156c..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.worker-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-
-PASS Missing arguments 
-PASS Non-Module arguments 
-PASS Branding 
-PASS Empty module 
-PASS Empty module: array caching 
-FAIL exports WebAssembly.Module doesn't parse at byte 87: 3th Export isn't immutable, named 'global' (evaluating 'new WebAssembly.Module(buffer)')
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any-expected.txt
deleted file mode 100644
index 4723e63..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-
-PASS Missing arguments 
-PASS Non-Module arguments 
-PASS Branding 
-PASS Return type 
-PASS Empty module 
-PASS Empty module: array caching 
-PASS imports 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.js
deleted file mode 100644
index 640da59..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.js
+++ /dev/null
@@ -1,120 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-
-function assert_ModuleImportDescriptor(import_, expected) {
-  assert_equals(Object.getPrototypeOf(import_), Object.prototype, "Prototype");
-  assert_true(Object.isExtensible(import_), "isExtensible");
-
-  const module = Object.getOwnPropertyDescriptor(import_, "module");
-  assert_true(module.writable, "module: writable");
-  assert_true(module.enumerable, "module: enumerable");
-  assert_true(module.configurable, "module: configurable");
-  assert_equals(module.value, expected.module);
-
-  const name = Object.getOwnPropertyDescriptor(import_, "name");
-  assert_true(name.writable, "name: writable");
-  assert_true(name.enumerable, "name: enumerable");
-  assert_true(name.configurable, "name: configurable");
-  assert_equals(name.value, expected.name);
-
-  const kind = Object.getOwnPropertyDescriptor(import_, "kind");
-  assert_true(kind.writable, "kind: writable");
-  assert_true(kind.enumerable, "kind: enumerable");
-  assert_true(kind.configurable, "kind: configurable");
-  assert_equals(kind.value, expected.kind);
-}
-
-function assert_imports(imports, expected) {
-  assert_true(Array.isArray(imports), "Should be array");
-  assert_equals(Object.getPrototypeOf(imports), Array.prototype, "Prototype");
-  assert_true(Object.isExtensible(imports), "isExtensible");
-
-  assert_equals(imports.length, expected.length);
-  for (let i = 0; i < expected.length; ++i) {
-    assert_ModuleImportDescriptor(imports[i], expected[i]);
-  }
-}
-
-let emptyModuleBinary;
-setup(() => {
-  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
-});
-
-test(() => {
-  assert_throws(new TypeError(), () => WebAssembly.Module.imports());
-}, "Missing arguments");
-
-test(() => {
-  const invalidArguments = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Module,
-    WebAssembly.Module.prototype,
-  ];
-  for (const argument of invalidArguments) {
-    assert_throws(new TypeError(), () => WebAssembly.Module.imports(argument),
-                  `imports(${format_value(argument)})`);
-  }
-}, "Non-Module arguments");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const fn = WebAssembly.Module.imports;
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Module,
-    WebAssembly.Module.prototype,
-  ];
-  for (const thisValue of thisValues) {
-    assert_array_equals(fn.call(thisValue, module), []);
-  }
-}, "Branding");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const imports = WebAssembly.Module.imports(module);
-  assert_true(Array.isArray(imports));
-}, "Return type");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  const imports = WebAssembly.Module.imports(module);
-  assert_imports(imports, []);
-}, "Empty module");
-
-test(() => {
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_not_equals(WebAssembly.Module.imports(module), WebAssembly.Module.imports(module));
-}, "Empty module: array caching");
-
-test(() => {
-  const builder = new WasmModuleBuilder();
-
-  builder.addImport("module", "fn", kSig_v_v);
-  builder.addImportedGlobal("module", "global", kWasmI32);
-  builder.addImportedMemory("module", "memory", 0, 128);
-  builder.addImportedTable("module", "table", 0, 128);
-
-  const buffer = builder.toBuffer()
-  const module = new WebAssembly.Module(buffer);
-  const imports = WebAssembly.Module.imports(module);
-  const expected = [
-    { "module": "module", "kind": "function", "name": "fn" },
-    { "module": "module", "kind": "global", "name": "global" },
-    { "module": "module", "kind": "memory", "name": "memory" },
-    { "module": "module", "kind": "table", "name": "table" },
-  ];
-  assert_imports(imports, expected);
-}, "imports");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.worker-expected.txt
deleted file mode 100644
index 4723e63..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.worker-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-
-PASS Missing arguments 
-PASS Non-Module arguments 
-PASS Branding 
-PASS Return type 
-PASS Empty module 
-PASS Empty module: array caching 
-PASS imports 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any-expected.txt
deleted file mode 100644
index b13e61e..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-PASS Object.prototype.toString on an Module 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.js
deleted file mode 100644
index d9231a1..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-
-test(() => {
-  const emptyModuleBinary = new WasmModuleBuilder().toBuffer();
-  const module = new WebAssembly.Module(emptyModuleBinary);
-  assert_class_string(module, "WebAssembly.Module");
-}, "Object.prototype.toString on an Module");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.worker-expected.txt
deleted file mode 100644
index b13e61e..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.worker-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-PASS Object.prototype.toString on an Module 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/w3c-import.log
deleted file mode 100644
index e66a985..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/w3c-import.log
+++ /dev/null
@@ -1,21 +0,0 @@
-The tests in this directory were imported from the W3C repository.
-Do NOT modify these tests directly in WebKit.
-Instead, create a pull request on the WPT github:
-	https://github.com/web-platform-tests/wpt
-
-Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport
-
-Do NOT modify or remove this file.
-
-------------------------------------------------------------------------
-Properties requiring vendor prefixes:
-None
-Property values requiring vendor prefixes:
-None
-------------------------------------------------------------------------
-List of files:
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/constructor.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/customSections.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/exports.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/imports.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/module/toString.any.js
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/assertions.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/assertions.js
deleted file mode 100644
index dde2fd7..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/assertions.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function assert_equal_to_array(table, expected, message) {
-  assert_equals(table.length, expected.length, `${message}: length`);
-  assert_throws(new RangeError(), () => table.get(-1), `${message}: table.get(-1)`);
-  for (let i = 0; i < expected.length; ++i) {
-    assert_equals(table.get(i), expected[i], `${message}: table.get(${i} of ${expected.length})`);
-  }
-  assert_throws(new RangeError(), () => table.get(expected.length),
-                `${message}: table.get(${expected.length} of ${expected.length})`);
-  assert_throws(new RangeError(), () => table.get(expected.length + 1),
-                `${message}: table.get(${expected.length + 1} of ${expected.length})`);
-}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any-expected.txt
deleted file mode 100644
index a312505..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-
-PASS name 
-PASS length 
-PASS No arguments 
-PASS Calling 
-PASS Empty descriptor 
-PASS Invalid descriptor argument 
-PASS Undefined initial value in descriptor 
-PASS Undefined element value in descriptor 
-PASS Out-of-range initial value in descriptor: NaN 
-PASS Out-of-range maximum value in descriptor: NaN 
-PASS Out-of-range initial value in descriptor: Infinity 
-PASS Out-of-range maximum value in descriptor: Infinity 
-PASS Out-of-range initial value in descriptor: -Infinity 
-PASS Out-of-range maximum value in descriptor: -Infinity 
-PASS Out-of-range initial value in descriptor: -1 
-PASS Out-of-range maximum value in descriptor: -1 
-PASS Out-of-range initial value in descriptor: 4294967296 
-PASS Out-of-range maximum value in descriptor: 4294967296 
-PASS Out-of-range initial value in descriptor: 68719476736 
-PASS Out-of-range maximum value in descriptor: 68719476736 
-PASS Initial value exceeds maximum 
-PASS Basic (zero) 
-PASS Basic (non-zero) 
-PASS Proxy descriptor 
-PASS Type conversion for descriptor.element 
-PASS Order of evaluation for descriptor 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.js
deleted file mode 100644
index e924bdb..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.js
+++ /dev/null
@@ -1,173 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/assertions.js
-
-function assert_Table(actual, expected) {
-  assert_equals(Object.getPrototypeOf(actual), WebAssembly.Table.prototype,
-                "prototype");
-  assert_true(Object.isExtensible(actual), "extensible");
-
-  assert_equals(actual.length, expected.length, "length");
-  for (let i = 0; i < expected.length; ++i) {
-    assert_equals(actual.get(i), null, `actual.get(${i})`);
-  }
-}
-
-test(() => {
-  assert_function_name(WebAssembly.Table, "Table", "WebAssembly.Table");
-}, "name");
-
-test(() => {
-  assert_function_length(WebAssembly.Table, 1, "WebAssembly.Table");
-}, "length");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Table());
-}, "No arguments");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 0 };
-  assert_throws(new TypeError(), () => WebAssembly.Table(argument));
-}, "Calling");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Table({}));
-}, "Empty descriptor");
-
-test(() => {
-  const invalidArguments = [
-    undefined,
-    null,
-    false,
-    true,
-    "",
-    "test",
-    Symbol(),
-    1,
-    NaN,
-    {},
-  ];
-  for (const invalidArgument of invalidArguments) {
-    assert_throws(new TypeError(),
-                  () => new WebAssembly.Table(invalidArgument),
-                  `new Table(${format_value(invalidArgument)})`);
-  }
-}, "Invalid descriptor argument");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Table({ "element": "anyfunc", "initial": undefined }));
-}, "Undefined initial value in descriptor");
-
-test(() => {
-  assert_throws(new TypeError(), () => new WebAssembly.Table({ "element": undefined, "initial": 0 }));
-}, "Undefined element value in descriptor");
-
-const outOfRangeValues = [
-  NaN,
-  Infinity,
-  -Infinity,
-  -1,
-  0x100000000,
-  0x1000000000,
-];
-
-for (const value of outOfRangeValues) {
-  test(() => {
-    assert_throws(new TypeError(), () => new WebAssembly.Table({ "element": "anyfunc", "initial": value }));
-  }, `Out-of-range initial value in descriptor: ${format_value(value)}`);
-
-  test(() => {
-    assert_throws(new TypeError(), () => new WebAssembly.Table({ "element": "anyfunc", "initial": 0, "maximum": value }));
-  }, `Out-of-range maximum value in descriptor: ${format_value(value)}`);
-}
-
-test(() => {
-  assert_throws(new RangeError(), () => new WebAssembly.Table({ "element": "anyfunc", "initial": 10, "maximum": 9 }));
-}, "Initial value exceeds maximum");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 0 };
-  const table = new WebAssembly.Table(argument);
-  assert_Table(table, { "length": 0 });
-}, "Basic (zero)");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_Table(table, { "length": 5 });
-}, "Basic (non-zero)");
-
-test(() => {
-  const proxy = new Proxy({}, {
-    has(o, x) {
-      assert_unreached(`Should not call [[HasProperty]] with ${x}`);
-    },
-    get(o, x) {
-      switch (x) {
-      case "element":
-        return "anyfunc";
-      case "initial":
-      case "maximum":
-        return 0;
-      default:
-        return undefined;
-      }
-    },
-  });
-  const table = new WebAssembly.Table(proxy);
-  assert_Table(table, { "length": 0 });
-}, "Proxy descriptor");
-
-test(() => {
-  const table = new WebAssembly.Table({
-    "element": {
-      toString() { return "anyfunc"; },
-    },
-    "initial": 1,
-  });
-  assert_Table(table, { "length": 1 });
-}, "Type conversion for descriptor.element");
-
-test(() => {
-  const order = [];
-
-  new WebAssembly.Table({
-    get maximum() {
-      order.push("maximum");
-      return {
-        valueOf() {
-          order.push("maximum valueOf");
-          return 1;
-        },
-      };
-    },
-
-    get initial() {
-      order.push("initial");
-      return {
-        valueOf() {
-          order.push("initial valueOf");
-          return 1;
-        },
-      };
-    },
-
-    get element() {
-      order.push("element");
-      return {
-        toString() {
-          order.push("element toString");
-          return "anyfunc";
-        },
-      };
-    },
-  });
-
-  assert_array_equals(order, [
-    "element",
-    "element toString",
-    "initial",
-    "initial valueOf",
-    "maximum",
-    "maximum valueOf",
-  ]);
-}, "Order of evaluation for descriptor");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.worker-expected.txt
deleted file mode 100644
index a312505..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.worker-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-
-PASS name 
-PASS length 
-PASS No arguments 
-PASS Calling 
-PASS Empty descriptor 
-PASS Invalid descriptor argument 
-PASS Undefined initial value in descriptor 
-PASS Undefined element value in descriptor 
-PASS Out-of-range initial value in descriptor: NaN 
-PASS Out-of-range maximum value in descriptor: NaN 
-PASS Out-of-range initial value in descriptor: Infinity 
-PASS Out-of-range maximum value in descriptor: Infinity 
-PASS Out-of-range initial value in descriptor: -Infinity 
-PASS Out-of-range maximum value in descriptor: -Infinity 
-PASS Out-of-range initial value in descriptor: -1 
-PASS Out-of-range maximum value in descriptor: -1 
-PASS Out-of-range initial value in descriptor: 4294967296 
-PASS Out-of-range maximum value in descriptor: 4294967296 
-PASS Out-of-range initial value in descriptor: 68719476736 
-PASS Out-of-range maximum value in descriptor: 68719476736 
-PASS Initial value exceeds maximum 
-PASS Basic (zero) 
-PASS Basic (non-zero) 
-PASS Proxy descriptor 
-PASS Type conversion for descriptor.element 
-PASS Order of evaluation for descriptor 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any-expected.txt
deleted file mode 100644
index dac3284..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-
-PASS Missing arguments: get 
-PASS Branding: get 
-PASS Missing arguments: set 
-PASS Branding: set 
-FAIL Basic assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Growing assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Setting out-of-bounds assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Setting non-function assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Setting non-wasm function assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Setting non-wasm arrow function assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-PASS Getting out-of-range argument: undefined 
-PASS Setting out-of-range argument: undefined 
-PASS Getting out-of-range argument: NaN 
-PASS Setting out-of-range argument: NaN 
-PASS Getting out-of-range argument: Infinity 
-PASS Setting out-of-range argument: Infinity 
-PASS Getting out-of-range argument: -Infinity 
-PASS Setting out-of-range argument: -Infinity 
-PASS Getting out-of-range argument: -1 
-PASS Setting out-of-range argument: -1 
-PASS Getting out-of-range argument: 4294967296 
-PASS Setting out-of-range argument: 4294967296 
-PASS Getting out-of-range argument: 68719476736 
-PASS Setting out-of-range argument: 68719476736 
-PASS Getting out-of-range argument: "0x100000000" 
-PASS Setting out-of-range argument: "0x100000000" 
-PASS Getting out-of-range argument: object "[object Object]" 
-PASS Setting out-of-range argument: object "[object Object]" 
-PASS Order of argument conversion 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.js
deleted file mode 100644
index 2bb43a9..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.js
+++ /dev/null
@@ -1,220 +0,0 @@
-// META: global=jsshell
-// META: script=/wasm/jsapi/wasm-constants.js
-// META: script=/wasm/jsapi/wasm-module-builder.js
-// META: script=assertions.js
-
-let functions;
-setup(() => {
-  const builder = new WasmModuleBuilder();
-
-  builder
-    .addFunction("fn", kSig_v_d)
-    .addBody([
-        kExprEnd
-    ])
-    .exportFunc();
-  builder
-    .addFunction("fn2", kSig_v_v)
-    .addBody([
-        kExprEnd
-    ])
-    .exportFunc();
-
-  const buffer = builder.toBuffer()
-  const module = new WebAssembly.Module(buffer);
-  const instance = new WebAssembly.Instance(module, {});
-  functions = instance.exports;
-});
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_throws(new TypeError(), () => table.get());
-}, "Missing arguments: get");
-
-test(t => {
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Table,
-    WebAssembly.Table.prototype,
-  ];
-
-  const argument = {
-    valueOf: t.unreached_func("Should not touch the argument (valueOf)"),
-    toString: t.unreached_func("Should not touch the argument (toString)"),
-  };
-
-  const fn = WebAssembly.Table.prototype.get;
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => fn.call(thisValue, argument), `this=${format_value(thisValue)}`);
-  }
-}, "Branding: get");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_throws(new TypeError(), () => table.set());
-  assert_throws(new TypeError(), () => table.set(0));
-}, "Missing arguments: set");
-
-test(t => {
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Table,
-    WebAssembly.Table.prototype,
-  ];
-
-  const argument = {
-    valueOf: t.unreached_func("Should not touch the argument (valueOf)"),
-    toString: t.unreached_func("Should not touch the argument (toString)"),
-  };
-
-  const fn = WebAssembly.Table.prototype.set;
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => fn.call(thisValue, argument, null), `this=${format_value(thisValue)}`);
-  }
-}, "Branding: set");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, [null, null, null, null, null]);
-
-  const {fn, fn2} = functions;
-
-  assert_equals(table.set(0, fn), undefined, "set() returns undefined.");
-  table.set(2, fn2);
-  table.set(4, fn);
-
-  assert_equal_to_array(table, [fn, null, fn2, null, fn]);
-
-  table.set(0, null);
-  assert_equal_to_array(table, [null, null, fn2, null, fn]);
-}, "Basic");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, [null, null, null, null, null]);
-
-  const {fn, fn2} = functions;
-
-  table.set(0, fn);
-  table.set(2, fn2);
-  table.set(4, fn);
-
-  assert_equal_to_array(table, [fn, null, fn2, null, fn]);
-
-  table.grow(4);
-
-  assert_equal_to_array(table, [fn, null, fn2, null, fn, null, null, null, null]);
-}, "Growing");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, [null, null, null, null, null]);
-
-  const {fn} = functions;
-
-  assert_throws(new RangeError(), () => table.set(-1, fn));
-  assert_throws(new RangeError(), () => table.set(5, fn));
-  assert_equal_to_array(table, [null, null, null, null, null]);
-}, "Setting out-of-bounds");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 1 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, [null]);
-
-  const invalidArguments = [
-    undefined,
-    true,
-    false,
-    "test",
-    Symbol(),
-    7,
-    NaN,
-    {},
-  ];
-  for (const argument of invalidArguments) {
-    assert_throws(new TypeError(), () => table.set(0, argument),
-                  `set(${format_value(argument)})`);
-  }
-  assert_equal_to_array(table, [null]);
-}, "Setting non-function");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 1 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, [null]);
-
-  const fn = function() {};
-  assert_throws(new TypeError(), () => table.set(0, fn));
-  assert_equal_to_array(table, [null]);
-}, "Setting non-wasm function");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 1 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, [null]);
-
-  const fn = () => {};
-  assert_throws(new TypeError(), () => table.set(0, fn));
-  assert_equal_to_array(table, [null]);
-}, "Setting non-wasm arrow function");
-
-const outOfRangeValues = [
-  undefined,
-  NaN,
-  Infinity,
-  -Infinity,
-  -1,
-  0x100000000,
-  0x1000000000,
-  "0x100000000",
-  { valueOf() { return 0x100000000; } },
-];
-
-for (const value of outOfRangeValues) {
-  test(() => {
-    const argument = { "element": "anyfunc", "initial": 1 };
-    const table = new WebAssembly.Table(argument);
-    assert_throws(new TypeError(), () => table.get(value));
-  }, `Getting out-of-range argument: ${format_value(value)}`);
-
-  test(() => {
-    const argument = { "element": "anyfunc", "initial": 1 };
-    const table = new WebAssembly.Table(argument);
-    assert_throws(new TypeError(), () => table.set(value, null));
-  }, `Setting out-of-range argument: ${format_value(value)}`);
-}
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 1 };
-  const table = new WebAssembly.Table(argument);
-  let called = 0;
-  const value = {
-    valueOf() {
-      called++;
-      return 0;
-    },
-  };
-  assert_throws(new TypeError(), () => table.set(value, {}));
-  assert_equals(called, 1);
-}, "Order of argument conversion");
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.worker-expected.txt
deleted file mode 100644
index dac3284..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.worker-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-
-PASS Missing arguments: get 
-PASS Branding: get 
-PASS Missing arguments: set 
-PASS Branding: set 
-FAIL Basic assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Growing assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Setting out-of-bounds assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Setting non-function assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Setting non-wasm function assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Setting non-wasm arrow function assert_throws: undefined: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-PASS Getting out-of-range argument: undefined 
-PASS Setting out-of-range argument: undefined 
-PASS Getting out-of-range argument: NaN 
-PASS Setting out-of-range argument: NaN 
-PASS Getting out-of-range argument: Infinity 
-PASS Setting out-of-range argument: Infinity 
-PASS Getting out-of-range argument: -Infinity 
-PASS Setting out-of-range argument: -Infinity 
-PASS Getting out-of-range argument: -1 
-PASS Setting out-of-range argument: -1 
-PASS Getting out-of-range argument: 4294967296 
-PASS Setting out-of-range argument: 4294967296 
-PASS Getting out-of-range argument: 68719476736 
-PASS Setting out-of-range argument: 68719476736 
-PASS Getting out-of-range argument: "0x100000000" 
-PASS Setting out-of-range argument: "0x100000000" 
-PASS Getting out-of-range argument: object "[object Object]" 
-PASS Setting out-of-range argument: object "[object Object]" 
-PASS Order of argument conversion 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any-expected.txt
deleted file mode 100644
index 60d21e0..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any-expected.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-
-PASS Missing arguments 
-PASS Branding 
-FAIL Basic assert_throws: before: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Reached maximum assert_throws: before: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Exceeded maximum assert_throws: before: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-PASS Out-of-range argument: undefined 
-PASS Out-of-range argument: NaN 
-PASS Out-of-range argument: Infinity 
-PASS Out-of-range argument: -Infinity 
-PASS Out-of-range argument: -1 
-PASS Out-of-range argument: 4294967296 
-PASS Out-of-range argument: 68719476736 
-PASS Out-of-range argument: "0x100000000" 
-PASS Out-of-range argument: object "[object Object]" 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.js
deleted file mode 100644
index d3efb51..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.js
+++ /dev/null
@@ -1,86 +0,0 @@
-// META: global=jsshell
-// META: script=assertions.js
-
-function nulls(n) {
-  return Array(n).fill(null);
-}
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_throws(new TypeError(), () => table.grow());
-}, "Missing arguments");
-
-test(t => {
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Table,
-    WebAssembly.Table.prototype,
-  ];
-
-  const argument = {
-    valueOf: t.unreached_func("Should not touch the argument (valueOf)"),
-    toString: t.unreached_func("Should not touch the argument (toString)"),
-  };
-
-  const fn = WebAssembly.Table.prototype.grow;
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => fn.call(thisValue, argument), `this=${format_value(thisValue)}`);
-  }
-}, "Branding");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, nulls(5), "before");
-
-  const result = table.grow(3);
-  assert_equals(result, 5);
-  assert_equal_to_array(table, nulls(8), "after");
-}, "Basic");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 3, "maximum": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, nulls(3), "before");
-
-  const result = table.grow(2);
-  assert_equals(result, 3);
-  assert_equal_to_array(table, nulls(5), "after");
-}, "Reached maximum");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 2, "maximum": 5 };
-  const table = new WebAssembly.Table(argument);
-  assert_equal_to_array(table, nulls(2), "before");
-
-  assert_throws(new RangeError(), () => table.grow(4));
-  assert_equal_to_array(table, nulls(2), "after");
-}, "Exceeded maximum");
-
-const outOfRangeValues = [
-  undefined,
-  NaN,
-  Infinity,
-  -Infinity,
-  -1,
-  0x100000000,
-  0x1000000000,
-  "0x100000000",
-  { valueOf() { return 0x100000000; } },
-];
-
-for (const value of outOfRangeValues) {
-  test(() => {
-    const argument = { "element": "anyfunc", "initial": 1 };
-    const table = new WebAssembly.Table(argument);
-    assert_throws(new TypeError(), () => table.grow(value));
-  }, `Out-of-range argument: ${format_value(value)}`);
-}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.worker-expected.txt
deleted file mode 100644
index 60d21e0..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.worker-expected.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-
-PASS Missing arguments 
-PASS Branding 
-FAIL Basic assert_throws: before: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Reached maximum assert_throws: before: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-FAIL Exceeded maximum assert_throws: before: table.get(-1) function "() => table.get(-1)" threw object "TypeError: Expect an integer argument in the range: [0, 2^32 - 1]" ("TypeError") expected object "RangeError" ("RangeError")
-PASS Out-of-range argument: undefined 
-PASS Out-of-range argument: NaN 
-PASS Out-of-range argument: Infinity 
-PASS Out-of-range argument: -Infinity 
-PASS Out-of-range argument: -1 
-PASS Out-of-range argument: 4294967296 
-PASS Out-of-range argument: 68719476736 
-PASS Out-of-range argument: "0x100000000" 
-PASS Out-of-range argument: object "[object Object]" 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any-expected.txt
deleted file mode 100644
index 670f281..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-
-PASS Branding 
-PASS Setting (sloppy mode) 
-PASS Setting (strict mode) 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.js
deleted file mode 100644
index a6a9661..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// META: global=jsshell
-
-test(() => {
-  const thisValues = [
-    undefined,
-    null,
-    true,
-    "",
-    Symbol(),
-    1,
-    {},
-    WebAssembly.Table,
-    WebAssembly.Table.prototype,
-  ];
-
-  const desc = Object.getOwnPropertyDescriptor(WebAssembly.Table.prototype, "length");
-  assert_equals(typeof desc, "object");
-
-  const getter = desc.get;
-  assert_equals(typeof getter, "function");
-
-  assert_equals(typeof desc.set, "undefined");
-
-  for (const thisValue of thisValues) {
-    assert_throws(new TypeError(), () => getter.call(thisValue), `this=${format_value(thisValue)}`);
-  }
-}, "Branding");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 2 };
-  const table = new WebAssembly.Table(argument);
-  assert_equals(table.length, 2, "Initial length");
-  table.length = 4;
-  assert_equals(table.length, 2, "Should not change the length");
-}, "Setting (sloppy mode)");
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 2 };
-  const table = new WebAssembly.Table(argument);
-  assert_equals(table.length, 2, "Initial length");
-  assert_throws(new TypeError(), () => {
-    "use strict";
-    table.length = 4;
-  });
-  assert_equals(table.length, 2, "Should not change the length");
-}, "Setting (strict mode)");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.worker-expected.txt
deleted file mode 100644
index 670f281..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.worker-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-
-PASS Branding 
-PASS Setting (sloppy mode) 
-PASS Setting (strict mode) 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any-expected.txt
deleted file mode 100644
index 923d633..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-PASS Object.prototype.toString on an Table 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.js
deleted file mode 100644
index e576477..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.js
+++ /dev/null
@@ -1,7 +0,0 @@
-// META: global=jsshell
-
-test(() => {
-  const argument = { "element": "anyfunc", "initial": 0 };
-  const table = new WebAssembly.Table(argument);
-  assert_class_string(table, "WebAssembly.Table");
-}, "Object.prototype.toString on an Table");
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.worker-expected.txt
deleted file mode 100644
index 923d633..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.worker-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-PASS Object.prototype.toString on an Table 
-
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.worker.html
deleted file mode 100644
index 2382913..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.worker.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/w3c-import.log
deleted file mode 100644
index 6a9ecce..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/w3c-import.log
+++ /dev/null
@@ -1,22 +0,0 @@
-The tests in this directory were imported from the W3C repository.
-Do NOT modify these tests directly in WebKit.
-Instead, create a pull request on the WPT github:
-	https://github.com/web-platform-tests/wpt
-
-Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport
-
-Do NOT modify or remove this file.
-
-------------------------------------------------------------------------
-Properties requiring vendor prefixes:
-None
-Property values requiring vendor prefixes:
-None
-------------------------------------------------------------------------
-List of files:
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/assertions.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/constructor.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/get-set.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/grow.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/length.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/table/toString.any.js
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/w3c-import.log
deleted file mode 100644
index c4c117f..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/w3c-import.log
+++ /dev/null
@@ -1,21 +0,0 @@
-The tests in this directory were imported from the W3C repository.
-Do NOT modify these tests directly in WebKit.
-Instead, create a pull request on the WPT github:
-	https://github.com/web-platform-tests/wpt
-
-Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport
-
-Do NOT modify or remove this file.
-
-------------------------------------------------------------------------
-Properties requiring vendor prefixes:
-None
-Property values requiring vendor prefixes:
-None
-------------------------------------------------------------------------
-List of files:
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/assertions.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/bad-imports.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/interface.any.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/wasm-constants.js
-/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/wasm-module-builder.js
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/wasm-constants.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/wasm-constants.js
deleted file mode 100644
index f056f9c..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/wasm-constants.js
+++ /dev/null
@@ -1,374 +0,0 @@
-// Copyright 2015 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flags: --expose-wasm
-
-function bytes() {
-  var buffer = new ArrayBuffer(arguments.length);
-  var view = new Uint8Array(buffer);
-  for (var i = 0; i < arguments.length; i++) {
-    var val = arguments[i];
-    if ((typeof val) == "string") val = val.charCodeAt(0);
-    view[i] = val | 0;
-  }
-  return buffer;
-}
-
-// Header declaration constants
-var kWasmH0 = 0;
-var kWasmH1 = 0x61;
-var kWasmH2 = 0x73;
-var kWasmH3 = 0x6d;
-
-var kWasmV0 = 1;
-var kWasmV1 = 0;
-var kWasmV2 = 0;
-var kWasmV3 = 0;
-
-var kHeaderSize = 8;
-var kPageSize = 65536;
-
-function bytesWithHeader() {
-  var buffer = new ArrayBuffer(kHeaderSize + arguments.length);
-  var view = new Uint8Array(buffer);
-  view[0] = kWasmH0;
-  view[1] = kWasmH1;
-  view[2] = kWasmH2;
-  view[3] = kWasmH3;
-  view[4] = kWasmV0;
-  view[5] = kWasmV1;
-  view[6] = kWasmV2;
-  view[7] = kWasmV3;
-  for (var i = 0; i < arguments.length; i++) {
-    var val = arguments[i];
-    if ((typeof val) == "string") val = val.charCodeAt(0);
-    view[kHeaderSize + i] = val | 0;
-  }
-  return buffer;
-}
-
-let kDeclNoLocals = 0;
-
-// Section declaration constants
-let kUnknownSectionCode = 0;
-let kTypeSectionCode = 1;      // Function signature declarations
-let kImportSectionCode = 2;    // Import declarations
-let kFunctionSectionCode = 3;  // Function declarations
-let kTableSectionCode = 4;     // Indirect function table and other tables
-let kMemorySectionCode = 5;    // Memory attributes
-let kGlobalSectionCode = 6;    // Global declarations
-let kExportSectionCode = 7;    // Exports
-let kStartSectionCode = 8;     // Start function declaration
-let kElementSectionCode = 9;  // Elements section
-let kCodeSectionCode = 10;      // Function code
-let kDataSectionCode = 11;     // Data segments
-let kNameSectionCode = 12;     // Name section (encoded as string)
-
-let kWasmFunctionTypeForm = 0x60;
-let kWasmAnyFunctionTypeForm = 0x70;
-
-let kResizableMaximumFlag = 1;
-
-// Function declaration flags
-let kDeclFunctionName   = 0x01;
-let kDeclFunctionImport = 0x02;
-let kDeclFunctionLocals = 0x04;
-let kDeclFunctionExport = 0x08;
-
-// Local types
-let kWasmStmt = 0x40;
-let kWasmI32 = 0x7f;
-let kWasmI64 = 0x7e;
-let kWasmF32 = 0x7d;
-let kWasmF64 = 0x7c;
-let kWasmS128 = 0x7b;
-
-let kExternalFunction = 0;
-let kExternalTable = 1;
-let kExternalMemory = 2;
-let kExternalGlobal = 3;
-
-let kTableZero = 0;
-let kMemoryZero = 0;
-
-// Useful signatures
-let kSig_i_i = makeSig([kWasmI32], [kWasmI32]);
-let kSig_l_l = makeSig([kWasmI64], [kWasmI64]);
-let kSig_i_l = makeSig([kWasmI64], [kWasmI32]);
-let kSig_i_ii = makeSig([kWasmI32, kWasmI32], [kWasmI32]);
-let kSig_i_iii = makeSig([kWasmI32, kWasmI32, kWasmI32], [kWasmI32]);
-let kSig_d_dd = makeSig([kWasmF64, kWasmF64], [kWasmF64]);
-let kSig_l_ll = makeSig([kWasmI64, kWasmI64], [kWasmI64]);
-let kSig_i_dd = makeSig([kWasmF64, kWasmF64], [kWasmI32]);
-let kSig_v_v = makeSig([], []);
-let kSig_i_v = makeSig([], [kWasmI32]);
-let kSig_l_v = makeSig([], [kWasmI64]);
-let kSig_f_v = makeSig([], [kWasmF64]);
-let kSig_d_v = makeSig([], [kWasmF64]);
-let kSig_v_i = makeSig([kWasmI32], []);
-let kSig_v_ii = makeSig([kWasmI32, kWasmI32], []);
-let kSig_v_iii = makeSig([kWasmI32, kWasmI32, kWasmI32], []);
-let kSig_v_l = makeSig([kWasmI64], []);
-let kSig_v_d = makeSig([kWasmF64], []);
-let kSig_v_dd = makeSig([kWasmF64, kWasmF64], []);
-let kSig_v_ddi = makeSig([kWasmF64, kWasmF64, kWasmI32], []);
-let kSig_s_v = makeSig([], [kWasmS128]);
-
-function makeSig(params, results) {
-  return {params: params, results: results};
-}
-
-function makeSig_v_x(x) {
-  return makeSig([x], []);
-}
-
-function makeSig_v_xx(x) {
-  return makeSig([x, x], []);
-}
-
-function makeSig_r_v(r) {
-  return makeSig([], [r]);
-}
-
-function makeSig_r_x(r, x) {
-  return makeSig([x], [r]);
-}
-
-function makeSig_r_xx(r, x) {
-  return makeSig([x, x], [r]);
-}
-
-// Opcodes
-let kExprUnreachable = 0x00;
-let kExprNop = 0x01;
-let kExprBlock = 0x02;
-let kExprLoop = 0x03;
-let kExprIf = 0x04;
-let kExprElse = 0x05;
-let kExprTry = 0x06;
-let kExprCatch = 0x07;
-let kExprThrow = 0x08;
-let kExprEnd = 0x0b;
-let kExprBr = 0x0c;
-let kExprBrIf = 0x0d;
-let kExprBrTable = 0x0e;
-let kExprReturn = 0x0f;
-let kExprCallFunction = 0x10;
-let kExprCallIndirect = 0x11;
-let kExprDrop = 0x1a;
-let kExprSelect = 0x1b;
-let kExprGetLocal = 0x20;
-let kExprSetLocal = 0x21;
-let kExprTeeLocal = 0x22;
-let kExprGetGlobal = 0x23;
-let kExprSetGlobal = 0x24;
-let kExprI32Const = 0x41;
-let kExprI64Const = 0x42;
-let kExprF32Const = 0x43;
-let kExprF64Const = 0x44;
-let kExprI32LoadMem = 0x28;
-let kExprI64LoadMem = 0x29;
-let kExprF32LoadMem = 0x2a;
-let kExprF64LoadMem = 0x2b;
-let kExprI32LoadMem8S = 0x2c;
-let kExprI32LoadMem8U = 0x2d;
-let kExprI32LoadMem16S = 0x2e;
-let kExprI32LoadMem16U = 0x2f;
-let kExprI64LoadMem8S = 0x30;
-let kExprI64LoadMem8U = 0x31;
-let kExprI64LoadMem16S = 0x32;
-let kExprI64LoadMem16U = 0x33;
-let kExprI64LoadMem32S = 0x34;
-let kExprI64LoadMem32U = 0x35;
-let kExprI32StoreMem = 0x36;
-let kExprI64StoreMem = 0x37;
-let kExprF32StoreMem = 0x38;
-let kExprF64StoreMem = 0x39;
-let kExprI32StoreMem8 = 0x3a;
-let kExprI32StoreMem16 = 0x3b;
-let kExprI64StoreMem8 = 0x3c;
-let kExprI64StoreMem16 = 0x3d;
-let kExprI64StoreMem32 = 0x3e;
-let kExprMemorySize = 0x3f;
-let kExprGrowMemory = 0x40;
-let kExprI32Eqz = 0x45;
-let kExprI32Eq = 0x46;
-let kExprI32Ne = 0x47;
-let kExprI32LtS = 0x48;
-let kExprI32LtU = 0x49;
-let kExprI32GtS = 0x4a;
-let kExprI32GtU = 0x4b;
-let kExprI32LeS = 0x4c;
-let kExprI32LeU = 0x4d;
-let kExprI32GeS = 0x4e;
-let kExprI32GeU = 0x4f;
-let kExprI64Eqz = 0x50;
-let kExprI64Eq = 0x51;
-let kExprI64Ne = 0x52;
-let kExprI64LtS = 0x53;
-let kExprI64LtU = 0x54;
-let kExprI64GtS = 0x55;
-let kExprI64GtU = 0x56;
-let kExprI64LeS = 0x57;
-let kExprI64LeU = 0x58;
-let kExprI64GeS = 0x59;
-let kExprI64GeU = 0x5a;
-let kExprF32Eq = 0x5b;
-let kExprF32Ne = 0x5c;
-let kExprF32Lt = 0x5d;
-let kExprF32Gt = 0x5e;
-let kExprF32Le = 0x5f;
-let kExprF32Ge = 0x60;
-let kExprF64Eq = 0x61;
-let kExprF64Ne = 0x62;
-let kExprF64Lt = 0x63;
-let kExprF64Gt = 0x64;
-let kExprF64Le = 0x65;
-let kExprF64Ge = 0x66;
-let kExprI32Clz = 0x67;
-let kExprI32Ctz = 0x68;
-let kExprI32Popcnt = 0x69;
-let kExprI32Add = 0x6a;
-let kExprI32Sub = 0x6b;
-let kExprI32Mul = 0x6c;
-let kExprI32DivS = 0x6d;
-let kExprI32DivU = 0x6e;
-let kExprI32RemS = 0x6f;
-let kExprI32RemU = 0x70;
-let kExprI32And = 0x71;
-let kExprI32Ior = 0x72;
-let kExprI32Xor = 0x73;
-let kExprI32Shl = 0x74;
-let kExprI32ShrS = 0x75;
-let kExprI32ShrU = 0x76;
-let kExprI32Rol = 0x77;
-let kExprI32Ror = 0x78;
-let kExprI64Clz = 0x79;
-let kExprI64Ctz = 0x7a;
-let kExprI64Popcnt = 0x7b;
-let kExprI64Add = 0x7c;
-let kExprI64Sub = 0x7d;
-let kExprI64Mul = 0x7e;
-let kExprI64DivS = 0x7f;
-let kExprI64DivU = 0x80;
-let kExprI64RemS = 0x81;
-let kExprI64RemU = 0x82;
-let kExprI64And = 0x83;
-let kExprI64Ior = 0x84;
-let kExprI64Xor = 0x85;
-let kExprI64Shl = 0x86;
-let kExprI64ShrS = 0x87;
-let kExprI64ShrU = 0x88;
-let kExprI64Rol = 0x89;
-let kExprI64Ror = 0x8a;
-let kExprF32Abs = 0x8b;
-let kExprF32Neg = 0x8c;
-let kExprF32Ceil = 0x8d;
-let kExprF32Floor = 0x8e;
-let kExprF32Trunc = 0x8f;
-let kExprF32NearestInt = 0x90;
-let kExprF32Sqrt = 0x91;
-let kExprF32Add = 0x92;
-let kExprF32Sub = 0x93;
-let kExprF32Mul = 0x94;
-let kExprF32Div = 0x95;
-let kExprF32Min = 0x96;
-let kExprF32Max = 0x97;
-let kExprF32CopySign = 0x98;
-let kExprF64Abs = 0x99;
-let kExprF64Neg = 0x9a;
-let kExprF64Ceil = 0x9b;
-let kExprF64Floor = 0x9c;
-let kExprF64Trunc = 0x9d;
-let kExprF64NearestInt = 0x9e;
-let kExprF64Sqrt = 0x9f;
-let kExprF64Add = 0xa0;
-let kExprF64Sub = 0xa1;
-let kExprF64Mul = 0xa2;
-let kExprF64Div = 0xa3;
-let kExprF64Min = 0xa4;
-let kExprF64Max = 0xa5;
-let kExprF64CopySign = 0xa6;
-let kExprI32ConvertI64 = 0xa7;
-let kExprI32SConvertF32 = 0xa8;
-let kExprI32UConvertF32 = 0xa9;
-let kExprI32SConvertF64 = 0xaa;
-let kExprI32UConvertF64 = 0xab;
-let kExprI64SConvertI32 = 0xac;
-let kExprI64UConvertI32 = 0xad;
-let kExprI64SConvertF32 = 0xae;
-let kExprI64UConvertF32 = 0xaf;
-let kExprI64SConvertF64 = 0xb0;
-let kExprI64UConvertF64 = 0xb1;
-let kExprF32SConvertI32 = 0xb2;
-let kExprF32UConvertI32 = 0xb3;
-let kExprF32SConvertI64 = 0xb4;
-let kExprF32UConvertI64 = 0xb5;
-let kExprF32ConvertF64 = 0xb6;
-let kExprF64SConvertI32 = 0xb7;
-let kExprF64UConvertI32 = 0xb8;
-let kExprF64SConvertI64 = 0xb9;
-let kExprF64UConvertI64 = 0xba;
-let kExprF64ConvertF32 = 0xbb;
-let kExprI32ReinterpretF32 = 0xbc;
-let kExprI64ReinterpretF64 = 0xbd;
-let kExprF32ReinterpretI32 = 0xbe;
-let kExprF64ReinterpretI64 = 0xbf;
-
-let kTrapUnreachable          = 0;
-let kTrapMemOutOfBounds       = 1;
-let kTrapDivByZero            = 2;
-let kTrapDivUnrepresentable   = 3;
-let kTrapRemByZero            = 4;
-let kTrapFloatUnrepresentable = 5;
-let kTrapFuncInvalid          = 6;
-let kTrapFuncSigMismatch      = 7;
-let kTrapInvalidIndex         = 8;
-
-let kTrapMsgs = [
-  "unreachable",
-  "memory access out of bounds",
-  "divide by zero",
-  "divide result unrepresentable",
-  "remainder by zero",
-  "integer result unrepresentable",
-  "invalid function",
-  "function signature mismatch",
-  "invalid index into function table"
-];
-
-function assertTraps(trap, code) {
-    var threwException = true;
-    try {
-      if (typeof code === 'function') {
-        code();
-      } else {
-        eval(code);
-      }
-      threwException = false;
-    } catch (e) {
-      assertEquals("object", typeof e);
-      assertEquals(kTrapMsgs[trap], e.message);
-      // Success.
-      return;
-    }
-    throw new MjsUnitAssertionError("Did not trap, expected: " + kTrapMsgs[trap]);
-}
-
-function assertWasmThrows(value, code) {
-    assertEquals("number", typeof(value));
-    try {
-      if (typeof code === 'function') {
-        code();
-      } else {
-        eval(code);
-      }
-    } catch (e) {
-      assertEquals("number", typeof e);
-      assertEquals(value, e);
-      // Success.
-      return;
-    }
-    throw new MjsUnitAssertionError("Did not throw at all, expected: " + value);
-}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/wasm-module-builder.js b/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/wasm-module-builder.js
deleted file mode 100644
index 6e9284e..0000000
--- a/LayoutTests/imported/w3c/web-platform-tests/wasm/jsapi/wasm-module-builder.js
+++ /dev/null
@@ -1,555 +0,0 @@
-// Copyright 2016 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Used for encoding f32 and double constants to bits.
-let __buffer = new ArrayBuffer(8);
-let byte_view = new Int8Array(__buffer);
-let f32_view = new Float32Array(__buffer);
-let f64_view = new Float64Array(__buffer);
-
-class Binary extends Array {
-  emit_u8(val) {
-    this.push(val);
-  }
-
-  emit_u16(val) {
-    this.push(val & 0xff);
-    this.push((val >> 8) & 0xff);
-  }
-
-  emit_u32(val) {
-    this.push(val & 0xff);
-    this.push((val >> 8) & 0xff);
-    this.push((val >> 16) & 0xff);
-    this.push((val >> 24) & 0xff);
-  }
-
-  emit_u32v(val) {
-    while (true) {
-      let v = val & 0xff;
-      val = val >>> 7;
-      if (val == 0) {
-        this.push(v);
-        break;
-      }
-      this.push(v | 0x80);
-    }
-  }
-
-  emit_bytes(data) {
-    for (let i = 0; i < data.length; i++) {
-      this.push(data[i] & 0xff);
-    }
-  }
-
-  emit_string(string) {
-    // When testing illegal names, we pass a byte array directly.
-    if (string instanceof Array) {
-      this.emit_u32v(string.length);
-      this.emit_bytes(string);
-      return;
-    }
-
-    // This is the hacky way to convert a JavaScript string to a UTF8 encoded
-    // string only containing single-byte characters.
-    let string_utf8 = unescape(encodeURIComponent(string));
-    this.emit_u32v(string_utf8.length);
-    for (let i = 0; i < string_utf8.length; i++) {
-      this.emit_u8(string_utf8.charCodeAt(i));
-    }
-  }
-
-  emit_header() {
-    this.push(kWasmH0, kWasmH1, kWasmH2, kWasmH3,
-              kWasmV0, kWasmV1, kWasmV2, kWasmV3);
-  }
-
-  emit_section(section_code, content_generator) {
-    // Emit section name.
-    this.emit_u8(section_code);
-    // Emit the section to a temporary buffer: its full length isn't know yet.
-    let section = new Binary;
-    content_generator(section);
-    // Emit section length.
-    this.emit_u32v(section.length);
-    // Copy the temporary buffer.
-    this.push(...section);
-  }
-}
-
-class WasmFunctionBuilder {
-  constructor(module, name, type_index) {
-    this.module = module;
-    this.name = name;
-    this.type_index = type_index;
-    this.body = [];
-  }
-
-  exportAs(name) {
-    this.module.addExport(name, this.index);
-    return this;
-  }
-
-  exportFunc() {
-    this.exportAs(this.name);
-    return this;
-  }
-
-  addBody(body) {
-    this.body = body;
-    return this;
-  }
-
-  addLocals(locals) {
-    this.locals = locals;
-    return this;
-  }
-
-  end() {
-    return this.module;
-  }
-}
-
-class WasmGlobalBuilder {
-  constructor(module, type, mutable) {
-    this.module = module;
-    this.type = type;
-    this.mutable = mutable;
-    this.init = 0;
-  }
-
-  exportAs(name) {
-    this.module.exports.push({name: name, kind: kExternalGlobal,
-                              index: this.index});
-    return this;
-  }
-}
-
-class WasmModuleBuilder {
-  constructor() {
-    this.types = [];
-    this.imports = [];
-    this.exports = [];
-    this.globals = [];
-    this.functions = [];
-    this.function_table = [];
-    this.function_table_length = 0;
-    this.function_table_inits = [];
-    this.segments = [];
-    this.explicit = [];
-    this.num_imported_funcs = 0;
-    this.num_imported_globals = 0;
-    return this;
-  }
-
-  addStart(start_index) {
-    this.start_index = start_index;
-    return this;
-  }
-
-  addMemory(min, max, exp) {
-    this.memory = {min: min, max: max, exp: exp};
-    return this;
-  }
-
-  addExplicitSection(bytes) {
-    this.explicit.push(bytes);
-    return this;
-  }
-
-  addType(type) {
-    // TODO: canonicalize types?
-    this.types.push(type);
-    return this.types.length - 1;
-  }
-
-  addGlobal(local_type, mutable) {
-    let glob = new WasmGlobalBuilder(this, local_type, mutable);
-    glob.index = this.globals.length + this.num_imported_globals;
-    this.globals.push(glob);
-    return glob;
-  }
-
-  addFunction(name, type) {
-    let type_index = (typeof type) == "number" ? type : this.addType(type);
-    let func = new WasmFunctionBuilder(this, name, type_index);
-    func.index = this.functions.length + this.num_imported_funcs;
-    this.functions.push(func);
-    return func;
-  }
-
-  addImport(module = "", name, type) {
-    let type_index = (typeof type) == "number" ? type : this.addType(type);
-    this.imports.push({module: module, name: name, kind: kExternalFunction,
-                       type: type_index});
-    return this.num_imported_funcs++;
-  }
-
-  addImportedGlobal(module = "", name, type) {
-    let o = {module: module, name: name, kind: kExternalGlobal, type: type,
-             mutable: false}
-    this.imports.push(o);
-    return this.num_imported_globals++;
-  }
-
-  addImportedMemory(module = "", name, initial = 0, maximum) {
-    let o = {module: module, name: name, kind: kExternalMemory,
-             initial: initial, maximum: maximum};
-    this.imports.push(o);
-    return this;
-  }
-
-  addImportedTable(module = "", name, initial, maximum) {
-    let o = {module: module, name: name, kind: kExternalTable, initial: initial,
-             maximum: maximum};
-    this.imports.push(o);
-  }
-
-  addExport(name, index) {
-    this.exports.push({name: name, kind: kExternalFunction, index: index});
-    return this;
-  }
-
-  addExportOfKind(name, kind, index) {
-    this.exports.push({name: name, kind: kind, index: index});
-    return this;
-  }
-
-  addDataSegment(addr, data, is_global = false) {
-    this.segments.push({addr: addr, data: data, is_global: is_global});
-    return this.segments.length - 1;
-  }
-
-  exportMemoryAs(name) {
-    this.exports.push({name: name, kind: kExternalMemory, index: 0});
-  }
-
-  addFunctionTableInit(base, is_global, array) {
-    this.function_table_inits.push({base: base, is_global: is_global,
-                                    array: array});
-    if (!is_global) {
-      var length = base + array.length;
-      if (length > this.function_table_length) {
-        this.function_table_length = length;
-      }
-    }
-    return this;
-  }
-
-  appendToTable(array) {
-    return this.addFunctionTableInit(this.function_table.length, false, array);
-  }
-
-  setFunctionTableLength(length) {
-    this.function_table_length = length;
-    return this;
-  }
-
-  toArray(debug = false) {
-    let binary = new Binary;
-    let wasm = this;
-
-    // Add header
-    binary.emit_header();
-
-    // Add type section
-    if (wasm.types.length > 0) {
-      if (debug) print("emitting types @ " + binary.length);
-      binary.emit_section(kTypeSectionCode, section => {
-        section.emit_u32v(wasm.types.length);
-        for (let type of wasm.types) {
-          section.emit_u8(kWasmFunctionTypeForm);
-          section.emit_u32v(type.params.length);
-          for (let param of type.params) {
-            section.emit_u8(param);
-          }
-          section.emit_u32v(type.results.length);
-          for (let result of type.results) {
-            section.emit_u8(result);
-          }
-        }
-      });
-    }
-
-    // Add imports section
-    if (wasm.imports.length > 0) {
-      if (debug) print("emitting imports @ " + binary.length);
-      binary.emit_section(kImportSectionCode, section => {
-        section.emit_u32v(wasm.imports.length);
-        for (let imp of wasm.imports) {
-          section.emit_string(imp.module);
-          section.emit_string(imp.name || '');
-          section.emit_u8(imp.kind);
-          if (imp.kind == kExternalFunction) {
-            section.emit_u32v(imp.type);
-          } else if (imp.kind == kExternalGlobal) {
-            section.emit_u32v(imp.type);
-            section.emit_u8(imp.mutable);
-          } else if (imp.kind == kExternalMemory) {
-            var has_max = (typeof imp.maximum) != "undefined";
-            section.emit_u8(has_max ? 1 : 0); // flags
-            section.emit_u32v(imp.initial); // initial
-            if (has_max) section.emit_u32v(imp.maximum); // maximum
-          } else if (imp.kind == kExternalTable) {
-            section.emit_u8(kWasmAnyFunctionTypeForm);
-            var has_max = (typeof imp.maximum) != "undefined";
-            section.emit_u8(has_max ? 1 : 0); // flags
-            section.emit_u32v(imp.initial); // initial
-            if (has_max) section.emit_u32v(imp.maximum); // maximum
-          } else {
-            throw new Error("unknown/unsupported import kind " + imp.kind);
-          }
-        }
-      });
-    }
-
-    // Add functions declarations
-    let has_names = false;
-    let names = false;
-    if (wasm.functions.length > 0) {
-      if (debug) print("emitting function decls @ " + binary.length);
-      binary.emit_section(kFunctionSectionCode, section => {
-        section.emit_u32v(wasm.functions.length);
-        for (let func of wasm.functions) {
-          has_names = has_names || (func.name != undefined &&
-                                   func.name.length > 0);
-          section.emit_u32v(func.type_index);
-        }
-      });
-    }
-
-    // Add function_table.
-    if (wasm.function_table_length > 0) {
-      if (debug) print("emitting table @ " + binary.length);
-      binary.emit_section(kTableSectionCode, section => {
-        section.emit_u8(1);  // one table entry
-        section.emit_u8(kWasmAnyFunctionTypeForm);
-        section.emit_u8(1);
-        section.emit_u32v(wasm.function_table_length);
-        section.emit_u32v(wasm.function_table_length);
-      });
-    }
-
-    // Add memory section
-    if (wasm.memory != undefined) {
-      if (debug) print("emitting memory @ " + binary.length);
-      binary.emit_section(kMemorySectionCode, section => {
-        section.emit_u8(1);  // one memory entry
-        section.emit_u32v(kResizableMaximumFlag);
-        section.emit_u32v(wasm.memory.min);
-        section.emit_u32v(wasm.memory.max);
-      });
-    }
-
-    // Add global section.
-    if (wasm.globals.length > 0) {
-      if (debug) print ("emitting globals @ " + binary.length);
-      binary.emit_section(kGlobalSectionCode, section => {
-        section.emit_u32v(wasm.globals.length);
-        for (let global of wasm.globals) {
-          section.emit_u8(global.type);
-          section.emit_u8(global.mutable);
-          if ((typeof global.init_index) == "undefined") {
-            // Emit a constant initializer.
-            switch (global.type) {
-            case kWasmI32:
-              section.emit_u8(kExprI32Const);
-              section.emit_u32v(global.init);
-              break;
-            case kWasmI64:
-              section.emit_u8(kExprI64Const);
-              section.emit_u8(global.init);
-              break;
-            case kWasmF32:
-              section.emit_u8(kExprF32Const);
-              f32_view[0] = global.init;
-              section.emit_u8(byte_view[0]);
-              section.emit_u8(byte_view[1]);
-              section.emit_u8(byte_view[2]);
-              section.emit_u8(byte_view[3]);
-              break;
-            case kWasmF64:
-              section.emit_u8(kExprF64Const);
-              f64_view[0] = global.init;
-              section.emit_u8(byte_view[0]);
-              section.emit_u8(byte_view[1]);
-              section.emit_u8(byte_view[2]);
-              section.emit_u8(byte_view[3]);
-              section.emit_u8(byte_view[4]);
-              section.emit_u8(byte_view[5]);
-              section.emit_u8(byte_view[6]);
-              section.emit_u8(byte_view[7]);
-              break;
-            }
-          } else {
-            // Emit a global-index initializer.
-            section.emit_u8(kExprGetGlobal);
-            section.emit_u32v(global.init_index);
-          }
-          section.emit_u8(kExprEnd);  // end of init expression
-        }
-      });
-    }
-
-    // Add export table.
-    var mem_export = (wasm.memory != undefined && wasm.memory.exp);
-    var exports_count = wasm.exports.length + (mem_export ? 1 : 0);
-    if (exports_count > 0) {
-      if (debug) print("emitting exports @ " + binary.length);
-      binary.emit_section(kExportSectionCode, section => {
-        section.emit_u32v(exports_count);
-        for (let exp of wasm.exports) {
-          section.emit_string(exp.name);
-          section.emit_u8(exp.kind);
-          section.emit_u32v(exp.index);
-        }
-        if (mem_export) {
-          section.emit_string("memory");
-          section.emit_u8(kExternalMemory);
-          section.emit_u8(0);
-        }
-      });
-    }
-
-    // Add start function section.
-    if (wasm.start_index != undefined) {
-      if (debug) print("emitting start function @ " + binary.length);
-      binary.emit_section(kStartSectionCode, section => {
-        section.emit_u32v(wasm.start_index);
-      });
-    }
-
-    // Add table elements.
-    if (wasm.function_table_inits.length > 0) {
-      if (debug) print("emitting table @ " + binary.length);
-      binary.emit_section(kElementSectionCode, section => {
-        var inits = wasm.function_table_inits;
-        section.emit_u32v(inits.length);
-        section.emit_u8(0); // table index
-
-        for (let init of inits) {
-          if (init.is_global) {
-            section.emit_u8(kExprGetGlobal);
-          } else {
-            section.emit_u8(kExprI32Const);
-          }
-          section.emit_u32v(init.base);
-          section.emit_u8(kExprEnd);
-          section.emit_u32v(init.array.length);
-          for (let index of init.array) {
-            section.emit_u32v(index);
-          }
-        }
-      });
-    }
-
-    // Add function bodies.
-    if (wasm.functions.length > 0) {
-      // emit function bodies
-      if (debug) print("emitting code @ " + binary.length);
-      binary.emit_section(kCodeSectionCode, section => {
-        section.emit_u32v(wasm.functions.length);
-        for (let func of wasm.functions) {
-          // Function body length will be patched later.
-          let local_decls = [];
-          let l = func.locals;
-          if (l != undefined) {
-            let local_decls_count = 0;
-            if (l.i32_count > 0) {
-              local_decls.push({count: l.i32_count, type: kWasmI32});
-            }
-            if (l.i64_count > 0) {
-              local_decls.push({count: l.i64_count, type: kWasmI64});
-            }
-            if (l.f32_count > 0) {
-              local_decls.push({count: l.f32_count, type: kWasmF32});
-            }
-            if (l.f64_count > 0) {
-              local_decls.push({count: l.f64_count, type: kWasmF64});
-            }
-          }
-
-          let header = new Binary;
-          header.emit_u32v(local_decls.length);
-          for (let decl of local_decls) {
-            header.emit_u32v(decl.count);
-            header.emit_u8(decl.type);
-          }
-
-          section.emit_u32v(header.length + func.body.length);
-          section.emit_bytes(header);
-          section.emit_bytes(func.body);
-        }
-      });
-    }
-
-    // Add data segments.
-    if (wasm.segments.length > 0) {
-      if (debug) print("emitting data segments @ " + binary.length);
-      binary.emit_section(kDataSectionCode, section => {
-        section.emit_u32v(wasm.segments.length);
-        for (let seg of wasm.segments) {
-          section.emit_u8(0);  // linear memory index 0
-          if (seg.is_global) {
-            // initializer is a global variable
-            section.emit_u8(kExprGetGlobal);
-            section.emit_u32v(seg.addr);
-          } else {
-            // initializer is a constant
-            section.emit_u8(kExprI32Const);
-            section.emit_u32v(seg.addr);
-          }
-          section.emit_u8(kExprEnd);
-          section.emit_u32v(seg.data.length);
-          section.emit_bytes(seg.data);
-        }
-      });
-    }
-
-    // Add any explicitly added sections
-    for (let exp of wasm.explicit) {
-      if (debug) print("emitting explicit @ " + binary.length);
-      binary.emit_bytes(exp);
-    }
-
-    // Add function names.
-    if (has_names) {
-      if (debug) print("emitting names @ " + binary.length);
-      binary.emit_section(kUnknownSectionCode, section => {
-        section.emit_string("name");
-        var count = wasm.functions.length + wasm.num_imported_funcs;
-        section.emit_u32v(count);
-        for (var i = 0; i < wasm.num_imported_funcs; i++) {
-          section.emit_u8(0); // empty string
-          section.emit_u8(0); // local names count == 0
-        }
-        for (let func of wasm.functions) {
-          var name = func.name == undefined ? "" : func.name;
-          section.emit_string(name);
-          section.emit_u8(0);  // local names count == 0
-        }
-      });
-    }
-
-    return binary;
-  }
-
-  toBuffer(debug = false) {
-    let bytes = this.toArray(debug);
-    let buffer = new ArrayBuffer(bytes.length);
-    let view = new Uint8Array(buffer);
-    for (let i = 0; i < bytes.length; i++) {
-      let val = bytes[i];
-      if ((typeof val) == "string") val = val.charCodeAt(0);
-      view[i] = val | 0;
-    }
-    return new Uint8Array(buffer);
-  }
-
-  instantiate(...args) {
-    let module = new WebAssembly.Module(this.toBuffer());
-    let instance = new WebAssembly.Instance(module, ...args);
-    return instance;
-  }
-}
diff --git a/LayoutTests/platform/ios-simulator/TestExpectations b/LayoutTests/platform/ios-simulator/TestExpectations
index 0408652..76c5689 100644
--- a/LayoutTests/platform/ios-simulator/TestExpectations
+++ b/LayoutTests/platform/ios-simulator/TestExpectations
@@ -122,6 +122,4 @@
 
 webkit.org/b/195466 imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-width-1000px.html [ Pass Failure ]
 webkit.org/b/195466 imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/ready-states/autoplay.html [ Pass Failure ]
-webkit.org/b/195466 imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/error-codes/error.html [ Pass Failure ]
-
-imported/w3c/web-platform-tests/wasm [ Skip ]
+webkit.org/b/195466 imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/error-codes/error.html [ Pass Failure ]
\ No newline at end of file
diff --git a/LayoutTests/platform/win/TestExpectations b/LayoutTests/platform/win/TestExpectations
index 0eed029..f32b4a8 100644
--- a/LayoutTests/platform/win/TestExpectations
+++ b/LayoutTests/platform/win/TestExpectations
@@ -4423,5 +4423,3 @@
 webkit.org/b/198112 http/tests/security/showModalDialog-sync-cross-origin-page-load2.html [ Skip ]
 
 webkit.org/b/198679 fast/events/fire-mousedown-while-pressing-mouse-button.html [ Failure ]
-
-imported/w3c/web-platform-tests/wasm [ Skip ]
diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt
index 3fe5174..e43bb6b 100644
--- a/Source/JavaScriptCore/CMakeLists.txt
+++ b/Source/JavaScriptCore/CMakeLists.txt
@@ -108,6 +108,7 @@
     wasm/js/WebAssemblyMemoryPrototype.cpp
     wasm/js/WebAssemblyModuleConstructor.cpp
     wasm/js/WebAssemblyModulePrototype.cpp
+    wasm/js/WebAssemblyPrototype.cpp
     wasm/js/WebAssemblyRuntimeErrorConstructor.cpp
     wasm/js/WebAssemblyRuntimeErrorPrototype.cpp
     wasm/js/WebAssemblyTableConstructor.cpp
@@ -1010,8 +1011,8 @@
     wasm/WasmPageCount.h
     wasm/WasmTierUpCount.h
 
-    wasm/js/JSWebAssembly.h
     wasm/js/JSWebAssemblyModule.h
+    wasm/js/WebAssemblyPrototype.h
 
 
     yarr/RegularExpression.h
@@ -1219,6 +1220,7 @@
     ${JAVASCRIPTCORE_DIR}/builtins/StringPrototype.js
     ${JAVASCRIPTCORE_DIR}/builtins/TypedArrayConstructor.js
     ${JAVASCRIPTCORE_DIR}/builtins/TypedArrayPrototype.js
+    ${JAVASCRIPTCORE_DIR}/builtins/WebAssemblyPrototype.js
 )
 
 add_custom_command(
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 6a7a715..345c750 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,16 @@
+2019-07-15  Michael Catanzaro  <mcatanzaro@igalia.com>
+
+        Unreviewed, rolling out r247440.
+
+        Broke builds
+
+        Reverted changeset:
+
+        "[JSC] Improve wasm wpt test results by fixing miscellaneous
+        issues"
+        https://bugs.webkit.org/show_bug.cgi?id=199783
+        https://trac.webkit.org/changeset/247440
+
 2019-07-15  Yusuke Suzuki  <ysuzuki@apple.com>
 
         [JSC] Improve wasm wpt test results by fixing miscellaneous issues
diff --git a/Source/JavaScriptCore/DerivedSources-input.xcfilelist b/Source/JavaScriptCore/DerivedSources-input.xcfilelist
index a76a5ed..5fc30d0 100644
--- a/Source/JavaScriptCore/DerivedSources-input.xcfilelist
+++ b/Source/JavaScriptCore/DerivedSources-input.xcfilelist
@@ -57,7 +57,7 @@
 $(PROJECT_DIR)/builtins/StringPrototype.js
 $(PROJECT_DIR)/builtins/TypedArrayConstructor.js
 $(PROJECT_DIR)/builtins/TypedArrayPrototype.js
-$(PROJECT_DIR)/builtins/WebAssembly.js
+$(PROJECT_DIR)/builtins/WebAssemblyPrototype.js
 $(PROJECT_DIR)/bytecode/BytecodeList.rb
 $(PROJECT_DIR)/create_hash_table
 $(PROJECT_DIR)/disassembler/udis86/optable.xml
@@ -183,6 +183,7 @@
 $(PROJECT_DIR)/wasm/js/WebAssemblyMemoryPrototype.cpp
 $(PROJECT_DIR)/wasm/js/WebAssemblyModuleConstructor.cpp
 $(PROJECT_DIR)/wasm/js/WebAssemblyModulePrototype.cpp
+$(PROJECT_DIR)/wasm/js/WebAssemblyPrototype.cpp
 $(PROJECT_DIR)/wasm/js/WebAssemblyRuntimeErrorConstructor.cpp
 $(PROJECT_DIR)/wasm/js/WebAssemblyRuntimeErrorPrototype.cpp
 $(PROJECT_DIR)/wasm/js/WebAssemblyTableConstructor.cpp
diff --git a/Source/JavaScriptCore/DerivedSources-output.xcfilelist b/Source/JavaScriptCore/DerivedSources-output.xcfilelist
index 6918b2a..818c74f 100644
--- a/Source/JavaScriptCore/DerivedSources-output.xcfilelist
+++ b/Source/JavaScriptCore/DerivedSources-output.xcfilelist
@@ -69,6 +69,7 @@
 $(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/WebAssemblyMemoryPrototype.lut.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/WebAssemblyModuleConstructor.lut.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/WebAssemblyModulePrototype.lut.h
+$(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/WebAssemblyPrototype.lut.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/WebAssemblyRuntimeErrorConstructor.lut.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/WebAssemblyRuntimeErrorPrototype.lut.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/JavaScriptCore/WebAssemblyTableConstructor.lut.h
diff --git a/Source/JavaScriptCore/DerivedSources.make b/Source/JavaScriptCore/DerivedSources.make
index b59fe06..8ed0ac7 100644
--- a/Source/JavaScriptCore/DerivedSources.make
+++ b/Source/JavaScriptCore/DerivedSources.make
@@ -119,7 +119,7 @@
     $(JavaScriptCore)/builtins/StringPrototype.js \
     $(JavaScriptCore)/builtins/TypedArrayConstructor.js \
     $(JavaScriptCore)/builtins/TypedArrayPrototype.js \
-    $(JavaScriptCore)/builtins/WebAssembly.js \
+    $(JavaScriptCore)/builtins/WebAssemblyPrototype.js \
 #
 
 # The combined output file depends on the contents of builtins and generator scripts, so
@@ -183,6 +183,7 @@
     WebAssemblyMemoryPrototype.lut.h \
     WebAssemblyModuleConstructor.lut.h \
     WebAssemblyModulePrototype.lut.h \
+    WebAssemblyPrototype.lut.h \
     WebAssemblyRuntimeErrorConstructor.lut.h \
     WebAssemblyRuntimeErrorPrototype.lut.h \
     WebAssemblyTableConstructor.lut.h \
diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
index 73f6ede..dd8fe4a 100644
--- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
+++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
@@ -1573,6 +1573,7 @@
 		AD2FCC1F1DB59CB200B3E736 /* WebAssemblyRuntimeErrorPrototype.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = AD2FCC131DB59C5900B3E736 /* WebAssemblyRuntimeErrorPrototype.lut.h */; };
 		AD2FCC201DB59CB200B3E736 /* WebAssemblyTableConstructor.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = AD2FCC141DB59C5900B3E736 /* WebAssemblyTableConstructor.lut.h */; };
 		AD2FCC211DB59CB200B3E736 /* WebAssemblyTablePrototype.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = AD2FCC151DB59C5900B3E736 /* WebAssemblyTablePrototype.lut.h */; };
+		AD2FCC2D1DB838FD00B3E736 /* WebAssemblyPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = AD2FCC271DB838C400B3E736 /* WebAssemblyPrototype.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		AD412B341E7B2E9E008AF157 /* WasmContext.h in Headers */ = {isa = PBXBuildFile; fileRef = AD412B321E7B2E8A008AF157 /* WasmContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		AD4252511E5D0E14009D2A97 /* FullCodeOrigin.h in Headers */ = {isa = PBXBuildFile; fileRef = AD4252501E5D0DEB009D2A97 /* FullCodeOrigin.h */; };
 		AD4937C41DDBE6140077C807 /* AbstractModuleRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = AD4937C21DDBE60A0077C807 /* AbstractModuleRecord.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -4511,6 +4512,8 @@
 		AD2FCC131DB59C5900B3E736 /* WebAssemblyRuntimeErrorPrototype.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAssemblyRuntimeErrorPrototype.lut.h; sourceTree = "<group>"; };
 		AD2FCC141DB59C5900B3E736 /* WebAssemblyTableConstructor.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAssemblyTableConstructor.lut.h; sourceTree = "<group>"; };
 		AD2FCC151DB59C5900B3E736 /* WebAssemblyTablePrototype.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAssemblyTablePrototype.lut.h; sourceTree = "<group>"; };
+		AD2FCC261DB838C400B3E736 /* WebAssemblyPrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebAssemblyPrototype.cpp; path = js/WebAssemblyPrototype.cpp; sourceTree = "<group>"; };
+		AD2FCC271DB838C400B3E736 /* WebAssemblyPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebAssemblyPrototype.h; path = js/WebAssemblyPrototype.h; sourceTree = "<group>"; };
 		AD2FCC321DC4045300B3E736 /* WasmFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WasmFormat.cpp; sourceTree = "<group>"; };
 		AD412B321E7B2E8A008AF157 /* WasmContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WasmContext.h; sourceTree = "<group>"; };
 		AD412B351E7B57C0008AF157 /* AllowMacroScratchRegisterUsageIf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AllowMacroScratchRegisterUsageIf.h; sourceTree = "<group>"; };
@@ -4813,7 +4816,6 @@
 		E39D9D841D39000600667282 /* InterpreterInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InterpreterInlines.h; sourceTree = "<group>"; };
 		E39DA4A41B7E8B7C0084F33A /* JSModuleRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSModuleRecord.cpp; sourceTree = "<group>"; };
 		E39DA4A51B7E8B7C0084F33A /* JSModuleRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSModuleRecord.h; sourceTree = "<group>"; };
-		E39E030D22D9EA3E00408C18 /* WebAssembly.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = WebAssembly.js; sourceTree = "<group>"; };
 		E39EEAF12281244C008474F4 /* ObjectToStringAdaptiveStructureWatchpoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ObjectToStringAdaptiveStructureWatchpoint.cpp; sourceTree = "<group>"; };
 		E39EEAF22281244C008474F4 /* ObjectToStringAdaptiveStructureWatchpoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ObjectToStringAdaptiveStructureWatchpoint.h; sourceTree = "<group>"; };
 		E3A0531621342B660022EC14 /* WasmStreamingParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WasmStreamingParser.h; sourceTree = "<group>"; };
@@ -8358,7 +8360,6 @@
 				A1E0451B1C25B4B100BB663C /* StringPrototype.js */,
 				534C457A1BC703DC007476A7 /* TypedArrayConstructor.js */,
 				53917E831B791CB8000EBD33 /* TypedArrayPrototype.js */,
-				E39E030D22D9EA3E00408C18 /* WebAssembly.js */,
 			);
 			path = builtins;
 			sourceTree = "<group>";
@@ -8421,6 +8422,8 @@
 				AD2FCB9B1DB585A600B3E736 /* WebAssemblyModulePrototype.h */,
 				AD4937C51DDCDCF00077C807 /* WebAssemblyModuleRecord.cpp */,
 				AD4937C61DDCDCF00077C807 /* WebAssemblyModuleRecord.h */,
+				AD2FCC261DB838C400B3E736 /* WebAssemblyPrototype.cpp */,
+				AD2FCC271DB838C400B3E736 /* WebAssemblyPrototype.h */,
 				AD2FCBBC1DB58DA400B3E736 /* WebAssemblyRuntimeErrorConstructor.cpp */,
 				AD2FCBBD1DB58DA400B3E736 /* WebAssemblyRuntimeErrorConstructor.h */,
 				AD2FCBBE1DB58DA400B3E736 /* WebAssemblyRuntimeErrorPrototype.cpp */,
@@ -10061,6 +10064,7 @@
 				AD2FCC031DB58DAD00B3E736 /* WebAssemblyModulePrototype.h in Headers */,
 				AD2FCC1D1DB59CB200B3E736 /* WebAssemblyModulePrototype.lut.h in Headers */,
 				AD4937C81DDD0AAE0077C807 /* WebAssemblyModuleRecord.h in Headers */,
+				AD2FCC2D1DB838FD00B3E736 /* WebAssemblyPrototype.h in Headers */,
 				AD2FCBF91DB58DAD00B3E736 /* WebAssemblyRuntimeErrorConstructor.h in Headers */,
 				AD2FCC1E1DB59CB200B3E736 /* WebAssemblyRuntimeErrorConstructor.lut.h in Headers */,
 				AD2FCBFB1DB58DAD00B3E736 /* WebAssemblyRuntimeErrorPrototype.h in Headers */,
diff --git a/Source/JavaScriptCore/Sources.txt b/Source/JavaScriptCore/Sources.txt
index ee54ad9..e41b755 100644
--- a/Source/JavaScriptCore/Sources.txt
+++ b/Source/JavaScriptCore/Sources.txt
@@ -1053,6 +1053,7 @@
 wasm/js/WebAssemblyModuleConstructor.cpp
 wasm/js/WebAssemblyModulePrototype.cpp
 wasm/js/WebAssemblyModuleRecord.cpp
+wasm/js/WebAssemblyPrototype.cpp
 wasm/js/WebAssemblyRuntimeErrorConstructor.cpp
 wasm/js/WebAssemblyRuntimeErrorPrototype.cpp
 wasm/js/WebAssemblyTableConstructor.cpp
diff --git a/Source/JavaScriptCore/builtins/WebAssembly.js b/Source/JavaScriptCore/builtins/WebAssemblyPrototype.js
similarity index 100%
rename from Source/JavaScriptCore/builtins/WebAssembly.js
rename to Source/JavaScriptCore/builtins/WebAssemblyPrototype.js
diff --git a/Source/JavaScriptCore/jit/Repatch.cpp b/Source/JavaScriptCore/jit/Repatch.cpp
index e388fb0..19e5c04 100644
--- a/Source/JavaScriptCore/jit/Repatch.cpp
+++ b/Source/JavaScriptCore/jit/Repatch.cpp
@@ -51,7 +51,6 @@
 #include "JSCInlines.h"
 #include "JSModuleNamespaceObject.h"
 #include "JSWebAssembly.h"
-#include "JSWebAssemblyModule.h"
 #include "LinkBuffer.h"
 #include "ModuleNamespaceAccessCase.h"
 #include "PolymorphicAccess.h"
@@ -63,8 +62,6 @@
 #include "StructureStubInfo.h"
 #include "SuperSampler.h"
 #include "ThunkGenerators.h"
-#include "WebAssemblyFunction.h"
-#include "WebAssemblyToJSCallee.h"
 #include <wtf/CommaPrinter.h>
 #include <wtf/ListDump.h>
 #include <wtf/StringPrintStream.h>
diff --git a/Source/JavaScriptCore/runtime/JSGlobalObject.cpp b/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
index b7cf0d0..eace92b 100644
--- a/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
+++ b/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
@@ -125,13 +125,6 @@
 #include "JSWeakObjectRef.h"
 #include "JSWeakSet.h"
 #include "JSWebAssembly.h"
-#include "JSWebAssemblyCompileError.h"
-#include "JSWebAssemblyInstance.h"
-#include "JSWebAssemblyLinkError.h"
-#include "JSWebAssemblyMemory.h"
-#include "JSWebAssemblyModule.h"
-#include "JSWebAssemblyRuntimeError.h"
-#include "JSWebAssemblyTable.h"
 #include "JSWithScope.h"
 #include "LazyClassStructureInlines.h"
 #include "LazyPropertyInlines.h"
@@ -185,22 +178,7 @@
 #include "WeakObjectRefPrototype.h"
 #include "WeakSetConstructor.h"
 #include "WeakSetPrototype.h"
-#include "WebAssemblyCompileErrorConstructor.h"
-#include "WebAssemblyCompileErrorPrototype.h"
-#include "WebAssemblyFunction.h"
-#include "WebAssemblyInstanceConstructor.h"
-#include "WebAssemblyInstancePrototype.h"
-#include "WebAssemblyLinkErrorConstructor.h"
-#include "WebAssemblyLinkErrorPrototype.h"
-#include "WebAssemblyMemoryConstructor.h"
-#include "WebAssemblyMemoryPrototype.h"
-#include "WebAssemblyModuleConstructor.h"
-#include "WebAssemblyModulePrototype.h"
-#include "WebAssemblyModuleRecord.h"
-#include "WebAssemblyRuntimeErrorConstructor.h"
-#include "WebAssemblyRuntimeErrorPrototype.h"
-#include "WebAssemblyTableConstructor.h"
-#include "WebAssemblyTablePrototype.h"
+#include "WebAssemblyPrototype.h"
 #include "WebAssemblyToJSCallee.h"
 #include <wtf/RandomNumber.h>
 
@@ -1082,6 +1060,7 @@
 
 #if ENABLE(WEBASSEMBLY)
     if (Wasm::isSupported()) {
+        auto* webAssemblyPrototype = WebAssemblyPrototype::create(vm, this, WebAssemblyPrototype::createStructure(vm, this, m_objectPrototype.get()));
         m_webAssemblyModuleRecordStructure.initLater(
             [] (const Initializer<Structure>& init) {
                 init.set(WebAssemblyModuleRecord::createStructure(init.vm, init.owner, init.owner->m_objectPrototype.get()));
@@ -1102,7 +1081,7 @@
             [] (const Initializer<Structure>& init) {
                 init.set(WebAssemblyToJSCallee::createStructure(init.vm, init.owner, jsNull()));
             });
-        auto* webAssembly = JSWebAssembly::create(vm, this, JSWebAssembly::createStructure(vm, this, m_objectPrototype.get()));
+        auto* webAssembly = JSWebAssembly::create(vm, this, JSWebAssembly::createStructure(vm, this, webAssemblyPrototype));
         putDirectWithoutTransition(vm, Identifier::fromString(exec, "WebAssembly"), webAssembly, static_cast<unsigned>(PropertyAttribute::DontEnum));
 
 #define CREATE_WEBASSEMBLY_PROTOTYPE(capitalName, lowerName, properName, instanceType, jsName, prototypeBase) \
diff --git a/Source/JavaScriptCore/runtime/JSModuleLoader.cpp b/Source/JavaScriptCore/runtime/JSModuleLoader.cpp
index fe5d601..fad7c7a 100644
--- a/Source/JavaScriptCore/runtime/JSModuleLoader.cpp
+++ b/Source/JavaScriptCore/runtime/JSModuleLoader.cpp
@@ -41,12 +41,12 @@
 #include "JSModuleNamespaceObject.h"
 #include "JSModuleRecord.h"
 #include "JSSourceCode.h"
-#include "JSWebAssembly.h"
 #include "ModuleAnalyzer.h"
 #include "Nodes.h"
 #include "ObjectConstructor.h"
 #include "Parser.h"
 #include "ParserError.h"
+#include "WebAssemblyPrototype.h"
 
 namespace JSC {
 
@@ -413,7 +413,7 @@
 
 #if ENABLE(WEBASSEMBLY)
     if (sourceCode.provider()->sourceType() == SourceProviderSourceType::WebAssembly)
-        return JSValue::encode(JSWebAssembly::instantiate(exec, deferred, moduleKey, jsSourceCode));
+        return JSValue::encode(WebAssemblyPrototype::instantiate(exec, deferred, moduleKey, jsSourceCode));
 #endif
 
     CodeProfiling profile(sourceCode);
diff --git a/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp b/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp
index 9cbb0bb..b9d4f32 100644
--- a/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp
+++ b/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp
@@ -28,30 +28,7 @@
 
 #if ENABLE(WEBASSEMBLY)
 
-#include "CatchScope.h"
-#include "Exception.h"
-#include "FunctionPrototype.h"
-#include "JSCBuiltins.h"
 #include "JSCInlines.h"
-#include "JSModuleNamespaceObject.h"
-#include "JSPromiseDeferred.h"
-#include "JSToWasm.h"
-#include "JSWebAssemblyHelpers.h"
-#include "JSWebAssemblyInstance.h"
-#include "JSWebAssemblyModule.h"
-#include "ObjectConstructor.h"
-#include "Options.h"
-#include "PromiseDeferredTimer.h"
-#include "StrongInlines.h"
-#include "ThrowScope.h"
-#include "WasmBBQPlan.h"
-#include "WasmToJS.h"
-#include "WasmWorklist.h"
-#include "WebAssemblyInstanceConstructor.h"
-#include "WebAssemblyModuleConstructor.h"
-
-using JSC::Wasm::Plan;
-using JSC::Wasm::BBQPlan;
 
 namespace JSC {
 
@@ -69,20 +46,16 @@
 
 #undef DEFINE_CALLBACK_FOR_CONSTRUCTOR
 
-static EncodedJSValue JSC_HOST_CALL webAssemblyCompileFunc(ExecState*);
-static EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateFunc(ExecState*);
-static EncodedJSValue JSC_HOST_CALL webAssemblyValidateFunc(ExecState*);
-
 }
 
 #include "JSWebAssembly.lut.h"
 
 namespace JSC {
 
-const ClassInfo JSWebAssembly::s_info = { "WebAssembly", &Base::s_info, &webAssemblyTable, nullptr, CREATE_METHOD_TABLE(JSWebAssembly) };
+const ClassInfo JSWebAssembly::s_info = { "WebAssembly", &Base::s_info, &jsWebAssemblyTable, nullptr, CREATE_METHOD_TABLE(JSWebAssembly) };
 
 /* Source for JSWebAssembly.lut.h
-@begin webAssemblyTable
+@begin jsWebAssemblyTable
   CompileError    createWebAssemblyCompileError  DontEnum|PropertyCallback
   Instance        createWebAssemblyInstance      DontEnum|PropertyCallback
   LinkError       createWebAssemblyLinkError     DontEnum|PropertyCallback
@@ -90,16 +63,13 @@
   Module          createWebAssemblyModule        DontEnum|PropertyCallback
   RuntimeError    createWebAssemblyRuntimeError  DontEnum|PropertyCallback
   Table           createWebAssemblyTable         DontEnum|PropertyCallback
-  compile         webAssemblyCompileFunc         Function 1
-  instantiate     webAssemblyInstantiateFunc     Function 1
-  validate        webAssemblyValidateFunc        Function 1
 @end
 */
 
-JSWebAssembly* JSWebAssembly::create(VM& vm, JSGlobalObject* globalObject, Structure* structure)
+JSWebAssembly* JSWebAssembly::create(VM& vm, JSGlobalObject*, Structure* structure)
 {
     auto* object = new (NotNull, allocateCell<JSWebAssembly>(vm.heap)) JSWebAssembly(vm, structure);
-    object->finishCreation(vm, globalObject);
+    object->finishCreation(vm);
     return object;
 }
 
@@ -108,14 +78,10 @@
     return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
 }
 
-void JSWebAssembly::finishCreation(VM& vm, JSGlobalObject* globalObject)
+void JSWebAssembly::finishCreation(VM& vm)
 {
     Base::finishCreation(vm);
     ASSERT(inherits(vm, info()));
-    if (Options::useWebAssemblyStreamingApi()) {
-        JSC_BUILTIN_FUNCTION_WITHOUT_TRANSITION("compileStreaming", webAssemblyCompileStreamingCodeGenerator, static_cast<unsigned>(PropertyAttribute::DontEnum));
-        JSC_BUILTIN_FUNCTION_WITHOUT_TRANSITION("instantiateStreaming", webAssemblyInstantiateStreamingCodeGenerator, static_cast<unsigned>(PropertyAttribute::DontEnum));
-    }
 }
 
 JSWebAssembly::JSWebAssembly(VM& vm, Structure* structure)
@@ -123,291 +89,6 @@
 {
 }
 
-static void reject(ExecState* exec, CatchScope& catchScope, JSPromiseDeferred* promise)
-{
-    Exception* exception = catchScope.exception();
-    ASSERT(exception);
-    catchScope.clearException();
-    promise->reject(exec, exception->value());
-    CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, void());
-}
-
-static void webAssemblyModuleValidateAsyncInternal(ExecState* exec, JSPromiseDeferred* promise, Vector<uint8_t>&& source)
-{
-    VM& vm = exec->vm();
-    auto* globalObject = exec->lexicalGlobalObject();
-
-    Vector<Strong<JSCell>> dependencies;
-    dependencies.append(Strong<JSCell>(vm, globalObject));
-
-    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
-
-    Wasm::Module::validateAsync(&vm.wasmContext, WTFMove(source), createSharedTask<Wasm::Module::CallbackType>([promise, globalObject, &vm] (Wasm::Module::ValidationResult&& result) mutable {
-        vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, globalObject, result = WTFMove(result), &vm] () mutable {
-            auto scope = DECLARE_CATCH_SCOPE(vm);
-            ExecState* exec = globalObject->globalExec();
-            JSValue module = JSWebAssemblyModule::createStub(vm, exec, globalObject->webAssemblyModuleStructure(), WTFMove(result));
-            if (UNLIKELY(scope.exception())) {
-                reject(exec, scope, promise);
-                return;
-            }
-
-            promise->resolve(exec, module);
-            CLEAR_AND_RETURN_IF_EXCEPTION(scope, void());
-        });
-    }));
-}
-
-static EncodedJSValue JSC_HOST_CALL webAssemblyCompileFunc(ExecState* exec)
-{
-    VM& vm = exec->vm();
-    auto throwScope = DECLARE_THROW_SCOPE(vm);
-    auto* globalObject = exec->lexicalGlobalObject();
-
-    JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject);
-    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
-
-    {
-        auto catchScope = DECLARE_CATCH_SCOPE(vm);
-        Vector<uint8_t> source = createSourceBufferFromValue(vm, exec, exec->argument(0));
-
-        if (UNLIKELY(catchScope.exception()))
-            reject(exec, catchScope, promise);
-        else
-            webAssemblyModuleValidateAsyncInternal(exec, promise, WTFMove(source));
-
-        return JSValue::encode(promise->promise());
-    }
-}
-
-enum class Resolve { WithInstance, WithModuleRecord, WithModuleAndInstance };
-static void resolve(VM& vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyInstance* instance, JSWebAssemblyModule* module, JSObject* importObject, Ref<Wasm::CodeBlock>&& codeBlock, Resolve resolveKind, Wasm::CreationMode creationMode)
-{
-    auto scope = DECLARE_CATCH_SCOPE(vm);
-    instance->finalizeCreation(vm, exec, WTFMove(codeBlock), importObject, creationMode);
-    RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
-
-    if (resolveKind == Resolve::WithInstance)
-        promise->resolve(exec, instance);
-    else if (resolveKind == Resolve::WithModuleRecord) {
-        auto* moduleRecord = instance->moduleNamespaceObject()->moduleRecord();
-        if (Options::dumpModuleRecord())
-            moduleRecord->dump();
-        promise->resolve(exec, moduleRecord);
-    } else {
-        JSObject* result = constructEmptyObject(exec);
-        result->putDirect(vm, Identifier::fromString(&vm, "module"_s), module);
-        result->putDirect(vm, Identifier::fromString(&vm, "instance"_s), instance);
-        promise->resolve(exec, result);
-    }
-    CLEAR_AND_RETURN_IF_EXCEPTION(scope, void());
-}
-
-void JSWebAssembly::webAssemblyModuleValidateAsync(ExecState* exec, JSPromiseDeferred* promise, Vector<uint8_t>&& source)
-{
-    VM& vm = exec->vm();
-    auto catchScope = DECLARE_CATCH_SCOPE(vm);
-    webAssemblyModuleValidateAsyncInternal(exec, promise, WTFMove(source));
-    CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, void());
-}
-
-static void instantiate(VM& vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyModule* module, JSObject* importObject, const Identifier& moduleKey, Resolve resolveKind, Wasm::CreationMode creationMode)
-{
-    auto scope = DECLARE_CATCH_SCOPE(vm);
-    // In order to avoid potentially recompiling a module. We first gather all the import/memory information prior to compiling code.
-    JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, moduleKey, module, importObject, exec->lexicalGlobalObject()->webAssemblyInstanceStructure(), Ref<Wasm::Module>(module->module()), creationMode);
-    RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
-
-    Vector<Strong<JSCell>> dependencies;
-    // The instance keeps the module alive.
-    dependencies.append(Strong<JSCell>(vm, instance));
-    dependencies.append(Strong<JSCell>(vm, importObject));
-    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
-    // Note: This completion task may or may not get called immediately.
-    module->module().compileAsync(&vm.wasmContext, instance->memoryMode(), createSharedTask<Wasm::CodeBlock::CallbackType>([promise, instance, module, importObject, resolveKind, creationMode, &vm] (Ref<Wasm::CodeBlock>&& refCodeBlock) mutable {
-        RefPtr<Wasm::CodeBlock> codeBlock = WTFMove(refCodeBlock);
-        vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, instance, module, importObject, resolveKind, creationMode, &vm, codeBlock = WTFMove(codeBlock)] () mutable {
-            ExecState* exec = instance->globalObject(vm)->globalExec();
-            resolve(vm, exec, promise, instance, module, importObject, codeBlock.releaseNonNull(), resolveKind, creationMode);
-        });
-    }), &Wasm::createJSToWasmWrapper, &Wasm::wasmToJSException);
-}
-
-static void compileAndInstantiate(VM& vm, ExecState* exec, JSPromiseDeferred* promise, const Identifier& moduleKey, JSValue buffer, JSObject* importObject, Resolve resolveKind, Wasm::CreationMode creationMode)
-{
-    auto scope = DECLARE_CATCH_SCOPE(vm);
-
-    auto* globalObject = exec->lexicalGlobalObject();
-
-    JSCell* moduleKeyCell = identifierToJSValue(vm, moduleKey).asCell();
-    Vector<Strong<JSCell>> dependencies;
-    dependencies.append(Strong<JSCell>(vm, importObject));
-    dependencies.append(Strong<JSCell>(vm, moduleKeyCell));
-    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
-
-    Vector<uint8_t> source = createSourceBufferFromValue(vm, exec, buffer);
-    RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
-
-    Wasm::Module::validateAsync(&vm.wasmContext, WTFMove(source), createSharedTask<Wasm::Module::CallbackType>([promise, importObject, moduleKeyCell, globalObject, resolveKind, creationMode, &vm] (Wasm::Module::ValidationResult&& result) mutable {
-        vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, importObject, moduleKeyCell, globalObject, result = WTFMove(result), resolveKind, creationMode, &vm] () mutable {
-            auto scope = DECLARE_CATCH_SCOPE(vm);
-            ExecState* exec = globalObject->globalExec();
-            JSWebAssemblyModule* module = JSWebAssemblyModule::createStub(vm, exec, globalObject->webAssemblyModuleStructure(), WTFMove(result));
-            if (UNLIKELY(scope.exception()))
-                return reject(exec, scope, promise);
-
-            const Identifier moduleKey = JSValue(moduleKeyCell).toPropertyKey(exec);
-            if (UNLIKELY(scope.exception()))
-                return reject(exec, scope, promise);
-
-            instantiate(vm, exec, promise, module, importObject, moduleKey, resolveKind, creationMode);
-        });
-    }));
-}
-
-JSValue JSWebAssembly::instantiate(ExecState* exec, JSPromiseDeferred* promise, const Identifier& moduleKey, JSValue argument)
-{
-    VM& vm = exec->vm();
-    compileAndInstantiate(vm, exec, promise, moduleKey, argument, nullptr, Resolve::WithModuleRecord, Wasm::CreationMode::FromModuleLoader);
-    return promise->promise();
-}
-
-static void webAssemblyModuleInstantinateAsyncInternal(ExecState* exec, JSPromiseDeferred* promise, Vector<uint8_t>&& source, JSObject* importObject)
-{
-    auto* globalObject = exec->lexicalGlobalObject();
-    VM& vm = exec->vm();
-
-    Vector<Strong<JSCell>> dependencies;
-    dependencies.append(Strong<JSCell>(vm, importObject));
-    dependencies.append(Strong<JSCell>(vm, globalObject));
-    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
-
-    Wasm::Module::validateAsync(&vm.wasmContext, WTFMove(source), createSharedTask<Wasm::Module::CallbackType>([promise, importObject, globalObject, &vm] (Wasm::Module::ValidationResult&& result) mutable {
-        vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, importObject, globalObject, result = WTFMove(result), &vm] () mutable {
-            auto scope = DECLARE_CATCH_SCOPE(vm);
-            ExecState* exec = globalObject->globalExec();
-            JSWebAssemblyModule* module = JSWebAssemblyModule::createStub(vm, exec, globalObject->webAssemblyModuleStructure(), WTFMove(result));
-            if (UNLIKELY(scope.exception()))
-                return reject(exec, scope, promise);
-
-            instantiate(vm, exec, promise, module, importObject, JSWebAssemblyInstance::createPrivateModuleKey(),  Resolve::WithModuleAndInstance, Wasm::CreationMode::FromJS);
-            CLEAR_AND_RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
-        });
-    }));
-}
-
-void JSWebAssembly::webAssemblyModuleInstantinateAsync(ExecState* exec, JSPromiseDeferred* promise, Vector<uint8_t>&& source, JSObject* importedObject)
-{
-    VM& vm = exec->vm();
-    auto catchScope = DECLARE_CATCH_SCOPE(vm);
-    webAssemblyModuleInstantinateAsyncInternal(exec, promise, WTFMove(source), importedObject);
-    CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, void());
-}
-
-static EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateFunc(ExecState* exec)
-{
-    VM& vm = exec->vm();
-    auto throwScope = DECLARE_THROW_SCOPE(vm);
-    auto* globalObject = exec->lexicalGlobalObject();
-
-    JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject);
-    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
-
-    {
-        auto catchScope = DECLARE_CATCH_SCOPE(vm);
-
-        JSValue importArgument = exec->argument(1);
-        JSObject* importObject = importArgument.getObject();
-        if (UNLIKELY(!importArgument.isUndefined() && !importObject)) {
-            promise->reject(exec, createTypeError(exec,
-                "second argument to WebAssembly.instantiate must be undefined or an Object"_s, defaultSourceAppender, runtimeTypeForValue(vm, importArgument)));
-            CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, JSValue::encode(promise->promise()));
-        } else {
-            JSValue firstArgument = exec->argument(0);
-            if (auto* module = jsDynamicCast<JSWebAssemblyModule*>(vm, firstArgument))
-                instantiate(vm, exec, promise, module, importObject, JSWebAssemblyInstance::createPrivateModuleKey(), Resolve::WithInstance, Wasm::CreationMode::FromJS);
-            else
-                compileAndInstantiate(vm, exec, promise, JSWebAssemblyInstance::createPrivateModuleKey(), firstArgument, importObject, Resolve::WithModuleAndInstance, Wasm::CreationMode::FromJS);
-        }
-
-        return JSValue::encode(promise->promise());
-    }
-}
-
-static EncodedJSValue JSC_HOST_CALL webAssemblyValidateFunc(ExecState* exec)
-{
-    VM& vm = exec->vm();
-    auto scope = DECLARE_THROW_SCOPE(vm);
-
-    auto [base, byteSize] = getWasmBufferFromValue(exec, exec->argument(0));
-    RETURN_IF_EXCEPTION(scope, encodedJSValue());
-    BBQPlan plan(&vm.wasmContext, BBQPlan::Validation, Plan::dontFinalize());
-    // FIXME: We might want to throw an OOM exception here if we detect that something will OOM.
-    // https://bugs.webkit.org/show_bug.cgi?id=166015
-    return JSValue::encode(jsBoolean(plan.parseAndValidateModule(base, byteSize)));
-}
-
-EncodedJSValue JSC_HOST_CALL webAssemblyCompileStreamingInternal(ExecState* exec)
-{
-    VM& vm = exec->vm();
-    auto* globalObject = exec->lexicalGlobalObject();
-    auto catchScope = DECLARE_CATCH_SCOPE(vm);
-
-    JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject);
-
-    Vector<Strong<JSCell>> dependencies;
-    dependencies.append(Strong<JSCell>(vm, globalObject));
-    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
-
-    if (globalObject->globalObjectMethodTable()->compileStreaming)
-        globalObject->globalObjectMethodTable()->compileStreaming(globalObject, exec, promise, exec->argument(0));
-    else {
-        // CompileStreaming is not supported in jsc, only in browser environment
-        ASSERT_NOT_REACHED();
-    }
-
-    CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, JSValue::encode(promise->promise()));
-
-    return JSValue::encode(promise->promise());
-}
-
-EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateStreamingInternal(ExecState* exec)
-{
-    VM& vm = exec->vm();
-    auto throwScope = DECLARE_THROW_SCOPE(vm);
-    auto* globalObject = exec->lexicalGlobalObject();
-
-    JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject);
-    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
-    {
-        auto catchScope = DECLARE_CATCH_SCOPE(vm);
-
-        JSValue importArgument = exec->argument(1);
-        JSObject* importObject = importArgument.getObject();
-        if (UNLIKELY(!importArgument.isUndefined() && !importObject)) {
-            promise->reject(exec, createTypeError(exec,
-                "second argument to WebAssembly.instantiateStreaming must be undefined or an Object"_s, defaultSourceAppender, runtimeTypeForValue(vm, importArgument)));
-            CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, JSValue::encode(promise->promise()));
-        } else {
-            if (globalObject->globalObjectMethodTable()->instantiateStreaming) {
-                Vector<Strong<JSCell>> dependencies;
-                dependencies.append(Strong<JSCell>(vm, globalObject));
-                dependencies.append(Strong<JSCell>(vm, importObject));
-                vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
-
-                // FIXME: <http://webkit.org/b/184888> if there's an importObject and it contains a Memory, then we can compile the module with the right memory type (fast or not) by looking at the memory's type.
-                globalObject->globalObjectMethodTable()->instantiateStreaming(globalObject, exec, promise, exec->argument(0), importObject);
-            } else {
-                // InstantiateStreaming is not supported in jsc, only in browser environment.
-                ASSERT_NOT_REACHED();
-            }
-        }
-        CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, JSValue::encode(promise->promise()));
-
-        return JSValue::encode(promise->promise());
-    }
-}
-
 } // namespace JSC
 
 #endif // ENABLE(WEBASSEMBLY)
diff --git a/Source/JavaScriptCore/wasm/js/JSWebAssembly.h b/Source/JavaScriptCore/wasm/js/JSWebAssembly.h
index fd409af..fb257e3 100644
--- a/Source/JavaScriptCore/wasm/js/JSWebAssembly.h
+++ b/Source/JavaScriptCore/wasm/js/JSWebAssembly.h
@@ -28,7 +28,31 @@
 #if ENABLE(WEBASSEMBLY)
 
 #include "JSObject.h"
-#include "JSPromiseDeferred.h"
+#include "JSWebAssemblyCompileError.h"
+#include "JSWebAssemblyInstance.h"
+#include "JSWebAssemblyLinkError.h"
+#include "JSWebAssemblyMemory.h"
+#include "JSWebAssemblyModule.h"
+#include "JSWebAssemblyRuntimeError.h"
+#include "JSWebAssemblyTable.h"
+#include "WebAssemblyCompileErrorConstructor.h"
+#include "WebAssemblyCompileErrorPrototype.h"
+#include "WebAssemblyFunction.h"
+#include "WebAssemblyInstanceConstructor.h"
+#include "WebAssemblyInstancePrototype.h"
+#include "WebAssemblyLinkErrorConstructor.h"
+#include "WebAssemblyLinkErrorPrototype.h"
+#include "WebAssemblyMemoryConstructor.h"
+#include "WebAssemblyMemoryPrototype.h"
+#include "WebAssemblyModuleConstructor.h"
+#include "WebAssemblyModulePrototype.h"
+#include "WebAssemblyModuleRecord.h"
+#include "WebAssemblyPrototype.h"
+#include "WebAssemblyRuntimeErrorConstructor.h"
+#include "WebAssemblyRuntimeErrorPrototype.h"
+#include "WebAssemblyTableConstructor.h"
+#include "WebAssemblyTablePrototype.h"
+#include "WebAssemblyToJSCallee.h"
 
 namespace JSC {
 
@@ -42,20 +66,13 @@
 
     DECLARE_INFO;
 
-    JS_EXPORT_PRIVATE static void webAssemblyModuleValidateAsync(ExecState*, JSPromiseDeferred*, Vector<uint8_t>&&);
-    JS_EXPORT_PRIVATE static void webAssemblyModuleInstantinateAsync(ExecState*, JSPromiseDeferred*, Vector<uint8_t>&&, JSObject*);
-    static JSValue instantiate(ExecState*, JSPromiseDeferred*, const Identifier&, JSValue);
-
 protected:
-    void finishCreation(VM&, JSGlobalObject*);
+    void finishCreation(VM&);
 
 private:
     JSWebAssembly(VM&, Structure*);
 };
 
-EncodedJSValue JSC_HOST_CALL webAssemblyCompileStreamingInternal(ExecState*);
-EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateStreamingInternal(ExecState*);
-
 } // namespace JSC
 
 #endif // ENABLE(WEBASSEMBLY)
diff --git a/Source/JavaScriptCore/wasm/js/JSWebAssemblyHelpers.h b/Source/JavaScriptCore/wasm/js/JSWebAssemblyHelpers.h
index 4311680..95ffa17 100644
--- a/Source/JavaScriptCore/wasm/js/JSWebAssemblyHelpers.h
+++ b/Source/JavaScriptCore/wasm/js/JSWebAssemblyHelpers.h
@@ -39,21 +39,15 @@
 {
     VM& vm = exec->vm();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
-
-    if (value.isUInt32())
-        return value.asUInt32();
-
-    double doubleValue = value.toNumber(exec);
+    double doubleValue = value.toInteger(exec);
     RETURN_IF_EXCEPTION(throwScope, { });
-
-    if (!std::isnan(doubleValue) && !std::isinf(doubleValue)) {
-        double truncedValue = trunc(doubleValue);
-        if (truncedValue >= 0 && truncedValue <= UINT_MAX)
-            return static_cast<uint32_t>(truncedValue);
+    if (doubleValue < 0 || doubleValue > UINT_MAX) {
+        throwException(exec, throwScope,
+            createRangeError(exec, "Expect an integer argument in the range: [0, 2^32 - 1]"_s));
+        return { };
     }
 
-    throwException(exec, throwScope, createTypeError(exec, "Expect an integer argument in the range: [0, 2^32 - 1]"_s));
-    return { };
+    return static_cast<uint32_t>(doubleValue);
 }
 
 ALWAYS_INLINE std::pair<const uint8_t*, size_t> getWasmBufferFromValue(ExecState* exec, JSValue value)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyCompileErrorConstructor.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyCompileErrorConstructor.cpp
index 7f2d17d..7d70795 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyCompileErrorConstructor.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyCompileErrorConstructor.cpp
@@ -77,7 +77,7 @@
 {
     Base::finishCreation(vm, "CompileError"_s, NameVisibility::Visible, NameAdditionMode::WithoutStructureTransition);
     putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
-    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum);
+    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
 }
 
 WebAssemblyCompileErrorConstructor::WebAssemblyCompileErrorConstructor(VM& vm, Structure* structure)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp
index 6842f95..548a3f9 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp
@@ -108,7 +108,7 @@
 {
     Base::finishCreation(vm, "Instance"_s, NameVisibility::Visible, NameAdditionMode::WithoutStructureTransition);
     putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, PropertyAttribute::DontEnum | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly);
-    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum);
+    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
 }
 
 WebAssemblyInstanceConstructor::WebAssemblyInstanceConstructor(VM& vm, Structure* structure)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyInstancePrototype.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyInstancePrototype.cpp
index f81b2a1..10c2fec 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyInstancePrototype.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyInstancePrototype.cpp
@@ -45,7 +45,7 @@
 
 /* Source for WebAssemblyInstancePrototype.lut.h
  @begin prototypeTableWebAssemblyInstance
- exports webAssemblyInstanceProtoFuncExports Accessor 0
+ exports webAssemblyInstanceProtoFuncExports DontEnum|Accessor 0
  @end
  */
 
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyLinkErrorConstructor.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyLinkErrorConstructor.cpp
index 473c263..26202b8 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyLinkErrorConstructor.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyLinkErrorConstructor.cpp
@@ -77,7 +77,7 @@
 {
     Base::finishCreation(vm, "LinkError"_s, NameVisibility::Visible, NameAdditionMode::WithoutStructureTransition);
     putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
-    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum);
+    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
 }
 
 WebAssemblyLinkErrorConstructor::WebAssemblyLinkErrorConstructor(VM& vm, Structure* structure)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp
index 2405989..86f9d8b 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp
@@ -79,12 +79,12 @@
 
     Wasm::PageCount maximumPageCount;
     {
-        // In WebIDL, "present" means that [[Get]] result is undefined, not [[HasProperty]] result.
-        // https://heycam.github.io/webidl/#idl-dictionaries
         Identifier maximum = Identifier::fromString(&vm, "maximum");
-        JSValue maxSizeValue = memoryDescriptor->get(exec, maximum);
+        bool hasProperty = memoryDescriptor->hasProperty(exec, maximum);
         RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
-        if (!maxSizeValue.isUndefined()) {
+        if (hasProperty) {
+            JSValue maxSizeValue = memoryDescriptor->get(exec, maximum);
+            RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
             uint32_t size = toNonWrappingUint32(exec, maxSizeValue);
             RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
             if (!Wasm::PageCount::isValid(size))
@@ -136,7 +136,7 @@
 {
     Base::finishCreation(vm, "Memory"_s, NameVisibility::Visible, NameAdditionMode::WithoutStructureTransition);
     putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, PropertyAttribute::DontEnum | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly);
-    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum);
+    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
 }
 
 WebAssemblyMemoryConstructor::WebAssemblyMemoryConstructor(VM& vm, Structure* structure)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryPrototype.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryPrototype.cpp
index 1441a9b..082b08d7 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryPrototype.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryPrototype.cpp
@@ -48,8 +48,8 @@
 
 /* Source for WebAssemblyMemoryPrototype.lut.h
 @begin prototypeTableWebAssemblyMemory
- grow   webAssemblyMemoryProtoFuncGrow   Function 1
- buffer webAssemblyMemoryProtoFuncBuffer Accessor 0
+ grow   webAssemblyMemoryProtoFuncGrow   DontEnum|Function 1
+ buffer webAssemblyMemoryProtoFuncBuffer DontEnum|Accessor 0
 @end
 */
 
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp
index 730f4ec..d96c4ec 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp
@@ -59,9 +59,9 @@
 
 /* Source for WebAssemblyModuleConstructor.lut.h
  @begin constructorTableWebAssemblyModule
- customSections webAssemblyModuleCustomSections Function 2
- imports        webAssemblyModuleImports        Function 1
- exports        webAssemblyModuleExports        Function 1
+ customSections webAssemblyModuleCustomSections DontEnum|Function 2
+ imports        webAssemblyModuleImports        DontEnum|Function 1
+ exports        webAssemblyModuleExports        DontEnum|Function 1
  @end
  */
 
@@ -71,14 +71,11 @@
     auto* globalObject = exec->lexicalGlobalObject();
     auto throwScope = DECLARE_THROW_SCOPE(vm);
 
-    if (UNLIKELY(exec->argumentCount() < 2))
-        return JSValue::encode(throwException(exec, throwScope, createNotEnoughArgumentsError(exec)));
-
-    JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->uncheckedArgument(0));
+    JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->argument(0));
     if (!module)
         return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, "WebAssembly.Module.customSections called with non WebAssembly.Module argument"_s)));
 
-    const String sectionNameString = exec->uncheckedArgument(1).getString(exec);
+    const String sectionNameString = exec->argument(1).getString(exec);
     RETURN_IF_EXCEPTION(throwScope, { });
 
     JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
@@ -206,7 +203,7 @@
 {
     Base::finishCreation(vm, "Module"_s, NameVisibility::Visible, NameAdditionMode::WithoutStructureTransition);
     putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, PropertyAttribute::DontEnum | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly);
-    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum);
+    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
 }
 
 WebAssemblyModuleConstructor::WebAssemblyModuleConstructor(VM& vm, Structure* structure)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp
new file mode 100644
index 0000000..8a44433
--- /dev/null
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2018 Oleksandr Skachkov <gskachkov@gmail.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebAssemblyPrototype.h"
+
+#if ENABLE(WEBASSEMBLY)
+
+#include "CatchScope.h"
+#include "Exception.h"
+#include "FunctionPrototype.h"
+#include "JSCBuiltins.h"
+#include "JSCInlines.h"
+#include "JSModuleNamespaceObject.h"
+#include "JSPromiseDeferred.h"
+#include "JSToWasm.h"
+#include "JSWebAssemblyHelpers.h"
+#include "JSWebAssemblyInstance.h"
+#include "JSWebAssemblyModule.h"
+#include "ObjectConstructor.h"
+#include "Options.h"
+#include "PromiseDeferredTimer.h"
+#include "StrongInlines.h"
+#include "ThrowScope.h"
+#include "WasmBBQPlan.h"
+#include "WasmToJS.h"
+#include "WasmWorklist.h"
+#include "WebAssemblyInstanceConstructor.h"
+#include "WebAssemblyModuleConstructor.h"
+
+using JSC::Wasm::Plan;
+using JSC::Wasm::BBQPlan;
+
+namespace JSC {
+static EncodedJSValue JSC_HOST_CALL webAssemblyCompileFunc(ExecState*);
+static EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateFunc(ExecState*);
+static EncodedJSValue JSC_HOST_CALL webAssemblyValidateFunc(ExecState*);
+}
+
+#include "WebAssemblyPrototype.lut.h"
+
+namespace JSC {
+
+const ClassInfo WebAssemblyPrototype::s_info = { "WebAssembly", &Base::s_info, &prototypeTableWebAssembly, nullptr, CREATE_METHOD_TABLE(WebAssemblyPrototype) };
+
+/* Source for WebAssemblyPrototype.lut.h
+ @begin prototypeTableWebAssembly
+ compile     webAssemblyCompileFunc     DontEnum|Function 1
+ instantiate webAssemblyInstantiateFunc DontEnum|Function 1
+ validate    webAssemblyValidateFunc    DontEnum|Function 1
+ @end
+ */
+
+static void reject(ExecState* exec, CatchScope& catchScope, JSPromiseDeferred* promise)
+{
+    Exception* exception = catchScope.exception();
+    ASSERT(exception);
+    catchScope.clearException();
+    promise->reject(exec, exception->value());
+    CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, void());
+}
+
+static void webAssemblyModuleValidateAsyncInternal(ExecState* exec, JSPromiseDeferred* promise, Vector<uint8_t>&& source)
+{
+    VM& vm = exec->vm();
+    auto* globalObject = exec->lexicalGlobalObject();
+
+    Vector<Strong<JSCell>> dependencies;
+    dependencies.append(Strong<JSCell>(vm, globalObject));
+
+    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
+
+    Wasm::Module::validateAsync(&vm.wasmContext, WTFMove(source), createSharedTask<Wasm::Module::CallbackType>([promise, globalObject, &vm] (Wasm::Module::ValidationResult&& result) mutable {
+        vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, globalObject, result = WTFMove(result), &vm] () mutable {
+            auto scope = DECLARE_CATCH_SCOPE(vm);
+            ExecState* exec = globalObject->globalExec();
+            JSValue module = JSWebAssemblyModule::createStub(vm, exec, globalObject->webAssemblyModuleStructure(), WTFMove(result));
+            if (UNLIKELY(scope.exception())) {
+                reject(exec, scope, promise);
+                return;
+            }
+
+            promise->resolve(exec, module);
+            CLEAR_AND_RETURN_IF_EXCEPTION(scope, void());
+        });
+    }));
+}
+
+static EncodedJSValue JSC_HOST_CALL webAssemblyCompileFunc(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+    auto* globalObject = exec->lexicalGlobalObject();
+
+    JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject);
+    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
+
+    {
+        auto catchScope = DECLARE_CATCH_SCOPE(vm);
+        Vector<uint8_t> source = createSourceBufferFromValue(vm, exec, exec->argument(0));
+
+        if (UNLIKELY(catchScope.exception()))
+            reject(exec, catchScope, promise);
+        else
+            webAssemblyModuleValidateAsyncInternal(exec, promise, WTFMove(source));
+
+        return JSValue::encode(promise->promise());
+    }
+}
+
+enum class Resolve { WithInstance, WithModuleRecord, WithModuleAndInstance };
+static void resolve(VM& vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyInstance* instance, JSWebAssemblyModule* module, JSObject* importObject, Ref<Wasm::CodeBlock>&& codeBlock, Resolve resolveKind, Wasm::CreationMode creationMode)
+{
+    auto scope = DECLARE_CATCH_SCOPE(vm);
+    instance->finalizeCreation(vm, exec, WTFMove(codeBlock), importObject, creationMode);
+    RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
+
+    if (resolveKind == Resolve::WithInstance)
+        promise->resolve(exec, instance);
+    else if (resolveKind == Resolve::WithModuleRecord) {
+        auto* moduleRecord = instance->moduleNamespaceObject()->moduleRecord();
+        if (Options::dumpModuleRecord())
+            moduleRecord->dump();
+        promise->resolve(exec, moduleRecord);
+    } else {
+        JSObject* result = constructEmptyObject(exec);
+        result->putDirect(vm, Identifier::fromString(&vm, "module"_s), module);
+        result->putDirect(vm, Identifier::fromString(&vm, "instance"_s), instance);
+        promise->resolve(exec, result);
+    }
+    CLEAR_AND_RETURN_IF_EXCEPTION(scope, void());
+}
+
+void WebAssemblyPrototype::webAssemblyModuleValidateAsync(ExecState* exec, JSPromiseDeferred* promise, Vector<uint8_t>&& source)
+{
+    VM& vm = exec->vm();
+    auto catchScope = DECLARE_CATCH_SCOPE(vm);
+    webAssemblyModuleValidateAsyncInternal(exec, promise, WTFMove(source));
+    CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, void());
+}
+
+static void instantiate(VM& vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyModule* module, JSObject* importObject, const Identifier& moduleKey, Resolve resolveKind, Wasm::CreationMode creationMode)
+{
+    auto scope = DECLARE_CATCH_SCOPE(vm);
+    // In order to avoid potentially recompiling a module. We first gather all the import/memory information prior to compiling code.
+    JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, moduleKey, module, importObject, exec->lexicalGlobalObject()->webAssemblyInstanceStructure(), Ref<Wasm::Module>(module->module()), creationMode);
+    RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
+
+    Vector<Strong<JSCell>> dependencies;
+    // The instance keeps the module alive.
+    dependencies.append(Strong<JSCell>(vm, instance));
+    dependencies.append(Strong<JSCell>(vm, importObject));
+    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
+    // Note: This completion task may or may not get called immediately.
+    module->module().compileAsync(&vm.wasmContext, instance->memoryMode(), createSharedTask<Wasm::CodeBlock::CallbackType>([promise, instance, module, importObject, resolveKind, creationMode, &vm] (Ref<Wasm::CodeBlock>&& refCodeBlock) mutable {
+        RefPtr<Wasm::CodeBlock> codeBlock = WTFMove(refCodeBlock);
+        vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, instance, module, importObject, resolveKind, creationMode, &vm, codeBlock = WTFMove(codeBlock)] () mutable {
+            ExecState* exec = instance->globalObject(vm)->globalExec();
+            resolve(vm, exec, promise, instance, module, importObject, codeBlock.releaseNonNull(), resolveKind, creationMode);
+        });
+    }), &Wasm::createJSToWasmWrapper, &Wasm::wasmToJSException);
+}
+
+static void compileAndInstantiate(VM& vm, ExecState* exec, JSPromiseDeferred* promise, const Identifier& moduleKey, JSValue buffer, JSObject* importObject, Resolve resolveKind, Wasm::CreationMode creationMode)
+{
+    auto scope = DECLARE_CATCH_SCOPE(vm);
+
+    auto* globalObject = exec->lexicalGlobalObject();
+
+    JSCell* moduleKeyCell = identifierToJSValue(vm, moduleKey).asCell();
+    Vector<Strong<JSCell>> dependencies;
+    dependencies.append(Strong<JSCell>(vm, importObject));
+    dependencies.append(Strong<JSCell>(vm, moduleKeyCell));
+    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
+
+    Vector<uint8_t> source = createSourceBufferFromValue(vm, exec, buffer);
+    RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
+
+    Wasm::Module::validateAsync(&vm.wasmContext, WTFMove(source), createSharedTask<Wasm::Module::CallbackType>([promise, importObject, moduleKeyCell, globalObject, resolveKind, creationMode, &vm] (Wasm::Module::ValidationResult&& result) mutable {
+        vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, importObject, moduleKeyCell, globalObject, result = WTFMove(result), resolveKind, creationMode, &vm] () mutable {
+            auto scope = DECLARE_CATCH_SCOPE(vm);
+            ExecState* exec = globalObject->globalExec();
+            JSWebAssemblyModule* module = JSWebAssemblyModule::createStub(vm, exec, globalObject->webAssemblyModuleStructure(), WTFMove(result));
+            if (UNLIKELY(scope.exception()))
+                return reject(exec, scope, promise);
+
+            const Identifier moduleKey = JSValue(moduleKeyCell).toPropertyKey(exec);
+            if (UNLIKELY(scope.exception()))
+                return reject(exec, scope, promise);
+
+            instantiate(vm, exec, promise, module, importObject, moduleKey, resolveKind, creationMode);
+        });
+    }));
+}
+
+JSValue WebAssemblyPrototype::instantiate(ExecState* exec, JSPromiseDeferred* promise, const Identifier& moduleKey, JSValue argument)
+{
+    VM& vm = exec->vm();
+    compileAndInstantiate(vm, exec, promise, moduleKey, argument, nullptr, Resolve::WithModuleRecord, Wasm::CreationMode::FromModuleLoader);
+    return promise->promise();
+}
+
+static void webAssemblyModuleInstantinateAsyncInternal(ExecState* exec, JSPromiseDeferred* promise, Vector<uint8_t>&& source, JSObject* importObject)
+{
+    auto* globalObject = exec->lexicalGlobalObject();
+    VM& vm = exec->vm();
+
+    Vector<Strong<JSCell>> dependencies;
+    dependencies.append(Strong<JSCell>(vm, importObject));
+    dependencies.append(Strong<JSCell>(vm, globalObject));
+    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
+
+    Wasm::Module::validateAsync(&vm.wasmContext, WTFMove(source), createSharedTask<Wasm::Module::CallbackType>([promise, importObject, globalObject, &vm] (Wasm::Module::ValidationResult&& result) mutable {
+        vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, importObject, globalObject, result = WTFMove(result), &vm] () mutable {
+            auto scope = DECLARE_CATCH_SCOPE(vm);
+            ExecState* exec = globalObject->globalExec();
+            JSWebAssemblyModule* module = JSWebAssemblyModule::createStub(vm, exec, globalObject->webAssemblyModuleStructure(), WTFMove(result));
+            if (UNLIKELY(scope.exception()))
+                return reject(exec, scope, promise);
+
+            instantiate(vm, exec, promise, module, importObject, JSWebAssemblyInstance::createPrivateModuleKey(),  Resolve::WithModuleAndInstance, Wasm::CreationMode::FromJS);
+            CLEAR_AND_RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
+        });
+    }));
+}
+
+void WebAssemblyPrototype::webAssemblyModuleInstantinateAsync(ExecState* exec, JSPromiseDeferred* promise, Vector<uint8_t>&& source, JSObject* importedObject)
+{
+    VM& vm = exec->vm();
+    auto catchScope = DECLARE_CATCH_SCOPE(vm);
+    webAssemblyModuleInstantinateAsyncInternal(exec, promise, WTFMove(source), importedObject);
+    CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, void());
+}
+
+static EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateFunc(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+    auto* globalObject = exec->lexicalGlobalObject();
+
+    JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject);
+    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
+
+    {
+        auto catchScope = DECLARE_CATCH_SCOPE(vm);
+
+        JSValue importArgument = exec->argument(1);
+        JSObject* importObject = importArgument.getObject();
+        if (UNLIKELY(!importArgument.isUndefined() && !importObject)) {
+            promise->reject(exec, createTypeError(exec,
+                "second argument to WebAssembly.instantiate must be undefined or an Object"_s, defaultSourceAppender, runtimeTypeForValue(vm, importArgument)));
+            CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, JSValue::encode(promise->promise()));
+        } else {
+            JSValue firstArgument = exec->argument(0);
+            if (auto* module = jsDynamicCast<JSWebAssemblyModule*>(vm, firstArgument))
+                instantiate(vm, exec, promise, module, importObject, JSWebAssemblyInstance::createPrivateModuleKey(), Resolve::WithInstance, Wasm::CreationMode::FromJS);
+            else
+                compileAndInstantiate(vm, exec, promise, JSWebAssemblyInstance::createPrivateModuleKey(), firstArgument, importObject, Resolve::WithModuleAndInstance, Wasm::CreationMode::FromJS);
+        }
+
+        return JSValue::encode(promise->promise());
+    }
+}
+
+static EncodedJSValue JSC_HOST_CALL webAssemblyValidateFunc(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+
+    auto [base, byteSize] = getWasmBufferFromValue(exec, exec->argument(0));
+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
+    BBQPlan plan(&vm.wasmContext, BBQPlan::Validation, Plan::dontFinalize());
+    // FIXME: We might want to throw an OOM exception here if we detect that something will OOM.
+    // https://bugs.webkit.org/show_bug.cgi?id=166015
+    return JSValue::encode(jsBoolean(plan.parseAndValidateModule(base, byteSize)));
+}
+
+EncodedJSValue JSC_HOST_CALL webAssemblyCompileStreamingInternal(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto* globalObject = exec->lexicalGlobalObject();
+    auto catchScope = DECLARE_CATCH_SCOPE(vm);
+
+    JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject);
+
+    Vector<Strong<JSCell>> dependencies;
+    dependencies.append(Strong<JSCell>(vm, globalObject));
+    vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
+
+    if (globalObject->globalObjectMethodTable()->compileStreaming)
+        globalObject->globalObjectMethodTable()->compileStreaming(globalObject, exec, promise, exec->argument(0));
+    else {
+        // CompileStreaming is not supported in jsc, only in browser environment
+        ASSERT_NOT_REACHED();
+    }
+
+    CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, JSValue::encode(promise->promise()));
+
+    return JSValue::encode(promise->promise());
+}
+
+EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateStreamingInternal(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+    auto* globalObject = exec->lexicalGlobalObject();
+
+    JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject);
+    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
+    {
+        auto catchScope = DECLARE_CATCH_SCOPE(vm);
+
+        JSValue importArgument = exec->argument(1);
+        JSObject* importObject = importArgument.getObject();
+        if (UNLIKELY(!importArgument.isUndefined() && !importObject)) {
+            promise->reject(exec, createTypeError(exec,
+                "second argument to WebAssembly.instantiateStreaming must be undefined or an Object"_s, defaultSourceAppender, runtimeTypeForValue(vm, importArgument)));
+            CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, JSValue::encode(promise->promise()));
+        } else {
+            if (globalObject->globalObjectMethodTable()->instantiateStreaming) {
+                Vector<Strong<JSCell>> dependencies;
+                dependencies.append(Strong<JSCell>(vm, globalObject));
+                dependencies.append(Strong<JSCell>(vm, importObject));
+                vm.promiseDeferredTimer->addPendingPromise(vm, promise, WTFMove(dependencies));
+
+                // FIXME: <http://webkit.org/b/184888> if there's an importObject and it contains a Memory, then we can compile the module with the right memory type (fast or not) by looking at the memory's type.
+                globalObject->globalObjectMethodTable()->instantiateStreaming(globalObject, exec, promise, exec->argument(0), importObject);
+            } else {
+                // InstantiateStreaming is not supported in jsc, only in browser environment.
+                ASSERT_NOT_REACHED();
+            }
+        }
+        CLEAR_AND_RETURN_IF_EXCEPTION(catchScope, JSValue::encode(promise->promise()));
+
+        return JSValue::encode(promise->promise());
+    }
+}
+
+WebAssemblyPrototype* WebAssemblyPrototype::create(VM& vm, JSGlobalObject* globalObject, Structure* structure)
+{
+    auto* object = new (NotNull, allocateCell<WebAssemblyPrototype>(vm.heap)) WebAssemblyPrototype(vm, structure);
+    object->finishCreation(vm, globalObject);
+    return object;
+}
+
+Structure* WebAssemblyPrototype::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
+{
+    return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
+}
+
+void WebAssemblyPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject)
+{
+    Base::finishCreation(vm);
+
+    if (Options::useWebAssemblyStreamingApi()) {
+        JSC_BUILTIN_FUNCTION_WITHOUT_TRANSITION("compileStreaming", webAssemblyPrototypeCompileStreamingCodeGenerator, static_cast<unsigned>(PropertyAttribute::DontEnum));
+        JSC_BUILTIN_FUNCTION_WITHOUT_TRANSITION("instantiateStreaming", webAssemblyPrototypeInstantiateStreamingCodeGenerator, static_cast<unsigned>(PropertyAttribute::DontEnum));
+    }
+}
+
+WebAssemblyPrototype::WebAssemblyPrototype(VM& vm, Structure* structure)
+    : Base(vm, structure)
+{
+}
+
+} // namespace JSC
+
+#endif // ENABLE(WEBASSEMBLY)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.h b/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.h
new file mode 100644
index 0000000..dc43898
--- /dev/null
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2018 Oleksandr Skachkov <gskachkov@gmail.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(WEBASSEMBLY)
+
+#include "JSDestructibleObject.h"
+#include "JSObject.h"
+
+namespace JSC {
+
+class JSPromiseDeferred;
+
+class WebAssemblyPrototype final : public JSNonFinalObject {
+public:
+    typedef JSNonFinalObject Base;
+    static const unsigned StructureFlags = Base::StructureFlags | HasStaticPropertyTable;
+
+    static WebAssemblyPrototype* create(VM&, JSGlobalObject*, Structure*);
+    static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
+    JS_EXPORT_PRIVATE static void webAssemblyModuleValidateAsync(ExecState*, JSPromiseDeferred*, Vector<uint8_t>&&);
+    JS_EXPORT_PRIVATE static void webAssemblyModuleInstantinateAsync(ExecState*, JSPromiseDeferred*, Vector<uint8_t>&&, JSObject*);
+
+    DECLARE_INFO;
+
+    static JSValue instantiate(ExecState*, JSPromiseDeferred*, const Identifier&, JSValue);
+
+protected:
+    void finishCreation(VM&, JSGlobalObject*);
+
+private:
+    WebAssemblyPrototype(VM&, Structure*);
+};
+
+EncodedJSValue JSC_HOST_CALL webAssemblyCompileStreamingInternal(ExecState*);
+EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateStreamingInternal(ExecState*);
+
+} // namespace JSC
+
+#endif // ENABLE(WEBASSEMBLY)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyRuntimeErrorConstructor.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyRuntimeErrorConstructor.cpp
index 8de9d2d..7107d73 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyRuntimeErrorConstructor.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyRuntimeErrorConstructor.cpp
@@ -79,7 +79,7 @@
 {
     Base::finishCreation(vm, "RuntimeError"_s, NameVisibility::Visible, NameAdditionMode::WithoutStructureTransition);
     putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
-    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum);
+    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
 }
 
 WebAssemblyRuntimeErrorConstructor::WebAssemblyRuntimeErrorConstructor(VM& vm, Structure* structure)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyTableConstructor.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyTableConstructor.cpp
index 909c281..191e204 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyTableConstructor.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyTableConstructor.cpp
@@ -79,13 +79,13 @@
     uint32_t initial = toNonWrappingUint32(exec, initialSizeValue);
     RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
 
-    // In WebIDL, "present" means that [[Get]] result is undefined, not [[HasProperty]] result.
-    // https://heycam.github.io/webidl/#idl-dictionaries
     Optional<uint32_t> maximum;
     Identifier maximumIdent = Identifier::fromString(&vm, "maximum");
-    JSValue maxSizeValue = memoryDescriptor->get(exec, maximumIdent);
+    bool hasProperty = memoryDescriptor->hasProperty(exec, maximumIdent);
     RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
-    if (!maxSizeValue.isUndefined()) {
+    if (hasProperty) {
+        JSValue maxSizeValue = memoryDescriptor->get(exec, maximumIdent);
+        RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
         maximum = toNonWrappingUint32(exec, maxSizeValue);
         RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
 
@@ -127,7 +127,7 @@
 {
     Base::finishCreation(vm, "Table"_s, NameVisibility::Visible, NameAdditionMode::WithoutStructureTransition);
     putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, PropertyAttribute::DontEnum | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly);
-    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum);
+    putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete);
 }
 
 WebAssemblyTableConstructor::WebAssemblyTableConstructor(VM& vm, Structure* structure)
diff --git a/Source/JavaScriptCore/wasm/js/WebAssemblyTablePrototype.cpp b/Source/JavaScriptCore/wasm/js/WebAssemblyTablePrototype.cpp
index e1c1fba..7f1057f 100644
--- a/Source/JavaScriptCore/wasm/js/WebAssemblyTablePrototype.cpp
+++ b/Source/JavaScriptCore/wasm/js/WebAssemblyTablePrototype.cpp
@@ -48,10 +48,10 @@
 
 /* Source for WebAssemblyTablePrototype.lut.h
  @begin prototypeTableWebAssemblyTable
- length webAssemblyTableProtoFuncLength Accessor 0
- grow   webAssemblyTableProtoFuncGrow   Function 1
- get    webAssemblyTableProtoFuncGet    Function 1
- set    webAssemblyTableProtoFuncSet    Function 2
+ length webAssemblyTableProtoFuncLength DontEnum|Accessor 0
+ grow   webAssemblyTableProtoFuncGrow   DontEnum|Function 1
+ get    webAssemblyTableProtoFuncGet    DontEnum|Function 1
+ set    webAssemblyTableProtoFuncSet    DontEnum|Function 2
  @end
  */
 
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 9903bb46..260ebce 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,16 @@
+2019-07-15  Michael Catanzaro  <mcatanzaro@igalia.com>
+
+        Unreviewed, rolling out r247440.
+
+        Broke builds
+
+        Reverted changeset:
+
+        "[JSC] Improve wasm wpt test results by fixing miscellaneous
+        issues"
+        https://bugs.webkit.org/show_bug.cgi?id=199783
+        https://trac.webkit.org/changeset/247440
+
 2019-07-15  Daniel Bates  <dabates@apple.com>
 
         Typing into a cell in a Google Sheet lags behind by one character
diff --git a/Source/WebCore/bindings/js/JSDOMWindowBase.cpp b/Source/WebCore/bindings/js/JSDOMWindowBase.cpp
index db0c1dc..f48234a 100644
--- a/Source/WebCore/bindings/js/JSDOMWindowBase.cpp
+++ b/Source/WebCore/bindings/js/JSDOMWindowBase.cpp
@@ -50,10 +50,10 @@
 #include <JavaScriptCore/CodeBlock.h>
 #include <JavaScriptCore/JSInternalPromise.h>
 #include <JavaScriptCore/JSInternalPromiseDeferred.h>
-#include <JavaScriptCore/JSWebAssembly.h>
 #include <JavaScriptCore/Microtask.h>
 #include <JavaScriptCore/PromiseDeferredTimer.h>
 #include <JavaScriptCore/StrongInlines.h>
+#include <JavaScriptCore/WebAssemblyPrototype.h>
 #include <wtf/Language.h>
 #include <wtf/MainThread.h>
 
@@ -446,7 +446,7 @@
     if (auto inputResponse = JSFetchResponse::toWrapped(vm, source)) {
         handleResponseOnStreamingAction(globalObject, exec, inputResponse, promise, [promise] (JSC::ExecState* exec, const char* data, size_t byteSize) mutable {
             if (auto arrayBuffer = tryAllocate(exec, promise, data, byteSize))
-                JSC::JSWebAssembly::webAssemblyModuleValidateAsync(exec, promise, WTFMove(*arrayBuffer));
+                JSC::WebAssemblyPrototype::webAssemblyModuleValidateAsync(exec, promise, WTFMove(*arrayBuffer));
         });
     } else
         promise->reject(exec, createTypeError(exec, "first argument must be an Response or Promise for Response"_s));
@@ -465,7 +465,7 @@
     if (auto inputResponse = JSFetchResponse::toWrapped(vm, source)) {
         handleResponseOnStreamingAction(globalObject, exec, inputResponse, promise, [promise, importedObject] (JSC::ExecState* exec, const char* data, size_t byteSize) mutable {
             if (auto arrayBuffer = tryAllocate(exec, promise, data, byteSize))
-                JSC::JSWebAssembly::webAssemblyModuleInstantinateAsync(exec, promise, WTFMove(*arrayBuffer), importedObject);
+                JSC::WebAssemblyPrototype::webAssemblyModuleInstantinateAsync(exec, promise, WTFMove(*arrayBuffer), importedObject);
         });
     } else
         promise->reject(exec, createTypeError(exec, "first argument must be an Response or Promise for Response"_s));
