From 02884207d56d7dafbf78465d53e10f0478aa493a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 20 Sep 2024 11:15:47 +0100 Subject: [PATCH] Update wasm's runtime.js --- vendor/wasm/js/dom.odin | 17 +++++ vendor/wasm/js/runtime.js | 152 +++++++++++++++++++++++++++----------- 2 files changed, 124 insertions(+), 45 deletions(-) diff --git a/vendor/wasm/js/dom.odin b/vendor/wasm/js/dom.odin index e19be3078..28dd32fed 100644 --- a/vendor/wasm/js/dom.odin +++ b/vendor/wasm/js/dom.odin @@ -8,9 +8,15 @@ foreign dom_lib { get_element_value_f64 :: proc(id: string) -> f64 --- set_element_value_f64 :: proc(id: string, value: f64) --- + get_element_key_f64 :: proc(id: string, key: string) -> f64 --- + set_element_key_f64 :: proc(id: string, key: string, value: f64) --- + set_element_value_string :: proc(id: string, value: string) --- get_element_value_string_length :: proc(id: string) -> int --- + set_element_key_string :: proc(id: string, key: string, value: string) --- + get_element_key_string_length :: proc(id: string, key: string, ) -> int --- + device_pixel_ratio :: proc() -> f64 --- window_set_scroll :: proc(x, y: f64) --- @@ -24,10 +30,21 @@ get_element_value_string :: proc "contextless" (id: string, buf: []byte) -> stri } n := _get_element_value_string(id, buf) return string(buf[:n]) +} + +get_element_key_string :: proc "contextless" (id: string, key: string, buf: []byte) -> string { + @(default_calling_convention="contextless") + foreign dom_lib { + @(link_name="get_element_key_string") + _get_element_key_string :: proc(id: string, key: string, buf: []byte) -> int --- + } + n := _get_element_key_string(id, key, buf) + return string(buf[:n]) } + get_element_min_max :: proc "contextless" (id: string) -> (min, max: f64) { @(default_calling_convention="contextless") foreign dom_lib { diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/runtime.js index 74ad7568e..2258f805b 100644 --- a/vendor/wasm/js/runtime.js +++ b/vendor/wasm/js/runtime.js @@ -108,7 +108,7 @@ class WasmMemoryInterface { const bytes = this.loadBytes(ptr, Number(len)); return new TextDecoder().decode(bytes); } - + loadCstring(ptr) { const start = this.loadPtr(ptr); if (start == 0) { @@ -1259,7 +1259,7 @@ class WebGLInterface { }; -function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { +function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory, eventQueue, event_temp) { const MAX_INFO_CONSOLE_LINES = 512; let infoConsoleLines = new Array(); let currentLine = {}; @@ -1377,10 +1377,8 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { info.scrollTop = info.scrollHeight; }; - let event_temp_data = {}; - let webglContext = new WebGLInterface(wasmMemoryInterface); - + const env = {}; if (memory) { @@ -1455,9 +1453,13 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { let wmi = wasmMemoryInterface; - let e = event_temp_data.event; + if (!event_temp.data) { + return; + } - wmi.storeU32(off(4), event_temp_data.name_code); + let e = event_temp.data.event; + + wmi.storeU32(off(4), event_temp.data.name_code); if (e.target == document) { wmi.storeU32(off(4), 1); } else if (e.target == window) { @@ -1475,8 +1477,8 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { align(W); - wmi.storeI32(off(W), event_temp_data.id_ptr); - wmi.storeUint(off(W), event_temp_data.id_len); + wmi.storeI32(off(W), event_temp.data.id_ptr); + wmi.storeUint(off(W), event_temp.data.id_len); align(8); wmi.storeF64(off(8), e.timeStamp*1e-3); @@ -1518,7 +1520,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { } else if (e instanceof KeyboardEvent) { // Note: those strings are constructed // on the native side from buffers that - // are filled later, so skip them + // are filled later, so skip them const keyPtr = off(W*2, W); const codePtr = off(W*2, W); @@ -1552,12 +1554,30 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { } let listener = (e) => { - const odin_ctx = wasmMemoryInterface.exports.default_context_ptr(); - event_temp_data.id_ptr = id_ptr; - event_temp_data.id_len = id_len; - event_temp_data.event = e; - event_temp_data.name_code = name_code; - wasmMemoryInterface.exports.odin_dom_do_event_callback(data, callback, odin_ctx); + let event_data = {}; + event_data.id_ptr = id_ptr; + event_data.id_len = id_len; + event_data.event = e; + event_data.name_code = name_code; + + eventQueue.push({event_data: event_data, data: data, callback: callback}); + }; + wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener; + element.addEventListener(name, listener, !!use_capture); + return true; + }, + + add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => { + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let element = window; + let listener = (e) => { + let event_data = {}; + event_data.id_ptr = 0; + event_data.id_len = 0; + event_data.event = e; + event_data.name_code = name_code; + + eventQueue.push({event_data: event_data, data: data, callback: callback}); }; wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener; element.addEventListener(name, listener, !!use_capture); @@ -1579,24 +1599,6 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { element.removeEventListener(name, listener); return true; }, - - - add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => { - let name = wasmMemoryInterface.loadString(name_ptr, name_len); - let element = window; - let listener = (e) => { - const odin_ctx = wasmMemoryInterface.exports.default_context_ptr(); - event_temp_data.id_ptr = 0; - event_temp_data.id_len = 0; - event_temp_data.event = e; - event_temp_data.name_code = name_code; - wasmMemoryInterface.exports.odin_dom_do_event_callback(data, callback, odin_ctx); - }; - wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener; - element.addEventListener(name, listener, !!use_capture); - return true; - }, - remove_window_event_listener: (name_ptr, name_len, data, callback) => { let name = wasmMemoryInterface.loadString(name_ptr, name_len); let element = window; @@ -1612,18 +1614,18 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { }, event_stop_propagation: () => { - if (event_temp_data && event_temp_data.event) { - event_temp_data.event.stopPropagation(); + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.stopPropagation(); } }, event_stop_immediate_propagation: () => { - if (event_temp_data && event_temp_data.event) { - event_temp_data.event.stopImmediatePropagation(); + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.stopImmediatePropagation(); } }, event_prevent_default: () => { - if (event_temp_data && event_temp_data.event) { - event_temp_data.event.preventDefault(); + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.preventDefault(); } }, @@ -1696,6 +1698,55 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { } }, + get_element_key_f64: (id_ptr, id_len, key_ptr, key_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + return element ? element[key] : 0; + }, + get_element_key_string: (id_ptr, id_len, key_ptr, key_len, buf_ptr, buf_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element) { + let str = element[key]; + if (buf_len > 0 && buf_ptr) { + let n = Math.min(buf_len, str.length); + str = str.substring(0, n); + this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(str)) + return n; + } + } + return 0; + }, + get_element_key_string_length: (id_ptr, id_len, key_ptr, key_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element && element[key]) { + return element[key].length; + } + return 0; + }, + + set_element_key_f64: (id_ptr, id_len, key_ptr, key_len, value) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element) { + element[key] = value; + } + }, + set_element_key_string: (id_ptr, id_len, key_ptr, key_len, value_ptr, value_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let value = wasmMemoryInterface.loadString(value_ptr, value_len); + let element = getElement(id); + if (element) { + element[key] = value; + } + }, + get_bounding_client_rect: (rect_ptr, id_ptr, id_len) => { let id = wasmMemoryInterface.loadString(id_ptr, id_len); @@ -1750,7 +1801,10 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory } wasmMemoryInterface.setIntSize(intSize); - let imports = odinSetupDefaultImports(wasmMemoryInterface, consoleElement, wasmMemoryInterface.memory); + let eventQueue = new Array(); + let event_temp = {}; + + let imports = odinSetupDefaultImports(wasmMemoryInterface, consoleElement, wasmMemoryInterface.memory, eventQueue, event_temp); let exports = {}; if (extraForeignImports !== undefined) { @@ -1775,14 +1829,14 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory exports._start(); - // Define a `@export step :: proc(dt: f32) -> (keep_going: bool) {` + // Define a `@export step :: proc(current_type: f64) -> (keep_going: bool) {` // in your app and it will get called every frame. // return `false` to stop the execution of the module. if (exports.step) { const odin_ctx = exports.default_context_ptr(); let prevTimeStamp = undefined; - const step = (currTimeStamp) => { + function step(currTimeStamp) { if (prevTimeStamp == undefined) { prevTimeStamp = currTimeStamp; } @@ -1790,13 +1844,21 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory const dt = (currTimeStamp - prevTimeStamp)*0.001; prevTimeStamp = currTimeStamp; - if (!exports.step(dt, odin_ctx)) { + for (let i = 0; i < eventQueue.length; i++) { + let e = eventQueue[i]; + event_temp.data = e.event_data; + exports.odin_dom_do_event_callback(e.data, e.callback, odin_ctx); + } + event_temp.data = null; + eventQueue.length = 0; + + if (!exports.step(currTimeStamp*0.001, odin_ctx)) { exports._end(); return; } window.requestAnimationFrame(step); - }; + } window.requestAnimationFrame(step); } else {