Skip to content

Commit dac04e1

Browse files
feggeclaude
andcommitted
Restructured type inference lattice and fixed issues in type analysis
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 4ad52e9 commit dac04e1

File tree

8 files changed

+682
-527
lines changed

8 files changed

+682
-527
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "masm-decompiler"
3-
version = "0.6.0"
3+
version = "0.6.1"
44
edition = "2024"
55

66
[dependencies]

src/decompile.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ impl DecompiledProc {
239239
})
240240
.unwrap_or_else(|| {
241241
(
242-
vec![TypeRequirement::Unknown; inputs],
243-
vec![InferredType::Unknown; outputs],
242+
vec![TypeRequirement::Felt; inputs],
243+
vec![InferredType::Felt; outputs],
244244
)
245245
});
246246

@@ -263,7 +263,7 @@ impl DecompiledProc {
263263

264264
/// Normalize inferred input types to exactly match the known input arity.
265265
fn normalized_input_types(types: &[TypeRequirement], expected_len: usize) -> Vec<TypeRequirement> {
266-
let mut normalized = vec![TypeRequirement::Unknown; expected_len];
266+
let mut normalized = vec![TypeRequirement::Felt; expected_len];
267267
for (display_idx, slot) in normalized.iter_mut().enumerate() {
268268
let summary_idx = expected_len.saturating_sub(1).saturating_sub(display_idx);
269269
if let Some(ty) = types.get(summary_idx) {
@@ -275,7 +275,7 @@ fn normalized_input_types(types: &[TypeRequirement], expected_len: usize) -> Vec
275275

276276
/// Normalize inferred output types to exactly match the known output arity.
277277
fn normalized_output_types(types: &[InferredType], expected_len: usize) -> Vec<InferredType> {
278-
let mut normalized = vec![InferredType::Unknown; expected_len];
278+
let mut normalized = vec![InferredType::Felt; expected_len];
279279
for (display_idx, slot) in normalized.iter_mut().enumerate() {
280280
let summary_idx = expected_len.saturating_sub(1).saturating_sub(display_idx);
281281
if let Some(ty) = types.get(summary_idx) {

src/fmt/mod.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,7 @@ impl CodeDisplay for DecompiledHeader {
730730
.input_types
731731
.get(i)
732732
.copied()
733-
.unwrap_or(TypeRequirement::Unknown);
733+
.unwrap_or(TypeRequirement::Felt);
734734
args.push(format!(
735735
"{}: {}",
736736
f.fmt_var(&v),
@@ -747,7 +747,7 @@ impl CodeDisplay for DecompiledHeader {
747747
.output_types
748748
.first()
749749
.copied()
750-
.unwrap_or(InferredType::Unknown);
750+
.unwrap_or(InferredType::Felt);
751751
format!(" -> {}", type_name(inferred_type_for_display(ty)))
752752
}
753753
n => {
@@ -757,7 +757,7 @@ impl CodeDisplay for DecompiledHeader {
757757
.output_types
758758
.get(idx)
759759
.copied()
760-
.unwrap_or(InferredType::Unknown);
760+
.unwrap_or(InferredType::Felt);
761761
type_name(inferred_type_for_display(ty))
762762
})
763763
.collect::<Vec<_>>()
@@ -777,23 +777,19 @@ impl CodeDisplay for DecompiledHeader {
777777
}
778778

779779
/// Convert an input type requirement to its formatter display string.
780-
///
781-
/// Unknown requirements are rendered as `Felt`.
782780
fn type_requirement_for_display(requirement: TypeRequirement) -> &'static str {
783781
match requirement {
784-
TypeRequirement::Unknown | TypeRequirement::Felt => "Felt",
782+
TypeRequirement::Felt => "Felt",
785783
TypeRequirement::Bool => "Bool",
786784
TypeRequirement::U32 => "U32",
787785
TypeRequirement::Address => "Address",
788786
}
789787
}
790788

791789
/// Convert an inferred output type to its formatter display string.
792-
///
793-
/// Unknown inferred outputs are rendered as `Felt`.
794790
fn inferred_type_for_display(ty: InferredType) -> &'static str {
795791
match ty {
796-
InferredType::Unknown | InferredType::Felt => "Felt",
792+
InferredType::Felt => "Felt",
797793
InferredType::Bool => "Bool",
798794
InferredType::U32 => "U32",
799795
InferredType::Address => "Address",

0 commit comments

Comments
 (0)