@samitouri / QOS-React-2 / commits / 43176b129e

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