Skip to content

Commit 0bfcd9b

Browse files
committed
make Typedef indirect
1 parent 77c70f9 commit 0bfcd9b

File tree

3 files changed

+113
-93
lines changed

3 files changed

+113
-93
lines changed

SRC/ast-constructor.lsts

Lines changed: 72 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,15 @@ let .is-var-or-ascripted-var(t: AST): Bool = (
5050
let .with-implies(term: AST, implies: Vector<Type>): AST = (
5151
match term {
5252
Typedef{} => (
53-
let location = (term as Tag::Typedef).location;
54-
let lhs-type = (term as Tag::Typedef).lhs-type;
55-
let implements = (term as Tag::Typedef).implements;
56-
let size = (term as Tag::Typedef).size;
57-
let alias = (term as Tag::Typedef).alias;
58-
let opaque-alias = (term as Tag::Typedef).opaque-alias;
59-
let cases = (term as Tag::Typedef).cases;
60-
let misc-type = (term as Tag::Typedef).misc-type;
61-
let implied-phi = (term as Tag::Typedef).implied-phi;
53+
let location = open((term as Tag::Typedef)).td.location;
54+
let lhs-type = open((term as Tag::Typedef)).td.lhs-type;
55+
let implements = open((term as Tag::Typedef)).td.implements;
56+
let size = open((term as Tag::Typedef)).td.size;
57+
let alias = open((term as Tag::Typedef)).td.alias;
58+
let opaque-alias = open((term as Tag::Typedef)).td.opaque-alias;
59+
let cases = open((term as Tag::Typedef)).td.cases;
60+
let misc-type = open((term as Tag::Typedef)).td.misc-type;
61+
let implied-phi = open((term as Tag::Typedef)).td.implied-phi;
6262
Typedef( location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi );
6363
);
6464
_ => term;
@@ -67,15 +67,15 @@ let .with-implies(term: AST, implies: Vector<Type>): AST = (
6767
let .with-implements(term: AST, implements: Vector<Type>): AST = (
6868
match term {
6969
Typedef{} => (
70-
let location = (term as Tag::Typedef).location;
71-
let lhs-type = (term as Tag::Typedef).lhs-type;
72-
let implies = (term as Tag::Typedef).implies;
73-
let size = (term as Tag::Typedef).size;
74-
let alias = (term as Tag::Typedef).alias;
75-
let opaque-alias = (term as Tag::Typedef).opaque-alias;
76-
let cases = (term as Tag::Typedef).cases;
77-
let misc-type = (term as Tag::Typedef).misc-type;
78-
let implied-phi = (term as Tag::Typedef).implied-phi;
70+
let location = open((term as Tag::Typedef)).td.location;
71+
let lhs-type = open((term as Tag::Typedef)).td.lhs-type;
72+
let implies = open((term as Tag::Typedef)).td.implies;
73+
let size = open((term as Tag::Typedef)).td.size;
74+
let alias = open((term as Tag::Typedef)).td.alias;
75+
let opaque-alias = open((term as Tag::Typedef)).td.opaque-alias;
76+
let cases = open((term as Tag::Typedef)).td.cases;
77+
let misc-type = open((term as Tag::Typedef)).td.misc-type;
78+
let implied-phi = open((term as Tag::Typedef)).td.implied-phi;
7979
Typedef( location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi );
8080
);
8181
_ => term;
@@ -84,15 +84,15 @@ let .with-implements(term: AST, implements: Vector<Type>): AST = (
8484
let .with-size(term: AST, size: Type): AST = (
8585
match term {
8686
Typedef{} => (
87-
let location = (term as Tag::Typedef).location;
88-
let lhs-type = (term as Tag::Typedef).lhs-type;
89-
let implies = (term as Tag::Typedef).implies;
90-
let implements = (term as Tag::Typedef).implements;
91-
let alias = (term as Tag::Typedef).alias;
92-
let opaque-alias = (term as Tag::Typedef).opaque-alias;
93-
let cases = (term as Tag::Typedef).cases;
94-
let misc-type = (term as Tag::Typedef).misc-type;
95-
let implied-phi = (term as Tag::Typedef).implied-phi;
87+
let location = open((term as Tag::Typedef)).td.location;
88+
let lhs-type = open((term as Tag::Typedef)).td.lhs-type;
89+
let implies = open((term as Tag::Typedef)).td.implies;
90+
let implements = open((term as Tag::Typedef)).td.implements;
91+
let alias = open((term as Tag::Typedef)).td.alias;
92+
let opaque-alias = open((term as Tag::Typedef)).td.opaque-alias;
93+
let cases = open((term as Tag::Typedef)).td.cases;
94+
let misc-type = open((term as Tag::Typedef)).td.misc-type;
95+
let implied-phi = open((term as Tag::Typedef)).td.implied-phi;
9696
Typedef( location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi );
9797
);
9898
_ => term;
@@ -101,15 +101,15 @@ let .with-size(term: AST, size: Type): AST = (
101101
let .with-alias(term: AST, alias: Type): AST = (
102102
match term {
103103
Typedef{} => (
104-
let location = (term as Tag::Typedef).location;
105-
let lhs-type = (term as Tag::Typedef).lhs-type;
106-
let implies = (term as Tag::Typedef).implies;
107-
let implements = (term as Tag::Typedef).implements;
108-
let size = (term as Tag::Typedef).size;
109-
let opaque-alias = (term as Tag::Typedef).opaque-alias;
110-
let cases = (term as Tag::Typedef).cases;
111-
let misc-type = (term as Tag::Typedef).misc-type;
112-
let implied-phi = (term as Tag::Typedef).implied-phi;
104+
let location = open((term as Tag::Typedef)).td.location;
105+
let lhs-type = open((term as Tag::Typedef)).td.lhs-type;
106+
let implies = open((term as Tag::Typedef)).td.implies;
107+
let implements = open((term as Tag::Typedef)).td.implements;
108+
let size = open((term as Tag::Typedef)).td.size;
109+
let opaque-alias = open((term as Tag::Typedef)).td.opaque-alias;
110+
let cases = open((term as Tag::Typedef)).td.cases;
111+
let misc-type = open((term as Tag::Typedef)).td.misc-type;
112+
let implied-phi = open((term as Tag::Typedef)).td.implied-phi;
113113
Typedef( location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi );
114114
);
115115
_ => term;
@@ -118,15 +118,15 @@ let .with-alias(term: AST, alias: Type): AST = (
118118
let .with-opaque-alias(term: AST, opaque-alias: Type): AST = (
119119
match term {
120120
Typedef{} => (
121-
let location = (term as Tag::Typedef).location;
122-
let lhs-type = (term as Tag::Typedef).lhs-type;
123-
let implies = (term as Tag::Typedef).implies;
124-
let implements = (term as Tag::Typedef).implements;
125-
let size = (term as Tag::Typedef).size;
126-
let alias = (term as Tag::Typedef).alias;
127-
let cases = (term as Tag::Typedef).cases;
128-
let misc-type = (term as Tag::Typedef).misc-type;
129-
let implied-phi = (term as Tag::Typedef).implied-phi;
121+
let location = open((term as Tag::Typedef)).td.location;
122+
let lhs-type = open((term as Tag::Typedef)).td.lhs-type;
123+
let implies = open((term as Tag::Typedef)).td.implies;
124+
let implements = open((term as Tag::Typedef)).td.implements;
125+
let size = open((term as Tag::Typedef)).td.size;
126+
let alias = open((term as Tag::Typedef)).td.alias;
127+
let cases = open((term as Tag::Typedef)).td.cases;
128+
let misc-type = open((term as Tag::Typedef)).td.misc-type;
129+
let implied-phi = open((term as Tag::Typedef)).td.implied-phi;
130130
Typedef( location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi );
131131
);
132132
_ => term;
@@ -135,15 +135,15 @@ let .with-opaque-alias(term: AST, opaque-alias: Type): AST = (
135135
let .with-cases(term: AST, cases: Vector<(CString,Vector<(CString,Type)>)>): AST = (
136136
match term {
137137
Typedef{} => (
138-
let location = (term as Tag::Typedef).location;
139-
let lhs-type = (term as Tag::Typedef).lhs-type;
140-
let implies = (term as Tag::Typedef).implies;
141-
let implements = (term as Tag::Typedef).implements;
142-
let size = (term as Tag::Typedef).size;
143-
let alias = (term as Tag::Typedef).alias;
144-
let opaque-alias = (term as Tag::Typedef).opaque-alias;
145-
let misc-type = (term as Tag::Typedef).misc-type;
146-
let implied-phi = (term as Tag::Typedef).implied-phi;
138+
let location = open((term as Tag::Typedef)).td.location;
139+
let lhs-type = open((term as Tag::Typedef)).td.lhs-type;
140+
let implies = open((term as Tag::Typedef)).td.implies;
141+
let implements = open((term as Tag::Typedef)).td.implements;
142+
let size = open((term as Tag::Typedef)).td.size;
143+
let alias = open((term as Tag::Typedef)).td.alias;
144+
let opaque-alias = open((term as Tag::Typedef)).td.opaque-alias;
145+
let misc-type = open((term as Tag::Typedef)).td.misc-type;
146+
let implied-phi = open((term as Tag::Typedef)).td.implied-phi;
147147
Typedef( location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi );
148148
);
149149
_ => term;
@@ -152,15 +152,15 @@ let .with-cases(term: AST, cases: Vector<(CString,Vector<(CString,Type)>)>): AST
152152
let .with-misc(term: AST, misc-type: Type): AST = (
153153
match term {
154154
Typedef{} => (
155-
let location = (term as Tag::Typedef).location;
156-
let lhs-type = (term as Tag::Typedef).lhs-type;
157-
let implies = (term as Tag::Typedef).implies;
158-
let implements = (term as Tag::Typedef).implements;
159-
let size = (term as Tag::Typedef).size;
160-
let alias = (term as Tag::Typedef).alias;
161-
let opaque-alias = (term as Tag::Typedef).opaque-alias;
162-
let cases = (term as Tag::Typedef).cases;
163-
let implied-phi = (term as Tag::Typedef).implied-phi;
155+
let location = open((term as Tag::Typedef)).td.location;
156+
let lhs-type = open((term as Tag::Typedef)).td.lhs-type;
157+
let implies = open((term as Tag::Typedef)).td.implies;
158+
let implements = open((term as Tag::Typedef)).td.implements;
159+
let size = open((term as Tag::Typedef)).td.size;
160+
let alias = open((term as Tag::Typedef)).td.alias;
161+
let opaque-alias = open((term as Tag::Typedef)).td.opaque-alias;
162+
let cases = open((term as Tag::Typedef)).td.cases;
163+
let implied-phi = open((term as Tag::Typedef)).td.implied-phi;
164164
Typedef( location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi );
165165
);
166166
_ => term;
@@ -169,15 +169,15 @@ let .with-misc(term: AST, misc-type: Type): AST = (
169169
let .with-implied-phi(term: AST, implied-phi: Type): AST = (
170170
match term {
171171
Typedef{} => (
172-
let location = (term as Tag::Typedef).location;
173-
let lhs-type = (term as Tag::Typedef).lhs-type;
174-
let implies = (term as Tag::Typedef).implies;
175-
let implements = (term as Tag::Typedef).implements;
176-
let size = (term as Tag::Typedef).size;
177-
let alias = (term as Tag::Typedef).alias;
178-
let opaque-alias = (term as Tag::Typedef).opaque-alias;
179-
let cases = (term as Tag::Typedef).cases;
180-
let misc-type = (term as Tag::Typedef).misc-type;
172+
let location = open((term as Tag::Typedef)).td.location;
173+
let lhs-type = open((term as Tag::Typedef)).td.lhs-type;
174+
let implies = open((term as Tag::Typedef)).td.implies;
175+
let implements = open((term as Tag::Typedef)).td.implements;
176+
let size = open((term as Tag::Typedef)).td.size;
177+
let alias = open((term as Tag::Typedef)).td.alias;
178+
let opaque-alias = open((term as Tag::Typedef)).td.opaque-alias;
179+
let cases = open((term as Tag::Typedef)).td.cases;
180+
let misc-type = open((term as Tag::Typedef)).td.misc-type;
181181
Typedef( location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi );
182182
);
183183
_ => term;

SRC/ast-definition.lsts

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22
type SourceLocation = { filename: CString, line: U64, column: U64 };
33
type Token = { key: CString, nonce: U64, location: SourceLocation };
44

5+
# This AST row is very fat, so we move it into an indirect data
6+
# TODO: do this optimization automatically or with a simple annotation
7+
type ASTTypedef = { location: SourceLocation, lhs-type: Type, implies: Vector<Type>, implements: Vector<Type>,
8+
size: Type, alias: Type, opaque-alias: Type, cases: Vector<(CString,Vector<(CString,Type)>)>,
9+
misc-type: Type, implied-phi: Type };
10+
11+
let $"Typedef"(location: SourceLocation, lhs-type: Type, implies: Vector<Type>, implements: Vector<Type>,
12+
size: Type, alias: Type, opaque-alias: Type, cases: Vector<(CString,Vector<(CString,Type)>)>,
13+
misc-type: Type, implied-phi: Type): AST = (
14+
Typedef(close(ASTTypedef(location, lhs-type, implies, implements, size, alias, opaque-alias, cases, misc-type, implied-phi)))
15+
);
16+
517
type AST zero ASTEOF implies MustRetain, MustRelease
618
= Meta { val: OwnedData<AST>[] }
719
| ASTEOF
@@ -13,12 +25,23 @@ type AST zero ASTEOF implies MustRetain, MustRelease
1325
| AType { tt: Type }
1426
| Seq { seq: Vector<AST> }
1527
| Glb { key: Token , val: OwnedData<AST>[] }
16-
| Typedef { location: SourceLocation, lhs-type: Type, implies: Vector<Type>, implements: Vector<Type>,
17-
size: Type, alias: Type, opaque-alias: Type, cases: Vector<(CString,Vector<(CString,Type)>)>,
18-
misc-type: Type, implied-phi: Type };
28+
| Typedef { td: OwnedData<ASTTypedef>[] };
1929

2030
let $"App"(left: OwnedData<AST>[], right: OwnedData<AST>[]): AST = App ( false, left, right );
2131

32+
let .retain(t: ASTTypedef): ASTTypedef = (
33+
mark-as-released(t.lhs-type.retain);
34+
mark-as-released(t.implies.retain);
35+
mark-as-released(t.implements.retain);
36+
mark-as-released(t.size.retain);
37+
mark-as-released(t.alias.retain);
38+
mark-as-released(t.opaque-alias.retain);
39+
mark-as-released(t.cases.retain);
40+
mark-as-released(t.misc-type.retain);
41+
mark-as-released(t.implied-phi.retain);
42+
t
43+
);
44+
2245
let .retain(t: AST): AST = (
2346
if t.discriminator-case-tag==(t as Tag::Meta).discriminator-case-tag {
2447
(t as Tag::Meta).val.retain;
@@ -42,19 +65,23 @@ let .retain(t: AST): AST = (
4265
(t as Tag::Glb).val.retain;
4366
};
4467
if t.discriminator-case-tag==(t as Tag::Typedef).discriminator-case-tag {
45-
mark-as-released((t as Tag::Typedef).lhs-type.retain);
46-
mark-as-released((t as Tag::Typedef).implies.retain);
47-
mark-as-released((t as Tag::Typedef).implements.retain);
48-
mark-as-released((t as Tag::Typedef).size.retain);
49-
mark-as-released((t as Tag::Typedef).alias.retain);
50-
mark-as-released((t as Tag::Typedef).opaque-alias.retain);
51-
mark-as-released((t as Tag::Typedef).cases.retain);
52-
mark-as-released((t as Tag::Typedef).misc-type.retain);
53-
mark-as-released((t as Tag::Typedef).implied-phi.retain);
68+
mark-as-released((t as Tag::Typedef).td.retain);
5469
};
5570
t
5671
);
5772

73+
let .release(t: ASTTypedef): Nil = (
74+
t.lhs-type.release;
75+
t.implies.release;
76+
t.implements.release;
77+
t.size.release;
78+
t.alias.release;
79+
t.opaque-alias.release;
80+
t.cases.release;
81+
t.misc-type.release;
82+
t.implied-phi.release;
83+
);
84+
5885
let .release(t: AST): Nil = (
5986
if t.discriminator-case-tag==(t as Tag::Meta).discriminator-case-tag {
6087
(t as Tag::Meta).val.release;
@@ -78,15 +105,7 @@ let .release(t: AST): Nil = (
78105
(t as Tag::Glb).val.release;
79106
};
80107
if t.discriminator-case-tag==(t as Tag::Typedef).discriminator-case-tag {
81-
(t as Tag::Typedef).lhs-type.release;
82-
(t as Tag::Typedef).implies.release;
83-
(t as Tag::Typedef).implements.release;
84-
(t as Tag::Typedef).size.release;
85-
(t as Tag::Typedef).alias.release;
86-
(t as Tag::Typedef).opaque-alias.release;
87-
(t as Tag::Typedef).cases.release;
88-
(t as Tag::Typedef).misc-type.release;
89-
(t as Tag::Typedef).implied-phi.release;
108+
(t as Tag::Typedef).td.release;
90109
};
91110
mark-as-released(t);
92111
);

SRC/typecheck-infer-expr.lsts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ let std-infer-expr(tctx: Maybe<TypeContext>, term: AST, is-scoped: Bool, used: I
193193
}};
194194
);
195195
Glb{key1=key, val=val} => (
196+
print("Typecheck Glb \{safe-alloc-block-count-monotonic}, total memory = \{current_allocated_memory()} \{term}\n");
196197
let prev-count-history = safe-alloc-block-count-monotonic-history;
197198
let rough-tt = typeof-term(term);
198199
if rough-tt.is-arrow and not(rough-tt.is-open) and not(rough-tt.is-t(c"TypedMacro",0)) {

0 commit comments

Comments
 (0)