first commit

This commit is contained in:
s.golasch
2023-08-01 13:49:46 +02:00
commit 1fc239fd54
20238 changed files with 3112246 additions and 0 deletions

151
build/node_modules/prepack/lib/domains/TypesDomain.js generated vendored Normal file
View File

@@ -0,0 +1,151 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**
* 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.
*/
var _invariant = require("../invariant.js");
var _invariant2 = _interopRequireDefault(_invariant);
var _index = require("../values/index.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/* An abstract domain for the type of value a variable might have. */
var TypesDomain = function () {
function TypesDomain(type) {
_classCallCheck(this, TypesDomain);
(0, _invariant2.default)(type !== _index.ConcreteValue, "Concrete values must be specific");
this._type = type === _index.Value ? undefined : type;
}
_createClass(TypesDomain, [{
key: "getType",
value: function getType() {
return this._type || _index.Value;
}
// return the type of the result in the case where there is no exception
}, {
key: "joinWith",
value: function joinWith(t) {
var type = this.getType();
if (type === t) return this;
if (_index.Value.isTypeCompatibleWith(type, _index.FunctionValue) && _index.Value.isTypeCompatibleWith(t, _index.FunctionValue)) {
return new TypesDomain(_index.FunctionValue);
}
if (_index.Value.isTypeCompatibleWith(type, _index.ObjectValue) && _index.Value.isTypeCompatibleWith(t, _index.ObjectValue)) {
return new TypesDomain(_index.ObjectValue);
}
if (_index.Value.isTypeCompatibleWith(type, _index.PrimitiveValue) && _index.Value.isTypeCompatibleWith(t, _index.PrimitiveValue)) {
return new TypesDomain(_index.PrimitiveValue);
}
return TypesDomain.topVal;
}
}], [{
key: "binaryOp",
value: function binaryOp(op, left, right) {
var lType = left._type;
var rType = right._type;
var resultType = _index.Value;
switch (op) {
case "+":
if (lType === undefined || rType === undefined) return TypesDomain.topVal;
if (_index.Value.isTypeCompatibleWith(lType, _index.StringValue) || _index.Value.isTypeCompatibleWith(rType, _index.StringValue)) resultType = _index.StringValue;else if (_index.Value.isTypeCompatibleWith(lType, _index.NumberValue) && _index.Value.isTypeCompatibleWith(rType, _index.NumberValue)) resultType = _index.NumberValue;
break;
case "<":
case ">":
case ">=":
case "<=":
case "!=":
case "==":
case "!==":
case "===":
case "in":
case "instanceof":
resultType = _index.BooleanValue;
break;
case ">>>":
case "<<":
case ">>":
case "&":
case "|":
case "^":
case "**":
case "%":
case "/":
case "*":
case "-":
resultType = _index.NumberValue;
break;
default:
(0, _invariant2.default)(false);
}
return new TypesDomain(resultType);
}
}, {
key: "joinValues",
value: function joinValues(v1, v2) {
if (v1 === undefined && v2 === undefined) return new TypesDomain(_index.UndefinedValue);
if (v1 === undefined || v2 === undefined) return TypesDomain.topVal;
if (v1 instanceof _index.AbstractValue) return v1.types.joinWith(v2.getType());
if (v2 instanceof _index.AbstractValue) return v2.types.joinWith(v1.getType());
return new TypesDomain(v1.getType()).joinWith(v2.getType());
}
}, {
key: "logicalOp",
value: function logicalOp(op, left, right) {
return left.joinWith(right.getType());
}
// return the type of the result in the case where there is no exception
// note that the type of the operand has no influence on the type of the non exceptional result
}, {
key: "unaryOp",
value: function unaryOp(op) {
var resultType = _index.Value;
switch (op) {
case "-":
case "+":
case "~":
resultType = _index.NumberValue;
break;
case "!":
case "delete":
resultType = _index.BooleanValue;
break;
case "typeof":
resultType = _index.StringValue;
break;
case "void":
resultType = _index.UndefinedValue;
break;
default:
(0, _invariant2.default)(false);
}
return new TypesDomain(resultType);
}
}]);
return TypesDomain;
}();
TypesDomain.topVal = new TypesDomain(undefined);
exports.default = TypesDomain;
//# sourceMappingURL=TypesDomain.js.map

File diff suppressed because one or more lines are too long

800
build/node_modules/prepack/lib/domains/ValuesDomain.js generated vendored Normal file
View File

@@ -0,0 +1,800 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**
* 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.
*/
var _completions = require("../completions.js");
var _errors = require("../errors.js");
var _invariant = require("../invariant.js");
var _invariant2 = _interopRequireDefault(_invariant);
var _index = require("../methods/index.js");
var _singletons = require("../singletons.js");
var _index2 = require("../values/index.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/* An abstract domain that collects together a set of concrete values
that might be the value of a variable at runtime.
Initially, every variable has the value undefined.
A property that has been weakly deleted will have more than
one value, one of which will by the EmptyValue. */
var ValuesDomain = function () {
function ValuesDomain(values) {
_classCallCheck(this, ValuesDomain);
if (values instanceof _index2.ConcreteValue) {
var valueSet = new Set();
valueSet.add(values);
values = valueSet;
}
this._elements = values;
}
_createClass(ValuesDomain, [{
key: "contains",
value: function contains(x) {
var elems = this._elements;
var xelems = x._elements;
if (elems === xelems) return true;
if (elems === undefined) return true;
if (xelems === undefined) return false;
if (elems.size < xelems.size) return false;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = xelems[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var e = _step.value;
if (!elems.has(e)) return false;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return true;
}
}, {
key: "containsValue",
value: function containsValue(x) {
var elems = this._elements;
if (elems === undefined) return true; // Top contains everything
if (x instanceof _index2.AbstractValue) return this.contains(x.values);
(0, _invariant2.default)(x instanceof _index2.ConcreteValue);
return elems.has(x);
}
}, {
key: "isTop",
value: function isTop() {
return this._elements === undefined;
}
}, {
key: "getElements",
value: function getElements() {
(0, _invariant2.default)(this._elements !== undefined);
return this._elements;
}
// return a set of values that may be result of performing the given operation on each pair in the
// Cartesian product of the value sets of the operands.
}, {
key: "includesValueNotOfType",
value: function includesValueNotOfType(type) {
(0, _invariant2.default)(!this.isTop());
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = this.getElements()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var cval = _step2.value;
if (!(cval instanceof type)) return true;
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return false;
}
}, {
key: "includesValueOfType",
value: function includesValueOfType(type) {
(0, _invariant2.default)(!this.isTop());
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = this.getElements()[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var cval = _step3.value;
if (cval instanceof type) return true;
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
return false;
}
}, {
key: "mightBeFalse",
value: function mightBeFalse() {
(0, _invariant2.default)(!this.isTop());
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
for (var _iterator4 = this.getElements()[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
var cval = _step4.value;
if (cval.mightBeFalse()) return true;
}
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4.return) {
_iterator4.return();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
return false;
}
}, {
key: "mightNotBeFalse",
value: function mightNotBeFalse() {
(0, _invariant2.default)(!this.isTop());
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
for (var _iterator5 = this.getElements()[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var cval = _step5.value;
if (cval.mightNotBeFalse()) return true;
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator5.return();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
return false;
}
}, {
key: "joinWith",
value: function joinWith(y) {
if (this.isTop()) return this;
var union = new Set(this.getElements());
if (y instanceof _index2.AbstractValue) {
if (y.values.isTop()) return y.values;
y.values.getElements().forEach(function (v) {
return union.add(v);
});
} else {
(0, _invariant2.default)(y instanceof _index2.ConcreteValue);
union.add(y);
}
return new ValuesDomain(union);
}
}, {
key: "meetWith",
value: function meetWith(y) {
var intersection = new Set();
var elements = this._elements;
if (y instanceof _index2.AbstractValue) {
if (y.values.isTop()) return this;
y.values.getElements().forEach(function (v) {
if (elements === undefined || elements.has(v)) intersection.add(v);
});
} else {
(0, _invariant2.default)(y instanceof _index2.ConcreteValue);
if (elements === undefined || elements.has(y)) intersection.add(y);
}
return new ValuesDomain(intersection);
}
}, {
key: "promoteEmptyToUndefined",
value: function promoteEmptyToUndefined() {
if (this.isTop()) return this;
var newSet = new Set();
var _iteratorNormalCompletion6 = true;
var _didIteratorError6 = false;
var _iteratorError6 = undefined;
try {
for (var _iterator6 = this.getElements()[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
var cval = _step6.value;
if (cval instanceof _index2.EmptyValue) newSet.add(cval.$Realm.intrinsics.undefined);else newSet.add(cval);
}
} catch (err) {
_didIteratorError6 = true;
_iteratorError6 = err;
} finally {
try {
if (!_iteratorNormalCompletion6 && _iterator6.return) {
_iterator6.return();
}
} finally {
if (_didIteratorError6) {
throw _iteratorError6;
}
}
}
return new ValuesDomain(newSet);
}
}], [{
key: "binaryOp",
value: function binaryOp(realm, op, left, right) {
var leftElements = left._elements;
var rightElements = right._elements;
// Return top if left and/or right are top or if the size of the value set would get to be quite large.
// Note: the larger the set of values, the less we know and therefore the less we get value from computing
// all of these values. TODO #1000: probably the upper bound can be quite a bit smaller.
if (!leftElements || !rightElements || leftElements.size > 100 || rightElements.size > 100) return ValuesDomain.topVal;
var resultSet = new Set();
var savedHandler = realm.errorHandler;
var savedIsReadOnly = realm.isReadOnly;
realm.isReadOnly = true;
try {
realm.errorHandler = function () {
throw new _errors.FatalError();
};
var _iteratorNormalCompletion7 = true;
var _didIteratorError7 = false;
var _iteratorError7 = undefined;
try {
for (var _iterator7 = leftElements[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var leftElem = _step7.value;
var _iteratorNormalCompletion8 = true;
var _didIteratorError8 = false;
var _iteratorError8 = undefined;
try {
for (var _iterator8 = rightElements[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
var rightElem = _step8.value;
var result = ValuesDomain.computeBinary(realm, op, leftElem, rightElem);
(0, _invariant2.default)(result instanceof _index2.ConcreteValue);
resultSet.add(result);
}
} catch (err) {
_didIteratorError8 = true;
_iteratorError8 = err;
} finally {
try {
if (!_iteratorNormalCompletion8 && _iterator8.return) {
_iterator8.return();
}
} finally {
if (_didIteratorError8) {
throw _iteratorError8;
}
}
}
}
} catch (err) {
_didIteratorError7 = true;
_iteratorError7 = err;
} finally {
try {
if (!_iteratorNormalCompletion7 && _iterator7.return) {
_iterator7.return();
}
} finally {
if (_didIteratorError7) {
throw _iteratorError7;
}
}
}
} catch (e) {
if (e instanceof _completions.AbruptCompletion) return ValuesDomain.topVal;
} finally {
realm.errorHandler = savedHandler;
realm.isReadOnly = savedIsReadOnly;
}
return new ValuesDomain(resultSet);
}
// Note that calling this can result in user code running, which can side-effect the heap.
// If that is not the desired behavior, mark the realm as read-only for the duration of the call.
}, {
key: "computeBinary",
value: function computeBinary(realm, op, lval, rval) {
if (op === "+") {
// ECMA262 12.8.3 The Addition Operator
var lprim = _singletons.To.ToPrimitiveOrAbstract(realm, lval);
var rprim = _singletons.To.ToPrimitiveOrAbstract(realm, rval);
if (lprim instanceof _index2.AbstractValue || rprim instanceof _index2.AbstractValue) {
return _index2.AbstractValue.createFromBinaryOp(realm, op, lprim, rprim);
}
if (lprim instanceof _index2.StringValue || rprim instanceof _index2.StringValue) {
var lstr = _singletons.To.ToString(realm, lprim);
var rstr = _singletons.To.ToString(realm, rprim);
return new _index2.StringValue(realm, lstr + rstr);
}
var lnum = _singletons.To.ToNumber(realm, lprim);
var rnum = _singletons.To.ToNumber(realm, rprim);
return (0, _index.Add)(realm, lnum, rnum);
} else if (op === "<" || op === ">" || op === ">=" || op === "<=") {
// ECMA262 12.10.3
if (op === "<") {
var r = (0, _index.AbstractRelationalComparison)(realm, lval, rval, true);
if (r instanceof _index2.UndefinedValue) {
return realm.intrinsics.false;
} else {
return r;
}
} else if (op === "<=") {
var _r = (0, _index.AbstractRelationalComparison)(realm, rval, lval, false);
if (_r instanceof _index2.UndefinedValue || _r instanceof _index2.BooleanValue && _r.value) {
return realm.intrinsics.false;
} else {
return realm.intrinsics.true;
}
} else if (op === ">") {
var _r2 = (0, _index.AbstractRelationalComparison)(realm, rval, lval, false);
if (_r2 instanceof _index2.UndefinedValue) {
return realm.intrinsics.false;
} else {
return _r2;
}
} else if (op === ">=") {
var _r3 = (0, _index.AbstractRelationalComparison)(realm, lval, rval, true);
if (_r3 instanceof _index2.UndefinedValue || _r3 instanceof _index2.BooleanValue && _r3.value) {
return realm.intrinsics.false;
} else {
return realm.intrinsics.true;
}
}
} else if (op === ">>>") {
// ECMA262 12.9.5.1
var _lnum = _singletons.To.ToUint32(realm, lval);
var _rnum = _singletons.To.ToUint32(realm, rval);
return new _index2.NumberValue(realm, _lnum >>> _rnum);
} else if (op === "<<" || op === ">>") {
var _lnum2 = _singletons.To.ToInt32(realm, lval);
var _rnum2 = _singletons.To.ToUint32(realm, rval);
if (op === "<<") {
// ECMA262 12.9.3.1
return new _index2.NumberValue(realm, _lnum2 << _rnum2);
} else if (op === ">>") {
// ECMA262 12.9.4.1
return new _index2.NumberValue(realm, _lnum2 >> _rnum2);
}
} else if (op === "**") {
// ECMA262 12.6.3
// 5. Let base be ? ToNumber(leftValue).
var base = _singletons.To.ToNumber(realm, lval);
// 6. Let exponent be ? ToNumber(rightValue).
var exponent = _singletons.To.ToNumber(realm, rval);
// 7. Return the result of Applying the ** operator with base and exponent as specified in 12.7.3.4.
return new _index2.NumberValue(realm, Math.pow(base, exponent));
} else if (op === "%" || op === "/" || op === "*" || op === "-") {
// ECMA262 12.7.3
var _lnum3 = _singletons.To.ToNumberOrAbstract(realm, lval);
var _rnum3 = _singletons.To.ToNumberOrAbstract(realm, rval);
if (_lnum3 instanceof _index2.AbstractValue || _rnum3 instanceof _index2.AbstractValue) {
var lnumVal = _lnum3 instanceof _index2.AbstractValue ? _lnum3 : new _index2.NumberValue(realm, _lnum3);
var rnumVal = _rnum3 instanceof _index2.AbstractValue ? _rnum3 : new _index2.NumberValue(realm, _rnum3);
return _index2.AbstractValue.createFromBinaryOp(realm, op, lnumVal, rnumVal);
}
if (isNaN(_rnum3)) return realm.intrinsics.NaN;
if (isNaN(_lnum3)) return realm.intrinsics.NaN;
if (op === "-") {
return (0, _index.Add)(realm, _lnum3, _rnum3, true);
} else if (op === "%") {
// The sign of the result equals the sign of the dividend.
// If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
// If the dividend is finite and the divisor is an infinity, the result equals the dividend.
// If the dividend is a zero and the divisor is nonzero and finite, the result is the same as the dividend.
return new _index2.NumberValue(realm, _lnum3 % _rnum3);
} else if (op === "/") {
// The sign of the result is positive if both operands have the same sign, negative if the operands have different signs.
// Division of an infinity by an infinity results in NaN.
// Division of an infinity by a zero results in an infinity. The sign is determined by the rule already stated above.
// Division of an infinity by a nonzero finite value results in a signed infinity. The sign is determined by the rule already stated above.
// Division of a finite value by an infinity results in zero. The sign is determined by the rule already stated above.
// Division of a zero by a zero results in NaN; division of zero by any other finite value results in zero, with the sign determined by the rule already stated above.
// Division of a nonzero finite value by a zero results in a signed infinity. The sign is determined by the rule already stated above.
return new _index2.NumberValue(realm, _lnum3 / _rnum3);
} else if (op === "*") {
// The sign of the result is positive if both operands have the same sign, negative if the operands have different signs.
// Multiplication of an infinity by a zero results in NaN.
// Multiplication of an infinity by an infinity results in an infinity. The sign is determined by the rule already stated above.
// Multiplication of an infinity by a finite nonzero value results in a signed infinity. The sign is determined by the rule already stated above.
return new _index2.NumberValue(realm, _lnum3 * _rnum3);
}
} else if (op === "!==") {
return new _index2.BooleanValue(realm, !(0, _index.StrictEqualityComparison)(realm, lval, rval));
} else if (op === "===") {
return new _index2.BooleanValue(realm, (0, _index.StrictEqualityComparison)(realm, lval, rval));
} else if (op === "!=") {
return new _index2.BooleanValue(realm, !(0, _index.AbstractEqualityComparison)(realm, lval, rval));
} else if (op === "==") {
return new _index2.BooleanValue(realm, (0, _index.AbstractEqualityComparison)(realm, lval, rval));
} else if (op === "&" || op === "|" || op === "^") {
// ECMA262 12.12.3
var _lnum4 = _singletons.To.ToInt32(realm, lval);
// 6. Let rnum be ? ToInt32(rval).
var _rnum4 = _singletons.To.ToInt32(realm, rval);
// 7. Return the result of applying the bitwise operator @ to lnum and rnum. The result is a signed 32 bit integer.
if (op === "&") {
return new _index2.NumberValue(realm, _lnum4 & _rnum4);
} else if (op === "|") {
return new _index2.NumberValue(realm, _lnum4 | _rnum4);
} else if (op === "^") {
return new _index2.NumberValue(realm, _lnum4 ^ _rnum4);
}
} else if (op === "in") {
// ECMA262 12.10.3
// 5. If Type(rval) is not Object, throw a TypeError exception.
if (!(rval instanceof _index2.ObjectValue)) {
throw new _errors.FatalError();
}
// 6. Return ? HasProperty(rval, ToPropertyKey(lval)).
return new _index2.BooleanValue(realm, (0, _index.HasProperty)(realm, rval, _singletons.To.ToPropertyKey(realm, lval)));
} else if (op === "instanceof") {
// ECMA262 12.10.3
// 5. Return ? InstanceofOperator(lval, rval).;
return new _index2.BooleanValue(realm, (0, _index.InstanceofOperator)(realm, lval, rval));
}
(0, _invariant2.default)(false, "unimplemented " + op);
}
}, {
key: "logicalOp",
value: function logicalOp(realm, op, left, right) {
var leftElements = left._elements;
var rightElements = right._elements;
// Return top if left and/or right are top or if the size of the value set would get to be quite large.
// Note: the larger the set of values, the less we know and therefore the less we get value from computing
// all of these values. TODO #1000: probably the upper bound can be quite a bit smaller.
if (!leftElements || !rightElements || leftElements.size > 100 || rightElements.size > 100) return ValuesDomain.topVal;
var resultSet = new Set();
var savedHandler = realm.errorHandler;
var savedIsReadOnly = realm.isReadOnly;
realm.isReadOnly = true;
try {
realm.errorHandler = function () {
throw new _errors.FatalError();
};
var _iteratorNormalCompletion9 = true;
var _didIteratorError9 = false;
var _iteratorError9 = undefined;
try {
for (var _iterator9 = leftElements[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
var leftElem = _step9.value;
var _iteratorNormalCompletion10 = true;
var _didIteratorError10 = false;
var _iteratorError10 = undefined;
try {
for (var _iterator10 = rightElements[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
var rightElem = _step10.value;
var result = ValuesDomain.computeLogical(realm, op, leftElem, rightElem);
(0, _invariant2.default)(result instanceof _index2.ConcreteValue);
resultSet.add(result);
}
} catch (err) {
_didIteratorError10 = true;
_iteratorError10 = err;
} finally {
try {
if (!_iteratorNormalCompletion10 && _iterator10.return) {
_iterator10.return();
}
} finally {
if (_didIteratorError10) {
throw _iteratorError10;
}
}
}
}
} catch (err) {
_didIteratorError9 = true;
_iteratorError9 = err;
} finally {
try {
if (!_iteratorNormalCompletion9 && _iterator9.return) {
_iterator9.return();
}
} finally {
if (_didIteratorError9) {
throw _iteratorError9;
}
}
}
} catch (e) {
if (e instanceof _completions.AbruptCompletion) return ValuesDomain.topVal;
} finally {
realm.errorHandler = savedHandler;
realm.isReadOnly = savedIsReadOnly;
}
return new ValuesDomain(resultSet);
}
// Note that calling this can result in user code running, which can side-effect the heap.
// If that is not the desired behavior, mark the realm as read-only for the duration of the call.
}, {
key: "computeLogical",
value: function computeLogical(realm, op, lval, rval) {
var lbool = _singletons.To.ToBoolean(realm, lval);
if (op === "&&") {
// ECMA262 12.13.3
if (lbool === false) return lval;
} else if (op === "||") {
// ECMA262 12.13.3
if (lbool === true) return lval;
}
return rval;
}
// Note that calling this can result in user code running, which can side-effect the heap.
// If that is not the desired behavior, mark the realm as read-only for the duration of the call.
}, {
key: "computeUnary",
value: function computeUnary(realm, op, value) {
if (op === "+") {
// ECMA262 12.5.6.1
// 1. Let expr be the result of evaluating UnaryExpression.
// 2. Return ? ToNumber(? GetValue(expr)).
return new _index2.NumberValue(realm, _singletons.To.ToNumber(realm, value));
} else if (op === "-") {
// ECMA262 12.5.7.1
// 1. Let expr be the result of evaluating UnaryExpression.
// 2. Let oldValue be ? ToNumber(? GetValue(expr)).
var oldValue = _singletons.To.ToNumber(realm, value);
// 3. If oldValue is NaN, return NaN.
if (isNaN(oldValue)) {
return realm.intrinsics.NaN;
}
// 4. Return the result of negating oldValue; that is, compute a Number with the same magnitude but opposite sign.
return new _index2.NumberValue(realm, -oldValue);
} else if (op === "~") {
// ECMA262 12.5.8
// 1. Let expr be the result of evaluating UnaryExpression.
// 2. Let oldValue be ? ToInt32(? GetValue(expr)).
var _oldValue = _singletons.To.ToInt32(realm, value);
// 3. Return the result of applying bitwise complement to oldValue. The result is a signed 32-bit integer.
return new _index2.NumberValue(realm, ~_oldValue);
} else if (op === "!") {
// ECMA262 12.6.9
// 1. Let expr be the result of evaluating UnaryExpression.
// 2. Let oldValue be ToBoolean(? GetValue(expr)).
var _oldValue2 = _singletons.To.ToBoolean(realm, value);
// 3. If oldValue is true, return false.
if (_oldValue2 === true) return realm.intrinsics.false;
// 4. Return true.
return realm.intrinsics.true;
} else if (op === "void") {
// 1. Let expr be the result of evaluating UnaryExpression.
// 2. Perform ? GetValue(expr).
// 3. Return undefined.
return realm.intrinsics.undefined;
} else if (op === "typeof") {
var isInstance = function isInstance(proto, Constructor) {
return proto instanceof Constructor || proto === Constructor.prototype;
};
// ECMA262 12.6.5
// 1. Let val be the result of evaluating UnaryExpression.
// 2. If Type(val) is Reference, then
// 3. Let val be ? GetValue(val).
var val = value;
// 4. Return a String according to Table 35.
var proto = val.getType().prototype;
if (isInstance(proto, _index2.UndefinedValue)) {
return new _index2.StringValue(realm, "undefined");
} else if (isInstance(proto, _index2.NullValue)) {
return new _index2.StringValue(realm, "object");
} else if (isInstance(proto, _index2.StringValue)) {
return new _index2.StringValue(realm, "string");
} else if (isInstance(proto, _index2.BooleanValue)) {
return new _index2.StringValue(realm, "boolean");
} else if (isInstance(proto, _index2.NumberValue)) {
return new _index2.StringValue(realm, "number");
} else if (isInstance(proto, _index2.SymbolValue)) {
return new _index2.StringValue(realm, "symbol");
} else if (isInstance(proto, _index2.ObjectValue)) {
if ((0, _index.IsCallable)(realm, val)) {
return new _index2.StringValue(realm, "function");
}
return new _index2.StringValue(realm, "object");
} else {
(0, _invariant2.default)(false);
}
} else {
(0, _invariant2.default)(op === "delete");
// ECMA262 12.5.3.2
// 1. Let ref be the result of evaluating UnaryExpression.
// 2. ReturnIfAbrupt(ref).
// 3. If Type(ref) is not Reference, return true.
return realm.intrinsics.true;
}
}
}, {
key: "unaryOp",
value: function unaryOp(realm, op, operandValues) {
var operandElements = operandValues._elements;
if (operandElements === undefined) return ValuesDomain.topVal;
var resultSet = new Set();
var savedHandler = realm.errorHandler;
var savedIsReadOnly = realm.isReadOnly;
realm.isReadOnly = true;
try {
realm.errorHandler = function () {
throw new _errors.FatalError();
};
var _iteratorNormalCompletion11 = true;
var _didIteratorError11 = false;
var _iteratorError11 = undefined;
try {
for (var _iterator11 = operandElements[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
var operandElem = _step11.value;
var result = ValuesDomain.computeUnary(realm, op, operandElem);
(0, _invariant2.default)(result instanceof _index2.ConcreteValue);
resultSet.add(result);
}
} catch (err) {
_didIteratorError11 = true;
_iteratorError11 = err;
} finally {
try {
if (!_iteratorNormalCompletion11 && _iterator11.return) {
_iterator11.return();
}
} finally {
if (_didIteratorError11) {
throw _iteratorError11;
}
}
}
} catch (e) {
if (e instanceof _completions.AbruptCompletion) return ValuesDomain.topVal;
} finally {
realm.errorHandler = savedHandler;
realm.isReadOnly = savedIsReadOnly;
}
return new ValuesDomain(resultSet);
}
}, {
key: "joinValues",
value: function joinValues(realm, v1, v2) {
if (v1 === undefined) v1 = realm.intrinsics.undefined;
if (v2 === undefined) v2 = realm.intrinsics.undefined;
if (v1 instanceof _index2.AbstractValue) return v1.values.joinWith(v2);
if (v2 instanceof _index2.AbstractValue) return v2.values.joinWith(v1);
var union = new Set();
(0, _invariant2.default)(v1 instanceof _index2.ConcreteValue);
union.add(v1);
(0, _invariant2.default)(v2 instanceof _index2.ConcreteValue);
union.add(v2);
return new ValuesDomain(union);
}
}, {
key: "meetValues",
value: function meetValues(realm, v1, v2) {
if (v1 === undefined) v1 = realm.intrinsics.undefined;
if (v2 === undefined) v2 = realm.intrinsics.undefined;
if (v1 instanceof _index2.AbstractValue) return v1.values.meetWith(v2);
if (v2 instanceof _index2.AbstractValue) return v2.values.meetWith(v1);
var intersection = new Set();
(0, _invariant2.default)(v1 instanceof _index2.ConcreteValue);
(0, _invariant2.default)(v2 instanceof _index2.ConcreteValue);
if (v1 === v2) intersection.add(v1);
return new ValuesDomain(intersection);
}
}]);
return ValuesDomain;
}();
ValuesDomain.topVal = new ValuesDomain(undefined);
exports.default = ValuesDomain;
//# sourceMappingURL=ValuesDomain.js.map

File diff suppressed because one or more lines are too long

26
build/node_modules/prepack/lib/domains/index.js generated vendored Normal file
View File

@@ -0,0 +1,26 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _TypesDomain = require("./TypesDomain.js");
Object.defineProperty(exports, "TypesDomain", {
enumerable: true,
get: function get() {
return _interopRequireDefault(_TypesDomain).default;
}
});
var _ValuesDomain = require("./ValuesDomain.js");
Object.defineProperty(exports, "ValuesDomain", {
enumerable: true,
get: function get() {
return _interopRequireDefault(_ValuesDomain).default;
}
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
//# sourceMappingURL=index.js.map

1
build/node_modules/prepack/lib/domains/index.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../src/domains/index.js"],"names":["default"],"mappings":";;;;;;;;;;;gDAWSA,O;;;;;;;;;iDACAA,O","file":"index.js","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\nexport { default as TypesDomain } from \"./TypesDomain.js\";\nexport { default as ValuesDomain } from \"./ValuesDomain.js\";\n"]}