[be] Simplify BuildHIR w lowerValueToTemporary helper
Creates a new helper, `const temp: Place = lowerValueToTemporary(builder, value)` which creates a new temporary and an instruction to write that value to the temporary. We have this pattern all over BuildHIR, and the new helper makes this all a bit tidier.
Joe Savona committed
Mar 27, 2023 at 11:35 UTC
43176b129e372d5efec03ae879d068214f2d9e98
1 file changed
+150
-365
compiler/forget/src/HIR/BuildHIR.ts
+150
-365
@@ -583,7 +583,6 @@ function lowerStatement(
583
value
584
);
585
} else if (id.isIdentifier()) {
586
- const loc = stmt.node.loc ?? GeneratedSource;
586
const identifier = builder.resolveIdentifier(id);
587
if (identifier == null) {
588
builder.errors.push({
@@ -592,23 +591,18 @@ function lowerStatement(
591
nodePath: id,
592
});
593
} else {
595
- builder.push({
596
- id: makeInstructionId(0),
597
- lvalue: buildTemporaryPlace(builder, loc),
598
- value: {
599
- kind: "DeclareLocal",
600
- lvalue: {
601
- kind,
602
- place: {
603
- effect: Effect.Unknown,
604
- identifier,
605
- kind: "Identifier",
606
- loc: id.node.loc ?? GeneratedSource,
607
- },
594
+ lowerValueToTemporary(builder, {
595
+ kind: "DeclareLocal",
596
+ lvalue: {
597
+ kind,
598
+ place: {
599
+ effect: Effect.Unknown,
600
+ identifier,
601
+ kind: "Identifier",
602
+ loc: id.node.loc ?? GeneratedSource,
603
},
609
- loc: id.node.loc ?? GeneratedSource,
604
},
611
- loc,
605
+ loc: id.node.loc ?? GeneratedSource,
606
});
607
}
608
} else {
@@ -719,18 +713,10 @@ function lowerStatement(
713
severity: ErrorSeverity.Todo,
714
nodePath: stmtPath,
715
});
722
- builder.push({
723
- id: makeInstructionId(0),
724
- lvalue: buildTemporaryPlace(
725
- builder,
726
- stmtPath.node.loc ?? GeneratedSource
727
- ),
716
+ lowerValueToTemporary(builder, {
717
+ kind: "UnsupportedNode",
718
loc: stmtPath.node.loc ?? GeneratedSource,
729
- value: {
730
- kind: "UnsupportedNode",
731
- loc: stmtPath.node.loc ?? GeneratedSource,
732
- node: stmtPath.node,
733
- },
719
+ node: stmtPath.node,
720
});
721
return;
722
}
@@ -914,13 +900,7 @@ function lowerExpression(
900
calleePath.isOptionalMemberExpression()
901
) {
902
const memberExpr = lowerMemberExpression(builder, calleePath);
917
- const propertyPlace = buildTemporaryPlace(builder, GeneratedSource);
918
- builder.push({
919
- id: makeInstructionId(0),
920
- lvalue: { ...propertyPlace },
921
- value: memberExpr.value,
922
- loc: GeneratedSource,
923
- });
903
+ const propertyPlace = lowerValueToTemporary(builder, memberExpr.value);
904
callee = {
905
kind: "MethodCall",
906
receiver: memberExpr.object,
@@ -964,15 +944,10 @@ function lowerExpression(
944
loc,
945
});
946
}
967
- builder.push({
968
- id: makeInstructionId(0),
969
- lvalue: buildTemporaryPlace(builder, loc),
970
- value: {
971
- kind: "StoreLocal",
972
- lvalue: { kind: InstructionKind.Const, place: { ...place } },
973
- value: { ...temp },
974
- loc,
975
- },
947
+ lowerValueToTemporary(builder, {
948
+ kind: "StoreLocal",
949
+ lvalue: { kind: InstructionKind.Const, place: { ...place } },
950
+ value: { ...temp },
951
loc,
952
});
953
return {
@@ -985,26 +960,15 @@ function lowerExpression(
960
961
// block to evaluate if the callee is null/undefined, this sets the result of the call to undefined.
962
const alternate = builder.enter("value", () => {
988
- const temp = buildTemporaryPlace(builder, loc);
989
- builder.push({
990
- id: makeInstructionId(0),
991
- lvalue: { ...temp },
992
- value: {
993
- kind: "Primitive",
994
- value: undefined,
995
- loc,
996
- },
963
+ const temp = lowerValueToTemporary(builder, {
964
+ kind: "Primitive",
965
+ value: undefined,
966
loc,
967
});
999
- builder.push({
1000
- id: makeInstructionId(0),
1001
- lvalue: buildTemporaryPlace(builder, loc),
1002
- value: {
1003
- kind: "StoreLocal",
1004
- lvalue: { kind: InstructionKind.Const, place: { ...place } },
1005
- value: { ...temp },
1006
- loc,
1007
- },
968
+ lowerValueToTemporary(builder, {
969
+ kind: "StoreLocal",
970
+ lvalue: { kind: InstructionKind.Const, place: { ...place } },
971
+ value: { ...temp },
972
loc,
973
});
974
return {
@@ -1055,13 +1019,7 @@ function lowerExpression(
1019
}
1020
if (calleePath.isMemberExpression()) {
1021
const memberExpr = lowerMemberExpression(builder, calleePath);
1058
- const propertyPlace = buildTemporaryPlace(builder, GeneratedSource);
1059
- builder.push({
1060
- id: makeInstructionId(0),
1061
- lvalue: { ...propertyPlace },
1062
- value: memberExpr.value,
1063
- loc: GeneratedSource,
1064
- });
1022
+ const propertyPlace = lowerValueToTemporary(builder, memberExpr.value);
1023
const args = lowerArguments(builder, expr.get("arguments"));
1024
return {
1025
kind: "MethodCall",
@@ -1140,15 +1098,10 @@ function lowerExpression(
1098
builder,
1099
expr.get("consequent")
1100
);
1143
- builder.push({
1144
- id: makeInstructionId(0),
1145
- lvalue: buildTemporaryPlace(builder, exprLoc),
1146
- value: {
1147
- kind: "StoreLocal",
1148
- lvalue: { kind: InstructionKind.Const, place: { ...place } },
1149
- value: consequent,
1150
- loc: exprLoc,
1151
- },
1101
+ lowerValueToTemporary(builder, {
1102
+ kind: "StoreLocal",
1103
+ lvalue: { kind: InstructionKind.Const, place: { ...place } },
1104
+ value: consequent,
1105
loc: exprLoc,
1106
});
1107
return {
@@ -1164,15 +1117,10 @@ function lowerExpression(
1117
builder,
1118
expr.get("alternate")
1119
);
1167
- builder.push({
1168
- id: makeInstructionId(0),
1169
- lvalue: buildTemporaryPlace(builder, exprLoc),
1170
- value: {
1171
- kind: "StoreLocal",
1172
- lvalue: { kind: InstructionKind.Const, place: { ...place } },
1173
- value: alternate,
1174
- loc: exprLoc,
1175
- },
1120
+ lowerValueToTemporary(builder, {
1121
+ kind: "StoreLocal",
1122
+ lvalue: { kind: InstructionKind.Const, place: { ...place } },
1123
+ value: alternate,
1124
loc: exprLoc,
1125
});
1126
return {
@@ -1217,16 +1165,11 @@ function lowerExpression(
1165
expr.get("left").node.loc ?? GeneratedSource
1166
);
1167
const consequent = builder.enter("value", () => {
1220
- builder.push({
1221
- id: makeInstructionId(0),
1222
- lvalue: buildTemporaryPlace(builder, leftPlace.loc),
1223
- value: {
1224
- kind: "StoreLocal",
1225
- lvalue: { kind: InstructionKind.Const, place: { ...place } },
1226
- value: { ...leftPlace },
1227
- loc: leftPlace.loc,
1228
- },
1229
- loc: exprLoc,
1168
+ lowerValueToTemporary(builder, {
1169
+ kind: "StoreLocal",
1170
+ lvalue: { kind: InstructionKind.Const, place: { ...place } },
1171
+ value: { ...leftPlace },
1172
+ loc: leftPlace.loc,
1173
});
1174
return {
1175
kind: "goto",
@@ -1237,16 +1180,11 @@ function lowerExpression(
1180
});
1181
const alternate = builder.enter("value", () => {
1182
const right = lowerExpressionToTemporary(builder, expr.get("right"));
1240
- builder.push({
1241
- id: makeInstructionId(0),
1242
- lvalue: buildTemporaryPlace(builder, right.loc),
1243
- value: {
1244
- kind: "StoreLocal",
1245
- lvalue: { kind: InstructionKind.Const, place: { ...place } },
1246
- value: { ...right },
1247
- loc: right.loc,
1248
- },
1249
- loc: exprLoc,
1183
+ lowerValueToTemporary(builder, {
1184
+ kind: "StoreLocal",
1185
+ lvalue: { kind: InstructionKind.Const, place: { ...place } },
1186
+ value: { ...right },
1187
+ loc: right.loc,
1188
});
1189
return {
1190
kind: "goto",
@@ -1335,34 +1273,20 @@ function lowerExpression(
1273
const identifier = lowerIdentifier(builder, leftExpr);
1274
const leftPlace = lowerExpressionToTemporary(builder, leftExpr);
1275
const right = lowerExpressionToTemporary(builder, expr.get("right"));
1338
- const binaryPlace = buildTemporaryPlace(builder, exprLoc);
1339
- builder.push({
1340
- id: makeInstructionId(0),
1341
- lvalue: {
1342
- ...binaryPlace,
1343
- },
1344
- value: {
1345
- kind: "BinaryExpression",
1346
- operator: binaryOperator,
1347
- left: leftPlace,
1348
- right,
1349
- loc: exprLoc,
1350
- },
1276
+ const binaryPlace = lowerValueToTemporary(builder, {
1277
+ kind: "BinaryExpression",
1278
+ operator: binaryOperator,
1279
+ left: leftPlace,
1280
+ right,
1281
loc: exprLoc,
1282
});
1353
- const result = buildTemporaryPlace(builder, exprLoc);
1354
- builder.push({
1355
- id: makeInstructionId(0),
1356
- lvalue: { ...result },
1357
- value: {
1358
- kind: "StoreLocal",
1359
- lvalue: {
1360
- place: { ...identifier },
1361
- kind: InstructionKind.Reassign,
1362
- },
1363
- value: { ...binaryPlace },
1364
- loc: exprLoc,
1283
+ lowerValueToTemporary(builder, {
1284
+ kind: "StoreLocal",
1285
+ lvalue: {
1286
+ place: { ...identifier },
1287
+ kind: InstructionKind.Reassign,
1288
},
1289
+ value: { ...binaryPlace },
1290
loc: exprLoc,
1291
});
1292
return { kind: "LoadLocal", place: identifier, loc: exprLoc };
@@ -1376,32 +1300,13 @@ function lowerExpression(
1300
);
1301
1302
// Store the previous value to a temporary
1379
- const previousValuePlace: Place = buildTemporaryPlace(
1380
- builder,
1381
- exprLoc
1382
- );
1383
- builder.push({
1384
- id: makeInstructionId(0),
1385
- lvalue: {
1386
- ...previousValuePlace,
1387
- },
1388
- value,
1389
- loc: leftExpr.node.loc ?? GeneratedSource,
1390
- });
1303
+ const previousValuePlace = lowerValueToTemporary(builder, value);
1304
// Store the new value to a temporary
1392
- const newValuePlace: Place = buildTemporaryPlace(builder, exprLoc);
1393
- builder.push({
1394
- id: makeInstructionId(0),
1395
- lvalue: {
1396
- ...newValuePlace,
1397
- },
1398
- value: {
1399
- kind: "BinaryExpression",
1400
- operator: binaryOperator,
1401
- left: { ...previousValuePlace },
1402
- right: lowerExpressionToTemporary(builder, expr.get("right")),
1403
- loc: leftExpr.node.loc ?? GeneratedSource,
1404
- },
1305
+ const newValuePlace = lowerValueToTemporary(builder, {
1306
+ kind: "BinaryExpression",
1307
+ operator: binaryOperator,
1308
+ left: { ...previousValuePlace },
1309
+ right: lowerExpressionToTemporary(builder, expr.get("right")),
1310
loc: leftExpr.node.loc ?? GeneratedSource,
1311
});
1312
@@ -1440,13 +1345,7 @@ function lowerExpression(
1345
t.MemberExpression | t.OptionalMemberExpression
1346
>;
1347
const { value } = lowerMemberExpression(builder, expr);
1443
- const place: Place = buildTemporaryPlace(builder, exprLoc);
1444
- builder.push({
1445
- id: makeInstructionId(0),
1446
- lvalue: { ...place },
1447
- value,
1448
- loc: exprLoc,
1449
- });
1348
+ const place = lowerValueToTemporary(builder, value);
1349
return { kind: "LoadLocal", place, loc: place.loc };
1350
}
1351
case "JSXElement": {
@@ -1723,18 +1622,9 @@ function lowerExpression(
1622
});
1623
return { kind: "UnsupportedNode", node: exprNode, loc: exprLoc };
1624
}
1726
- const primitiveTemp = buildTemporaryPlace(
1727
- builder,
1728
- expr.node.loc ?? GeneratedSource
1729
- );
1730
- builder.push({
1731
- id: makeInstructionId(0),
1732
- lvalue: { ...primitiveTemp },
1733
- value: {
1734
- kind: "Primitive",
1735
- value: 1,
1736
- loc: expr.node.loc ?? GeneratedSource,
1737
- },
1625
+ const primitiveTemp = lowerValueToTemporary(builder, {
1626
+ kind: "Primitive",
1627
+ value: 1,
1628
loc: expr.node.loc ?? GeneratedSource,
1629
});
1630
const temp = buildTemporaryPlace(
@@ -1757,15 +1647,10 @@ function lowerExpression(
1647
},
1648
loc: exprLoc,
1649
});
1760
- builder.push({
1761
- id: makeInstructionId(0),
1762
- lvalue: buildTemporaryPlace(builder, exprLoc),
1763
- value: {
1764
- kind: "StoreLocal",
1765
- lvalue: { place: { ...identifier }, kind: InstructionKind.Reassign },
1766
- value: { ...temp },
1767
- loc: exprLoc,
1768
- },
1650
+ lowerValueToTemporary(builder, {
1651
+ kind: "StoreLocal",
1652
+ lvalue: { place: { ...identifier }, kind: InstructionKind.Reassign },
1653
+ value: { ...temp },
1654
loc: exprLoc,
1655
});
1656
return {
@@ -1989,16 +1874,10 @@ function lowerJsxElementName(
1874
nodePath: exprPath,
1875
});
1876
}
1992
- const place: Place = buildTemporaryPlace(builder, exprLoc);
1993
- builder.push({
1994
- id: makeInstructionId(0),
1995
- value: {
1996
- kind: "Primitive",
1997
- value: tag,
1998
- loc: exprLoc,
1999
- },
1877
+ const place = lowerValueToTemporary(builder, {
1878
+ kind: "Primitive",
1879
+ value: tag,
1880
loc: exprLoc,
2001
- lvalue: { ...place },
1881
});
1882
return place;
1883
}
@@ -2015,16 +1894,10 @@ function lowerJsxElementName(
1894
nodePath: exprPath,
1895
});
1896
}
2018
- const place: Place = buildTemporaryPlace(builder, exprLoc);
2019
- builder.push({
2020
- id: makeInstructionId(0),
2021
- value: {
2022
- kind: "Primitive",
2023
- value: tag,
2024
- loc: exprLoc,
2025
- },
1897
+ const place = lowerValueToTemporary(builder, {
1898
+ kind: "Primitive",
1899
+ value: tag,
1900
loc: exprLoc,
2027
- lvalue: { ...place },
1901
});
1902
return place;
1903
} else {
@@ -2033,18 +1906,11 @@ function lowerJsxElementName(
1906
severity: ErrorSeverity.Todo,
1907
nodePath: exprPath,
1908
});
2036
- const place: Place = buildTemporaryPlace(builder, exprLoc);
2037
- builder.push({
2038
- id: makeInstructionId(0),
2039
- value: {
2040
- kind: "UnsupportedNode",
2041
- node: exprNode,
2042
- loc: exprLoc,
2043
- },
1909
+ return lowerValueToTemporary(builder, {
1910
+ kind: "UnsupportedNode",
1911
+ node: exprNode,
1912
loc: exprLoc,
2045
- lvalue: { ...place },
1913
});
2047
- return { ...place };
1914
}
1915
}
1916
@@ -2065,21 +1931,14 @@ function lowerJsxMemberExpression(
1931
);
1932
objectPlace = lowerIdentifier(builder, object);
1933
}
2068
- const place = buildTemporaryPlace(builder, loc);
1934
const property = exprPath.get("property").node.name;
2070
- builder.push({
2071
- id: makeInstructionId(0),
2072
- lvalue: { ...place },
2073
- value: {
2074
- kind: "PropertyLoad",
2075
- object: objectPlace,
2076
- property,
2077
- optional: false,
2078
- loc,
2079
- },
1935
+ return lowerValueToTemporary(builder, {
1936
+ kind: "PropertyLoad",
1937
+ object: objectPlace,
1938
+ property,
1939
+ optional: false,
1940
loc,
1941
});
2082
- return place;
1942
}
1943
1944
function lowerJsxElement(
@@ -2104,31 +1963,19 @@ function lowerJsxElement(
1963
severity: ErrorSeverity.Todo,
1964
nodePath: expression,
1965
});
2107
- const place: Place = buildTemporaryPlace(builder, exprLoc);
2108
- builder.push({
2109
- id: makeInstructionId(0),
2110
- value: {
2111
- kind: "UnsupportedNode",
2112
- node: exprNode,
2113
- loc: exprLoc,
2114
- },
1966
+ const place = lowerValueToTemporary(builder, {
1967
+ kind: "UnsupportedNode",
1968
+ node: exprNode,
1969
loc: exprLoc,
2116
- lvalue: { ...place },
1970
});
1971
return { ...place };
1972
}
1973
return lowerExpressionToTemporary(builder, expression);
1974
} else if (exprPath.isJSXText()) {
2122
- const place: Place = buildTemporaryPlace(builder, exprLoc);
2123
- builder.push({
2124
- id: makeInstructionId(0),
2125
- value: {
2126
- kind: "JSXText",
2127
- value: exprPath.node.value,
2128
- loc: exprLoc,
2129
- },
1975
+ const place = lowerValueToTemporary(builder, {
1976
+ kind: "JSXText",
1977
+ value: exprPath.node.value,
1978
loc: exprLoc,
2131
- lvalue: { ...place },
1979
});
1980
return place;
1981
} else {
@@ -2139,16 +1986,10 @@ function lowerJsxElement(
1986
nodePath: exprPath,
1987
});
1988
}
2142
- const place: Place = buildTemporaryPlace(builder, exprLoc);
2143
- builder.push({
2144
- id: makeInstructionId(0),
2145
- value: {
2146
- kind: "UnsupportedNode",
2147
- node: exprNode,
2148
- loc: exprLoc,
2149
- },
1989
+ const place = lowerValueToTemporary(builder, {
1990
+ kind: "UnsupportedNode",
1991
+ node: exprNode,
1992
loc: exprLoc,
2151
- lvalue: { ...place },
1993
});
1994
return place;
1995
}
@@ -2159,15 +2000,21 @@ function lowerExpressionToTemporary(
2000
exprPath: NodePath<t.Expression>
2001
): Place {
2002
const value = lowerExpression(builder, exprPath);
2003
+ return lowerValueToTemporary(builder, value);
2004
+}
2005
+
2006
+function lowerValueToTemporary(
2007
+ builder: HIRBuilder,
2008
+ value: InstructionValue
2009
+): Place {
2010
if (value.kind === "LoadLocal" && value.place.identifier.name === null) {
2011
return value.place;
2012
}
2165
- const exprLoc = exprPath.node.loc ?? GeneratedSource;
2166
- const place: Place = buildTemporaryPlace(builder, exprLoc);
2013
+ const place: Place = buildTemporaryPlace(builder, value.loc);
2014
builder.push({
2015
id: makeInstructionId(0),
2016
value: value,
2170
- loc: exprLoc,
2017
+ loc: value.loc,
2018
lvalue: { ...place },
2019
});
2020
return place;
@@ -2181,24 +2028,14 @@ function lowerIdentifier(
2028
const exprLoc = exprNode.loc ?? GeneratedSource;
2029
const identifier = builder.resolveIdentifier(exprPath);
2030
if (identifier === null) {
2184
- const place = buildTemporaryPlace(
2185
- builder,
2186
- exprPath.node.loc ?? GeneratedSource
2187
- );
2031
const global = builder.resolveGlobal(exprPath);
2032
let value: InstructionValue;
2033
if (global !== null) {
2191
- value = { kind: "LoadGlobal", name: global.name, loc: place.loc };
2034
+ value = { kind: "LoadGlobal", name: global.name, loc: exprLoc };
2035
} else {
2193
- value = { kind: "UnsupportedNode", node: exprPath.node, loc: place.loc };
2036
+ value = { kind: "UnsupportedNode", node: exprPath.node, loc: exprLoc };
2037
}
2195
- builder.push({
2196
- id: makeInstructionId(0),
2197
- value,
2198
- loc: place.loc,
2199
- lvalue: { ...place },
2200
- });
2201
- return place;
2038
+ return lowerValueToTemporary(builder, value);
2039
}
2040
const place: Place = {
2041
kind: "Identifier",
@@ -2257,22 +2094,16 @@ function lowerAssignment(
2094
};
2095
}
2096
2260
- const temporary = buildTemporaryPlace(builder, loc);
2097
const place: Place = {
2098
kind: "Identifier",
2099
identifier: identifier,
2100
effect: Effect.Unknown,
2101
loc: lvalue.node.loc ?? GeneratedSource,
2102
};
2267
- builder.push({
2268
- id: makeInstructionId(0),
2269
- lvalue: { ...temporary },
2270
- value: {
2271
- kind: "StoreLocal",
2272
- lvalue: { place: { ...place }, kind },
2273
- value,
2274
- loc,
2275
- },
2103
+ const temporary = lowerValueToTemporary(builder, {
2104
+ kind: "StoreLocal",
2105
+ lvalue: { place: { ...place }, kind },
2106
+ value,
2107
loc,
2108
});
2109
return { kind: "LoadLocal", place: temporary, loc: temporary.loc };
@@ -2295,17 +2126,11 @@ function lowerAssignment(
2126
});
2127
return { kind: "UnsupportedNode", node: lvalueNode, loc };
2128
}
2298
- const temporary = buildTemporaryPlace(builder, loc);
2299
- builder.push({
2300
- id: makeInstructionId(0),
2301
- lvalue: { ...temporary },
2302
- value: {
2303
- kind: "PropertyStore",
2304
- object,
2305
- property: property.node.name,
2306
- value,
2307
- loc,
2308
- },
2129
+ const temporary = lowerValueToTemporary(builder, {
2130
+ kind: "PropertyStore",
2131
+ object,
2132
+ property: property.node.name,
2133
+ value,
2134
loc,
2135
});
2136
return { kind: "LoadLocal", place: temporary, loc: temporary.loc };
@@ -2320,17 +2145,11 @@ function lowerAssignment(
2145
return { kind: "UnsupportedNode", node: lvalueNode, loc };
2146
}
2147
const propertyPlace = lowerExpressionToTemporary(builder, property);
2323
- const temporary = buildTemporaryPlace(builder, loc);
2324
- builder.push({
2325
- id: makeInstructionId(0),
2326
- lvalue: { ...temporary },
2327
- value: {
2328
- kind: "ComputedStore",
2329
- object,
2330
- property: propertyPlace,
2331
- value,
2332
- loc,
2333
- },
2148
+ const temporary = lowerValueToTemporary(builder, {
2149
+ kind: "ComputedStore",
2150
+ object,
2151
+ property: propertyPlace,
2152
+ value,
2153
loc,
2154
});
2155
return { kind: "LoadLocal", place: temporary, loc: temporary.loc };
@@ -2373,22 +2192,16 @@ function lowerAssignment(
2192
followups.push({ place: temp, path: element as NodePath<t.LVal> }); // TODO remove type cast
2193
}
2194
}
2376
- const temporary = buildTemporaryPlace(builder, loc);
2377
- builder.push({
2378
- id: makeInstructionId(0),
2379
- lvalue: { ...temporary },
2380
- value: {
2381
- kind: "Destructure",
2382
- lvalue: {
2383
- kind,
2384
- pattern: {
2385
- kind: "ArrayPattern",
2386
- items,
2387
- },
2195
+ const temporary = lowerValueToTemporary(builder, {
2196
+ kind: "Destructure",
2197
+ lvalue: {
2198
+ kind,
2199
+ pattern: {
2200
+ kind: "ArrayPattern",
2201
+ items,
2202
},
2389
- value,
2390
- loc,
2203
},
2204
+ value,
2205
loc,
2206
});
2207
for (const { place, path } of followups) {
@@ -2467,22 +2280,16 @@ function lowerAssignment(
2280
}
2281
}
2282
}
2470
- const temporary = buildTemporaryPlace(builder, loc);
2471
- builder.push({
2472
- id: makeInstructionId(0),
2473
- lvalue: { ...temporary },
2474
- value: {
2475
- kind: "Destructure",
2476
- lvalue: {
2477
- kind,
2478
- pattern: {
2479
- kind: "ObjectPattern",
2480
- properties,
2481
- },
2283
+ const temporary = lowerValueToTemporary(builder, {
2284
+ kind: "Destructure",
2285
+ lvalue: {
2286
+ kind,
2287
+ pattern: {
2288
+ kind: "ObjectPattern",
2289
+ properties,
2290
},
2483
- value,
2484
- loc,
2291
},
2292
+ value,
2293
loc,
2294
});
2295
for (const { place, path } of followups) {
@@ -2505,15 +2312,10 @@ function lowerAssignment(
2312
builder,
2313
lvalue.get("right")
2314
);
2508
- builder.push({
2509
- id: makeInstructionId(0),
2510
- lvalue: buildTemporaryPlace(builder, loc),
2511
- value: {
2512
- kind: "StoreLocal",
2513
- lvalue: { kind: InstructionKind.Const, place: { ...temp } },
2514
- value: { ...defaultValue },
2515
- loc,
2516
- },
2315
+ lowerValueToTemporary(builder, {
2316
+ kind: "StoreLocal",
2317
+ lvalue: { kind: InstructionKind.Const, place: { ...temp } },
2318
+ value: { ...defaultValue },
2319
loc,
2320
});
2321
return {
@@ -2526,15 +2328,10 @@ function lowerAssignment(
2328
});
2329
2330
const alternate = builder.enter("value", () => {
2529
- builder.push({
2530
- id: makeInstructionId(0),
2531
- lvalue: buildTemporaryPlace(builder, loc),
2532
- value: {
2533
- kind: "StoreLocal",
2534
- lvalue: { kind: InstructionKind.Const, place: { ...temp } },
2535
- value: { ...value },
2536
- loc,
2537
- },
2331
+ lowerValueToTemporary(builder, {
2332
+ kind: "StoreLocal",
2333
+ lvalue: { kind: InstructionKind.Const, place: { ...temp } },
2334
+ value: { ...value },
2335
loc,
2336
});
2337
return {
@@ -2555,28 +2352,16 @@ function lowerAssignment(
2352
},
2353
testBlock
2354
);
2558
- const undef = buildTemporaryPlace(builder, loc);
2559
- builder.push({
2560
- id: makeInstructionId(0),
2561
- lvalue: { ...undef },
2562
- value: {
2563
- kind: "Primitive",
2564
- value: undefined,
2565
- loc,
2566
- },
2355
+ const undef = lowerValueToTemporary(builder, {
2356
+ kind: "Primitive",
2357
+ value: undefined,
2358
loc,
2359
});
2569
- const test = buildTemporaryPlace(builder, loc);
2570
- builder.push({
2571
- id: makeInstructionId(0),
2572
- lvalue: { ...test },
2573
- value: {
2574
- kind: "BinaryExpression",
2575
- left: { ...value },
2576
- operator: "===",
2577
- right: { ...undef },
2578
- loc,
2579
- },
2360
+ const test = lowerValueToTemporary(builder, {
2361
+ kind: "BinaryExpression",
2362
+ left: { ...value },
2363
+ operator: "===",
2364
+ right: { ...undef },
2365
loc,
2366
});
2367
builder.terminateWithContinuation(