WebAssembly: Module.exports, Module.imports, Module.customSections are wrong
authorjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 22 Apr 2017 07:52:03 +0000 (07:52 +0000)
committerjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 22 Apr 2017 07:52:03 +0000 (07:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=171078

Reviewed by Saam Barati.

They're static properties of Module, not instance properties of a module.
https://github.com/WebAssembly/design/blob/master/JS.md#webassemblymoduleexports

JSTests:

* wasm/js-api/Module.customSection.js:
(assert.throws.WebAssembly.Module.customSections):
(assert.eq):
(assert.throws.WebAssembly.Module.prototype.customSections): Deleted.
* wasm/js-api/Module.exports.js:
(assert.throws.WebAssembly.Module.exports):
(assert.truthy):
(assert.throws.WebAssembly.Module.prototype.exports): Deleted.
* wasm/js-api/Module.imports.js:
(assert.throws.WebAssembly.Module.imports):
(assert.truthy):
(assert.throws.WebAssembly.Module.prototype.imports): Deleted.

Source/JavaScriptCore:

* wasm/js/WebAssemblyModuleConstructor.cpp:
(JSC::webAssemblyModuleCustomSections):
(JSC::webAssemblyModuleImports):
(JSC::webAssemblyModuleExports):
* wasm/js/WebAssemblyModulePrototype.cpp:
(JSC::webAssemblyModuleProtoCustomSections): Deleted.
(JSC::webAssemblyModuleProtoImports): Deleted.
(JSC::webAssemblyModuleProtoExports): Deleted.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@215664 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/wasm/js-api/Module.customSection.js
JSTests/wasm/js-api/Module.exports.js
JSTests/wasm/js-api/Module.imports.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp
Source/JavaScriptCore/wasm/js/WebAssemblyModulePrototype.cpp

index f4f95ab..f770910 100644 (file)
@@ -1,3 +1,26 @@
+2017-04-22  JF Bastien  <jfbastien@apple.com>
+
+        WebAssembly: Module.exports, Module.imports, Module.customSections are wrong
+        https://bugs.webkit.org/show_bug.cgi?id=171078
+
+        Reviewed by Saam Barati.
+
+        They're static properties of Module, not instance properties of a module.
+        https://github.com/WebAssembly/design/blob/master/JS.md#webassemblymoduleexports
+
+        * wasm/js-api/Module.customSection.js:
+        (assert.throws.WebAssembly.Module.customSections):
+        (assert.eq):
+        (assert.throws.WebAssembly.Module.prototype.customSections): Deleted.
+        * wasm/js-api/Module.exports.js:
+        (assert.throws.WebAssembly.Module.exports):
+        (assert.truthy):
+        (assert.throws.WebAssembly.Module.prototype.exports): Deleted.
+        * wasm/js-api/Module.imports.js:
+        (assert.throws.WebAssembly.Module.imports):
+        (assert.truthy):
+        (assert.throws.WebAssembly.Module.prototype.imports): Deleted.
+
 2017-04-21  JF Bastien  <jfbastien@apple.com>
 
         Silence noisy test
index 0a70ce9..ccd1a72 100644 (file)
@@ -1,20 +1,21 @@
 import Builder from '../Builder.js';
 import * as assert from '../assert.js';
 
-assert.throws(() => WebAssembly.Module.prototype.customSections(undefined, ""), TypeError, `WebAssembly.Module.prototype.customSections called with non WebAssembly.Module |this| value`);
+assert.throws(() => WebAssembly.Module.customSections(undefined, ""), TypeError, `WebAssembly.Module.customSections called with non WebAssembly.Module argument`);
+assert.eq(WebAssembly.Module.customSections.length, 2);
 
 {
     const empty = new WebAssembly.Module((new Builder()).WebAssembly().get());
-    assert.isArray(empty.customSections(""));
-    assert.eq(empty.customSections("").length, 0);
+    assert.isArray(WebAssembly.Module.customSections(empty, ""));
+    assert.eq(WebAssembly.Module.customSections(empty, "").length, 0);
 }
 
 {
     const single = new WebAssembly.Module((new Builder())
         .Unknown("hello").Byte(0x00).Byte(0x42).Byte(0xFF).End()
         .WebAssembly().get());
-    assert.eq(single.customSections("").length, 0);
-    const hello = single.customSections("hello");
+    assert.eq(WebAssembly.Module.customSections(single, "").length, 0);
+    const hello = WebAssembly.Module.customSections(single, "hello");
     assert.eq(hello.length, 1);
     assert.eq(hello[0].byteLength, 3);
     const helloI8 = new Int8Array(hello[0]);
@@ -27,7 +28,7 @@ assert.throws(() => WebAssembly.Module.prototype.customSections(undefined, ""),
     const unicode = new WebAssembly.Module((new Builder())
         .Unknown("👨‍❤️‍💋‍👨").Byte(42).End()
         .WebAssembly().get());
-    const family = unicode.customSections("👨‍❤️‍💋‍👨");
+    const family = WebAssembly.Module.customSections(unicode, "👨‍❤️‍💋‍👨");
     assert.eq(family.length, 1);
     assert.eq(family[0].byteLength, 1);
     const familyI8 = new Int8Array(family[0]);
@@ -43,13 +44,13 @@ assert.throws(() => WebAssembly.Module.prototype.customSections(undefined, ""),
         .Unknown("one").Byte(4).Byte(4).Byte(4).Byte(4).Byte(4).End()
         .WebAssembly().get());
 
-    const zero = many.customSections("zero");
+    const zero = WebAssembly.Module.customSections(many, "zero");
     assert.eq(zero.length, 1);
     assert.eq(zero[0].byteLength, 1);
     const zeroI8 = new Int8Array(zero[0]);
     assert.eq(zeroI8[0], 0);
 
-    const two = many.customSections("two");
+    const two = WebAssembly.Module.customSections(many, "two");
     assert.eq(two.length, 1);
     assert.eq(two[0].byteLength, 4);
     const twoI8 = new Int8Array(two[0]);
@@ -58,7 +59,7 @@ assert.throws(() => WebAssembly.Module.prototype.customSections(undefined, ""),
     assert.eq(twoI8[2], 3);
     assert.eq(twoI8[3], 3);
 
-    const one = many.customSections("one");
+    const one = WebAssembly.Module.customSections(many, "one");
     assert.eq(one.length, 3);
     let seen = 0;
     const expect = [
index 514047b..76e3fd3 100644 (file)
@@ -1,13 +1,14 @@
 import Builder from '../Builder.js';
 import * as assert from '../assert.js';
 
-assert.throws(() => WebAssembly.Module.prototype.exports(undefined, ""), TypeError, `WebAssembly.Module.prototype.exports called with non WebAssembly.Module |this| value`);
+assert.throws(() => WebAssembly.Module.exports(undefined), TypeError, `WebAssembly.Module.exports called with non WebAssembly.Module argument`);
+assert.eq(WebAssembly.Module.exports.length, 1);
 
 {
     const m = new WebAssembly.Module((new Builder()).WebAssembly().get());
-    assert.isArray(m.exports);
-    assert.eq(m.exports.length, 0);
-    assert.truthy(m.exports !== m.exports);
+    assert.isArray(WebAssembly.Module.exports(m));
+    assert.eq(WebAssembly.Module.exports(m).length, 0);
+    assert.truthy(WebAssembly.Module.exports(m) !== WebAssembly.Module.exports(m));
 }
 
 {
@@ -30,13 +31,13 @@ assert.throws(() => WebAssembly.Module.prototype.exports(undefined, ""), TypeErr
                 .Function("func", { params: [] }).Return().End()
             .End()
             .WebAssembly().get());
-    assert.eq(m.exports.length, 4);
-    assert.eq(m.exports[0].name, "func");
-    assert.eq(m.exports[0].kind, "function");
-    assert.eq(m.exports[1].name, "tab");
-    assert.eq(m.exports[1].kind, "table");
-    assert.eq(m.exports[2].name, "mem");
-    assert.eq(m.exports[2].kind, "memory");
-    assert.eq(m.exports[3].name, "glob");
-    assert.eq(m.exports[3].kind, "global");
+    assert.eq(WebAssembly.Module.exports(m).length, 4);
+    assert.eq(WebAssembly.Module.exports(m)[0].name, "func");
+    assert.eq(WebAssembly.Module.exports(m)[0].kind, "function");
+    assert.eq(WebAssembly.Module.exports(m)[1].name, "tab");
+    assert.eq(WebAssembly.Module.exports(m)[1].kind, "table");
+    assert.eq(WebAssembly.Module.exports(m)[2].name, "mem");
+    assert.eq(WebAssembly.Module.exports(m)[2].kind, "memory");
+    assert.eq(WebAssembly.Module.exports(m)[3].name, "glob");
+    assert.eq(WebAssembly.Module.exports(m)[3].kind, "global");
 }
index 273514d..1fc2dd5 100644 (file)
@@ -1,13 +1,14 @@
 import Builder from '../Builder.js';
 import * as assert from '../assert.js';
 
-assert.throws(() => WebAssembly.Module.prototype.imports(undefined, ""), TypeError, `WebAssembly.Module.prototype.imports called with non WebAssembly.Module |this| value`);
+assert.throws(() => WebAssembly.Module.imports(undefined), TypeError, `WebAssembly.Module.imports called with non WebAssembly.Module argument`);
+assert.eq(WebAssembly.Module.imports.length, 1);
 
 {
     const m = new WebAssembly.Module((new Builder()).WebAssembly().get());
-    assert.isArray(m.imports);
-    assert.eq(m.imports.length, 0);
-    assert.truthy(m.exports !== m.exports);
+    assert.isArray(WebAssembly.Module.imports(m));
+    assert.eq(WebAssembly.Module.imports(m).length, 0);
+    assert.truthy(WebAssembly.Module.imports(m) !== WebAssembly.Module.imports(m));
 }
 
 {
@@ -21,17 +22,17 @@ assert.throws(() => WebAssembly.Module.prototype.imports(undefined, ""), TypeErr
                 .Global().I32("fooGlobal", "barGlobal", "immutable").End()
             .End()
             .WebAssembly().get());
-    assert.eq(m.imports.length, 4);
-    assert.eq(m.imports[0].module, "fooFunction");
-    assert.eq(m.imports[0].name, "barFunction");
-    assert.eq(m.imports[0].kind, "function");
-    assert.eq(m.imports[1].module, "fooTable");
-    assert.eq(m.imports[1].name, "barTable");
-    assert.eq(m.imports[1].kind, "table");
-    assert.eq(m.imports[2].module, "fooMemory");
-    assert.eq(m.imports[2].name, "barMemory");
-    assert.eq(m.imports[2].kind, "memory");
-    assert.eq(m.imports[3].module, "fooGlobal");
-    assert.eq(m.imports[3].name, "barGlobal");
-    assert.eq(m.imports[3].kind, "global");
+    assert.eq(WebAssembly.Module.imports(m).length, 4);
+    assert.eq(WebAssembly.Module.imports(m)[0].module, "fooFunction");
+    assert.eq(WebAssembly.Module.imports(m)[0].name, "barFunction");
+    assert.eq(WebAssembly.Module.imports(m)[0].kind, "function");
+    assert.eq(WebAssembly.Module.imports(m)[1].module, "fooTable");
+    assert.eq(WebAssembly.Module.imports(m)[1].name, "barTable");
+    assert.eq(WebAssembly.Module.imports(m)[1].kind, "table");
+    assert.eq(WebAssembly.Module.imports(m)[2].module, "fooMemory");
+    assert.eq(WebAssembly.Module.imports(m)[2].name, "barMemory");
+    assert.eq(WebAssembly.Module.imports(m)[2].kind, "memory");
+    assert.eq(WebAssembly.Module.imports(m)[3].module, "fooGlobal");
+    assert.eq(WebAssembly.Module.imports(m)[3].name, "barGlobal");
+    assert.eq(WebAssembly.Module.imports(m)[3].kind, "global");
 }
index 1ef3005..a953d3a 100644 (file)
@@ -1,3 +1,22 @@
+2017-04-22  JF Bastien  <jfbastien@apple.com>
+
+        WebAssembly: Module.exports, Module.imports, Module.customSections are wrong
+        https://bugs.webkit.org/show_bug.cgi?id=171078
+
+        Reviewed by Saam Barati.
+
+        They're static properties of Module, not instance properties of a module.
+        https://github.com/WebAssembly/design/blob/master/JS.md#webassemblymoduleexports
+
+        * wasm/js/WebAssemblyModuleConstructor.cpp:
+        (JSC::webAssemblyModuleCustomSections):
+        (JSC::webAssemblyModuleImports):
+        (JSC::webAssemblyModuleExports):
+        * wasm/js/WebAssemblyModulePrototype.cpp:
+        (JSC::webAssemblyModuleProtoCustomSections): Deleted.
+        (JSC::webAssemblyModuleProtoImports): Deleted.
+        (JSC::webAssemblyModuleProtoExports): Deleted.
+
 2017-04-21  Saam Barati  <sbarati@apple.com>
 
         SharedArrayBuffer-opt.js fails with Briggs
index 9cfe336..0829d40 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -28,6 +28,7 @@
 
 #if ENABLE(WEBASSEMBLY)
 
+#include "ArrayBuffer.h"
 #include "ExceptionHelpers.h"
 #include "FunctionPrototype.h"
 #include "JSArrayBuffer.h"
 #include "JSWebAssemblyCompileError.h"
 #include "JSWebAssemblyHelpers.h"
 #include "JSWebAssemblyModule.h"
+#include "ObjectConstructor.h"
 #include "SymbolTable.h"
 #include "WasmCallee.h"
+#include "WasmModuleInformation.h"
 #include "WasmPlan.h"
 #include "WebAssemblyModulePrototype.h"
 #include <wtf/StdLibExtras.h>
 
+namespace JSC {
+static EncodedJSValue JSC_HOST_CALL webAssemblyModuleCustomSections(ExecState*);
+static EncodedJSValue JSC_HOST_CALL webAssemblyModuleImports(ExecState*);
+static EncodedJSValue JSC_HOST_CALL webAssemblyModuleExports(ExecState*);
+}
+
 #include "WebAssemblyModuleConstructor.lut.h"
 
 namespace JSC {
@@ -50,9 +59,105 @@ const ClassInfo WebAssemblyModuleConstructor::s_info = { "Function", &Base::s_in
 
 /* Source for WebAssemblyModuleConstructor.lut.h
  @begin constructorTableWebAssemblyModule
+ customSections webAssemblyModuleCustomSections DontEnum|Function 2
+ imports        webAssemblyModuleImports        DontEnum|Function 1
+ exports        webAssemblyModuleExports        DontEnum|Function 1
  @end
  */
 
+EncodedJSValue JSC_HOST_CALL webAssemblyModuleCustomSections(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto* globalObject = exec->lexicalGlobalObject();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+    JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->argument(0));
+    if (!module)
+        return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Module.customSections called with non WebAssembly.Module argument"))));
+
+    const String sectionNameString = exec->argument(1).getString(exec);
+    RETURN_IF_EXCEPTION(throwScope, { });
+
+    JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
+    RETURN_IF_EXCEPTION(throwScope, { });
+
+    const auto& customSections = module->moduleInformation().customSections;
+    for (const Wasm::CustomSection& section : customSections) {
+        if (String::fromUTF8(section.name) == sectionNameString) {
+            auto buffer = ArrayBuffer::tryCreate(section.payload.data(), section.payload.size());
+            if (!buffer)
+                return JSValue::encode(throwException(exec, throwScope, createOutOfMemoryError(exec)));
+
+            result->push(exec, JSArrayBuffer::create(vm, globalObject->m_arrayBufferStructure.get(), WTFMove(buffer)));
+            RETURN_IF_EXCEPTION(throwScope, { });
+        }
+    }
+
+    return JSValue::encode(result);
+}
+
+EncodedJSValue JSC_HOST_CALL webAssemblyModuleImports(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto* globalObject = exec->lexicalGlobalObject();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+    JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->argument(0));
+    if (!module)
+        return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Module.imports called with non WebAssembly.Module argument"))));
+
+    JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
+    RETURN_IF_EXCEPTION(throwScope, { });
+
+    const auto& imports = module->moduleInformation().imports;
+    if (imports.size()) {
+        Identifier module = Identifier::fromString(exec, "module");
+        Identifier name = Identifier::fromString(exec, "name");
+        Identifier kind = Identifier::fromString(exec, "kind");
+        for (const Wasm::Import& imp : imports) {
+            JSObject* obj = constructEmptyObject(exec);
+            RETURN_IF_EXCEPTION(throwScope, { });
+            obj->putDirect(vm, module, jsString(exec, String::fromUTF8(imp.module)));
+            obj->putDirect(vm, name, jsString(exec, String::fromUTF8(imp.field)));
+            obj->putDirect(vm, kind, jsString(exec, String(makeString(imp.kind))));
+            result->push(exec, obj);
+            RETURN_IF_EXCEPTION(throwScope, { });
+        }
+    }
+
+    return JSValue::encode(result);
+}
+
+EncodedJSValue JSC_HOST_CALL webAssemblyModuleExports(ExecState* exec)
+{
+    VM& vm = exec->vm();
+    auto* globalObject = exec->lexicalGlobalObject();
+    auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+    JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->argument(0));
+    if (!module)
+        return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Module.exports called with non WebAssembly.Module argument"))));
+
+    JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
+    RETURN_IF_EXCEPTION(throwScope, { });
+
+    const auto& exports = module->moduleInformation().exports;
+    if (exports.size()) {
+        Identifier name = Identifier::fromString(exec, "name");
+        Identifier kind = Identifier::fromString(exec, "kind");
+        for (const Wasm::Export& exp : exports) {
+            JSObject* obj = constructEmptyObject(exec);
+            RETURN_IF_EXCEPTION(throwScope, { });
+            obj->putDirect(vm, name, jsString(exec, String::fromUTF8(exp.field)));
+            obj->putDirect(vm, kind, jsString(exec, String(makeString(exp.kind))));
+            result->push(exec, obj);
+            RETURN_IF_EXCEPTION(throwScope, { });
+        }
+    }
+
+    return JSValue::encode(result);
+}
+
 static EncodedJSValue JSC_HOST_CALL constructJSWebAssemblyModule(ExecState* exec)
 {
     VM& vm = exec->vm();
index 65adc2d..1fe90b1 100644 (file)
 
 #if ENABLE(WEBASSEMBLY)
 
-#include "ArrayBuffer.h"
-#include "FunctionPrototype.h"
-#include "JSArrayBuffer.h"
 #include "JSCInlines.h"
-#include "JSWebAssemblyModule.h"
-#include "ObjectConstructor.h"
-#include "WasmModuleInformation.h"
-
-namespace JSC {
-static EncodedJSValue JSC_HOST_CALL webAssemblyModuleProtoCustomSections(ExecState*);
-static EncodedJSValue JSC_HOST_CALL webAssemblyModuleProtoImports(ExecState*);
-static EncodedJSValue JSC_HOST_CALL webAssemblyModuleProtoExports(ExecState*);
-}
 
 #include "WebAssemblyModulePrototype.lut.h"
 
@@ -50,108 +38,9 @@ const ClassInfo WebAssemblyModulePrototype::s_info = { "WebAssembly.Module.proto
 
 /* Source for WebAssemblyModulePrototype.lut.h
  @begin prototypeTableWebAssemblyModule
- customSections webAssemblyModuleProtoCustomSections DontEnum|Function 1
- imports        webAssemblyModuleProtoImports        DontEnum|Accessor 0
- exports        webAssemblyModuleProtoExports        DontEnum|Accessor 0
  @end
  */
 
-EncodedJSValue JSC_HOST_CALL webAssemblyModuleProtoCustomSections(ExecState* exec)
-{
-    VM& vm = exec->vm();
-    auto* globalObject = exec->lexicalGlobalObject();
-    auto throwScope = DECLARE_THROW_SCOPE(vm);
-
-    JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->thisValue());
-    if (!module)
-        return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Module.prototype.customSections called with non WebAssembly.Module |this| value"))));
-
-    const String sectionNameString = exec->argument(0).getString(exec);
-    RETURN_IF_EXCEPTION(throwScope, { });
-
-    JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
-    RETURN_IF_EXCEPTION(throwScope, { });
-
-    const auto& customSections = module->moduleInformation().customSections;
-    for (const Wasm::CustomSection& section : customSections) {
-        if (String::fromUTF8(section.name) == sectionNameString) {
-            auto buffer = ArrayBuffer::tryCreate(section.payload.data(), section.payload.size());
-            if (!buffer)
-                return JSValue::encode(throwException(exec, throwScope, createOutOfMemoryError(exec)));
-
-            Structure* arrayBufferStructure = InternalFunction::createSubclassStructure(exec, JSValue(), globalObject->arrayBufferStructure(ArrayBufferSharingMode::Default));
-            RETURN_IF_EXCEPTION(throwScope, { });
-
-            result->push(exec, JSArrayBuffer::create(vm, arrayBufferStructure, WTFMove(buffer)));
-            RETURN_IF_EXCEPTION(throwScope, { });
-        }
-    }
-
-    return JSValue::encode(result);
-}
-
-EncodedJSValue JSC_HOST_CALL webAssemblyModuleProtoImports(ExecState* exec)
-{
-    VM& vm = exec->vm();
-    auto* globalObject = exec->lexicalGlobalObject();
-    auto throwScope = DECLARE_THROW_SCOPE(vm);
-
-    JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->thisValue());
-    if (!module)
-        return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Module.prototype.imports called with non WebAssembly.Module |this| value"))));
-
-    JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
-    RETURN_IF_EXCEPTION(throwScope, { });
-
-    const auto& imports = module->moduleInformation().imports;
-    if (imports.size()) {
-        Identifier module = Identifier::fromString(exec, "module");
-        Identifier name = Identifier::fromString(exec, "name");
-        Identifier kind = Identifier::fromString(exec, "kind");
-        for (const Wasm::Import& imp : imports) {
-            JSObject* obj = constructEmptyObject(exec);
-            RETURN_IF_EXCEPTION(throwScope, { });
-            obj->putDirect(vm, module, jsString(exec, String::fromUTF8(imp.module)));
-            obj->putDirect(vm, name, jsString(exec, String::fromUTF8(imp.field)));
-            obj->putDirect(vm, kind, jsString(exec, String(makeString(imp.kind))));
-            result->push(exec, obj);
-            RETURN_IF_EXCEPTION(throwScope, { });
-        }
-    }
-
-    return JSValue::encode(result);
-}
-
-EncodedJSValue JSC_HOST_CALL webAssemblyModuleProtoExports(ExecState* exec)
-{
-    VM& vm = exec->vm();
-    auto* globalObject = exec->lexicalGlobalObject();
-    auto throwScope = DECLARE_THROW_SCOPE(vm);
-
-    JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->thisValue());
-    if (!module)
-        return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Module.prototype.exports called with non WebAssembly.Module |this| value"))));
-
-    JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
-    RETURN_IF_EXCEPTION(throwScope, { });
-
-    const auto& exports = module->moduleInformation().exports;
-    if (exports.size()) {
-        Identifier name = Identifier::fromString(exec, "name");
-        Identifier kind = Identifier::fromString(exec, "kind");
-        for (const Wasm::Export& exp : exports) {
-            JSObject* obj = constructEmptyObject(exec);
-            RETURN_IF_EXCEPTION(throwScope, { });
-            obj->putDirect(vm, name, jsString(exec, String::fromUTF8(exp.field)));
-            obj->putDirect(vm, kind, jsString(exec, String(makeString(exp.kind))));
-            result->push(exec, obj);
-            RETURN_IF_EXCEPTION(throwScope, { });
-        }
-    }
-
-    return JSValue::encode(result);
-}
-
 WebAssemblyModulePrototype* WebAssemblyModulePrototype::create(VM& vm, JSGlobalObject*, Structure* structure)
 {
     auto* object = new (NotNull, allocateCell<WebAssemblyModulePrototype>(vm.heap)) WebAssemblyModulePrototype(vm, structure);