UNPKG

prepack

Version:

Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.

166 lines (148 loc) 6.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PathImplementation = undefined; var _index = require("../values/index.js"); var _invariant = require("../invariant.js"); var _invariant2 = _interopRequireDefault(_invariant); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ class PathImplementation { implies(condition) { if (!condition.mightNotBeTrue()) return true; // any path implies true let path = condition.$Realm.pathConditions; for (let i = path.length - 1; i >= 0; i--) { let pathCondition = path[i]; if (pathCondition.implies(condition)) return true; } return false; } impliesNot(condition) { if (!condition.mightNotBeFalse()) return true; // any path implies !false let path = condition.$Realm.pathConditions; for (let i = path.length - 1; i >= 0; i--) { let pathCondition = path[i]; if (pathCondition.impliesNot(condition)) return true; } return false; } withCondition(condition, evaluate) { let realm = condition.$Realm; let savedPath = realm.pathConditions; realm.pathConditions = []; try { pushPathCondition(condition); pushRefinedConditions(savedPath); return evaluate(); } finally { realm.pathConditions = savedPath; } } withInverseCondition(condition, evaluate) { let realm = condition.$Realm; let savedPath = realm.pathConditions; realm.pathConditions = []; try { pushInversePathCondition(condition); pushRefinedConditions(savedPath); return evaluate(); } finally { realm.pathConditions = savedPath; } } pushAndRefine(condition) { let realm = condition.$Realm; let savedPath = realm.pathConditions; realm.pathConditions = []; pushPathCondition(condition); pushRefinedConditions(savedPath); } pushInverseAndRefine(condition) { let realm = condition.$Realm; let savedPath = realm.pathConditions; realm.pathConditions = []; pushInversePathCondition(condition); pushRefinedConditions(savedPath); } } exports.PathImplementation = PathImplementation; // A path condition is an abstract value that is known to be true in a particular code path function pushPathCondition(condition) { (0, _invariant2.default)(condition.mightNotBeFalse(), "pushing false"); // it is mistake to assert that false is true if (condition instanceof _index.ConcreteValue) return; if (!condition.mightNotBeTrue()) return; (0, _invariant2.default)(condition instanceof _index.AbstractValue); let realm = condition.$Realm; if (condition.kind === "&&") { let left = condition.args[0]; let right = condition.args[1]; (0, _invariant2.default)(left instanceof _index.AbstractValue); // it is a mistake to create an abstract value when concrete value will do pushPathCondition(left); pushPathCondition(right); } else { if (condition.kind === "!=" || condition.kind === "==") { let left = condition.args[0]; let right = condition.args[1]; if (left instanceof _index.ConcreteValue && right instanceof _index.AbstractValue) [left, right] = [right, left]; if (left instanceof _index.AbstractValue && (right instanceof _index.UndefinedValue || right instanceof _index.NullValue)) { let op = condition.kind === "!=" ? "!==" : "==="; if (op === "!==") pushPathCondition(left);else pushInversePathCondition(left); let leftNeNull = _index.AbstractValue.createFromBinaryOp(realm, op, left, realm.intrinsics.null); if (leftNeNull.mightNotBeFalse()) pushPathCondition(leftNeNull); let leftNeUndefined = _index.AbstractValue.createFromBinaryOp(realm, op, left, realm.intrinsics.undefined); if (leftNeUndefined.mightNotBeFalse()) pushPathCondition(leftNeUndefined); return; } } realm.pathConditions.push(condition); } } // An inverse path condition is an abstract value that is known to be false in a particular code path function pushInversePathCondition(condition) { // it is mistake to assert that true is false. (0, _invariant2.default)(condition.mightNotBeTrue()); if (condition instanceof _index.ConcreteValue) return; (0, _invariant2.default)(condition instanceof _index.AbstractValue); if (condition.kind === "||") { let left = condition.args[0]; let right = condition.args[1]; (0, _invariant2.default)(left instanceof _index.AbstractValue); // it is a mistake to create an abstract value when concrete value will do pushInversePathCondition(left); if (right.mightNotBeTrue()) pushInversePathCondition(right); } else { let realm = condition.$Realm; if (condition.kind === "!=" || condition.kind === "==") { let left = condition.args[0]; let right = condition.args[1]; if (left instanceof _index.ConcreteValue && right instanceof _index.AbstractValue) [left, right] = [right, left]; if (left instanceof _index.AbstractValue && (right instanceof _index.UndefinedValue || right instanceof _index.NullValue)) { let op = condition.kind === "!=" ? "===" : "!=="; if (op === "!==") pushInversePathCondition(left);else pushPathCondition(left); let leftEqNull = _index.AbstractValue.createFromBinaryOp(realm, op, left, realm.intrinsics.null); if (leftEqNull.mightNotBeFalse()) pushPathCondition(leftEqNull); let leftEqUndefined = _index.AbstractValue.createFromBinaryOp(realm, op, left, realm.intrinsics.undefined); if (leftEqUndefined.mightNotBeFalse()) pushPathCondition(leftEqUndefined); return; } } let inverseCondition = _index.AbstractValue.createFromUnaryOp(realm, "!", condition); pushPathCondition(inverseCondition); if (inverseCondition instanceof _index.AbstractValue) { let simplifiedInverseCondition = realm.simplifyAndRefineAbstractCondition(inverseCondition); if (!simplifiedInverseCondition.equals(inverseCondition)) pushPathCondition(simplifiedInverseCondition); } } } function pushRefinedConditions(unrefinedConditions) { for (let unrefinedCond of unrefinedConditions) { pushPathCondition(unrefinedCond.$Realm.simplifyAndRefineAbstractCondition(unrefinedCond)); } } //# sourceMappingURL=paths.js.map