From 980ca642c63f3dde39cd64d9ddf3a5961351ce96 Mon Sep 17 00:00:00 2001 From: ExE Boss <3889017+ExE-Boss@users.noreply.github.com> Date: Wed, 22 Jul 2020 03:45:00 +0200 Subject: [PATCH] =?UTF-8?q?runtime:=20Use=C2=A0`[[Define]]`=20for=C2=A0the?= =?UTF-8?q?=C2=A0`Symbol.toStringTag`=C2=A0property=20(#402)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/regenerator-runtime/runtime.js | 18 +++++++++++++++++- test/non-writable-tostringtag-property.js | 13 +++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/regenerator-runtime/runtime.js b/packages/regenerator-runtime/runtime.js index 9e0c50d58..7b4b80e5e 100644 --- a/packages/regenerator-runtime/runtime.js +++ b/packages/regenerator-runtime/runtime.js @@ -8,6 +8,7 @@ var runtime = (function (exports) { "use strict"; + var define = Object.defineProperty; var Op = Object.prototype; var hasOwn = Op.hasOwnProperty; var undefined; // More compressible than void 0. @@ -16,6 +17,15 @@ var runtime = (function (exports) { var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + if (define) { + try { + // IE 8 has a broken Object.defineProperty that only works on DOM objects + define({}, '', {}); + } catch (err) { + define = undefined; + } + } + function wrap(innerFn, outerFn, self, tryLocsList) { // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; @@ -85,7 +95,13 @@ var runtime = (function (exports) { function ensureDefaultToStringTag(object, defaultValue) { // https://bugzilla.mozilla.org/show_bug.cgi?id=1644581#c6 return toStringTagSymbol in object - ? object[toStringTagSymbol] + ? (define && define(object, toStringTagSymbol, { + value: defaultValue, + enumerable: true, + configurable: true, + writable: true + }), + defaultValue) : object[toStringTagSymbol] = defaultValue; } diff --git a/test/non-writable-tostringtag-property.js b/test/non-writable-tostringtag-property.js index 96ba10480..5513c6de5 100644 --- a/test/non-writable-tostringtag-property.js +++ b/test/non-writable-tostringtag-property.js @@ -5,7 +5,8 @@ * LICENSE file in the root directory of this source tree. */ -var hasOwn = Object.prototype.hasOwnProperty; +var assert = require("assert"); + var getProto = Object.getPrototypeOf; var NativeIteratorPrototype = typeof Symbol === "function" && @@ -20,8 +21,16 @@ Object.defineProperty(NativeIteratorPrototype, Symbol.toStringTag, { value: "Iterator", }); -describe("Symbol.toStringTag safety (#399, #400)", function () { +(NativeIteratorPrototype ? describe : describe.skip)("Symbol.toStringTag safety (#399, #400)", function () { it("regenerator-runtime doesn't fail to initialize when native iterator prototype has a non-writable @@toStringTag property", function() { require("./runtime.js"); }); + + it("regenerator-runtime's polyfilled generator prototype has the correct @@toStringTag value", function() { + require("./runtime.js"); + function foo() {} + regeneratorRuntime.mark(foo); + + assert.strictEqual(foo.prototype[Symbol.toStringTag], "Generator"); + }); });