summaryrefslogtreecommitdiffstats
path: root/site
diff options
context:
space:
mode:
authorBrian Cully <bjc@spork.org>2025-12-18 15:10:08 -0500
committerBrian Cully <bjc@spork.org>2025-12-18 15:10:08 -0500
commit7522618ac3e913b904ada9d2e2529afa7acabad3 (patch)
treec3dda56d921b42c3d039330078927576574a0e3c /site
parent3d0d63ede8e267b320c672c248c9e731b0ed95c2 (diff)
downloadautomathon-7522618ac3e913b904ada9d2e2529afa7acabad3.tar.gz
automathon-7522618ac3e913b904ada9d2e2529afa7acabad3.zip
rust, js: do plain old object translation is wasm. use workers
Diffstat (limited to 'site')
-rw-r--r--site/main.mjs29
-rw-r--r--site/robo.mjs59
2 files changed, 32 insertions, 56 deletions
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();