Skip to content

Commit 5b9468d

Browse files
Reduce regenerator size more (#17287)
Co-authored-by: Nicolò Ribaudo <[email protected]>
1 parent cb78b5b commit 5b9468d

94 files changed

Lines changed: 4306 additions & 3313 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/babel-helpers/src/helpers-generated.ts

Lines changed: 33 additions & 73 deletions
Large diffs are not rendered by default.

packages/babel-helpers/src/helpers/OverloadYield.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
/* @minVersion 7.18.14 */
22

3-
/*
4-
* 'kind' is an enum:
5-
* 0 => This yield was an await expression
6-
* 1 => This yield comes from yield*
7-
*/
3+
const enum Kind {
4+
// This yield was an await expression
5+
Await = 0,
6+
// This yield comes from yield*
7+
Delegate = 1,
8+
}
89

910
// _OverloadYield is actually a class
1011
declare class _OverloadYield<T = any> {
1112
constructor(value: T, /** 0: await 1: delegate */ kind: 0 | 1);
1213

1314
v: T;
14-
/** 0: await 1: delegate */
15-
k: 0 | 1;
15+
k: Kind;
1616
}
1717

1818
// The actual implementation of _OverloadYield starts here
19-
function _OverloadYield<T>(
20-
this: _OverloadYield<T>,
21-
value: T,
22-
/** 0: await 1: delegate */ kind: 0 | 1,
23-
) {
19+
function _OverloadYield<T>(this: _OverloadYield<T>, value: T, kind: Kind) {
2420
this.v = value;
2521
this.k = kind;
2622
}

packages/babel-helpers/src/helpers/regenerator.ts

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@
55
/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */
66

77
import define from "./regeneratorDefine.ts";
8-
import defineIteratorMethods from "./regeneratorDefineIM.ts";
9-
import values from "./regeneratorValues.ts";
108

119
const enum GenState {
1210
SuspendedStart,
13-
SuspendedYield,
11+
SuspendedYieldOrCompleted,
1412
Executing,
15-
Completed,
1613
}
1714

1815
const enum OperatorType {
@@ -59,8 +56,6 @@ type Context = {
5956
export default function /* @no-mangle */ _regenerator() {
6057
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
6158

62-
var Op = Object.prototype;
63-
var hasOwn = Op.hasOwnProperty;
6459
var undefined: undefined; // More compressible than void 0.
6560
var $Symbol =
6661
typeof Symbol === "function" ? Symbol : ({} as SymbolConstructor);
@@ -106,24 +101,17 @@ export default function /* @no-mangle */ _regenerator() {
106101
/* @no-mangle */
107102
function GeneratorFunctionPrototype() {}
108103

109-
// This is a polyfill for %IteratorPrototype% for environments that
110-
// don't natively support it.
111-
var IteratorPrototype = {};
112-
define(IteratorPrototype, iteratorSymbol, function (this: unknown) {
113-
return this;
114-
});
115-
116-
var getProto = Object.getPrototypeOf;
117-
var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
118-
if (
119-
NativeIteratorPrototype &&
120-
NativeIteratorPrototype !== Op &&
121-
hasOwn.call(NativeIteratorPrototype, iteratorSymbol)
122-
) {
123-
// This environment has a native %IteratorPrototype%; use it instead
124-
// of the polyfill.
125-
IteratorPrototype = NativeIteratorPrototype;
126-
}
104+
_ = Object.getPrototypeOf;
105+
var IteratorPrototype = [][iteratorSymbol as typeof Symbol.iterator]
106+
? // This environment has a native %IteratorPrototype%; use it instead
107+
// of the polyfill.
108+
_(_([][iteratorSymbol as typeof Symbol.iterator]()))
109+
: // This is a polyfill for %IteratorPrototype% for environments that
110+
// don't natively support it.
111+
(define((_ = {}), iteratorSymbol, function (this: unknown) {
112+
return this;
113+
}),
114+
_);
127115

128116
var Gp =
129117
(GeneratorFunctionPrototype.prototype =
@@ -137,7 +125,7 @@ export default function /* @no-mangle */ _regenerator() {
137125

138126
// Define Generator.prototype.{next,throw,return} in terms of the
139127
// unified ._invoke helper method.
140-
defineIteratorMethods(Gp);
128+
define(Gp);
141129

142130
define(Gp, toStringTagSymbol, "Generator");
143131

@@ -178,7 +166,7 @@ export default function /* @no-mangle */ _regenerator() {
178166
_method: OperatorType.Next | OperatorType.Throw | OperatorType.Return,
179167
_arg: any,
180168
) {
181-
if (state === GenState.Executing) {
169+
if (state > 1 /* Executing */) {
182170
throw TypeError("Generator is already running");
183171
} else if (done) {
184172
if (_method === OperatorType.Throw) {
@@ -189,19 +177,20 @@ export default function /* @no-mangle */ _regenerator() {
189177
method = _method;
190178
arg = _arg;
191179

192-
while (!done || (_ = undefined)) {
180+
while ((_ = method < 2 /* Next | Throw */ ? undefined : arg) || !done) {
193181
if (!delegateIterator) {
194-
if (!method /* Return */) {
182+
if (!method /* Next */) {
195183
ctx.v = arg;
196184
} else if (method < 3 /* Throw | Return */) {
197185
if (method > 1 /* Return */) ctx.n = ContextNext.End;
198186
Context_dispatchExceptionOrFinishOrAbrupt(method, arg);
199187
} else {
200-
// Jump
188+
/* Jump */
201189
ctx.n = arg;
202190
}
203191
}
204192
try {
193+
state = GenState.Executing;
205194
if (delegateIterator) {
206195
// Call delegate.iterator[context.method](context.arg) and handle the result
207196

@@ -255,27 +244,22 @@ export default function /* @no-mangle */ _regenerator() {
255244
// yield* loop.
256245
delegateIterator = undefined;
257246
} else {
258-
state = GenState.Executing;
259-
260247
if ((done = ctx.n < 0) /* End */) {
261248
_ = arg;
262249
} else {
263250
_ = innerFn.call(self, ctx);
264251
}
265252

266-
// If an exception is thrown from innerFn, we leave state ===
267-
// GenStateExecuting and loop back for another invocation.
268-
state = done ? GenState.Completed : GenState.SuspendedYield;
269-
270253
if (_ !== ContinueSentinel) {
271254
break;
272255
}
273256
}
274257
} catch (e) {
275-
state = GenState.Completed;
276258
delegateIterator = undefined;
277259
method = OperatorType.Throw;
278260
arg = e;
261+
} finally {
262+
state = GenState.SuspendedYieldOrCompleted;
279263
}
280264
}
281265
// Be forgiving, per GeneratorResume behavior specified since ES2015:
@@ -302,13 +286,16 @@ export default function /* @no-mangle */ _regenerator() {
302286

303287
v: undefined,
304288

289+
// abrupt
305290
a: Context_dispatchExceptionOrFinishOrAbrupt,
291+
// finish
306292
f: Context_dispatchExceptionOrFinishOrAbrupt.bind(
307293
undefined,
308294
OperatorType.Finish,
309295
),
296+
// delegateYield
310297
d: function (iterable: any, nextLoc: number) {
311-
delegateIterator = values(iterable);
298+
delegateIterator = iterable;
312299

313300
// Deliberately forget the last sent value so that we don't
314301
// accidentally pass it on to the delegate.
@@ -328,7 +315,10 @@ export default function /* @no-mangle */ _regenerator() {
328315
arg = _arg;
329316
for (
330317
_ = 0;
331-
!done && state && !shouldReturn && _ < tryEntries.length;
318+
!done &&
319+
state /* state !== SuspendedStart */ &&
320+
!shouldReturn &&
321+
_ < tryEntries.length;
332322
_++
333323
) {
334324
var entry = tryEntries[_];

packages/babel-helpers/src/helpers/regeneratorAsyncGen.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
/* @minVersion 7.27.0 */
2+
/* @mangleFns */
23

3-
import AsyncIterator from "./regeneratorAsyncIterator.ts";
44
import regenerator from "./regenerator.ts";
5+
import regeneratorAsyncIterator from "./regeneratorAsyncIterator.ts";
56

6-
export default function _regeneratorAsyncGen(
7+
export default /* @no-mangle */ function _regeneratorAsyncGen(
78
innerFn: Function,
89
outerFn: Function,
910
self: any,
1011
tryLocsList: any[],
1112
PromiseImpl: PromiseConstructor | undefined,
1213
) {
13-
return new (AsyncIterator as any)(
14+
return new (regeneratorAsyncIterator as any)(
1415
regenerator().w(innerFn as any, outerFn, self, tryLocsList),
1516
PromiseImpl || Promise,
1617
);

packages/babel-helpers/src/helpers/regeneratorAsyncIterator.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44

55
import OverloadYield from "./OverloadYield.ts";
66
import define from "./regeneratorDefine.ts";
7-
import tryCatch from "./tryCatch.ts";
8-
import defineIteratorMethods from "./regeneratorDefineIM.ts";
97

108
export default /* @no-mangle */ function AsyncIterator(
119
this: any,
1210
generator: Generator,
1311
PromiseImpl: PromiseConstructor,
1412
) {
1513
if (!this.next) {
16-
defineIteratorMethods(AsyncIterator.prototype);
14+
define(AsyncIterator.prototype);
1715
define(
1816
AsyncIterator.prototype,
1917
(typeof Symbol === "function" && Symbol.asyncIterator) ||
@@ -30,13 +28,10 @@ export default /* @no-mangle */ function AsyncIterator(
3028
resolve: (value: any) => void,
3129
reject: (error: any) => void,
3230
): any {
33-
var record = tryCatch(generator[method], generator, arg);
34-
if (/* error */ record.e) {
35-
reject(record.v);
36-
} else {
37-
var result = record.v;
31+
try {
32+
var result = generator[method](arg);
3833
var value = result.value;
39-
if (value && value instanceof OverloadYield) {
34+
if (value instanceof OverloadYield) {
4035
return PromiseImpl.resolve(value.v).then(
4136
function (value) {
4237
invoke("next", value, resolve, reject);
@@ -61,6 +56,8 @@ export default /* @no-mangle */ function AsyncIterator(
6156
return invoke("throw", error, resolve, reject);
6257
},
6358
);
59+
} catch (error) {
60+
reject(error);
6461
}
6562
}
6663

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,51 @@
11
/* @minVersion 7.27.0 */
2+
/* @mangleFns */
23
/* @internal */
34

5+
// Also used to define Iterator Methods
6+
// Defining the .next, .throw, and .return methods of the Iterator interface in terms of a single ._invoke method.
47
export default function regeneratorDefine(
58
obj: any,
6-
key: PropertyKey,
9+
key?: PropertyKey,
710
value?: unknown,
811
noFlags?: true,
912
) {
13+
var define: typeof Object.defineProperty | 0 = Object.defineProperty;
14+
try {
15+
// IE 8 has a broken Object.defineProperty that only works on DOM objects.
16+
define({}, "", {});
17+
} catch (_) {
18+
define = 0;
19+
}
20+
1021
// @ts-expect-error explicit function reassign
1122
regeneratorDefine = function (
1223
obj: any,
13-
key: PropertyKey,
24+
key?: PropertyKey,
1425
value?: unknown,
1526
noFlags?: true,
1627
) {
17-
return Object.defineProperty(obj, key, {
18-
value: value,
19-
enumerable: !noFlags,
20-
configurable: !noFlags,
21-
writable: !noFlags,
22-
});
28+
if (!key) {
29+
function defineIteratorMethod(method: string, i: number) {
30+
regeneratorDefine(obj, method, function (this: any, arg: any) {
31+
return this._invoke(method, i, arg);
32+
});
33+
}
34+
defineIteratorMethod("next", 0);
35+
defineIteratorMethod("throw", 1);
36+
defineIteratorMethod("return", 2);
37+
} else {
38+
if (define) {
39+
define(obj, key, {
40+
value: value,
41+
enumerable: !noFlags,
42+
configurable: !noFlags,
43+
writable: !noFlags,
44+
});
45+
} else {
46+
obj[key] = value;
47+
}
48+
}
2349
};
24-
try {
25-
// IE 8 has a broken Object.defineProperty that only works on DOM objects.
26-
regeneratorDefine({}, "");
27-
} catch (_) {
28-
// @ts-expect-error explicit function reassign
29-
regeneratorDefine = function (obj, key, value) {
30-
return (obj[key] = value);
31-
};
32-
}
33-
return regeneratorDefine(obj, key, value, noFlags);
50+
regeneratorDefine(obj, key, value, noFlags);
3451
}

packages/babel-helpers/src/helpers/regeneratorDefineIM.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

packages/babel-helpers/src/helpers/regeneratorRuntime.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export default function /* @no-mangle */ _regeneratorRuntime() {
8080
},
8181
delegateYield: function (iterable, resultName, nextLoc) {
8282
compatContext.resultName = resultName;
83-
return callSyncState(context.d, iterable, nextLoc);
83+
return callSyncState(context.d, values(iterable), nextLoc);
8484
},
8585
finish: function (finallyLoc) {
8686
return callSyncState(context.f, finallyLoc);

0 commit comments

Comments
 (0)