@samitouri / QOS-React / commits / 19cf39f50b

[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;