summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-26 12:00:55 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-26 12:00:55 +0100
commitebe855b47a5af50f9acc7a6b265904055e403bce (patch)
tree12eeb9ede17b1d755bf034cc59a1e2eef063aaa0
parentaaca617dea0adc0ce5cc535ac969bb8e123ba9ca (diff)
Remove potentially lossy cast
-rw-r--r--examples/11-transient-0/output/rust/src/gen/data/transient_0.rs12
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java6
2 files changed, 10 insertions, 8 deletions
diff --git a/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs
index 7f82820..1a6a009 100644
--- a/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs
+++ b/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs
@@ -253,7 +253,7 @@ pub fn decode_struct_with_list_of_shared(reader: &mut impl std::io::Read, shared
elements.push({
let id = crate::transient_0::decode_int_64(reader, shared_values)?;
if id < ((shared_values.len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))? {
- ((::std::sync::Arc::clone(&shared_values[id as ::core::primitive::usize])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
+ ((::std::sync::Arc::clone(&shared_values[(::core::primitive::usize::try_from(id)).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
} else {
let decoded_value = ::std::sync::Arc::new(crate::data::transient_0::decode_struct_with_int_32(reader, shared_values)?);
shared_values.push(::std::sync::Arc::clone(&decoded_value) as ::std::sync::Arc::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>);
@@ -316,7 +316,7 @@ pub fn decode_struct_with_different_shared_types(reader: &mut impl std::io::Read
let a = {
let id = crate::transient_0::decode_int_64(reader, shared_values)?;
if id < ((shared_values.len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))? {
- ((::std::sync::Arc::clone(&shared_values[id as ::core::primitive::usize])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
+ ((::std::sync::Arc::clone(&shared_values[(::core::primitive::usize::try_from(id)).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
} else {
let decoded_value = ::std::sync::Arc::new(crate::data::transient_0::decode_struct_with_int_32(reader, shared_values)?);
shared_values.push(::std::sync::Arc::clone(&decoded_value) as ::std::sync::Arc::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>);
@@ -326,7 +326,7 @@ pub fn decode_struct_with_different_shared_types(reader: &mut impl std::io::Read
let b = {
let id = crate::transient_0::decode_int_64(reader, shared_values)?;
if id < ((shared_values.len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))? {
- ((::std::sync::Arc::clone(&shared_values[id as ::core::primitive::usize])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
+ ((::std::sync::Arc::clone(&shared_values[(::core::primitive::usize::try_from(id)).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
} else {
let decoded_value = ::std::sync::Arc::new(crate::data::transient_0::decode_struct_with_int_64(reader, shared_values)?);
shared_values.push(::std::sync::Arc::clone(&decoded_value) as ::std::sync::Arc::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>);
@@ -336,7 +336,7 @@ pub fn decode_struct_with_different_shared_types(reader: &mut impl std::io::Read
let c = {
let id = crate::transient_0::decode_int_64(reader, shared_values)?;
if id < ((shared_values.len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))? {
- ((::std::sync::Arc::clone(&shared_values[id as ::core::primitive::usize])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
+ ((::std::sync::Arc::clone(&shared_values[(::core::primitive::usize::try_from(id)).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
} else {
let decoded_value = ::std::sync::Arc::new(crate::data::transient_0::decode_struct_with_int_32(reader, shared_values)?);
shared_values.push(::std::sync::Arc::clone(&decoded_value) as ::std::sync::Arc::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>);
@@ -382,7 +382,7 @@ pub fn decode_struct_with_shared_sum_and_variant(reader: &mut impl std::io::Read
let a = {
let id = crate::transient_0::decode_int_64(reader, shared_values)?;
if id < ((shared_values.len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))? {
- ((::std::sync::Arc::clone(&shared_values[id as ::core::primitive::usize])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
+ ((::std::sync::Arc::clone(&shared_values[(::core::primitive::usize::try_from(id)).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
} else {
let decoded_value = ::std::sync::Arc::new(crate::data::transient_0::decode_sum_with_variants(reader, shared_values)?);
shared_values.push(::std::sync::Arc::clone(&decoded_value) as ::std::sync::Arc::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>);
@@ -392,7 +392,7 @@ pub fn decode_struct_with_shared_sum_and_variant(reader: &mut impl std::io::Read
let b = {
let id = crate::transient_0::decode_int_64(reader, shared_values)?;
if id < ((shared_values.len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))? {
- ((::std::sync::Arc::clone(&shared_values[id as ::core::primitive::usize])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
+ ((::std::sync::Arc::clone(&shared_values[(::core::primitive::usize::try_from(id)).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?])).downcast()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, "referenced value has wrong type"))?
} else {
let decoded_value = ::std::sync::Arc::new(crate::data::transient_0::decode_variant_one(reader, shared_values)?);
shared_values.push(::std::sync::Arc::clone(&decoded_value) as ::std::sync::Arc::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>);
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
index 3718f05..734e7f7 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java
@@ -905,8 +905,10 @@ public class RustTransient0Generator implements Generator {
List.of(
new RustPrefixExpression(RustPrefixOperator.BORROW, new RustIndexExpression(
RustPath.of(SHARED_VALUES_NAME),
- // TODO: use try_into()
- new RustTypeCastExpression(RustPath.of(id), RustTypes.USIZE)
+ new RustTryPropagationExpression(mapErrToInvalidData(new RustCallExpression(
+ RustTypes.USIZE.addSegment(RustPathSegment.of("try_from")),
+ List.of(RustPath.of(id))
+ )))
))
)
),