diff --git a/src/codegen/transpiler.rs b/src/codegen/transpiler.rs index 79772fe..ec2a448 100644 --- a/src/codegen/transpiler.rs +++ b/src/codegen/transpiler.rs @@ -337,6 +337,10 @@ impl Transpiler { } fn generate_struct_decl(&self, struct_decl: &CStructDecl) -> String { + // Skip predefined structs that are already declared in included headers + if matches!(struct_decl.name.as_str(), "Shader" | "Color") { + return String::new(); + } let mut output = format!("struct {} {{\n", struct_decl.name); for field in &struct_decl.fields { output.push_str(&format!(" {} {};\n", field.ty.to_string(), field.name)); @@ -346,6 +350,10 @@ impl Transpiler { } fn generate_typeinfo_decl(&self, struct_decl: &CStructDecl) -> String { + // Skip predefined structs + if matches!(struct_decl.name.as_str(), "Shader" | "Color") { + return String::new(); + } if let Some(bitmap) = self.typeinfo_map.get(&struct_decl.name) { // Generate pointer bitmap as a C array let bitmap_str = bitmap @@ -796,7 +804,7 @@ impl Transpiler { "Vec3" => "suic_vec3".to_string(), _ => format!("struct {}", struct_name), }; - format!("({}){{ {} }}", c_type_name, field_inits.join(", ")) + format!("suic_alloc_struct(&sui_typeinfo_{}, sizeof({}), &(({}){{ {} }}))", struct_name, c_type_name, c_type_name, field_inits.join(", ")) } CExpr::EnumLit(enum_name, variant_name, args) => { // Find the variant index - for simplicity, assume variants are in order diff --git a/tests/structs.c b/tests/structs.c index 16bda91..5f9a149 100644 --- a/tests/structs.c +++ b/tests/structs.c @@ -31,15 +31,8 @@ struct Person { char* name; int age; }; -struct Color { - uint8_t r; - uint8_t g; - uint8_t b; - uint8_t a; -}; -struct Shader { - int id; -}; +; +; static const uint8_t sui_bitmap_Point[] = { 0, 0 }; static const TypeInfo sui_typeinfo_Point = { @@ -53,25 +46,15 @@ static const TypeInfo sui_typeinfo_Person = { .pointer_count = 1, .pointer_bitmap = sui_bitmap_Person }; -static const uint8_t sui_bitmap_Color[] = { 0, 0, 0, 0 }; -static const TypeInfo sui_typeinfo_Color = { - .field_count = 4, - .pointer_count = 0, - .pointer_bitmap = sui_bitmap_Color -}; -static const uint8_t sui_bitmap_Shader[] = { 0 }; -static const TypeInfo sui_typeinfo_Shader = { - .field_count = 1, - .pointer_count = 0, - .pointer_bitmap = sui_bitmap_Shader -}; + + int suic_main(void); int suic_main(void) { - struct Point* p = (struct Point){ .x = 5, .y = 10 }; - struct Person* person = (struct Person){ .name = suic_alloc_array(NULL, sizeof(char), 6, "Alice"), .age = 30 }; + struct Point* p = suic_alloc_struct(&sui_typeinfo_Point, sizeof(struct Point), &((struct Point){ .x = 5, .y = 10 })); + struct Person* person = suic_alloc_struct(&sui_typeinfo_Person, sizeof(struct Person), &((struct Person){ .name = suic_alloc_array(NULL, sizeof(char), 6, "Alice"), .age = 30 })); int _ = ((*p).x + (*person).age); return 0; } diff --git a/tests/structs.o b/tests/structs.o index 13e75a4..81c4f34 100755 Binary files a/tests/structs.o and b/tests/structs.o differ