Skip to content

Commit 2a983d8

Browse files
committed
optimize __createBinding
When the binding is itself one that was created by `__createBinding`, re-use its descriptor, which avoids piling multiple levels of getters in the case of multiple levels of exports. In addition, reuse a descriptor if the bindings is marked as non-writable and non-configurable, which makes a getter not necessary. (This can be done manually if needed, even though tsc doesn't do it now.) Also related to #46744 and to microsoft/tslib#165.
1 parent 852b1c2 commit 2a983d8

File tree

155 files changed

+1175
-235
lines changed

Some content is hidden

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

155 files changed

+1175
-235
lines changed

src/compiler/factory/emitHelpers.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,11 @@ namespace ts {
783783
text: `
784784
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
785785
if (k2 === undefined) k2 = k;
786-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
786+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
787+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
788+
|| m.__esModule && "get" in oldDesc)
789+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
790+
Object.defineProperty(o, k2, desc);
787791
}) : (function(o, m, k, k2) {
788792
if (k2 === undefined) k2 = k;
789793
o[k2] = m[k];

tests/baselines/reference/ambientShorthand_reExport.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ x($);
2020
"use strict";
2121
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2222
if (k2 === undefined) k2 = k;
23-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
23+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
24+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
25+
|| m.__esModule && "get" in oldDesc)
26+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
27+
Object.defineProperty(o, k2, desc);
2428
}) : (function(o, m, k, k2) {
2529
if (k2 === undefined) k2 = k;
2630
o[k2] = m[k];
@@ -33,7 +37,11 @@ __createBinding(exports, jquery_1, "x");
3337
"use strict";
3438
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3539
if (k2 === undefined) k2 = k;
36-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
40+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
41+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
42+
|| m.__esModule && "get" in oldDesc)
43+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
44+
Object.defineProperty(o, k2, desc);
3745
}) : (function(o, m, k, k2) {
3846
if (k2 === undefined) k2 = k;
3947
o[k2] = m[k];

tests/baselines/reference/constEnumPreserveEmitReexport.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ exports["default"] = ConstEnum_1.MyConstEnum;
3030
"use strict";
3131
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3232
if (k2 === undefined) k2 = k;
33-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
33+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
34+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
35+
|| m.__esModule && "get" in oldDesc)
36+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
37+
Object.defineProperty(o, k2, desc);
3438
}) : (function(o, m, k, k2) {
3539
if (k2 === undefined) k2 = k;
3640
o[k2] = m[k];

tests/baselines/reference/declarationEmitAliasExportStar.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ exports.__esModule = true;
1616
"use strict";
1717
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
1818
if (k2 === undefined) k2 = k;
19-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
19+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
20+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
21+
|| m.__esModule && "get" in oldDesc)
22+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
23+
Object.defineProperty(o, k2, desc);
2024
}) : (function(o, m, k, k2) {
2125
if (k2 === undefined) k2 = k;
2226
o[k2] = m[k];

tests/baselines/reference/declarationEmitExportAssignedNamespaceNoTripleSlashTypesReference.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ exports.obj = {
5959
"use strict";
6060
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6161
if (k2 === undefined) k2 = k;
62-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
62+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
63+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
64+
|| m.__esModule && "get" in oldDesc)
65+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
66+
Object.defineProperty(o, k2, desc);
6367
}) : (function(o, m, k, k2) {
6468
if (k2 === undefined) k2 = k;
6569
o[k2] = m[k];

tests/baselines/reference/declarationEmitReexportedSymlinkReference.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
5353
"use strict";
5454
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5555
if (k2 === undefined) k2 = k;
56-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
56+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
57+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
58+
|| m.__esModule && "get" in oldDesc)
59+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
60+
Object.defineProperty(o, k2, desc);
5761
}) : (function(o, m, k, k2) {
5862
if (k2 === undefined) k2 = k;
5963
o[k2] = m[k];

tests/baselines/reference/declarationEmitReexportedSymlinkReference2.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
5656
"use strict";
5757
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5858
if (k2 === undefined) k2 = k;
59-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
59+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
60+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
61+
|| m.__esModule && "get" in oldDesc)
62+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
63+
Object.defineProperty(o, k2, desc);
6064
}) : (function(o, m, k, k2) {
6165
if (k2 === undefined) k2 = k;
6266
o[k2] = m[k];

tests/baselines/reference/declarationEmitReexportedSymlinkReference3.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
5353
"use strict";
5454
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5555
if (k2 === undefined) k2 = k;
56-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
56+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
57+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
58+
|| m.__esModule && "get" in oldDesc)
59+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
60+
Object.defineProperty(o, k2, desc);
5761
}) : (function(o, m, k, k2) {
5862
if (k2 === undefined) k2 = k;
5963
o[k2] = m[k];

tests/baselines/reference/doubleUnderscoreExportStarConflict.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ exports.__foo = __foo;
2727
"use strict";
2828
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2929
if (k2 === undefined) k2 = k;
30-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
30+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
31+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
32+
|| m.__esModule && "get" in oldDesc)
33+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
34+
Object.defineProperty(o, k2, desc);
3135
}) : (function(o, m, k, k2) {
3236
if (k2 === undefined) k2 = k;
3337
o[k2] = m[k];

tests/baselines/reference/es6ExportAllInEs5.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ exports.x = 10;
3434
"use strict";
3535
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3636
if (k2 === undefined) k2 = k;
37-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
37+
var oldDesc = Object.getOwnPropertyDescriptor(m, k);
38+
var desc = (oldDesc.writable === false && oldDesc.configurable === false
39+
|| m.__esModule && "get" in oldDesc)
40+
? oldDesc : { enumerable: true, get: function() { return m[k]; } };
41+
Object.defineProperty(o, k2, desc);
3842
}) : (function(o, m, k, k2) {
3943
if (k2 === undefined) k2 = k;
4044
o[k2] = m[k];

0 commit comments

Comments
 (0)