From 4e22f464387725a5a282f3d72e11cfb694a31a5a Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 05:33:33 +0000 Subject: feat(memory): add checked REALLOC with failure preservation Co-Authored-By: Claude Fable 5.1 --- tests/i/memory-reallocation/program.cps | 81 +++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/i/memory-reallocation/program.cps (limited to 'tests/i/memory-reallocation/program.cps') diff --git a/tests/i/memory-reallocation/program.cps b/tests/i/memory-reallocation/program.cps new file mode 100644 index 0000000..d119256 --- /dev/null +++ b/tests/i/memory-reallocation/program.cps @@ -0,0 +1,81 @@ +TYPE Raw = C_TYPE("void*") +TYPE NativePointer = C_TYPE("int*") +TYPE Pair + DECLARE First : INTEGER + DECLARE Second : INTEGER +ENDTYPE +TYPE PairPointer = ^Pair +TYPE IntPointer = ^INTEGER +DECLARE Empty : Raw +DECLARE P : Raw +DECLARE Q : Raw +DECLARE Number : INTEGER +DECLARE Pointer : IntPointer +DECLARE PairAddress : PairPointer +DECLARE Native : NativePointer +OUTPUT REALLOC(Empty, 0) = Empty +P <- REALLOC(Empty, 16) +PairAddress <- (PairPointer)P +PairAddress^.First <- 12 +PairAddress^.Second <- 34 +P <- REALLOC(P, 32) +PairAddress <- (PairPointer)P +OUTPUT PairAddress^.First, ":", PairAddress^.Second +P <- REALLOC(P, (C_INT)8) +Pointer <- (IntPointer)P +OUTPUT Pointer^ +TRY + P <- REALLOC(P, -1) +CATCH + Pointer <- (IntPointer)P + OUTPUT "preserved:", Pointer^ +ENDTRY +Pointer^ <- 56 +P <- REALLOC(P, 16) +Pointer <- (IntPointer)P +OUTPUT Pointer^ +Q <- P +OUTPUT REALLOC(P, 0) = Empty +TRY + REALLOC(Q, 8) +CATCH + OUTPUT "released address caught" +ENDTRY +Pointer <- ^Number +Q <- (Raw)Pointer +TRY + REALLOC(Q, 0) +CATCH + OUTPUT "invalid zero resize caught" +ENDTRY +FUNCTION AllocateNative() RETURNS Raw + RETURN MALLOC(16) +ENDFUNCTION +P <- AllocateNative() +Native <- (NativePointer)P +Native^ <- (C_INT)71 +P <- REALLOC(P, 32) +Native <- (NativePointer)P +OUTPUT Native^ +FREE(P) +// A runtime failure raised from a function propagates to the caller. +FUNCTION InvalidResize(Value : Raw) RETURNS Raw + RETURN REALLOC(Value, 8) +ENDFUNCTION +TRY + InvalidResize(Q) +CATCH + TRY + FREE(Q) + CATCH + OUTPUT "nested catch" + ENDTRY +ENDTRY +// STRING storage is deliberately outside the explicit allocation list. +Q <- (Raw)(C_STRING)"internal" +TRY + REALLOC(Q, 16) +CATCH + OUTPUT "internal buffer caught" +ENDTRY +FREE(REALLOC(Empty, (C_INT)8)) -- cgit v1.3.1-4-g156e