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()
|