diff options
| author | Brian Cully <bjc@spork.org> | 2025-12-18 19:10:33 -0500 |
|---|---|---|
| committer | Brian Cully <bjc@spork.org> | 2025-12-18 19:10:33 -0500 |
| commit | 8e65c1c439b2fc0d0ae5d8482e9350e283cde882 (patch) | |
| tree | a6c9ce65527019d27861c873efe90dd6c39777c3 /src | |
| parent | 62f9d83b6ae7b62fb5606fbfd47c4332a2a2d3e6 (diff) | |
| download | automathon-8e65c1c439b2fc0d0ae5d8482e9350e283cde882.tar.gz automathon-8e65c1c439b2fc0d0ae5d8482e9350e283cde882.zip | |
rust: use from trait more
Diffstat (limited to 'src')
| -rwxr-xr-x | src/lib.rs | 45 |
1 files changed, 24 insertions, 21 deletions
@@ -34,6 +34,18 @@ fn tr_op(op: &forth::vm::OpCode) -> String { s.to_string() } +impl From<&forth::vm::WordList> for JsValue { + fn from(v: &forth::vm::WordList) -> Self { + let wl = v.iter().map(|dfn| { + let ops = dfn.iter().map(|op| { + Into::<js_sys::JsString>::into(tr_op(op)) + }); + js_sys::Array::from_iter(ops) + }); + js_sys::Array::from_iter(wl).into() + } +} + impl From<&forth::vm::InstructionPointer> for js_sys::Map { fn from(ip: &forth::vm::InstructionPointer) -> Self { let res = Self::new(); @@ -50,6 +62,16 @@ impl From<&forth::vm::InstructionPointer> for js_sys::Map { } } +impl From<&forth::vm::CallStack> for JsValue { + fn from(v: &forth::vm::CallStack) -> Self { + let cs = v.0.iter().map(|ip| { + let ip: js_sys::Map = ip.into(); + js_sys::Object::from_entries(&ip).expect("can't make object from ip map") + }); + js_sys::Array::from_iter(cs).into() + } +} + impl From<&forth::compiler::Annotation> for js_sys::Map { fn from(anno: &forth::compiler::Annotation) -> Self { let res = Self::new(); @@ -118,17 +140,7 @@ impl ExportedVM { let res = js_sys::Map::new(); // wordlist - let wl = vm.wordlist.iter().map( - |dfn| { - let ops = - dfn.iter() - .map(|op| { - Into::<js_sys::JsString>::into(tr_op(op)) - }); - js_sys::Array::from_iter(ops) - } - ); - res.set(&"wordlist".into(), &js_sys::Array::from_iter(wl)); + res.set(&"wordlist".into(), &(&vm.wordlist).into()); // annotations let annos = self.annos.iter().map( @@ -144,20 +156,11 @@ impl ExportedVM { ); res.set(&"annos".into(), &js_sys::Array::from_iter(annos)); - // instruction pointer let ip: js_sys::Map = (&vm.ip).into(); res.set(&"ip".into(), &js_sys::Object::from_entries(&ip)?.into()); - - // stack let s = vm.stack.0.iter().map(|v| Into::<JsValue>::into(*v as i32)); res.set(&"stack".into(), &js_sys::Array::from_iter(s)); - - // callstack - let cs = vm.callstack.0.iter().map(|v| { - let ip: js_sys::Map = v.into(); - js_sys::Object::from_entries(&ip).expect("can't make object from ip map") - }); - res.set(&"callstack".into(), &js_sys::Array::from_iter(cs)); + res.set(&"callstack".into(), &(&vm.callstack).into()); let vars = js_sys::Map::new(); let mut out = vec![]; |
