From 1d5656294b1e78ff72a735b3c8e36f5da3c085fd Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Fri, 22 May 2026 16:02:26 -0400 Subject: [PATCH 1/7] fix gcc 3.1 --- src/renderer.h | 3 +++ src/spatial_grid.h | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/renderer.h b/src/renderer.h index 453abac5..4f2e4e1b 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -45,7 +45,10 @@ // ===[ Renderer Vtable ]=== typedef struct Renderer Renderer; +#ifndef RUNNER_DEFINED +#define RUNNER_DEFINED typedef struct Runner Runner; +#endif typedef struct { void (*init)(Renderer* renderer, DataWin* dataWin); diff --git a/src/spatial_grid.h b/src/spatial_grid.h index 2795c99b..44e04e51 100644 --- a/src/spatial_grid.h +++ b/src/spatial_grid.h @@ -2,7 +2,10 @@ #include // Forward declarations +#ifndef RUNNER_DEFINED +#define RUNNER_DEFINED typedef struct Runner Runner; +#endif #include "instance.h" #include "real_type.h" @@ -82,4 +85,4 @@ typedef struct { uint32_t queryId; } SpatialGridQuery; -SpatialGridQuery SpatialGrid_prepareQuery(Runner* runner, GMLReal x1, GMLReal y1, GMLReal x2, GMLReal y2, int32_t target); \ No newline at end of file +SpatialGridQuery SpatialGrid_prepareQuery(Runner* runner, GMLReal x1, GMLReal y1, GMLReal x2, GMLReal y2, int32_t target); From 0050ee99d7f61811d2cae068ac6ab8fa9c14f9b4 Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Fri, 22 May 2026 16:15:54 -0400 Subject: [PATCH 2/7] gcc 3.0 --- src/sdl/main.c | 16 ++++++++-------- vendor/stb/ds/stb_ds.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/sdl/main.c b/src/sdl/main.c index bf050b57..cc52cf48 100644 --- a/src/sdl/main.c +++ b/src/sdl/main.c @@ -220,13 +220,13 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'f': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s'\n", optarg); exit(1); } - hmput(args->screenshotFrames, (int) frame, true); + hmput(args->screenshotFrames, frame, true); break; } case 'U': @@ -234,12 +234,12 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'V': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --screenshot-surfaces-at-frame\n", optarg); exit(1); } - hmput(args->screenshotSurfacesFrames, (int) frame, true); + hmput(args->screenshotSurfacesFrames, frame, true); break; } case 'h': @@ -309,22 +309,22 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) } case 'd': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --dump-frame\n", optarg); exit(1); } - hmput(args->dumpFrames, (int) frame, true); + hmput(args->dumpFrames, frame, true); break; } case 'j': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --dump-frame-json\n", optarg); exit(1); } - hmput(args->dumpJsonFrames, (int) frame, true); + hmput(args->dumpJsonFrames, frame, true); break; } case 'J': diff --git a/vendor/stb/ds/stb_ds.h b/vendor/stb/ds/stb_ds.h index b7bdd52b..757532f5 100644 --- a/vendor/stb/ds/stb_ds.h +++ b/vendor/stb/ds/stb_ds.h @@ -505,7 +505,7 @@ extern void * stbds_shmode_func(size_t elemsize, int mode); } #endif -#if defined(__GNUC__) || defined(__clang__) +#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) #define STBDS_HAS_TYPEOF #ifdef __cplusplus //#define STBDS_HAS_LITERAL_ARRAY // this is currently broken for clang From 530ee99ae8b94d1a14a708c6cccda1cca7f875c4 Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Fri, 22 May 2026 16:18:47 -0400 Subject: [PATCH 3/7] fixes --- src/glfw/main.c | 32 ++++++++++++++++---------------- src/sdl/main.c | 16 ++++++++-------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/glfw/main.c b/src/glfw/main.c index 7d3210a9..3d55147b 100644 --- a/src/glfw/main.c +++ b/src/glfw/main.c @@ -282,13 +282,13 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'f': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s'\n", optarg); exit(1); } - hmput(args->screenshotFrames, (int) frame, true); + hmput(args->screenshotFrames, frame, true); break; } case 'U': @@ -296,12 +296,12 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'V': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --screenshot-surfaces-at-frame\n", optarg); exit(1); } - hmput(args->screenshotSurfacesFrames, (int) frame, true); + hmput(args->screenshotSurfacesFrames, frame, true); break; } case 'h': @@ -351,42 +351,42 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'x': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --exit-at-frame\n", optarg); exit(1); } - args->exitAtFrame = (int) frame; + args->exitAtFrame = frame; break; } case 'F': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --trace-bytecode-after-frame\n", optarg); exit(1); } - args->traceBytecodeAfterFrame = (int) frame; + args->traceBytecodeAfterFrame = frame; break; } case 'd': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --dump-frame\n", optarg); exit(1); } - hmput(args->dumpFrames, (int) frame, true); + hmput(args->dumpFrames, frame, true); break; } case 'j': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --dump-frame-json\n", optarg); exit(1); } - hmput(args->dumpJsonFrames, (int) frame, true); + hmput(args->dumpJsonFrames, frame, true); break; } case 'J': @@ -435,12 +435,12 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'Z': { char* endPtr; - long seedVal = strtol(optarg, &endPtr, 10); + int seedVal = strtol(optarg, &endPtr, 10); if (*endPtr != '\0') { fprintf(stderr, "Error: Invalid seed value '%s' for --seed\n", optarg); exit(1); } - args->seed = (int) seedVal; + args->seed = seedVal; args->hasSeed = true; break; } @@ -452,12 +452,12 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'q': { char* endPtr; - long framesBetween = strtol(optarg, &endPtr, 10); + int framesBetween = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || framesBetween <= 0) { fprintf(stderr, "Error: Invalid frame count '%s' for --profile-gml-scripts (must be > 0)\n", optarg); exit(1); } - args->profilerFramesBetween = (int) framesBetween; + args->profilerFramesBetween = framesBetween; break; } case 'B': diff --git a/src/sdl/main.c b/src/sdl/main.c index cc52cf48..5314befa 100644 --- a/src/sdl/main.c +++ b/src/sdl/main.c @@ -289,22 +289,22 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'x': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --exit-at-frame\n", optarg); exit(1); } - args->exitAtFrame = (int) frame; + args->exitAtFrame = frame; break; } case 'F': { char* endPtr; - long frame = strtol(optarg, &endPtr, 10); + int frame = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || 0 > frame) { fprintf(stderr, "Error: Invalid frame number '%s' for --trace-bytecode-after-frame\n", optarg); exit(1); } - args->traceBytecodeAfterFrame = (int) frame; + args->traceBytecodeAfterFrame = frame; break; } case 'd': { @@ -373,12 +373,12 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'Z': { char* endPtr; - long seedVal = strtol(optarg, &endPtr, 10); + int seedVal = strtol(optarg, &endPtr, 10); if (*endPtr != '\0') { fprintf(stderr, "Error: Invalid seed value '%s' for --seed\n", optarg); exit(1); } - args->seed = (int) seedVal; + args->seed = seedVal; args->hasSeed = true; break; } @@ -390,12 +390,12 @@ static void parseCommandLineArgs(CommandLineArgs* args, int argc, char* argv[]) break; case 'q': { char* endPtr; - long framesBetween = strtol(optarg, &endPtr, 10); + int framesBetween = strtol(optarg, &endPtr, 10); if (*endPtr != '\0' || framesBetween <= 0) { fprintf(stderr, "Error: Invalid frame count '%s' for --profile-gml-scripts (must be > 0)\n", optarg); exit(1); } - args->profilerFramesBetween = (int) framesBetween; + args->profilerFramesBetween = framesBetween; break; } case 'B': From bbe95e26694378f8edf3b2094e462c65d7f9b667 Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Fri, 22 May 2026 18:38:10 -0400 Subject: [PATCH 4/7] i think this is more accurate --- vendor/stb/ds/stb_ds.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/stb/ds/stb_ds.h b/vendor/stb/ds/stb_ds.h index 757532f5..4b3a5185 100644 --- a/vendor/stb/ds/stb_ds.h +++ b/vendor/stb/ds/stb_ds.h @@ -505,7 +505,7 @@ extern void * stbds_shmode_func(size_t elemsize, int mode); } #endif -#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#if defined(__GNUC__) || defined(__clang__) #define STBDS_HAS_TYPEOF #ifdef __cplusplus //#define STBDS_HAS_LITERAL_ARRAY // this is currently broken for clang @@ -513,7 +513,7 @@ extern void * stbds_shmode_func(size_t elemsize, int mode); #endif #if !defined(__cplusplus) -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && (!defined(__GNUC__) || (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) #define STBDS_HAS_LITERAL_ARRAY #endif #endif From c7f61ab1054e8f687184f6c4139281ea817b65b2 Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Sat, 23 May 2026 02:20:04 -0400 Subject: [PATCH 5/7] we have functions for this --- src/vm.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/vm.c b/src/vm.c index 48cdfbca..e95cac6e 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1216,9 +1216,7 @@ static void handlePush(VMContext* ctx, uint32_t instr, const uint8_t* extraData, RValue_free(topSlot); GMLArray* sub = GMLArray_create(0); sub->owner = top->owner; - RValue rv = { .type = RVALUE_ARRAY, .ownsReference = true, RVALUE_INIT_GMLTYPE(GML_TYPE_VARIABLE) }; - rv.array = sub; - *topSlot = rv; + *topSlot = RValue_makeArray(sub); } // Push a weak ref to the sub-array — short-lived, consumed by the next BREAK op. stackPush(ctx, RValue_makeArrayWeak(topSlot->array)); @@ -2655,9 +2653,7 @@ static void handleBreakPushAC(VMContext* ctx, uint32_t instrAddr) { RValue_free(parentSlot); GMLArray* sub = GMLArray_create(0); sub->owner = parent->owner; - RValue rv = { .type = RVALUE_ARRAY, .ownsReference = true, RVALUE_INIT_GMLTYPE(GML_TYPE_VARIABLE) }; - rv.array = sub; - *parentSlot = rv; + *parentSlot = RValue_makeArray(sub); } stackPush(ctx, RValue_makeArrayWeak(parentSlot->array)); RValue_free(&arrayRef); From 4b1efd81184f70aefbfa27d3abf0c616bffcb302 Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Sat, 23 May 2026 02:27:05 -0400 Subject: [PATCH 6/7] fix --- src/vm_builtins.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vm_builtins.c b/src/vm_builtins.c index 25b788c1..7dbe6f88 100644 --- a/src/vm_builtins.c +++ b/src/vm_builtins.c @@ -6777,6 +6777,7 @@ static RValue builtin_draw_healthbar(VMContext* ctx, RValue* args, MAYBE_UNUSED } runner->renderer->vtable->drawRectangle(runner->renderer,x1,y1,healthbarX,y2,intermediateColor, runner->renderer->drawAlpha, false); + return RValue_makeUndefined(); } static RValue builtin_draw_set_color(VMContext* ctx, RValue* args, MAYBE_UNUSED int32_t argCount) { From 5c779a311f67af2e62791fc14616565ed6aff9e0 Mon Sep 17 00:00:00 2001 From: Un1q32 Date: Sun, 24 May 2026 22:44:04 -0400 Subject: [PATCH 7/7] rerun ci to not fail