Changeset 284702 in webkit
- Timestamp:
- Oct 22, 2021, 11:35:42 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 39 added
- 9 edited
-
JSTests/ChangeLog (modified) (1 diff)
-
JSTests/wasm/modules/js-wasm-cycle.js (modified) (1 diff)
-
JSTests/wasm/modules/js-wasm-cycle/entry-function.js (added)
-
JSTests/wasm/modules/js-wasm-cycle/entry-i32-global.js (added)
-
JSTests/wasm/modules/js-wasm-cycle/entry-i32-value.js (added)
-
JSTests/wasm/modules/js-wasm-cycle/entry-memory.js (added)
-
JSTests/wasm/modules/js-wasm-cycle/entry-table.js (added)
-
JSTests/wasm/modules/js-wasm-cycle/entry-wasm-global.js (added)
-
JSTests/wasm/modules/js-wasm-cycle/entry-wasm-memory.js (added)
-
JSTests/wasm/modules/js-wasm-cycle/entry-wasm-table.js (added)
-
JSTests/wasm/modules/js-wasm-cycle/function.wasm (added)
-
JSTests/wasm/modules/js-wasm-cycle/function.wat (added)
-
JSTests/wasm/modules/js-wasm-cycle/i32-global.wasm (added)
-
JSTests/wasm/modules/js-wasm-cycle/i32-global.wat (added)
-
JSTests/wasm/modules/js-wasm-cycle/i32-value.wasm (added)
-
JSTests/wasm/modules/js-wasm-cycle/i32-value.wat (added)
-
JSTests/wasm/modules/js-wasm-cycle/memory.wasm (added)
-
JSTests/wasm/modules/js-wasm-cycle/memory.wat (added)
-
JSTests/wasm/modules/js-wasm-cycle/table.wasm (added)
-
JSTests/wasm/modules/js-wasm-cycle/table.wat (added)
-
JSTests/wasm/modules/js-wasm-cycle/wasm-global.wasm (added)
-
JSTests/wasm/modules/js-wasm-cycle/wasm-global.wat (added)
-
JSTests/wasm/modules/js-wasm-cycle/wasm-memory.wasm (added)
-
JSTests/wasm/modules/js-wasm-cycle/wasm-memory.wat (added)
-
JSTests/wasm/modules/js-wasm-cycle/wasm-table.wasm (added)
-
JSTests/wasm/modules/js-wasm-cycle/wasm-table.wat (added)
-
JSTests/wasm/modules/wasm-imports-js-exports.js (modified) (1 diff)
-
JSTests/wasm/modules/wasm-imports-js-exports/global.js (added)
-
JSTests/wasm/modules/wasm-imports-js-exports/global.wasm (added)
-
JSTests/wasm/modules/wasm-imports-js-exports/global.wat (added)
-
JSTests/wasm/modules/wasm-imports-js-exports/table.js (added)
-
JSTests/wasm/modules/wasm-imports-js-exports/table.wasm (added)
-
JSTests/wasm/modules/wasm-imports-js-exports/table.wat (added)
-
JSTests/wasm/modules/wasm-js-cycle.js (modified) (1 diff)
-
JSTests/wasm/modules/wasm-js-cycle/entry-global.wasm (added)
-
JSTests/wasm/modules/wasm-js-cycle/entry-global.wat (added)
-
JSTests/wasm/modules/wasm-js-cycle/entry-memory.wasm (added)
-
JSTests/wasm/modules/wasm-js-cycle/entry-memory.wat (added)
-
JSTests/wasm/modules/wasm-js-cycle/entry-table.wasm (added)
-
JSTests/wasm/modules/wasm-js-cycle/entry-table.wat (added)
-
JSTests/wasm/modules/wasm-js-cycle/global.js (added)
-
JSTests/wasm/modules/wasm-js-cycle/memory.js (added)
-
JSTests/wasm/modules/wasm-js-cycle/table.js (added)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/runtime/AbstractModuleRecord.cpp (modified) (2 diffs)
-
Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp (modified) (1 diff)
-
Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.cpp (modified) (3 diffs)
-
Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r284635 r284702 1 2021-10-22 Asumu Takikawa <asumu@igalia.com> 2 3 Change WebAssembly module import linking time to evaluate step. 4 https://bugs.webkit.org/show_bug.cgi?id=231114 5 6 Reviewed by Yusuke Suzuki. 7 8 Added test cases based on Wasm/ESM proposal examples from: 9 10 https://github.com/WebAssembly/esm-integration/blob/main/proposals/esm-integration/EXAMPLES.md 11 12 The new tests cases cover the bindings made for both JS<->Wasm 13 and Wasm<->JS cyclic module cases, and importing values from JS 14 into Wasm modules. The tests do not cover importing memory values 15 as this does not work yet. 16 17 * wasm/modules/wasm-js-cycle.js: 18 * wasm/modules/wasm-js-cycle/entry-global.wasm: 19 * wasm/modules/wasm-js-cycle/entry-global.wat: 20 * wasm/modules/wasm-js-cycle/entry-table.wasm: 21 * wasm/modules/wasm-js-cycle/entry-table.wat: 22 * wasm/modules/wasm-js-cycle/global.js: 23 (from.string_appeared_here.export.incrementGlobal): Deleted. 24 * wasm/modules/wasm-js-cycle/table.js: 25 (from.string_appeared_here.export.setTable): Deleted. 26 27 * wasm/modules/js-wasm-cycle.js: 28 (then): 29 * wasm/modules/js-wasm-cycle/entry-function.js: Added. 30 (f): 31 * wasm/modules/js-wasm-cycle/entry-i32-global.js: Added. 32 * wasm/modules/js-wasm-cycle/entry-i32-value.js: Added. 33 * wasm/modules/js-wasm-cycle/entry-memory.js: Added. 34 * wasm/modules/js-wasm-cycle/entry-table.js: Added. 35 * wasm/modules/js-wasm-cycle/entry-wasm-global.js: Added. 36 (f): 37 * wasm/modules/js-wasm-cycle/entry-wasm-memory.js: Added. 38 (f): 39 * wasm/modules/js-wasm-cycle/entry-wasm-table.js: Added. 40 (f): 41 * wasm/modules/js-wasm-cycle/function.wasm: Added. 42 * wasm/modules/js-wasm-cycle/function.wat: Added. 43 * wasm/modules/js-wasm-cycle/i32-global.wasm: Added. 44 * wasm/modules/js-wasm-cycle/i32-global.wat: Added. 45 * wasm/modules/js-wasm-cycle/i32-value.wasm: Added. 46 * wasm/modules/js-wasm-cycle/i32-value.wat: Added. 47 * wasm/modules/js-wasm-cycle/memory.wasm: Added. 48 * wasm/modules/js-wasm-cycle/memory.wat: Added. 49 * wasm/modules/js-wasm-cycle/table.wasm: Added. 50 * wasm/modules/js-wasm-cycle/table.wat: Added. 51 * wasm/modules/js-wasm-cycle/wasm-global.wasm: Added. 52 * wasm/modules/js-wasm-cycle/wasm-global.wat: Added. 53 * wasm/modules/js-wasm-cycle/wasm-memory.wasm: Added. 54 * wasm/modules/js-wasm-cycle/wasm-memory.wat: Added. 55 * wasm/modules/js-wasm-cycle/wasm-table.wasm: Added. 56 * wasm/modules/js-wasm-cycle/wasm-table.wat: Added. 57 * wasm/modules/wasm-imports-js-exports.js: 58 * wasm/modules/wasm-imports-js-exports/global.js: Added. 59 * wasm/modules/wasm-imports-js-exports/global.wasm: Added. 60 * wasm/modules/wasm-imports-js-exports/global.wat: Added. 61 * wasm/modules/wasm-imports-js-exports/table.js: Added. 62 * wasm/modules/wasm-imports-js-exports/table.wasm: Added. 63 * wasm/modules/wasm-imports-js-exports/table.wat: Added. 64 * wasm/modules/wasm-js-cycle.js: 65 * wasm/modules/wasm-js-cycle/entry-global.wasm: Added. 66 * wasm/modules/wasm-js-cycle/entry-global.wat: Added. 67 * wasm/modules/wasm-js-cycle/entry-memory.wasm: Added. 68 * wasm/modules/wasm-js-cycle/entry-memory.wat: Added. 69 * wasm/modules/wasm-js-cycle/entry-table.wasm: Added. 70 * wasm/modules/wasm-js-cycle/entry-table.wat: Added. 71 * wasm/modules/wasm-js-cycle/global.js: Added. 72 (export.incrementGlobal): 73 * wasm/modules/wasm-js-cycle/memory.js: Added. 74 (from.string_appeared_here.export.setMemory): 75 * wasm/modules/wasm-js-cycle/table.js: Added. 76 (export.setTable): 77 1 78 2021-10-21 Yusuke Suzuki <ysuzuki@apple.com> 2 79 -
trunk/JSTests/wasm/modules/js-wasm-cycle.js
r260690 r284702 1 1 import * as assert from '../assert.js'; 2 import("./js-wasm-cycle/entry.js").then($vm.abort, function (error) { 3 assert.eq(String(error), `LinkError: import function ./entry.js:return42 must be callable`); 2 import { return42 } from "./js-wasm-cycle/entry.js"; 3 4 assert.eq(return42(), 42); 5 6 // Test the state of bindings with JS<->Wasm module cycles. 7 // https://github.com/WebAssembly/esm-integration/blob/main/proposals/esm-integration/EXAMPLES.md#js---wasm-cycle-where-js-is-higher-in-the-module-graph 8 9 // Testing JS exports. 10 import("./js-wasm-cycle/entry-i32-global.js").then($vm.abort, function (error) { 11 assert.eq(String(error), `LinkError: imported global ./entry-i32-global.js:glob must be a number`); 4 12 }).then(function () { }, $vm.abort); 13 14 import("./js-wasm-cycle/entry-i32-value.js").then($vm.abort, function (error) { 15 assert.eq(String(error), `LinkError: imported global ./entry-i32-value.js:glob must be a number`); 16 }).then(function () { }, $vm.abort); 17 18 import("./js-wasm-cycle/entry-table.js").then($vm.abort, function (error) { 19 assert.eq(String(error), `LinkError: Table import ./entry-table.js:t is not an instance of WebAssembly.Table`); 20 }).then(function () { }, $vm.abort); 21 22 import("./js-wasm-cycle/entry-memory.js").then($vm.abort, function (error) { 23 assert.eq(String(error), `LinkError: Memory import ./entry-memory.js:m is not an instance of WebAssembly.Memory`); 24 }).then(function () { }, $vm.abort); 25 26 // Test Wasm exports. 27 import { g } from "./js-wasm-cycle/entry-wasm-global.js"; 28 assert.instanceof(g, WebAssembly.Global); 29 assert.eq(g.valueOf(), 42); 30 31 import { m } from "./js-wasm-cycle/entry-wasm-memory.js"; 32 assert.instanceof(m, WebAssembly.Memory); 33 34 import { t } from "./js-wasm-cycle/entry-wasm-table.js"; 35 assert.instanceof(t, WebAssembly.Table); 36 37 // This case tests both Wasm and JS export. 38 import { f2 } from "./js-wasm-cycle/entry-function.js"; 39 assert.isFunction(f2); 40 assert.eq(f2(), 43); -
trunk/JSTests/wasm/modules/wasm-imports-js-exports.js
r230759 r284702 6 6 assert.eq(addOne(-2), -1); 7 7 assert.eq(addOne(0x7fffffff), -2147483648); 8 9 import { incrementCount } from "./wasm-imports-js-exports/global.wasm"; 10 import { count } from "./wasm-imports-js-exports/global.js"; 11 12 assert.isFunction(incrementCount); 13 assert.eq(count.valueOf(), 42); 14 incrementCount(); 15 assert.eq(count.valueOf(), 43); 16 17 import { getElem } from "./wasm-imports-js-exports/table.wasm"; 18 19 assert.isFunction(getElem); 20 assert.eq(getElem(), "foo"); -
trunk/JSTests/wasm/modules/wasm-js-cycle.js
r230759 r284702 3 3 4 4 assert.eq(return42(), 42); 5 6 import { getFromJSGlobal, g } from "./wasm-js-cycle/entry-global.wasm" 7 import { globalFromJS, incrementGlobal } from "./wasm-js-cycle/global.js" 8 9 assert.instanceof(g, WebAssembly.Global); 10 assert.eq(g.valueOf(), 42); 11 incrementGlobal(); 12 assert.eq(g.valueOf(), 43); 13 14 assert.isFunction(getFromJSGlobal); 15 assert.eq(getFromJSGlobal(), globalFromJS.valueOf()); 16 globalFromJS.value = 84; 17 assert.eq(getFromJSGlobal(), globalFromJS.valueOf()); 18 19 import { getFromJSTable, t } from "./wasm-js-cycle/entry-table.wasm" 20 import { tableFromJS, setTable } from "./wasm-js-cycle/table.js" 21 22 assert.instanceof(t, WebAssembly.Table); 23 assert.eq(t.get(0), null); 24 setTable(0, "foo"); 25 assert.eq(t.get(0), "foo"); 26 27 assert.isFunction(getFromJSTable); 28 assert.eq(getFromJSTable(), tableFromJS.get(0)); 29 tableFromJS.set(0, "foo"); 30 assert.eq(getFromJSTable(), tableFromJS.get(0)); 31 32 import { m } from "./wasm-js-cycle/entry-memory.wasm" 33 import { setMemory } from "./wasm-js-cycle/memory.js" 34 35 assert.instanceof(m, WebAssembly.Memory); 36 const view = new Int32Array(m.buffer); 37 assert.eq(view[0], 0); 38 setMemory(0, 42); 39 assert.eq(view[0], 42); -
trunk/Source/JavaScriptCore/ChangeLog
r284700 r284702 1 2021-10-22 Asumu Takikawa <asumu@igalia.com> 2 3 Change WebAssembly module import linking time to evaluate step. 4 https://bugs.webkit.org/show_bug.cgi?id=231114 5 6 Reviewed by Yusuke Suzuki. 7 8 Moves the Wasm module import linking code to execute in the 9 module evaluation step, which is the behavior specified in the 10 Wasm/ESM-integration proposal: 11 12 https://github.com/WebAssembly/esm-integration/tree/main/proposals/esm-integration#evaluate 13 14 * runtime/AbstractModuleRecord.cpp: 15 (JSC::AbstractModuleRecord::link): 16 (JSC::AbstractModuleRecord::evaluate): 17 * wasm/js/JSWebAssemblyInstance.cpp: 18 (JSC::JSWebAssemblyInstance::finalizeCreation): 19 * wasm/js/WebAssemblyModuleRecord.cpp: 20 (JSC::WebAssemblyModuleRecord::link): 21 (JSC::WebAssemblyModuleRecord::initializeImportsAndExports): 22 (JSC::WebAssemblyModuleRecord::linkImpl): Deleted. 23 * wasm/js/WebAssemblyModuleRecord.h: 24 1 25 2021-10-22 Mikhail R. Gadelha <mikhail@igalia.com> 2 26 -
trunk/Source/JavaScriptCore/runtime/AbstractModuleRecord.cpp
r279924 r284702 823 823 return jsModuleRecord->link(globalObject, scriptFetcher); 824 824 #if ENABLE(WEBASSEMBLY) 825 // WebAssembly module imports and exports are set up in the module record's 826 // evaluate() step. At this point, imports are just initialized as TDZ. 825 827 if (auto* wasmModuleRecord = jsDynamicCast<WebAssemblyModuleRecord*>(vm, this)) 826 return wasmModuleRecord->link(globalObject, scriptFetcher , nullptr, Wasm::CreationMode::FromModuleLoader);828 return wasmModuleRecord->link(globalObject, scriptFetcher); 827 829 #endif 828 830 RELEASE_ASSERT_NOT_REACHED(); … … 833 835 { 834 836 VM& vm = globalObject->vm(); 837 auto scope = DECLARE_THROW_SCOPE(vm); 838 835 839 if (auto* jsModuleRecord = jsDynamicCast<JSModuleRecord*>(vm, this)) 836 return jsModuleRecord->evaluate(globalObject, sentValue, resumeMode);840 RELEASE_AND_RETURN(scope, jsModuleRecord->evaluate(globalObject, sentValue, resumeMode)); 837 841 #if ENABLE(WEBASSEMBLY) 838 if (auto* wasmModuleRecord = jsDynamicCast<WebAssemblyModuleRecord*>(vm, this)) 839 return wasmModuleRecord->evaluate(globalObject); 842 if (auto* wasmModuleRecord = jsDynamicCast<WebAssemblyModuleRecord*>(vm, this)) { 843 // WebAssembly imports need to be supplied during evaluation so that, e.g., 844 // JS module exports are actually available to be read and installed as import 845 // bindings. 846 wasmModuleRecord->initializeImportsAndExports(globalObject, nullptr, Wasm::CreationMode::FromModuleLoader); 847 RETURN_IF_EXCEPTION(scope, jsUndefined()); 848 RELEASE_AND_RETURN(scope, wasmModuleRecord->evaluate(globalObject)); 849 } 840 850 #endif 841 851 RELEASE_ASSERT_NOT_REACHED(); -
trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp
r283852 r284702 144 144 145 145 if (creationMode == Wasm::CreationMode::FromJS) { 146 m_moduleRecord->link(globalObject, jsNull(), importObject, creationMode); 146 m_moduleRecord->link(globalObject, jsNull()); 147 RETURN_IF_EXCEPTION(scope, void()); 148 m_moduleRecord->initializeImportsAndExports(globalObject, importObject, creationMode); 147 149 RETURN_IF_EXCEPTION(scope, void()); 148 150 -
trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.cpp
r283852 r284702 99 99 } 100 100 101 Synchronousness WebAssemblyModuleRecord::link(JSGlobalObject* globalObject, JSValue, JSObject* importObject, Wasm::CreationMode creationMode) 102 { 103 linkImpl(globalObject, importObject, creationMode); 101 Synchronousness WebAssemblyModuleRecord::link(JSGlobalObject* globalObject, JSValue) 102 { 103 VM& vm = globalObject->vm(); 104 105 RELEASE_ASSERT(m_instance); 106 107 JSWebAssemblyModule* module = m_instance->module(); 108 SymbolTable* exportSymbolTable = module->exportSymbolTable(); 109 110 JSModuleEnvironment* moduleEnvironment = JSModuleEnvironment::create(vm, globalObject, nullptr, exportSymbolTable, jsTDZValue(), this); 111 setModuleEnvironment(globalObject, moduleEnvironment); 112 104 113 return Synchronousness::Sync; 105 114 } 106 115 107 void WebAssemblyModuleRecord:: linkImpl(JSGlobalObject* globalObject, JSObject* importObject, Wasm::CreationMode creationMode)116 void WebAssemblyModuleRecord::initializeImportsAndExports(JSGlobalObject* globalObject, JSObject* importObject, Wasm::CreationMode creationMode) 108 117 { 109 118 VM& vm = globalObject->vm(); … … 516 525 } 517 526 518 SymbolTable* exportSymbolTable = module->exportSymbolTable();519 520 527 // Let exports be a list of (string, JS value) pairs that is mapped from each external value e in instance.exports as follows: 521 528 // https://webassembly.github.io/spec/js-api/index.html#create-an-exports-object 522 529 JSObject* exportsObject = constructEmptyObject(vm, globalObject->nullPrototypeObjectStructure()); 523 JSModuleEnvironment* moduleEnvironment = JSModuleEnvironment::create(vm, globalObject, nullptr, exportSymbolTable, JSValue(), this);530 JSModuleEnvironment* moduleEnvironment = this->moduleEnvironment(); 524 531 for (const auto& exp : moduleInformation.exports) { 525 532 JSValue exportedValue; … … 621 628 } 622 629 } 623 624 scope.release();625 setModuleEnvironment(globalObject, moduleEnvironment);626 630 } 627 631 -
trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.h
r273225 r284702 60 60 61 61 void prepareLink(VM&, JSWebAssemblyInstance*); 62 Synchronousness link(JSGlobalObject*, JSValue scriptFetcher, JSObject* importObject, Wasm::CreationMode); 62 Synchronousness link(JSGlobalObject*, JSValue scriptFetcher); 63 void initializeImportsAndExports(JSGlobalObject*, JSObject* importObject, Wasm::CreationMode); 63 64 JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*); 64 65 … … 66 67 67 68 private: 68 void linkImpl(JSGlobalObject*, JSObject* importObject, Wasm::CreationMode);69 69 WebAssemblyModuleRecord(VM&, Structure*, const Identifier&); 70 70
Note:
See TracChangeset
for help on using the changeset viewer.