summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Cully <bjc@spork.org>2025-12-18 19:10:33 -0500
committerBrian Cully <bjc@spork.org>2025-12-18 19:10:33 -0500
commit8e65c1c439b2fc0d0ae5d8482e9350e283cde882 (patch)
treea6c9ce65527019d27861c873efe90dd6c39777c3
parent62f9d83b6ae7b62fb5606fbfd47c4332a2a2d3e6 (diff)
downloadautomathon-8e65c1c439b2fc0d0ae5d8482e9350e283cde882.tar.gz
automathon-8e65c1c439b2fc0d0ae5d8482e9350e283cde882.zip
rust: use from trait more
-rwxr-xr-xsrc/lib.rs45
1 files changed, 24 insertions, 21 deletions
diff --git a/src/lib.rs b/src/lib.rs
index b0f6264..2aedfff 100755
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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![];