From 12c06171b3f94696e852c3910c116f56cbfc5b64 Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Sat, 23 Aug 2025 08:51:24 -0400 Subject: wip: pass interp between js and rust --- src/forth/interp.rs | 18 ++++++++--------- src/lib.rs | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/forth/interp.rs b/src/forth/interp.rs index b34ed31..cacc5e3 100644 --- a/src/forth/interp.rs +++ b/src/forth/interp.rs @@ -28,7 +28,7 @@ pub enum OpCode { } #[derive(Clone, Debug)] -pub(super) struct ByteCode(pub(super) Vec); +pub struct ByteCode(pub Vec); impl ByteCode { pub fn len(&self) -> usize { @@ -45,9 +45,9 @@ impl Index for ByteCode { } #[derive(Debug, Copy, Clone, PartialEq)] -pub(super) struct InstructionPointer { - pub(super) word: usize, - pub(super) offset: usize, +pub struct InstructionPointer { + pub word: usize, + pub offset: usize, } impl InstructionPointer { @@ -60,21 +60,21 @@ impl InstructionPointer { } #[derive(Debug)] -pub(super) struct DataStack(pub(super) Vec); +pub struct DataStack(pub Vec); #[derive(Debug)] -pub(super) struct CallStack(pub(super) Vec); +pub struct CallStack(pub Vec); #[derive(Clone, Debug)] -pub struct WordList(pub(super) Vec); +pub struct WordList(pub Vec); #[derive(Debug)] pub struct Interp { // todo: don't be pub, probably - pub(super) stack: DataStack, + pub stack: DataStack, callstack: CallStack, // todo: don't be pub - pub(super) wordlist: WordList, + pub wordlist: WordList, ip: InstructionPointer, } diff --git a/src/lib.rs b/src/lib.rs index f4fc294..ddb87fd 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,9 +5,23 @@ use wasm_bindgen::prelude::*; pub mod forth; #[wasm_bindgen] -extern { - #[wasm_bindgen(js_namespace = console)] - fn debug(s: &str); +pub struct ExportedInstructionPointer { + pub word: usize, + pub offset: usize, +} + +#[wasm_bindgen] +pub struct ExportedByteCode(Vec); + +#[wasm_bindgen] +impl ExportedByteCode { + pub fn len(&self) -> usize { + self.0.len() + } + + pub fn at(&self, index: usize) -> String { + self.0[index].clone() + } } #[wasm_bindgen] @@ -25,6 +39,43 @@ pub fn tick() { info!("executing single instruction"); } +#[wasm_bindgen] +pub fn ip() -> ExportedInstructionPointer { + ExportedInstructionPointer { + word: 0, + offset: 0, + } +} + +#[wasm_bindgen] +pub fn wordlist() -> Vec { + vec![ + ExportedByteCode(vec!["NOP".to_string(), "2".to_string(), "DUP".to_string()]), + ] +} + +#[wasm_bindgen] +pub struct ExportedInterp { + i: forth::interp::Interp, +} + +#[wasm_bindgen] +impl ExportedInterp { + fn from_interp(i: forth::interp::Interp) -> Self { + Self { i } + } + + pub fn foo(&self) { + info!("in interp::foo: {:?}", self.i.wordlist); + } +} + +#[wasm_bindgen] +pub fn interp() -> ExportedInterp { + let i = forth::interp::Interp::new(forth::interp::WordList(vec![])); + ExportedInterp::from_interp(i) +} + #[wasm_bindgen] pub fn run() { info!("running to completion"); -- cgit v1.3