@samitouri / QOS-React-1 / commits / 9262761f1c

[compiler][ez] Add more Array.prototype methods

Adds Array.prototype methods that return primitives or other arrays -- naive type inference can be really helpful in reducing mutable ranges -> achieving higher quality memoization. Also copies Array.prototype methods to our mixed read-only JSON-like object shape. (Inspired after going through some suboptimal internal compilation outputs.) ghstack-source-id: 0bfad11180992fc5db61a1c5f23954f48acf07b8 Pull Request resolved: https://github.com/facebook/react/pull/30075

Mofei Zhang committed Jun 25, 2024 at 16:03 UTC 9262761f1c25bfe52a4585419fad16dd01a07424
1 file changed +128 -1
compiler/packages/babel-plugin-react-compiler/src/HIR/ObjectShape.ts
+128 -1
@@ -218,6 +218,36 @@ addObject(BUILTIN_SHAPES, BuiltInPropsId, [
218
219 /* Built-in array shape */
220 addObject(BUILTIN_SHAPES, BuiltInArrayId, [
221 + [
222 + "indexOf",
223 + addFunction(BUILTIN_SHAPES, [], {
224 + positionalParams: [],
225 + restParam: Effect.Read,
226 + returnType: { kind: "Primitive" },
227 + calleeEffect: Effect.Read,
228 + returnValueKind: ValueKind.Primitive,
229 + }),
230 + ],
231 + [
232 + "includes",
233 + addFunction(BUILTIN_SHAPES, [], {
234 + positionalParams: [],
235 + restParam: Effect.Read,
236 + returnType: { kind: "Primitive" },
237 + calleeEffect: Effect.Read,
238 + returnValueKind: ValueKind.Primitive,
239 + }),
240 + ],
241 + [
242 + "pop",
243 + addFunction(BUILTIN_SHAPES, [], {
244 + positionalParams: [],
245 + restParam: null,
246 + returnType: { kind: "Poly" },
247 + calleeEffect: Effect.Store,
248 + returnValueKind: ValueKind.Mutable,
249 + }),
250 + ],
251 [
252 "at",
253 addFunction(BUILTIN_SHAPES, [], {
@@ -252,6 +282,19 @@ addObject(BUILTIN_SHAPES, BuiltInArrayId, [
282 returnValueKind: ValueKind.Primitive,
283 }),
284 ],
285 + [
286 + "slice",
287 + addFunction(BUILTIN_SHAPES, [], {
288 + positionalParams: [],
289 + restParam: Effect.Read,
290 + returnType: {
291 + kind: "Object",
292 + shapeId: BuiltInArrayId,
293 + },
294 + calleeEffect: Effect.Capture,
295 + returnValueKind: ValueKind.Mutable,
296 + }),
297 + ],
298 [
299 "map",
300 addFunction(BUILTIN_SHAPES, [], {
@@ -353,7 +396,7 @@ addObject(BUILTIN_SHAPES, BuiltInArrayId, [
396 "join",
397 addFunction(BUILTIN_SHAPES, [], {
398 positionalParams: [],
356 - restParam: Effect.ConditionallyMutate,
399 + restParam: Effect.Read,
400 returnType: PRIMITIVE_TYPE,
401 calleeEffect: Effect.Read,
402 returnValueKind: ValueKind.Primitive,
@@ -478,6 +521,90 @@ addObject(BUILTIN_SHAPES, BuiltInMixedReadonlyId, [
521 noAlias: true,
522 }),
523 ],
524 + [
525 + "concat",
526 + addFunction(BUILTIN_SHAPES, [], {
527 + positionalParams: [],
528 + restParam: Effect.Capture,
529 + returnType: {
530 + kind: "Object",
531 + shapeId: BuiltInArrayId,
532 + },
533 + calleeEffect: Effect.Capture,
534 + returnValueKind: ValueKind.Mutable,
535 + }),
536 + ],
537 + [
538 + "slice",
539 + addFunction(BUILTIN_SHAPES, [], {
540 + positionalParams: [],
541 + restParam: Effect.Read,
542 + returnType: {
543 + kind: "Object",
544 + shapeId: BuiltInArrayId,
545 + },
546 + calleeEffect: Effect.Capture,
547 + returnValueKind: ValueKind.Mutable,
548 + }),
549 + ],
550 + [
551 + "every",
552 + addFunction(BUILTIN_SHAPES, [], {
553 + positionalParams: [],
554 + restParam: Effect.ConditionallyMutate,
555 + returnType: { kind: "Primitive" },
556 + calleeEffect: Effect.ConditionallyMutate,
557 + returnValueKind: ValueKind.Primitive,
558 + noAlias: true,
559 + mutableOnlyIfOperandsAreMutable: true,
560 + }),
561 + ],
562 + [
563 + "some",
564 + addFunction(BUILTIN_SHAPES, [], {
565 + positionalParams: [],
566 + restParam: Effect.ConditionallyMutate,
567 + returnType: { kind: "Primitive" },
568 + calleeEffect: Effect.ConditionallyMutate,
569 + returnValueKind: ValueKind.Primitive,
570 + noAlias: true,
571 + mutableOnlyIfOperandsAreMutable: true,
572 + }),
573 + ],
574 + [
575 + "find",
576 + addFunction(BUILTIN_SHAPES, [], {
577 + positionalParams: [],
578 + restParam: Effect.ConditionallyMutate,
579 + returnType: { kind: "Poly" },
580 + calleeEffect: Effect.ConditionallyMutate,
581 + returnValueKind: ValueKind.Mutable,
582 + noAlias: true,
583 + mutableOnlyIfOperandsAreMutable: true,
584 + }),
585 + ],
586 + [
587 + "findIndex",
588 + addFunction(BUILTIN_SHAPES, [], {
589 + positionalParams: [],
590 + restParam: Effect.ConditionallyMutate,
591 + returnType: { kind: "Primitive" },
592 + calleeEffect: Effect.ConditionallyMutate,
593 + returnValueKind: ValueKind.Primitive,
594 + noAlias: true,
595 + mutableOnlyIfOperandsAreMutable: true,
596 + }),
597 + ],
598 + [
599 + "join",
600 + addFunction(BUILTIN_SHAPES, [], {
601 + positionalParams: [],
602 + restParam: Effect.Read,
603 + returnType: PRIMITIVE_TYPE,
604 + calleeEffect: Effect.Read,
605 + returnValueKind: ValueKind.Primitive,
606 + }),
607 + ],
608 ["*", { kind: "Object", shapeId: BuiltInMixedReadonlyId }],
609 ]);
610