Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions core/cu29_export/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1209,11 +1209,13 @@ Call register_copperlist_python_type::<P>() from Rust before using this function
downcast_copy!(u16);
downcast_copy!(u32);
downcast_copy!(u64);
downcast_copy!(u128);
downcast_copy!(usize);
downcast_copy!(i8);
downcast_copy!(i16);
downcast_copy!(i32);
downcast_copy!(i64);
downcast_copy!(i128);
downcast_copy!(isize);
downcast_copy!(f32);
downcast_copy!(f64);
Expand All @@ -1236,7 +1238,9 @@ Call register_copperlist_python_type::<P>() from Rust before using this function
match value {
Value::String(s) => Ok(s.into_pyobject(py)?.into()),
Value::U64(u) => Ok(u.into_pyobject(py)?.into()),
Value::U128(u) => Ok(u.into_pyobject(py)?.into()),
Value::I64(i) => Ok(i.into_pyobject(py)?.into()),
Value::I128(i) => Ok(i.into_pyobject(py)?.into()),
Value::F64(f) => Ok(f.into_pyobject(py)?.into()),
Value::Bool(b) => Ok(b.into_pyobject(py)?.to_owned().into()),
Value::CuTime(t) => Ok(t.0.into_pyobject(py)?.into()),
Expand Down Expand Up @@ -1272,6 +1276,25 @@ Call register_copperlist_python_type::<P>() from Rust before using this function
}
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn value_to_py_preserves_128_bit_integers() {
Python::initialize();
Python::attach(|py| {
let u128_value = u128::from(u64::MAX) + 99;
let u128_py = value_to_py(&Value::U128(u128_value), py).unwrap();
assert_eq!(u128_py.bind(py).extract::<u128>().unwrap(), u128_value);

let i128_value = i128::from(i64::MIN) - 99;
let i128_py = value_to_py(&Value::I128(i128_value), py).unwrap();
assert_eq!(i128_py.bind(py).extract::<i128>().unwrap(), i128_value);
});
}
}
}

