-
Notifications
You must be signed in to change notification settings - Fork 1
/
locals.pas
146 lines (102 loc) · 2.35 KB
/
locals.pas
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
unit locals;
interface
uses
classes,LOXTypes,TokenArray;
type
TLocal = record
Name : String;
Token : TToken;
Depth : integer;
IsCaptured : Boolean;
end;
TLocalList = array of TLocal;
TLocals = class
const Local_Capacity = 256;
private
FItems : TLocalList;
FCapacity : integer;
FCount : integer;
function getLocal(const index: integer): TLocal;
procedure setLocal(const index: integer; const Value: TLocal);
function getCount: integer;
function getLast: TLocal;
procedure IncreaseCapacity;
procedure SetCount(const Value: integer);
public
function Add(const token : TToken) : TLocal;
Constructor create;
Destructor Destroy; override;
property Item[const index : integer] : TLocal read getLocal write setLocal;default;
property Last : TLocal read getLast;
property Count : integer read getCount write SetCount;
end;
implementation
uses
sysutils;
{ TLocals }
function TLocals.Add(const Token : TToken): TLocal;
begin
if FCount = FCapacity then increaseCapacity;
// assert(assigned(token), 'token added to local is nil');
FItems[FCount].Token := Token;
FItems[FCount].Depth := -1;
FItems[FCount].isCaptured := False;
FCount := FCount + 1;
end;
constructor TLocals.create;
begin
FCount := 0;
FCapacity := Local_Capacity;
SetLength(FItems,FCapacity);
end;
destructor TLocals.Destroy;
begin
inherited;
end;
function TLocals.getCount: integer;
begin
result := FCount;
end;
function TLocals.getLast: TLocal;
begin
result := FItems[Count-1];
end;
function TLocals.getLocal(const index: integer): TLocal;
begin
result := FItems[Index];
end;
procedure TLocals.IncreaseCapacity;
begin
FCapacity := FCapacity * 2;
SetLength(FItems,FCapacity);
end;
procedure TLocals.SetCount(const Value: integer);
begin
assert(Value >=0, 'value is < 0');
assert(Value < FCapacity, 'value is > Capacity');
FCount := Value;
end;
procedure TLocals.setLocal(const index: integer; const Value: TLocal);
begin
FItems[Index] := Value;
end;
{ TLocal }
(*
constructor TLocal.Create(const name : string; const token: TToken);
begin
inherited create;
FName := name;
FToken := Token;
FDepth := 0;
FIsCaptured := False;
end;
destructor TLocal.destroy;
begin
inherited;
end;
function TLocal.getToken: TToken;
begin
result := FToken;
end;
*)
end.