UNPKG

18.5 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/react/ReactEquivalenceSet.js"],"names":["temporalAliasSymbol","Symbol","ReactEquivalenceSet","constructor","realm","residualReactElementVisitor","objectRoot","Map","arrayRoot","reactElementRoot","reactPropsRoot","temporalAliasRoot","_createNode","map","value","getKey","key","visitedValues","has","set","get","_getValue","val","StringValue","NumberValue","AbstractValue","residualHeapVisitor","equivalenceSet","add","ArrayValue","_getArrayValue","ObjectValue","FunctionValue","_getObjectValue","object","reactElementEquivalenceSet","currentMap","result","propName","properties","getEquivalentPropertyValue","symbol","symbols","prop","temporalAlias","undefined","getTemporalAliasValue","react","emptyObject","_getTemporalValue","wasTemporalAliasDeclaredInCurrentScope","temporalOperationEntry","getTemporalOperationEntryFromDerivedValue","temporalArgs","args","length","i","arg","equivalenceArg","AbstractObjectValue","values","isTop","kind","childTemporalOperationEntry","Value","array","intrinsicName","lengthValue","emptyArray","isFinal","mightBeFinalObject","equivalentProp","reactPropsEquivalenceSet"],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2017-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n/* @flow */\n\nimport { Realm } from \"../realm.js\";\nimport {\n AbstractObjectValue,\n AbstractValue,\n ArrayValue,\n FunctionValue,\n NumberValue,\n ObjectValue,\n StringValue,\n SymbolValue,\n Value,\n} from \"../values/index.js\";\nimport invariant from \"../invariant.js\";\nimport { hardModifyReactObjectPropertyBinding, isReactElement, isReactPropsObject, getProperty } from \"./utils.js\";\nimport { ResidualReactElementVisitor } from \"../serializer/ResidualReactElementVisitor.js\";\n\nexport type ReactSetValueMapKey = Value | number | string;\nexport type ReactSetValueMap = Map<ReactSetValueMapKey, ReactSetNode>;\n\nexport type ReactSetKeyMapKey = string | number | Symbol | SymbolValue;\nexport type ReactSetKeyMap = Map<ReactSetKeyMapKey, ReactSetValueMap>;\n\nexport type ReactSetNode = {\n map: ReactSetKeyMap,\n value: ObjectValue | ArrayValue | null,\n};\n\nexport const temporalAliasSymbol = Symbol(\"temporalAlias\");\n\n// ReactEquivalenceSet keeps records around of the values\n// of ReactElement/JSX nodes so we can return the same immutable values\n// where possible, i.e. <div /> === <div />\n//\n// Rather than uses hashes, this class uses linked Maps to track equality of objects.\n// It does this by recursively iterating through objects, by their properties/symbols and using\n// each property key as a map, and then from that map, each value as a map. The value\n// then links to the subsequent property/symbol in the object. This approach ensures insertion\n// is maintained through all objects.\nexport class ReactEquivalenceSet {\n constructor(realm: Realm, residualReactElementVisitor: ResidualReactElementVisitor) {\n this.realm = realm;\n this.residualReactElementVisitor = residualReactElementVisitor;\n this.objectRoot = new Map();\n this.arrayRoot = new Map();\n this.reactElementRoot = new Map();\n this.reactPropsRoot = new Map();\n this.temporalAliasRoot = new Map();\n }\n realm: Realm;\n objectRoot: ReactSetKeyMap;\n arrayRoot: ReactSetKeyMap;\n reactElementRoot: ReactSetKeyMap;\n reactPropsRoot: ReactSetKeyMap;\n temporalAliasRoot: ReactSetKeyMap;\n residualReactElementVisitor: ResidualReactElementVisitor;\n\n _createNode(): ReactSetNode {\n return {\n map: new Map(),\n value: null,\n };\n }\n\n getKey(key: ReactSetKeyMapKey, map: ReactSetKeyMap, visitedValues: Set<Value>): ReactSetValueMap {\n if (!map.has(key)) {\n map.set(key, new Map());\n }\n return ((map.get(key): any): ReactSetValueMap);\n }\n\n _getValue(val: ReactSetValueMapKey, map: ReactSetValueMap, visitedValues: Set<Value>): ReactSetNode {\n if (val instanceof StringValue || val instanceof NumberValue) {\n val = val.value;\n } else if (val instanceof AbstractValue) {\n val = this.residualReactElementVisitor.residualHeapVisitor.equivalenceSet.add(val);\n } else if (val instanceof ArrayValue) {\n val = this._getArrayValue(val, visitedValues);\n } else if (val instanceof ObjectValue && !(val instanceof FunctionValue)) {\n val = this._getObjectValue(val, visitedValues);\n }\n if (!map.has(val)) {\n map.set(val, this._createNode());\n }\n return ((map.get(val): any): ReactSetNode);\n }\n\n // for objects: [key/symbol] -> [key/symbol]... as nodes\n _getObjectValue(object: ObjectValue, visitedValues: Set<Value>): ObjectValue {\n if (visitedValues.has(object)) return object;\n visitedValues.add(object);\n\n if (isReactElement(object)) {\n return this.residualReactElementVisitor.reactElementEquivalenceSet.add(object);\n }\n let currentMap = this.objectRoot;\n let result;\n\n for (let [propName] of object.properties) {\n currentMap = this.getKey(propName, currentMap, visitedValues);\n result = this.getEquivalentPropertyValue(object, propName, currentMap, visitedValues);\n currentMap = result.map;\n }\n for (let [symbol] of object.symbols) {\n currentMap = this.getKey(symbol, currentMap, visitedValues);\n let prop = getProperty(this.realm, object, symbol);\n result = this._getValue(prop, currentMap, visitedValues);\n currentMap = result.map;\n }\n let temporalAlias = object.temporalAlias;\n\n if (temporalAlias !== undefined) {\n currentMap = this.getKey(temporalAliasSymbol, currentMap, visitedValues);\n result = this.getTemporalAliasValue(temporalAlias, currentMap, visitedValues);\n }\n\n if (result === undefined) {\n // If we have a temporalAlias, we can never return an empty object\n if (temporalAlias === undefined && this.realm.react.emptyObject !== undefined) {\n return this.realm.react.emptyObject;\n }\n return object;\n }\n if (result.value === null) {\n result.value = object;\n }\n return result.value;\n }\n\n _getTemporalValue(temporalAlias: AbstractObjectValue, visitedValues: Set<Value>): AbstractObjectValue {\n // Check to ensure the temporal alias is definitely declared in the current scope\n if (!this.residualReactElementVisitor.wasTemporalAliasDeclaredInCurrentScope(temporalAlias)) {\n return temporalAlias;\n }\n let temporalOperationEntry = this.realm.getTemporalOperationEntryFromDerivedValue(temporalAlias);\n\n if (temporalOperationEntry === undefined) {\n return temporalAlias;\n }\n let temporalArgs = temporalOperationEntry.args;\n if (temporalArgs.length === 0) {\n return temporalAlias;\n }\n let currentMap = this.temporalAliasRoot;\n let result;\n\n for (let i = 0; i < temporalArgs.length; i++) {\n let arg = temporalArgs[i];\n let equivalenceArg;\n if (arg instanceof ObjectValue && arg.temporalAlias === temporalAlias) {\n continue;\n }\n if (arg instanceof ObjectValue && isReactElement(arg)) {\n equivalenceArg = this.residualReactElementVisitor.reactElementEquivalenceSet.add(arg);\n\n if (arg !== equivalenceArg) {\n temporalArgs[i] = equivalenceArg;\n }\n } else if (arg instanceof AbstractObjectValue && !arg.values.isTop() && arg.kind !== \"conditional\") {\n // Might be a temporal, so let's check\n let childTemporalOperationEntry = this.realm.getTemporalOperationEntryFromDerivedValue(arg);\n\n if (childTemporalOperationEntry !== undefined) {\n equivalenceArg = this._getTemporalValue(arg, visitedValues);\n invariant(equivalenceArg instanceof AbstractObjectValue);\n\n if (equivalenceArg !== arg) {\n temporalArgs[i] = equivalenceArg;\n }\n }\n } else if (arg instanceof AbstractValue) {\n equivalenceArg = this.residualReactElementVisitor.residualHeapVisitor.equivalenceSet.add(arg);\n\n if (arg !== equivalenceArg) {\n temporalArgs[i] = equivalenceArg;\n }\n }\n currentMap = this.getKey(i, (currentMap: any), visitedValues);\n invariant(arg instanceof Value && (equivalenceArg instanceof Value || equivalenceArg === undefined));\n result = this._getValue(equivalenceArg || arg, currentMap, visitedValues);\n currentMap = result.map;\n }\n invariant(result !== undefined);\n if (result.value === null) {\n result.value = temporalAlias;\n }\n // Check to ensure the equivalent temporal alias is definitely declared in the current scope\n if (!this.residualReactElementVisitor.wasTemporalAliasDeclaredInCurrentScope(result.value)) {\n result.value = temporalAlias;\n return temporalAlias;\n }\n return result.value;\n }\n\n getTemporalAliasValue(\n temporalAlias: AbstractObjectValue,\n map: ReactSetValueMap,\n visitedValues: Set<Value>\n ): ReactSetNode {\n let result = this._getTemporalValue(temporalAlias, visitedValues);\n\n invariant(result instanceof AbstractObjectValue);\n if (!map.has(result)) {\n map.set(result, this._createNode());\n }\n return ((map.get(result): any): ReactSetNode);\n }\n\n // for arrays: [0] -> [1] -> [2]... as nodes\n _getArrayValue(array: ArrayValue, visitedValues: Set<Value>): ArrayValue {\n if (visitedValues.has(array)) return array;\n if (array.intrinsicName) return array;\n visitedValues.add(array);\n let lengthValue = getProperty(this.realm, array, \"length\");\n invariant(lengthValue instanceof NumberValue);\n let length = lengthValue.value;\n let currentMap = this.arrayRoot;\n let result;\n\n for (let i = 0; i < length; i++) {\n currentMap = this.getKey(i, currentMap, visitedValues);\n result = this.getEquivalentPropertyValue(array, \"\" + i, currentMap, visitedValues);\n currentMap = result.map;\n }\n if (result === undefined) {\n if (this.realm.react.emptyArray !== undefined) {\n return this.realm.react.emptyArray;\n }\n return array;\n }\n if (result.value === null) {\n result.value = array;\n }\n return result.value;\n }\n\n getEquivalentPropertyValue(\n object: ObjectValue,\n propName: string,\n map: ReactSetValueMap,\n visitedValues: Set<Value>\n ): ReactSetNode {\n let prop = getProperty(this.realm, object, propName);\n let isFinal = object.mightBeFinalObject();\n let equivalentProp;\n\n if (prop instanceof ObjectValue && isReactElement(prop)) {\n equivalentProp = this.residualReactElementVisitor.reactElementEquivalenceSet.add(prop);\n } else if (prop instanceof ObjectValue && isReactPropsObject(prop)) {\n equivalentProp = this.residualReactElementVisitor.reactPropsEquivalenceSet.add(prop);\n } else if (prop instanceof AbstractValue) {\n equivalentProp = this.residualReactElementVisitor.residualHeapVisitor.equivalenceSet.add(prop);\n }\n\n if (equivalentProp !== undefined) {\n if (prop !== equivalentProp && isFinal) {\n hardModifyReactObjectPropertyBinding(this.realm, object, propName, equivalentProp);\n }\n if (!map.has(equivalentProp)) {\n map.set(equivalentProp, this._createNode());\n }\n return ((map.get(equivalentProp): any): ReactSetNode);\n } else {\n return this._getValue(prop, map, visitedValues);\n }\n }\n}\n"],"file":"ReactEquivalenceSet.js"}
\No newline at end of file