mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
[be] Move buildAliasSets to DisjointSet
This commit is contained in:
@@ -84,6 +84,28 @@ export default class DisjointSet<T> {
|
||||
}
|
||||
}
|
||||
|
||||
buildSets(): Array<Set<T>> {
|
||||
const ids: Map<T, number> = new Map();
|
||||
const sets: Map<number, Set<T>> = new Map();
|
||||
|
||||
this.forEach((identifier, groupIdentifier) => {
|
||||
let id = ids.get(groupIdentifier);
|
||||
if (id == null) {
|
||||
id = ids.size;
|
||||
ids.set(groupIdentifier, id);
|
||||
}
|
||||
|
||||
let set = sets.get(id);
|
||||
if (set === undefined) {
|
||||
set = new Set();
|
||||
sets.set(id, set);
|
||||
}
|
||||
set.add(identifier);
|
||||
});
|
||||
|
||||
return [...sets.values()];
|
||||
}
|
||||
|
||||
get size(): number {
|
||||
return this.#entries.size;
|
||||
}
|
||||
|
||||
@@ -15,30 +15,6 @@ type AbstractPrimitive = {
|
||||
|
||||
export type AliasSet = Set<Identifier>;
|
||||
|
||||
export function buildAliasSets(
|
||||
aliases: DisjointSet<Identifier>
|
||||
): Array<AliasSet> {
|
||||
const aliasIds: Map<Identifier, number> = new Map();
|
||||
const aliasSets: Map<number, Set<Identifier>> = new Map();
|
||||
|
||||
aliases.forEach((identifier, groupIdentifier) => {
|
||||
let aliasId = aliasIds.get(groupIdentifier);
|
||||
if (aliasId == null) {
|
||||
aliasId = aliasIds.size;
|
||||
aliasIds.set(groupIdentifier, aliasId);
|
||||
}
|
||||
|
||||
let aliasSet = aliasSets.get(aliasId);
|
||||
if (aliasSet === undefined) {
|
||||
aliasSet = new Set();
|
||||
aliasSets.set(aliasId, aliasSet);
|
||||
}
|
||||
aliasSet.add(identifier);
|
||||
});
|
||||
|
||||
return [...aliasSets.values()];
|
||||
}
|
||||
|
||||
class AbstractState {
|
||||
aliases = new DisjointSet<Identifier>();
|
||||
// NOTE(gsn): Should this be a part of AbstractObject? No, because this has
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import DisjointSet from "./DisjointSet";
|
||||
import { Identifier, InstructionId } from "./HIR";
|
||||
import { buildAliasSets } from "./InferAlias";
|
||||
|
||||
export function inferMutableRangesForAlias(aliases: DisjointSet<Identifier>) {
|
||||
const aliasSets = buildAliasSets(aliases);
|
||||
const aliasSets = aliases.buildSets();
|
||||
for (const aliasSet of aliasSets) {
|
||||
// Update mutableRange.end only if the identifiers have actually been
|
||||
// mutated.
|
||||
|
||||
@@ -23,7 +23,6 @@ import {
|
||||
SourceLocation,
|
||||
Terminal,
|
||||
} from "./HIR";
|
||||
import { buildAliasSets } from "./InferAlias";
|
||||
import { eachReactiveScope } from "./visitors";
|
||||
|
||||
export type Options = {
|
||||
@@ -335,7 +334,7 @@ export function printSourceLocation(loc: SourceLocation): string {
|
||||
}
|
||||
|
||||
export function printAliases(aliases: DisjointSet<Identifier>): string {
|
||||
const aliasSets = buildAliasSets(aliases);
|
||||
const aliasSets = aliases.buildSets();
|
||||
|
||||
const items = [];
|
||||
for (const aliasSet of aliasSets) {
|
||||
|
||||
Reference in New Issue
Block a user