From 6c7153e42d115fb6e98d126923b0d66fe22808c8 Mon Sep 17 00:00:00 2001 From: Masashi Date: Wed, 17 Dec 2025 19:27:57 +0530 Subject: [PATCH] better gc --- compile.sh | 2 +- src/codegen/transpiler.rs | 21 ++++++++++++++++++++- tests/fps_game.o | Bin 45312 -> 0 bytes 3 files changed, 21 insertions(+), 2 deletions(-) delete mode 100755 tests/fps_game.o diff --git a/compile.sh b/compile.sh index 9f66f30..09e2f22 100755 --- a/compile.sh +++ b/compile.sh @@ -67,7 +67,7 @@ ODE_LIBS=$(pkg-config --libs ode 2>/dev/null || echo "-lode -lm") # Compile C to executable with libsuicmez, raylib, and ODE support echo "Compiling C code and linking with libsuicmez, raylib, and ODE..." -gcc $OPTIMIZE_FLAG -I. "$C_FILE" libsuicmez/libsuicmez.c libsuicmez/suicmez_gc.c $RAYLIB_CFLAGS $RAYLIB_LIBS $ODE_CFLAGS $ODE_LIBS -lm -o "$OUTPUT_BINARY" || exit 1 +gcc $OPTIMIZE_FLAG -I. -Ilibfishsoup/include "$C_FILE" libsuicmez/libsuicmez.c libsuicmez/suicmez_gc.c libfishsoup/src/*.c $RAYLIB_CFLAGS $RAYLIB_LIBS $ODE_CFLAGS $ODE_LIBS -lm -o "$OUTPUT_BINARY" || exit 1 echo "✓ Successfully created: $OUTPUT_BINARY" echo " Run with: ./$OUTPUT_BINARY" diff --git a/src/codegen/transpiler.rs b/src/codegen/transpiler.rs index 90bd97f..8522c6b 100644 --- a/src/codegen/transpiler.rs +++ b/src/codegen/transpiler.rs @@ -154,6 +154,11 @@ impl Transpiler { output.push_str(&self.generate_typeinfo_decl(struct_decl)); output.push_str("\n"); } + // Generate TypeInfo for array wrapper structs + for array_type_name in &self.array_types { + output.push_str(&self.generate_array_typeinfo_decl(array_type_name)); + output.push_str("\n"); + } output.push_str("\n"); // Generate function declarations (prototypes) @@ -337,6 +342,20 @@ impl Transpiler { } } + fn generate_array_typeinfo_decl(&self, array_type_name: &str) -> String { + // Array wrapper struct has: void* data (pointer), size_t len (not pointer), size_t capacity (not pointer) + // So bitmap: 1, 0, 0 + format!( + "static const uint8_t sui_bitmap_{}[] = {{ 1, 0, 0 }};\n\ + static const TypeInfo sui_typeinfo_{} = {{\n \ + .field_count = 3,\n \ + .pointer_count = 1,\n \ + .pointer_bitmap = sui_bitmap_{}\n\ + }};", + array_type_name, array_type_name, array_type_name + ) + } + fn generate_func_proto(&self, func: &CFuncDecl) -> String { let params_str = if func.params.is_empty() { "void".to_string() @@ -395,7 +414,7 @@ impl Transpiler { fn generate_heap_alloc(&self, ty: &CType) -> String { match ty { CType::Struct(name) => { - format!("(struct {}*)gc_alloc(&sui_typeinfo_{}, sizeof(struct {}))", name, name, name) + format!("(struct {}*)suic_alloc_struct(&sui_typeinfo_{}, sizeof(struct {}), NULL)", name, name, name) } CType::Array(elem_type) => { let array_name = Self::get_array_struct_name(elem_type); diff --git a/tests/fps_game.o b/tests/fps_game.o deleted file mode 100755 index 5429807391b3a6612ff7de2a55a3f7f22cda921f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45312 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%0AEI-n<7++|={h{Iy>5<6+R8_;i{``dMROS3@~&vk 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