diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 0749051..4749287 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -554,11 +554,21 @@ pub extern "C" fn componentize_py_to_canon_i32(_py: &Python, value: Borrowed) -> u32 { + value.extract().unwrap() +} + #[export_name = "componentize-py#ToCanonI64"] pub extern "C" fn componentize_py_to_canon_i64(_py: &Python, value: Borrowed) -> i64 { value.extract().unwrap() } +#[export_name = "componentize-py#ToCanonU64"] +pub extern "C" fn componentize_py_to_canon_u64(_py: &Python, value: Borrowed) -> u64 { + value.extract().unwrap() +} + #[export_name = "componentize-py#ToCanonF32"] pub extern "C" fn componentize_py_to_canon_f32(_py: &Python, value: Borrowed) -> f32 { value.extract().unwrap() @@ -730,11 +740,21 @@ pub extern "C" fn componentize_py_from_canon_i32(py: &Python, value: i32) -> Py< value.to_object(*py) } +#[export_name = "componentize-py#FromCanonU32"] +pub extern "C" fn componentize_py_from_canon_u32(py: &Python, value: u32) -> Py { + value.to_object(*py) +} + #[export_name = "componentize-py#FromCanonI64"] pub extern "C" fn componentize_py_from_canon_i64(py: &Python, value: i64) -> Py { value.to_object(*py) } +#[export_name = "componentize-py#FromCanonU64"] +pub extern "C" fn componentize_py_from_canon_u64(py: &Python, value: u64) -> Py { + value.to_object(*py) +} + #[export_name = "componentize-py#FromCanonF32"] pub extern "C" fn componentize_py_from_canon_f32(py: &Python, value: f32) -> Py { value.to_object(*py) diff --git a/src/bindgen.rs b/src/bindgen.rs index e7fa834..093e5e1 100644 --- a/src/bindgen.rs +++ b/src/bindgen.rs @@ -47,11 +47,21 @@ pub static IMPORT_SIGNATURES: &[(&str, &[ValType], &[ValType])] = &[ &[ValType::I32; 2], &[ValType::I32], ), + ( + "componentize-py#ToCanonU32", + &[ValType::I32; 2], + &[ValType::I32], + ), ( "componentize-py#ToCanonI64", &[ValType::I32; 2], &[ValType::I64], ), + ( + "componentize-py#ToCanonU64", + &[ValType::I32; 2], + &[ValType::I64], + ), ( "componentize-py#ToCanonF32", &[ValType::I32; 2], @@ -93,11 +103,21 @@ pub static IMPORT_SIGNATURES: &[(&str, &[ValType], &[ValType])] = &[ &[ValType::I32; 2], &[ValType::I32], ), + ( + "componentize-py#FromCanonU32", + &[ValType::I32; 2], + &[ValType::I32], + ), ( "componentize-py#FromCanonI64", &[ValType::I32, ValType::I64], &[ValType::I32], ), + ( + "componentize-py#FromCanonU64", + &[ValType::I32, ValType::I64], + &[ValType::I32], + ), ( "componentize-py#FromCanonF32", &[ValType::I32, ValType::F32], @@ -592,20 +612,34 @@ impl<'a> FunctionBindgen<'a> { *IMPORTS.get("componentize-py#ToCanonBool").unwrap(), )); } - Type::U8 | Type::U16 | Type::U32 | Type::S8 | Type::S16 | Type::S32 => { + Type::S8 | Type::S16 | Type::S32 => { self.push(Ins::LocalGet(context)); self.push(Ins::LocalGet(value)); self.push(Ins::Call( *IMPORTS.get("componentize-py#ToCanonI32").unwrap(), )); } - Type::U64 | Type::S64 => { + Type::U8 | Type::U16 | Type::U32 => { + self.push(Ins::LocalGet(context)); + self.push(Ins::LocalGet(value)); + self.push(Ins::Call( + *IMPORTS.get("componentize-py#ToCanonU32").unwrap(), + )); + } + Type::S64 => { self.push(Ins::LocalGet(context)); self.push(Ins::LocalGet(value)); self.push(Ins::Call( *IMPORTS.get("componentize-py#ToCanonI64").unwrap(), )); } + Type::U64 => { + self.push(Ins::LocalGet(context)); + self.push(Ins::LocalGet(value)); + self.push(Ins::Call( + *IMPORTS.get("componentize-py#ToCanonU64").unwrap(), + )); + } Type::F32 => { self.push(Ins::LocalGet(context)); self.push(Ins::LocalGet(value)); @@ -1417,20 +1451,34 @@ impl<'a> FunctionBindgen<'a> { *IMPORTS.get("componentize-py#FromCanonBool").unwrap(), )); } - Type::U8 | Type::U16 | Type::U32 | Type::S8 | Type::S16 | Type::S32 => { + Type::S8 | Type::S16 | Type::S32 => { self.push(Ins::LocalGet(context)); self.push(Ins::LocalGet(value[0])); self.push(Ins::Call( *IMPORTS.get("componentize-py#FromCanonI32").unwrap(), )); } - Type::U64 | Type::S64 => { + Type::U8 | Type::U16 | Type::U32 => { + self.push(Ins::LocalGet(context)); + self.push(Ins::LocalGet(value[0])); + self.push(Ins::Call( + *IMPORTS.get("componentize-py#FromCanonU32").unwrap(), + )); + } + Type::S64 => { self.push(Ins::LocalGet(context)); self.push(Ins::LocalGet(value[0])); self.push(Ins::Call( *IMPORTS.get("componentize-py#FromCanonI64").unwrap(), )); } + Type::U64 => { + self.push(Ins::LocalGet(context)); + self.push(Ins::LocalGet(value[0])); + self.push(Ins::Call( + *IMPORTS.get("componentize-py#FromCanonU64").unwrap(), + )); + } Type::F32 => { self.push(Ins::LocalGet(context)); self.push(Ins::LocalGet(value[0])); diff --git a/src/test/echoes.rs b/src/test/echoes.rs index 2a780ba..397deed 100644 --- a/src/test/echoes.rs +++ b/src/test/echoes.rs @@ -216,18 +216,21 @@ class Echoes(exports.Echoes): return echoes.echo_bool(v) def echo_u8(self, v): + assert v >= 0 return echoes.echo_u8(v) def echo_s8(self, v): return echoes.echo_s8(v) def echo_u16(self, v): + assert v >= 0 return echoes.echo_u16(v) def echo_s16(self, v): return echoes.echo_s16(v) def echo_u32(self, v): + assert v >= 0 return echoes.echo_u32(v) def echo_s32(self, v): @@ -237,6 +240,7 @@ class Echoes(exports.Echoes): return echoes.echo_char(v) def echo_u64(self, v): + assert v >= 0 return echoes.echo_u64(v) def echo_s64(self, v): @@ -255,18 +259,21 @@ class Echoes(exports.Echoes): return echoes.echo_list_bool(v) def echo_list_u8(self, v): + assert all([n >= 0 for n in v]) return echoes.echo_list_u8(v) def echo_list_s8(self, v): return echoes.echo_list_s8(v) def echo_list_u16(self, v): + assert all([n >= 0 for n in v]) return echoes.echo_list_u16(v) def echo_list_s16(self, v): return echoes.echo_list_s16(v) def echo_list_u32(self, v): + assert all([n >= 0 for n in v]) return echoes.echo_list_u32(v) def echo_list_s32(self, v): @@ -276,6 +283,7 @@ class Echoes(exports.Echoes): return echoes.echo_list_char(v) def echo_list_u64(self, v): + assert all([n >= 0 for n in v]) return echoes.echo_list_u64(v) def echo_list_s64(self, v):