Commit 82774c5
[flow] Fast path for large union element access on object types
Summary:
When resolving `T[K]` where `K = k₁ | k₂ | ... | kₙ` (keyof T) and T is an
object type, Flow distributes the union and creates n individual GetPropT
constraint flows.
Add a fast path in flow_js.ml for `UnionT + ElemT { ObjT, ReadElem }` when
the object has no dict/indexer and the union has >100 members. Instead of
distributing through GetPropT, directly look up each key in the property map
(O(1) hash lookup per key) and collect value types into a union.
This bypasses GetPropT semantics (skip_optional, no_unchecked_indexed_access)
so we only apply it for large unions where the perf cost of distribution is
significant. Falls back to the standard distribution path if any key can't be
resolved via direct lookup.
Changelog: [internal]
Reviewed By: SamChou19815
Differential Revision: D94949645
fbshipit-source-id: 47ead9cf27091d95f304d5c5b3bef0427e5f01781 parent 86da4b2 commit 82774c5
3 files changed
Lines changed: 74 additions & 11 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
310 | 310 | | |
311 | 311 | | |
312 | 312 | | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
313 | 333 | | |
314 | 334 | | |
315 | 335 | | |
| |||
1698 | 1718 | | |
1699 | 1719 | | |
1700 | 1720 | | |
1701 | | - | |
1702 | | - | |
1703 | | - | |
1704 | | - | |
1705 | | - | |
1706 | | - | |
1707 | | - | |
1708 | | - | |
1709 | | - | |
| 1721 | + | |
| 1722 | + | |
| 1723 | + | |
| 1724 | + | |
| 1725 | + | |
| 1726 | + | |
| 1727 | + | |
| 1728 | + | |
| 1729 | + | |
| 1730 | + | |
| 1731 | + | |
| 1732 | + | |
| 1733 | + | |
1710 | 1734 | | |
1711 | | - | |
1712 | | - | |
| 1735 | + | |
| 1736 | + | |
| 1737 | + | |
| 1738 | + | |
| 1739 | + | |
| 1740 | + | |
| 1741 | + | |
| 1742 | + | |
| 1743 | + | |
| 1744 | + | |
| 1745 | + | |
| 1746 | + | |
| 1747 | + | |
| 1748 | + | |
| 1749 | + | |
| 1750 | + | |
| 1751 | + | |
| 1752 | + | |
| 1753 | + | |
| 1754 | + | |
| 1755 | + | |
| 1756 | + | |
| 1757 | + | |
| 1758 | + | |
| 1759 | + | |
| 1760 | + | |
| 1761 | + | |
| 1762 | + | |
| 1763 | + | |
| 1764 | + | |
| 1765 | + | |
| 1766 | + | |
1713 | 1767 | | |
1714 | 1768 | | |
1715 | 1769 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
887 | 887 | | |
888 | 888 | | |
889 | 889 | | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
890 | 897 | | |
891 | 898 | | |
892 | 899 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
127 | 127 | | |
128 | 128 | | |
129 | 129 | | |
| 130 | + | |
| 131 | + | |
130 | 132 | | |
131 | 133 | | |
132 | 134 | | |
| |||
0 commit comments