"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