UNPKG

15.4 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/utils/paths.js"],"names":["PathImplementation","implies","condition","mightNotBeTrue","path","$Realm","pathConditions","i","length","pathCondition","impliesNot","mightNotBeFalse","withCondition","evaluate","InfeasiblePathError","realm","savedPath","pushPathCondition","pushRefinedConditions","e","pushInversePathCondition","withInverseCondition","pushAndRefine","pushInverseAndRefine","ConcreteValue","AbstractValue","kind","left","args","right","cond","x","y","equals","push","UndefinedValue","NullValue","op","leftNeNull","createFromBinaryOp","intrinsics","null","leftNeUndefined","undefined","leftEqNull","leftEqUndefined","inverseCondition","createFromUnaryOp","simplifiedInverseCondition","simplifyAndRefineAbstractCondition","unrefinedConditions","refinedConditions","map","c","some","pc"],"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 strict-local */\n\nimport { AbstractValue, ConcreteValue, NullValue, UndefinedValue, Value } from \"../values/index.js\";\nimport { InfeasiblePathError } from \"../errors.js\";\nimport type { Realm } from \"../realm.js\";\nimport invariant from \"../invariant.js\";\n\nexport class PathImplementation {\n implies(condition: Value): boolean {\n if (!condition.mightNotBeTrue()) return true; // any path implies true\n let path = condition.$Realm.pathConditions;\n for (let i = path.length - 1; i >= 0; i--) {\n let pathCondition = path[i];\n if (pathCondition.implies(condition)) return true;\n }\n return false;\n }\n\n impliesNot(condition: Value): boolean {\n if (!condition.mightNotBeFalse()) return true; // any path implies !false\n let path = condition.$Realm.pathConditions;\n for (let i = path.length - 1; i >= 0; i--) {\n let pathCondition = path[i];\n if (pathCondition.impliesNot(condition)) return true;\n }\n return false;\n }\n\n withCondition<T>(condition: Value, evaluate: () => T): T {\n if (!condition.mightNotBeFalse()) throw new InfeasiblePathError();\n let realm = condition.$Realm;\n let savedPath = realm.pathConditions;\n realm.pathConditions = [];\n try {\n pushPathCondition(condition);\n pushRefinedConditions(realm, savedPath);\n return evaluate();\n } catch (e) {\n if (e instanceof InfeasiblePathError) {\n // if condition is true, one of the saved path conditions must be false\n // since we have to assume that those conditions are true we now know that on this path, condition is false\n realm.pathConditions = savedPath;\n pushInversePathCondition(condition);\n }\n throw e;\n } finally {\n realm.pathConditions = savedPath;\n }\n }\n\n withInverseCondition<T>(condition: Value, evaluate: () => T): T {\n if (!condition.mightNotBeTrue()) throw new InfeasiblePathError();\n let realm = condition.$Realm;\n let savedPath = realm.pathConditions;\n realm.pathConditions = [];\n try {\n pushInversePathCondition(condition);\n pushRefinedConditions(realm, savedPath);\n return evaluate();\n } catch (e) {\n if (e instanceof InfeasiblePathError) {\n // if condition is false, one of the saved path conditions must be false\n // since we have to assume that those conditions are true we now know that on this path, condition is true\n realm.pathConditions = savedPath;\n pushPathCondition(condition);\n }\n throw e;\n } finally {\n realm.pathConditions = savedPath;\n }\n }\n\n pushAndRefine(condition: Value): void {\n let realm = condition.$Realm;\n let savedPath = realm.pathConditions;\n realm.pathConditions = [];\n\n pushPathCondition(condition);\n pushRefinedConditions(realm, savedPath);\n }\n\n pushInverseAndRefine(condition: Value): void {\n let realm = condition.$Realm;\n let savedPath = realm.pathConditions;\n realm.pathConditions = [];\n\n pushInversePathCondition(condition);\n pushRefinedConditions(realm, savedPath);\n }\n}\n\n// A path condition is an abstract value that must be true in this particular code path, so we want to assume as much\nfunction pushPathCondition(condition: Value): void {\n invariant(condition.mightNotBeFalse(), \"pushing false\"); // it is mistake to assume that false is true\n if (condition instanceof ConcreteValue) return;\n if (!condition.mightNotBeTrue()) return;\n invariant(condition instanceof AbstractValue);\n let realm = condition.$Realm;\n if (condition.kind === \"&&\") {\n let left = condition.args[0];\n let right = condition.args[1];\n invariant(left instanceof AbstractValue); // it is a mistake to create an abstract value when concrete value will do\n pushPathCondition(left);\n pushPathCondition(right);\n } else if (condition.kind === \"===\") {\n let [left, right] = condition.args;\n if (right instanceof AbstractValue && right.kind === \"conditional\") [left, right] === [right, left];\n if (left instanceof AbstractValue && left.kind === \"conditional\") {\n let [cond, x, y] = left.args;\n if (right instanceof ConcreteValue && x instanceof ConcreteValue && y instanceof ConcreteValue) {\n if (right.equals(x) && !right.equals(y)) {\n pushPathCondition(cond);\n } else if (!right.equals(x) && right.equals(y)) {\n pushInversePathCondition(cond);\n }\n }\n }\n realm.pathConditions.push(condition);\n } else {\n if (condition.kind === \"!=\" || condition.kind === \"==\") {\n let left = condition.args[0];\n let right = condition.args[1];\n if (left instanceof ConcreteValue && right instanceof AbstractValue) [left, right] = [right, left];\n if (left instanceof AbstractValue && (right instanceof UndefinedValue || right instanceof NullValue)) {\n let op = condition.kind === \"!=\" ? \"!==\" : \"===\";\n if (op === \"!==\") pushPathCondition(left);\n else pushInversePathCondition(left);\n let leftNeNull = AbstractValue.createFromBinaryOp(realm, op, left, realm.intrinsics.null);\n if (leftNeNull.mightNotBeFalse()) pushPathCondition(leftNeNull);\n let leftNeUndefined = AbstractValue.createFromBinaryOp(realm, op, left, realm.intrinsics.undefined);\n if (leftNeUndefined.mightNotBeFalse()) pushPathCondition(leftNeUndefined);\n return;\n }\n }\n realm.pathConditions.push(condition);\n }\n}\n\n// An inverse path condition is an abstract value that must be false in this particular code path, so we want to assume as much\nfunction pushInversePathCondition(condition: Value): void {\n // it is mistake to assume that true is false.\n invariant(condition.mightNotBeTrue());\n if (condition instanceof ConcreteValue) return;\n invariant(condition instanceof AbstractValue);\n if (condition.kind === \"||\") {\n let left = condition.args[0];\n let right = condition.args[1];\n invariant(left instanceof AbstractValue); // it is a mistake to create an abstract value when concrete value will do\n pushInversePathCondition(left);\n if (right.mightNotBeTrue()) pushInversePathCondition(right);\n } else {\n let realm = condition.$Realm;\n if (condition.kind === \"!=\" || condition.kind === \"==\") {\n let left = condition.args[0];\n let right = condition.args[1];\n if (left instanceof ConcreteValue && right instanceof AbstractValue) [left, right] = [right, left];\n if (left instanceof AbstractValue && (right instanceof UndefinedValue || right instanceof NullValue)) {\n let op = condition.kind === \"!=\" ? \"===\" : \"!==\";\n if (op === \"!==\") pushPathCondition(left);\n else pushInversePathCondition(left);\n let leftEqNull = AbstractValue.createFromBinaryOp(realm, op, left, realm.intrinsics.null);\n if (leftEqNull.mightNotBeFalse()) pushPathCondition(leftEqNull);\n let leftEqUndefined = AbstractValue.createFromBinaryOp(realm, op, left, realm.intrinsics.undefined);\n if (leftEqUndefined.mightNotBeFalse()) pushPathCondition(leftEqUndefined);\n return;\n }\n }\n let inverseCondition = AbstractValue.createFromUnaryOp(realm, \"!\", condition);\n pushPathCondition(inverseCondition);\n if (inverseCondition instanceof AbstractValue) {\n let simplifiedInverseCondition = realm.simplifyAndRefineAbstractCondition(inverseCondition);\n if (!simplifiedInverseCondition.equals(inverseCondition)) pushPathCondition(simplifiedInverseCondition);\n }\n }\n}\n\nfunction pushRefinedConditions(realm: Realm, unrefinedConditions: Array<AbstractValue>): void {\n let refinedConditions = unrefinedConditions.map(c => realm.simplifyAndRefineAbstractCondition(c));\n if (refinedConditions.some(c => !c.mightNotBeFalse())) throw new InfeasiblePathError();\n let pc = realm.pathConditions;\n realm.pathConditions = [];\n for (let c of refinedConditions) pushPathCondition(c);\n for (let c of pc) realm.pathConditions.push(c);\n}\n"],"file":"paths.js"}
\No newline at end of file