From 3ce909c383cf07acd65aebff99760d77bdd6ad5d Mon Sep 17 00:00:00 2001 From: Si3nLoong Date: Fri, 7 May 2021 07:28:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=90=9B=20fix:=20undefined=20`deoptimi?= =?UTF-8?q?zePath`=20when=20the=20first=20element=20is=20empty=20string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ast/variables/NamespaceVariable.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ast/variables/NamespaceVariable.ts b/src/ast/variables/NamespaceVariable.ts index 8fb31629a77..b664b66430a 100644 --- a/src/ast/variables/NamespaceVariable.ts +++ b/src/ast/variables/NamespaceVariable.ts @@ -38,7 +38,7 @@ export default class NamespaceVariable extends Variable { memberVariables[key].deoptimizePath(memberPath); } } else { - memberVariables[key].deoptimizePath(memberPath); + memberVariables[key]?.deoptimizePath(memberPath); } } From c93e4a1853d41550f8d53c5fdf38f03fffc10340 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Fri, 14 May 2021 18:05:06 +0200 Subject: [PATCH 2/2] Add test --- src/ast/variables/NamespaceVariable.ts | 6 +++--- .../deoptimize-missing-namespace-members/_config.js | 8 ++++++++ .../samples/deoptimize-missing-namespace-members/main.js | 4 ++++ .../samples/deoptimize-missing-namespace-members/other.js | 0 4 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 test/function/samples/deoptimize-missing-namespace-members/_config.js create mode 100644 test/function/samples/deoptimize-missing-namespace-members/main.js create mode 100644 test/function/samples/deoptimize-missing-namespace-members/other.js diff --git a/src/ast/variables/NamespaceVariable.ts b/src/ast/variables/NamespaceVariable.ts index b664b66430a..0ed3fbbcfd1 100644 --- a/src/ast/variables/NamespaceVariable.ts +++ b/src/ast/variables/NamespaceVariable.ts @@ -33,12 +33,12 @@ export default class NamespaceVariable extends Variable { const memberVariables = this.getMemberVariables(); const memberPath = path.length <= 1 ? UNKNOWN_PATH : path.slice(1); const key = path[0]; - if (typeof key !== 'string') { + if (typeof key === 'string') { + memberVariables[key]?.deoptimizePath(memberPath); + } else { for (const key of Object.keys(memberVariables)) { memberVariables[key].deoptimizePath(memberPath); } - } else { - memberVariables[key]?.deoptimizePath(memberPath); } } diff --git a/test/function/samples/deoptimize-missing-namespace-members/_config.js b/test/function/samples/deoptimize-missing-namespace-members/_config.js new file mode 100644 index 00000000000..90766e5c479 --- /dev/null +++ b/test/function/samples/deoptimize-missing-namespace-members/_config.js @@ -0,0 +1,8 @@ +const assert = require('assert'); + +module.exports = { + description: 'handles deoptimization of non-existing namespace members', + exports(exports) { + assert.strictEqual(exports.bar, undefined); + } +}; diff --git a/test/function/samples/deoptimize-missing-namespace-members/main.js b/test/function/samples/deoptimize-missing-namespace-members/main.js new file mode 100644 index 00000000000..fff92bced04 --- /dev/null +++ b/test/function/samples/deoptimize-missing-namespace-members/main.js @@ -0,0 +1,4 @@ +import * as ns from './other.js'; + +const foo = 'foo'; +export const bar = ns[foo]; diff --git a/test/function/samples/deoptimize-missing-namespace-members/other.js b/test/function/samples/deoptimize-missing-namespace-members/other.js new file mode 100644 index 00000000000..e69de29bb2d