aboutsummaryrefslogtreecommitdiff
path: root/tests/i/class-heap-new/program.cps
blob: aff248a8f96838bf5d622ba4b7f24f2280aeb22c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165

CLASS Box
    Value : INTEGER
    PROCEDURE NEW()
        Value <- 1
    ENDPROCEDURE
    PROCEDURE Reset()
        this.NEW()
    ENDPROCEDURE
    PROCEDURE ReplaceSelf()
        this <- NEW Box()
    ENDPROCEDURE
ENDCLASS
CLASS Named
    Value : INTEGER
    PROCEDURE NEW(Number : INTEGER)
        Value <- Number
    ENDPROCEDURE
ENDCLASS
CLASS Holder
    Item : Box
    PROCEDURE ReplaceField()
        Item <- NEW Box
    ENDPROCEDURE
ENDCLASS
CLASS Failing
    PROCEDURE NEW()
        THROW
    ENDPROCEDURE
ENDCLASS
TYPE BoxPointer = ^Box
PROCEDURE ReplaceRef(BYREF Item : Box)
    Item <- NEW Box
ENDPROCEDURE
PROCEDURE ReplaceVal(Item : Box)
    DECLARE Old : BoxPointer
    Old <- ^Item
    Item <- NEW Box()
    Item.Value <- 20
    OUTPUT "byval:", Old^.Value, ",", Item.Value
ENDPROCEDURE
DECLARE A : Box
DECLARE B : Box
DECLARE OldA : BoxPointer
DECLARE CurrentA : BoxPointer
OldA <- ^A
A.Value <- 7
A <- NEW Box
A.Value <- 9
CurrentA <- ^A
OUTPUT "rebind:", OldA^.Value, ",", A.Value
B.Value <- 4
A <- B
OUTPUT "copy:", OldA^.Value, ",", CurrentA^.Value, ",", B.Value
CALL ReplaceVal(A)
OUTPUT "caller:", A.Value
CALL ReplaceRef(A)
OUTPUT "byref:", CurrentA^.Value, ",", A.Value
A.Value <- 11
A.ReplaceSelf()
OUTPUT "this:", CurrentA^.Value, ",", A.Value
A.Value <- 12
A.Reset()
OUTPUT "reset:", A.Value
DECLARE Items : ARRAY[1:2] OF Box
DECLARE Element : BoxPointer
Element <- ^Items[1]
Items[1].Value <- 30
Items[1] <- NEW Box()
OUTPUT "array:", Element^.Value, ",", Items[2].Value
DECLARE H : Holder
DECLARE Field : BoxPointer
Field <- ^H.Item
H.Item.Value <- 40
H.Item <- NEW Box
OUTPUT "field:", Field^.Value
H.Item.Value <- 41
H.ReplaceField()
OUTPUT "alias:", Field^.Value
CurrentA^ <- NEW Box
OUTPUT "deref:", A.Value
DECLARE N : Named(0)
N <- NEW Named(42)
OUTPUT "args:", N.Value
TRY
    DECLARE Broken : Failing
CATCH
    OUTPUT "declare caught"
ENDTRY
TRY
    Broken <- NEW Failing
CATCH
    OUTPUT "new caught"
ENDTRY
DECLARE Index : INTEGER
FOR Index <- 1 TO 2
    DECLARE Local : Box
    OUTPUT "loop:", Local.Value
    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()