Files
2023-08-01 13:49:46 +02:00

252 lines
12 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /**
* 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.
*/
exports.default = function (realm) {
var obj = new _index.ObjectValue(realm, realm.intrinsics.ObjectPrototype, "Math");
// ECMA262 20.2.1.9
obj.defineNativeProperty(realm.intrinsics.SymbolToStringTag, new _index.StringValue(realm, "Math"), { writable: false });
// ECMA262 20.2.1.1
obj.defineNativeConstant("E", new _index.NumberValue(realm, 2.7182818284590452354));
// ECMA262 20.2.1.2
obj.defineNativeConstant("LN10", new _index.NumberValue(realm, 2.302585092994046));
// ECMA262 20.2.1.3
obj.defineNativeConstant("LN2", new _index.NumberValue(realm, 0.6931471805599453));
// ECMA262 20.2.1.4
obj.defineNativeConstant("LOG10E", new _index.NumberValue(realm, 0.4342944819032518));
// ECMA262 20.2.1.5
obj.defineNativeConstant("LOG2E", new _index.NumberValue(realm, 1.4426950408889634));
// ECMA262 20.2.1.6
obj.defineNativeConstant("PI", new _index.NumberValue(realm, 3.1415926535897932));
// ECMA262 20.2.1.7
obj.defineNativeConstant("SQRT1_2", new _index.NumberValue(realm, 0.7071067811865476));
// ECMA262 20.2.1.8
obj.defineNativeConstant("SQRT2", new _index.NumberValue(realm, 1.4142135623730951));
var functions = [
// ECMA262 20.2.2.1
["abs", 1],
// ECMA262 20.2.2.2
["acos", 1],
// ECMA262 20.2.2.3
["acosh", 1],
// ECMA262 20.2.2.4
["asin", 1],
// ECMA262 20.2.2.5
["asinh", 1],
// ECMA262 20.2.2.6
["atan", 1],
// ECMA262 20.2.2.7
["atanh", 1],
// ECMA262 20.2.2.8
["atan2", 2],
// ECMA262 20.2.2.9
["cbrt", 1],
// ECMA262 20.2.2.10
["ceil", 1],
// ECMA262 20.2.2.12
["cos", 1],
// ECMA262 20.2.2.13
["cosh", 1],
// ECMA262 20.2.2.14
["exp", 1],
// ECMA262 20.2.2.15
["expm1", 1],
// ECMA262 20.2.2.16
["floor", 1],
// ECMA262 20.2.2.17
["fround", 1],
// ECMA262 20.2.2.18
["hypot", 2],
// ECMA262 20.2.2.20
["log", 1],
// ECMA262 20.2.2.21
["log1p", 1],
// ECMA262 20.2.2.22
["log10", 1],
// ECMA262 20.2.2.23
["log2", 1],
// ECMA262 20.2.2.24 ( _value1_, _value2_, ..._values_ )
["max", 2],
// ECMA262 20.2.2.25
["min", 2],
// ECMA262 20.2.2.26
["pow", 2],
// ECMA262 20.2.2.28
["round", 1],
// ECMA262 20.2.2.30
["sin", 1],
// ECMA262 20.2.2.31
["sinh", 1],
// ECMA262 20.2.2.32
["sqrt", 1],
// ECMA262 20.2.2.33
["tan", 1],
// ECMA262 20.2.2.34
["tanh", 1],
// ECMA262 20.2.2.35
["trunc", 1]];
// ECMA262 20.2.2.11
if (!realm.isCompatibleWith(realm.MOBILE_JSC_VERSION)) functions.push(["clz32", 1]);
// ECMA262 20.2.2.29 (_x_)
if (!realm.isCompatibleWith(realm.MOBILE_JSC_VERSION)) functions.push(["sign", 1]);
var _loop = function _loop(name, length) {
obj.defineNativeMethod(name, length, function (context, args, originalLength) {
(0, _invariant2.default)(originalLength >= 0);
args.length = originalLength;
if (originalLength <= 26 && args.some(function (arg) {
return arg instanceof _index.AbstractValue;
}) && args.every(function (arg) {
return _singletons.To.IsToNumberPure(realm, arg);
})) {
var r = buildMathTemplates.get(name);
if (r === undefined) {
var params = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z".substring(0, originalLength * 2 - 1);
var _templateSource = "Math." + name + "(" + params + ")";
var _template = (0, _builder2.default)(_templateSource);
buildMathTemplates.set(name, r = { template: _template, templateSource: _templateSource });
}
return _index.AbstractValue.createFromTemplate(realm, r.template, _index.NumberValue, args, r.templateSource);
}
return new _index.NumberValue(realm, Math[name].apply(null, args.map(function (arg, i) {
return _singletons.To.ToNumber(realm, arg.throwIfNotConcrete());
})));
});
};
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = functions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var _ref = _step.value;
var _ref2 = _slicedToArray(_ref, 2);
var name = _ref2[0];
var length = _ref2[1];
_loop(name, length);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var imulTemplateSrc = "global.Math.imul(A, B)";
var imulTemplate = (0, _builder2.default)(imulTemplateSrc);
// ECMA262 20.2.2.19
obj.defineNativeMethod("imul", 2, function (context, _ref3) {
var _ref4 = _slicedToArray(_ref3, 2),
x = _ref4[0],
y = _ref4[1];
if ((x instanceof _index.AbstractValue || y instanceof _index.AbstractValue) && _singletons.To.IsToNumberPure(realm, x) && _singletons.To.IsToNumberPure(realm, y)) {
return _index.AbstractValue.createFromTemplate(realm, imulTemplate, _index.NumberValue, [x, y], imulTemplateSrc);
}
return new _index.NumberValue(realm, Math.imul(_singletons.To.ToUint32(realm, x.throwIfNotConcrete()), _singletons.To.ToUint32(realm, y.throwIfNotConcrete())));
});
var mathRandomTemplateSrc = "global.Math.random()";
var mathRandomTemplate = (0, _builder2.default)(mathRandomTemplateSrc);
// ECMA262 20.2.2.27
obj.defineNativeMethod("random", 0, function (context) {
if (realm.mathRandomGenerator !== undefined) {
return new _index.NumberValue(realm, realm.mathRandomGenerator());
} else if (realm.useAbstractInterpretation) {
return _index.AbstractValue.createTemporalFromTemplate(realm, mathRandomTemplate, _index.NumberValue, [], {
isPure: true,
skipInvariant: true
});
} else {
return new _index.NumberValue(realm, Math.random());
}
});
return obj;
};
var _index = require("../../values/index.js");
var _singletons = require("../../singletons.js");
var _invariant = require("../../invariant.js");
var _invariant2 = _interopRequireDefault(_invariant);
var _builder = require("../../utils/builder.js");
var _builder2 = _interopRequireDefault(_builder);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var buildMathTemplates = new Map();
//# sourceMappingURL=Math.js.map