This commit is contained in:
Masashi 2025-12-20 03:18:31 +05:30
commit a00e8690fd
3 changed files with 15 additions and 24 deletions

View file

@ -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

View file

@ -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;
}

Binary file not shown.