From 7522618ac3e913b904ada9d2e2529afa7acabad3 Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Thu, 18 Dec 2025 15:10:08 -0500 Subject: rust, js: do plain old object translation is wasm. use workers --- site/main.mjs | 29 ++++++++++++++--------------- site/robo.mjs | 59 ++++++++++++++++++----------------------------------------- 2 files changed, 32 insertions(+), 56 deletions(-) (limited to 'site') diff --git a/site/main.mjs b/site/main.mjs index 5358616..31f1375 100644 --- a/site/main.mjs +++ b/site/main.mjs @@ -167,38 +167,37 @@ async function loaded() { speedy: 0, }; roboWorker.onmessage = e => { - const { kind, res, vm } = e.data; + const { kind, res, trans } = e.data; switch (kind) { case 'compile': if (res) { let wordlistContainer = document.querySelector(WORDLIST_SELECTOR); - console.debug('bjc new vm', vm); - const wordlist = wordlistElts(vm.wordlist); + const wordlist = wordlistElts(trans.wordlist); wordlist.forEach(elt => wordlistContainer.appendChild(elt)); initWordlist(); - renderStack(vm.stack); - renderCallStack(vm.callstack); - renderVars(vm.vars); - renderTextHighlight(vm); + renderStack(trans.stack); + renderCallStack(trans.callstack); + renderVars(trans.vars); + renderTextHighlight(trans); renderArena([robo]); } break; case 'tick': - const { word, offset } = vm.ip; + const { word, offset } = trans.ip; document.querySelectorAll(IP_SELECTOR).forEach(e => e.classList.remove('ip')); const sel = selectorForIP(word, offset); document.querySelectorAll(sel).forEach(e => { e.classList.add('ip'); }); - renderStack(vm.stack); - renderCallStack(vm.callstack); - renderVars(vm.vars); - renderTextHighlight(vm); + renderStack(trans.stack); + renderCallStack(trans.callstack); + renderVars(trans.vars); + renderTextHighlight(trans); robo.lastTick = document.timeline.currentTime; - robo.heading = vm.vars.heading; - robo.speed = vm.vars.speed; + robo.heading = trans.vars.heading; + robo.speed = trans.vars.speed; const [speedx, speedy] = [ Math.cos(2 * Math.PI * robo.heading / 360), Math.sin(2 * Math.PI * robo.heading / 360) @@ -217,7 +216,7 @@ async function loaded() { console.error('error in roboWorker', e); }; - document.querySelectorAll(SRC_SELECT_SELECTOR).forEach(async sel => { + document.querySelectorAll(SRC_SELECT_SELECTOR).forEach(sel => { sel.onchange = _ => loadForth(sel.value); loadForth(sel.value); }); diff --git a/site/robo.mjs b/site/robo.mjs index e6db244..1b7c3d8 100644 --- a/site/robo.mjs +++ b/site/robo.mjs @@ -2,59 +2,22 @@ import init, { make_vm } from './wasm/automathon.js'; let vm; -function vmData(vm) { - const wordlist = vm.wordlist().map(bc => { - let res = []; - for (let i = 0; i < bc.len(); i++) { - res.push(bc.at(i)) - } - return res; - }); - const callstack = vm.callstack().map(e => { return { word: e.word, offset: e.offset }; }); - const vars = Object.fromEntries(['out', 'heading', 'speed', 'doppler'].map(name => [name, vm[name]()])); - const ip = {word: vm.ip().word, offset: vm.ip().offset}; - const annos = vm.annotations().map(word_annos => { - let res = []; - for (let i = 0; i < word_annos.len(); i++) { - const anno = word_annos.at(i); - res.push({ start: anno.start, end: anno.end }) - } - return res; - }); - return { - wordlist, - stack: vm.stack(), - callstack, - vars, - ip, - annos, - } -} - function compile(text) { const start = performance.now(); const res = vm.compile(text); const end = performance.now(); console.info(`compile took ${end-start} ms`); - postMessage({ kind: 'compile', res, vm: vmData(vm) }); + postMessage({ kind: 'compile', res, trans: vm.trans() }); } function tick() { if (!vm.tick()) { vm.reset_ip(); } - postMessage({ kind: 'tick', vm: vmData(vm) }); + postMessage({ kind: 'tick', trans: vm.trans() }); } -let mod; async function messageHandler(e) { - if (mod === undefined) { - console.debug('worker running init'); - mod = await init(); - console.debug('worker init done'); - vm = make_vm(); - console.debug('worker vm made'); - } const { kind } = e.data; switch (kind) { case 'compile': @@ -69,5 +32,19 @@ async function messageHandler(e) { } } -console.debug('loading robo worker'); -addEventListener('message', messageHandler); +let mod; +async function loaded() { + console.debug('loading robo worker'); + if (mod === undefined) { + console.debug('worker running init'); + mod = await init(); + console.debug('worker init done'); + vm = make_vm(); + console.debug('worker vm made'); + } + + addEventListener('message', messageHandler); + console.debug('bjc loaded robo'); +} + +loaded(); -- cgit v1.3