UNPKG

prepack

Version:

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

143 lines (112 loc) 4.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (realm) { return build("Error", realm, false); }; exports.describeLocation = describeLocation; exports.build = build; var _index = require("../../values/index.js"); var _index2 = require("../../methods/index.js"); var _singletons = require("../../singletons.js"); var _invariant = require("../../invariant.js"); var _invariant2 = _interopRequireDefault(_invariant); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function describeLocation(realm, callerFn, env, loc) { let locString = ""; let displayName = ""; if (callerFn) { if (callerFn instanceof _index.NativeFunctionValue) { locString = "native"; } let name = callerFn.$Get("name", callerFn); if (!name.mightBeUndefined()) displayName = _singletons.To.ToStringPartial(realm, name);else name.throwIfNotConcrete(); if (env && env.$NewTarget) displayName = `new ${displayName}`; } if (!locString) { if (loc) { locString = `${loc.start.line}:${loc.start.column + 1}`; if (loc.source) locString = `${loc.source}:${locString}`; } else { locString = (loc ? loc.source : undefined) || "unknown"; if (!displayName) return undefined; } } if (displayName) { return `at ${displayName} (${locString})`; } else { return `at ${locString}`; } } /** * 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. */ function buildStack(realm, context) { (0, _invariant2.default)(context.$ErrorData); let stack = context.$ErrorData.contextStack; if (!stack) return realm.intrinsics.undefined; let lines = []; let header = ""; header += _singletons.To.ToStringPartial(realm, (0, _index2.Get)(realm, context, "name")); let msg = (0, _index2.Get)(realm, context, "message"); if (!msg.mightBeUndefined()) { msg = _singletons.To.ToStringPartial(realm, msg); if (msg) header += `: ${msg}`; } else { msg.throwIfNotConcrete(); } for (let executionContext of stack.reverse()) { let caller = executionContext.caller; let locString = describeLocation(realm, caller ? caller.function : undefined, caller ? caller.lexicalEnvironment : undefined, executionContext.loc); if (locString !== undefined) lines.push(locString); } return new _index.StringValue(realm, `${header}\n ${lines.join("\n ")}`); } function build(name, realm, inheritError = true) { let func = new _index.NativeFunctionValue(realm, name, name, 1, (context, [message], argLength, NewTarget) => { // 1. If NewTarget is undefined, let newTarget be the active function object, else let newTarget be NewTarget. let newTarget = NewTarget || func; // 2. Let O be ? OrdinaryCreateFromConstructor(newTarget, "%ErrorPrototype%", « [[ErrorData]] »). let O = _singletons.Create.OrdinaryCreateFromConstructor(realm, newTarget, `${name}Prototype`, { $ErrorData: undefined }); O.$ErrorData = { contextStack: realm.contextStack.slice(1), locationData: undefined }; // Build a text description of the stack. let stackDesc = { value: buildStack(realm, O), enumerable: false, configurable: true, writable: true }; _singletons.Properties.DefinePropertyOrThrow(realm, O, "stack", stackDesc); // 3. If message is not undefined, then if (!message.mightBeUndefined()) { // a. Let msg be ? ToString(message). let msg = message.getType() === _index.StringValue ? message : _singletons.To.ToStringValue(realm, message); // b. Let msgDesc be the PropertyDescriptor{[[Value]]: msg, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}. let msgDesc = { value: msg, writable: true, enumerable: false, configurable: true }; // c. Perform ! DefinePropertyOrThrow(O, "message", msgDesc). _singletons.Properties.DefinePropertyOrThrow(realm, O, "message", msgDesc); } else { message.throwIfNotConcrete(); } // 4. Return O. return O; }); if (inheritError) { func.$Prototype = realm.intrinsics.Error; } return func; } //# sourceMappingURL=Error.js.map