aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-17 00:17:43 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-17 00:17:43 +0100
commitf8b6afd57efc1a9e7e12fe1316bc45dcc6f32470 (patch)
tree8cc7cbf2b3eebdc92b1e7c9d6ab9f34da3cd4169
parentb99fc498f2cf26c93d7888ea9aba4dd8cea60b2f (diff)
downloadjellything-f8b6afd57efc1a9e7e12fe1316bc45dcc6f32470.tar
jellything-f8b6afd57efc1a9e7e12fe1316bc45dcc6f32470.tar.bz2
jellything-f8b6afd57efc1a9e7e12fe1316bc45dcc6f32470.tar.zst
fix object align bugs
-rw-r--r--common/object/src/buffer.rs3
-rw-r--r--common/object/src/json.rs29
-rw-r--r--common/object/src/value.rs10
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<u8> {
+ 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::<Object>(i).unwrap()));
+ let val = object_to_json(reg, ob.get_typed::<Object>(i).unwrap());
+ multi_insert(&mut o, key, val);
}
x if x == U32 => {
- o.insert(key, ob.get_typed::<u32>(i).unwrap().to_string().into());
+ let val = ob.get_typed::<u32>(i).unwrap().to_string().into();
+ multi_insert(&mut o, key, val);
}
x if x == U64 => {
- o.insert(key, ob.get_typed::<u64>(i).unwrap().to_string().into());
+ let val = ob.get_typed::<u64>(i).unwrap().to_string().into();
+ multi_insert(&mut o, key, val);
}
x if x == F64 => {
- o.insert(key, ob.get_typed::<f64>(i).unwrap().to_string().into());
+ let val = ob.get_typed::<f64>(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<String, Value>, 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<Self> {
let _ = buf;
- None
+ unimplemented!()
}
fn load_unaligned(buf: &'a [u8]) -> Option<Self> {
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<Self> {
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<Self> {
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<Self> {
u32::load_aligned(buf).map(|x| x as i64)
}