[effects] Track return ValueKind for function signatures
Mofei Zhang committed
May 22, 2023 at 19:37 UTC
19cf39f50be3b4742447c8463fbc5af2201b3d5c
3 files changed
+21
-2
compiler/forget/src/HIR/Globals.ts
+12
@@ -85,6 +85,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
85
restParam: null,
86
returnType: { kind: "Primitive" },
87
calleeEffect: Effect.Read,
88
+ returnValueKind: ValueKind.Immutable,
89
}),
90
],
91
// https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.from
@@ -104,6 +105,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
105
restParam: Effect.Read,
106
returnType: { kind: "Object", shapeId: BuiltInArrayId },
107
calleeEffect: Effect.Read,
108
+ returnValueKind: ValueKind.Mutable,
109
}),
110
],
111
]),
@@ -122,6 +124,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
124
restParam: Effect.Read,
125
returnType: { kind: "Primitive" },
126
calleeEffect: Effect.Read,
127
+ returnValueKind: ValueKind.Immutable,
128
}),
129
],
130
]),
@@ -138,6 +141,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
141
restParam: Effect.Read,
142
returnType: { kind: "Primitive" },
143
calleeEffect: Effect.Read,
144
+ returnValueKind: ValueKind.Immutable,
145
}),
146
],
147
[
@@ -147,6 +151,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
151
restParam: Effect.Read,
152
returnType: { kind: "Primitive" },
153
calleeEffect: Effect.Read,
154
+ returnValueKind: ValueKind.Immutable,
155
}),
156
],
157
[
@@ -156,6 +161,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
161
restParam: Effect.Read,
162
returnType: { kind: "Primitive" },
163
calleeEffect: Effect.Read,
164
+ returnValueKind: ValueKind.Immutable,
165
}),
166
],
167
[
@@ -165,6 +171,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
171
restParam: Effect.Read,
172
returnType: { kind: "Primitive" },
173
calleeEffect: Effect.Read,
174
+ returnValueKind: ValueKind.Immutable,
175
}),
176
],
177
[
@@ -174,6 +181,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
181
restParam: Effect.Read,
182
returnType: { kind: "Primitive" },
183
calleeEffect: Effect.Read,
184
+ returnValueKind: ValueKind.Immutable,
185
}),
186
],
187
[
@@ -183,6 +191,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
191
restParam: Effect.Read,
192
returnType: { kind: "Primitive" },
193
calleeEffect: Effect.Read,
194
+ returnValueKind: ValueKind.Immutable,
195
}),
196
],
197
]),
@@ -194,6 +203,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
203
restParam: Effect.Read,
204
returnType: { kind: "Primitive" },
205
calleeEffect: Effect.Read,
206
+ returnValueKind: ValueKind.Immutable,
207
}),
208
],
209
[
@@ -203,6 +213,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
213
restParam: Effect.Read,
214
returnType: { kind: "Primitive" },
215
calleeEffect: Effect.Read,
216
+ returnValueKind: ValueKind.Immutable,
217
}),
218
],
219
[
@@ -212,6 +223,7 @@ const TYPED_GLOBALS: Array<[string, BuiltInType]> = [
223
restParam: Effect.Read,
224
returnType: { kind: "Primitive" },
225
calleeEffect: Effect.Read,
226
+ returnValueKind: ValueKind.Immutable,
227
}),
228
],
229
// TODO: rest of Global objects
compiler/forget/src/HIR/ObjectShape.ts
+6
-1
@@ -6,7 +6,7 @@
6
*/
7
8
import invariant from "invariant";
9
-import { Effect } from "./HIR";
9
+import { Effect, ValueKind } from "./HIR";
10
import {
11
BuiltInType,
12
FunctionType,
@@ -100,6 +100,7 @@ export type FunctionSignature = {
100
positionalParams: Array<Effect>;
101
restParam: Effect | null;
102
returnType: BuiltInType | PolyType;
103
+ returnValueKind: ValueKind;
104
calleeEffect: Effect;
105
};
106
@@ -138,6 +139,7 @@ addObject(BUILTIN_SHAPES, BuiltInArrayId, [
139
restParam: null,
140
returnType: { kind: "Poly" },
141
calleeEffect: Effect.Read,
142
+ returnValueKind: ValueKind.Mutable,
143
}),
144
],
145
[
@@ -150,6 +152,7 @@ addObject(BUILTIN_SHAPES, BuiltInArrayId, [
152
shapeId: BuiltInArrayId,
153
},
154
calleeEffect: Effect.Read,
155
+ returnValueKind: ValueKind.Mutable,
156
}),
157
],
158
["length", PRIMITIVE_TYPE],
@@ -160,6 +163,7 @@ addObject(BUILTIN_SHAPES, BuiltInArrayId, [
163
restParam: Effect.Capture,
164
returnType: PRIMITIVE_TYPE,
165
calleeEffect: Effect.Store,
166
+ returnValueKind: ValueKind.Immutable,
167
}),
168
],
169
// TODO: rest of Array properties
@@ -174,6 +178,7 @@ addObject(BUILTIN_SHAPES, BuiltInObjectId, [
178
restParam: null,
179
returnType: PRIMITIVE_TYPE,
180
calleeEffect: Effect.Read,
181
+ returnValueKind: ValueKind.Immutable,
182
}),
183
],
184
// TODO:
compiler/forget/src/Inference/InferReferenceEffects.ts
+3
-1
@@ -729,6 +729,8 @@ function inferBlock(
729
730
const effects =
731
signature !== null ? getFunctionEffects(instrValue, signature) : null;
732
+ const returnValueKind =
733
+ signature !== null ? signature.returnValueKind : ValueKind.Mutable;
734
for (let i = 0; i < instrValue.args.length; i++) {
735
const arg = instrValue.args[i];
736
const place = arg.kind === "Identifier" ? arg : arg.place;
@@ -749,7 +751,7 @@ function inferBlock(
751
state.reference(instrValue.callee, Effect.Mutate);
752
}
753
752
- state.initialize(instrValue, ValueKind.Mutable);
754
+ state.initialize(instrValue, returnValueKind);
755
state.define(instr.lvalue, instrValue);
756
instr.lvalue.effect = Effect.Mutate;
757
continue;