From c372c08dc940db58f1da9cadeb64b4cb3c837704 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 06:58:13 +0000 Subject: fix(classes): preserve method-only heap objects and document NEW Allocate at least one byte for method-only classes so their heap addresses remain usable through pointers. Complete constructor diagnostics, field-order and exception coverage, document construction and rebinding, and highlight NEW. Co-Authored-By: Claude Opus 5.5 --- tests/i/class-heap-new/program.cps | 65 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'tests/i/class-heap-new/program.cps') diff --git a/tests/i/class-heap-new/program.cps b/tests/i/class-heap-new/program.cps index 7b8363f..aff248a 100644 --- a/tests/i/class-heap-new/program.cps +++ b/tests/i/class-heap-new/program.cps @@ -98,3 +98,68 @@ FOR Index <- 1 TO 2 Local <- NEW Box Local.Value <- 99 NEXT Index +CLASS Fragile + Value : INTEGER + PROCEDURE NEW(Fail : BOOLEAN) + Value <- 70 + IF Fail THEN + THROW + ENDIF + ENDPROCEDURE +ENDCLASS +TYPE FragilePointer = ^Fragile +DECLARE Stable : Fragile(FALSE) +DECLARE Original : FragilePointer +Original <- ^Stable +Stable.Value <- 71 +TRY + Stable <- NEW Fragile(TRUE) +CATCH + OUTPUT "failed rebind:", Stable.Value, ",", Original^.Value +ENDTRY +H.Item.Value <- 80 +H <- NEW Holder() +OUTPUT "nested heap:", Field^.Value, ",", H.Item.Value +CLASS OrderedFirst + PROCEDURE NEW() + OUTPUT "first" + ENDPROCEDURE +ENDCLASS +CLASS OrderedSecond + PROCEDURE NEW() + OUTPUT "second" + ENDPROCEDURE +ENDCLASS +CLASS Ordered + First : OrderedFirst + Second : OrderedSecond + PROCEDURE NEW() + OUTPUT "outer" + ENDPROCEDURE +ENDCLASS +DECLARE Order : Ordered +Order <- NEW Ordered +CLASS PrivateFactory + Value : INTEGER + PRIVATE PROCEDURE NEW() + Value <- 1 + ENDPROCEDURE + PROCEDURE Build() + DECLARE Local : PrivateFactory + Local <- NEW PrivateFactory + Local.NEW() + ENDPROCEDURE +ENDCLASS +CLASS Marker + PROCEDURE NEW() + ENDPROCEDURE + FUNCTION Get() RETURNS INTEGER + RETURN 99 + ENDFUNCTION +ENDCLASS +TYPE MarkerPointer = ^Marker +DECLARE M : Marker +DECLARE MarkerAddress : MarkerPointer +M <- NEW Marker +MarkerAddress <- ^M +OUTPUT "method only:", MarkerAddress^.Get() -- cgit v1.3.1-4-g156e