From f8b6afd57efc1a9e7e12fe1316bc45dcc6f32470 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 17 Feb 2026 00:17:43 +0100 Subject: fix object align bugs --- common/object/src/buffer.rs | 3 +++ common/object/src/json.rs | 29 ++++++++++++++++++++++------- common/object/src/value.rs | 10 +++++----- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/common/object/src/buffer.rs b/common/object/src/buffer.rs index 1792d73..05557e4 100644 --- a/common/object/src/buffer.rs +++ b/common/object/src/buffer.rs @@ -19,6 +19,9 @@ impl ObjectBuffer { pub fn as_object<'a>(&'a self) -> Object<'a> { Object::load(&self.0).unwrap() } + pub fn to_bytes(self) -> Vec { + self.0.into_iter().flat_map(u32::to_le_bytes).collect() + } pub fn new(fields: &mut [(Tag, &dyn ValueStore)]) -> ObjectBuffer { let mut tags = Vec::new(); let mut offsets = Vec::new(); diff --git a/common/object/src/json.rs b/common/object/src/json.rs index e8b04ea..31e7858 100644 --- a/common/object/src/json.rs +++ b/common/object/src/json.rs @@ -8,7 +8,6 @@ use crate::{Object, Registry, types::*}; use serde_json::{Map, Value}; pub fn object_to_json(reg: &Registry, ob: Object<'_>) -> Value { - eprintln!("{ob:#?}"); let mut o = Map::new(); let mut nonexhaustive = false; for (i, tag) in ob.keys().enumerate() { @@ -24,20 +23,24 @@ pub fn object_to_json(reg: &Registry, ob: Object<'_>) -> Value { match ty { x if x == STR => { - o.insert(key, ob.get_typed::<&str>(i).unwrap().to_string().into()); + let val = ob.get_typed::<&str>(i).unwrap().to_string().into(); + multi_insert(&mut o, key, val); } x if x == OBJECT => { - eprintln!("{key}"); - o.insert(key, object_to_json(reg, ob.get_typed::(i).unwrap())); + let val = object_to_json(reg, ob.get_typed::(i).unwrap()); + multi_insert(&mut o, key, val); } x if x == U32 => { - o.insert(key, ob.get_typed::(i).unwrap().to_string().into()); + let val = ob.get_typed::(i).unwrap().to_string().into(); + multi_insert(&mut o, key, val); } x if x == U64 => { - o.insert(key, ob.get_typed::(i).unwrap().to_string().into()); + let val = ob.get_typed::(i).unwrap().to_string().into(); + multi_insert(&mut o, key, val); } x if x == F64 => { - o.insert(key, ob.get_typed::(i).unwrap().to_string().into()); + let val = ob.get_typed::(i).unwrap().to_string().into(); + multi_insert(&mut o, key, val); } _ => { nonexhaustive = true; @@ -50,3 +53,15 @@ pub fn object_to_json(reg: &Registry, ob: Object<'_>) -> Value { Value::Object(o) } + +fn multi_insert(m: &mut Map, key: String, val: Value) { + if let Some(cur) = m.get_mut(&key) { + if let Some(cur) = cur.as_array_mut() { + cur.push(val); + } else { + *cur = Value::Array(vec![cur.clone(), val]) + } + } else { + m.insert(key, val); + } +} diff --git a/common/object/src/value.rs b/common/object/src/value.rs index ac4cc9d..817ccdc 100644 --- a/common/object/src/value.rs +++ b/common/object/src/value.rs @@ -10,11 +10,11 @@ pub trait Value<'a>: ValueStore + Sized { const ALIGNED: bool; fn load_aligned(buf: &'a [u32]) -> Option { let _ = buf; - None + unimplemented!() } fn load_unaligned(buf: &'a [u8]) -> Option { let _ = buf; - None + unimplemented!() } } pub trait ValueStore { @@ -75,7 +75,7 @@ impl ValueStore for Tag { } } impl Value<'_> for u64 { - const ALIGNED: bool = false; + const ALIGNED: bool = true; fn load_aligned(buf: &[u32]) -> Option { let hi = u32::from_be(*buf.get(0)?) as u64; let lo = u32::from_be(*buf.get(1)?) as u64; @@ -95,7 +95,7 @@ impl ValueStore for u64 { } } impl Value<'_> for f64 { - const ALIGNED: bool = false; + const ALIGNED: bool = true; fn load_aligned(buf: &[u32]) -> Option { u32::load_aligned(buf).map(|x| x as f64) } @@ -112,7 +112,7 @@ impl ValueStore for f64 { } } impl Value<'_> for i64 { - const ALIGNED: bool = false; + const ALIGNED: bool = true; fn load_aligned(buf: &[u32]) -> Option { u32::load_aligned(buf).map(|x| x as i64) } -- cgit v1.3