#[cfg(test)]
Expand Down
39 changes: 22 additions & 17 deletions core/cu29_value/src/bdec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ impl<Context> Decode<Context> for Value {
2 => Ok(Value::U16(u16::decode(decoder)?)),
3 => Ok(Value::U32(u32::decode(decoder)?)),
4 => Ok(Value::U64(u64::decode(decoder)?)),
19 => Ok(Value::U128(u128::decode(decoder)?)),
5 => Ok(Value::I8(i8::decode(decoder)?)),
6 => Ok(Value::I16(i16::decode(decoder)?)),
7 => Ok(Value::I32(i32::decode(decoder)?)),
8 => Ok(Value::I64(i64::decode(decoder)?)),
20 => Ok(Value::I128(i128::decode(decoder)?)),
9 => Ok(Value::F32(f32::decode(decoder)?)),
10 => Ok(Value::F64(f64::decode(decoder)?)),
11 => Ok(Value::Char(char::decode(decoder)?)),
Expand All @@ -45,27 +47,30 @@ impl<Context> Decode<Context> for Value {
impl<'de, Context> BorrowDecode<'de, Context> for Value {
fn borrow_decode<D: BorrowDecoder<'de>>(decoder: &mut D) -> Result<Self, DecodeError> {
match u8::borrow_decode(decoder)? {
0 => Ok(Value::U8(u8::borrow_decode(decoder)?)),
1 => Ok(Value::U16(u16::borrow_decode(decoder)?)),
2 => Ok(Value::U32(u32::borrow_decode(decoder)?)),
3 => Ok(Value::U64(u64::borrow_decode(decoder)?)),
4 => Ok(Value::I8(i8::borrow_decode(decoder)?)),
5 => Ok(Value::I16(i16::borrow_decode(decoder)?)),
6 => Ok(Value::I32(i32::borrow_decode(decoder)?)),
7 => Ok(Value::I64(i64::borrow_decode(decoder)?)),
8 => Ok(Value::F32(f32::borrow_decode(decoder)?)),
9 => Ok(Value::F64(f64::borrow_decode(decoder)?)),
10 => Ok(Value::Bool(bool::borrow_decode(decoder)?)),
0 => Ok(Value::Bool(bool::borrow_decode(decoder)?)),
1 => Ok(Value::U8(u8::borrow_decode(decoder)?)),
2 => Ok(Value::U16(u16::borrow_decode(decoder)?)),
3 => Ok(Value::U32(u32::borrow_decode(decoder)?)),
4 => Ok(Value::U64(u64::borrow_decode(decoder)?)),
19 => Ok(Value::U128(u128::borrow_decode(decoder)?)),
5 => Ok(Value::I8(i8::borrow_decode(decoder)?)),
6 => Ok(Value::I16(i16::borrow_decode(decoder)?)),
7 => Ok(Value::I32(i32::borrow_decode(decoder)?)),
8 => Ok(Value::I64(i64::borrow_decode(decoder)?)),
20 => Ok(Value::I128(i128::borrow_decode(decoder)?)),
9 => Ok(Value::F32(f32::borrow_decode(decoder)?)),
10 => Ok(Value::F64(f64::borrow_decode(decoder)?)),
11 => Ok(Value::Char(char::borrow_decode(decoder)?)),
12 => Ok(Value::String(String::borrow_decode(decoder)?)),
13 => Ok(Value::Bytes(Vec::<u8>::borrow_decode(decoder)?)),
14 => Ok(Value::Unit),
15 => Ok(Value::Seq(Vec::<Value>::borrow_decode(decoder)?)),
16 => Ok(Value::Map(BTreeMap::<Value, Value>::borrow_decode(
13 => Ok(Value::Unit),
14 => Ok(Value::Option(Option::<Box<Value>>::borrow_decode(decoder)?)),
15 => Ok(Value::Newtype(Box::<Value>::borrow_decode(decoder)?)),
16 => Ok(Value::Seq(Vec::<Value>::borrow_decode(decoder)?)),
17 => Ok(Value::Map(BTreeMap::<Value, Value>::borrow_decode(
decoder,
)?)),
17 => Ok(Value::Option(Option::<Box<Value>>::borrow_decode(decoder)?)),
18 => Ok(Value::Newtype(Box::<Value>::borrow_decode(decoder)?)),
18 => Ok(Value::Bytes(Vec::<u8>::borrow_decode(decoder)?)),
32 => Ok(Value::CuTime(CuTime::borrow_decode(decoder)?)),
r => Err(DecodeError::OtherString(format!(
"Unknown Value variant: {r}"
))),
Expand Down
2 changes: 2 additions & 0 deletions core/cu29_value/src/benc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ impl Encode for Value {
Value::U16(v) => v.to_owned().encode(encoder),
Value::U32(v) => v.to_owned().encode(encoder),
Value::U64(v) => v.to_owned().encode(encoder),
Value::U128(v) => v.to_owned().encode(encoder),
Value::I8(v) => v.to_owned().encode(encoder),
Value::I16(v) => v.to_owned().encode(encoder),
Value::I32(v) => v.to_owned().encode(encoder),
Value::I64(v) => v.to_owned().encode(encoder),
Value::I128(v) => v.to_owned().encode(encoder),
Value::F32(v) => v.to_owned().encode(encoder),
Value::F64(v) => v.to_owned().encode(encoder),
Value::Bool(v) => v.to_owned().encode(encoder),
Expand Down
14 changes: 12 additions & 2 deletions core/cu29_value/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,14 @@ impl<'de> de::Visitor<'de> for ValueVisitor {
Ok(Value::U64(value))
}

fn visit_u128<E>(self, value: u128) -> Result<Value, E> {
Ok(Value::U128(value))
}

fn visit_i128<E>(self, value: i128) -> Result<Value, E> {
Ok(Value::I128(value))
}

fn visit_f32<E>(self, value: f32) -> Result<Value, E> {
Ok(Value::F32(value))
}
Expand Down Expand Up @@ -362,10 +370,12 @@ where
Value::U16(v) => visitor.visit_u16(v),
Value::U32(v) => visitor.visit_u32(v),
Value::U64(v) => visitor.visit_u64(v),
Value::U128(v) => visitor.visit_u128(v),
Value::I8(v) => visitor.visit_i8(v),
Value::I16(v) => visitor.visit_i16(v),
Value::I32(v) => visitor.visit_i32(v),
Value::I64(v) => visitor.visit_i64(v),
Value::I128(v) => visitor.visit_i128(v),
Value::F32(v) => visitor.visit_f32(v),
Value::F64(v) => visitor.visit_f64(v),
Value::Char(v) => visitor.visit_char(v),
Expand Down Expand Up @@ -453,7 +463,7 @@ where
}

forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit
bool u8 u16 u32 u64 u128 i8 i16 i32 i64 i128 f32 f64 char str string unit
seq bytes byte_buf map unit_struct
tuple_struct struct tuple ignored_any identifier
}
Expand Down Expand Up @@ -499,7 +509,7 @@ impl<'de> de::Deserializer<'de> for Value {
}

forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit
bool u8 u16 u32 u64 u128 i8 i16 i32 i64 i128 f32 f64 char str string unit
seq bytes byte_buf map unit_struct
tuple_struct struct tuple ignored_any identifier
}
Expand Down
Loading
Loading