From f6ea7408040bed478a00bdc902daccf82ead82da Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Mon, 16 Dec 2019 06:09:11 +0100 Subject: [PATCH] Add tests and slightly adapt logic --- src/ast/nodes/AssignmentExpression.ts | 25 ++++++++----------- .../assignee-is-deoptimized/_config.js | 3 +++ .../assignee-is-deoptimized/main.js | 5 ++++ .../_config.js | 3 +++ .../assignment-target-is-deoptimized/main.js | 3 +++ .../nested-assignment/_config.js | 3 +++ .../nested-assignment/main.js | 3 +++ .../try-catch-inclusion/_config.js | 3 +++ .../try-catch-inclusion/main.js | 6 +++++ 9 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 test/function/samples/assignment-deoptimization/assignee-is-deoptimized/_config.js create mode 100644 test/function/samples/assignment-deoptimization/assignee-is-deoptimized/main.js create mode 100644 test/function/samples/assignment-deoptimization/assignment-target-is-deoptimized/_config.js create mode 100644 test/function/samples/assignment-deoptimization/assignment-target-is-deoptimized/main.js create mode 100644 test/function/samples/assignment-deoptimization/nested-assignment/_config.js create mode 100644 test/function/samples/assignment-deoptimization/nested-assignment/main.js create mode 100644 test/function/samples/assignment-deoptimization/try-catch-inclusion/_config.js create mode 100644 test/function/samples/assignment-deoptimization/try-catch-inclusion/main.js diff --git a/src/ast/nodes/AssignmentExpression.ts b/src/ast/nodes/AssignmentExpression.ts index 5303dd90e85..8dd9796cab8 100644 --- a/src/ast/nodes/AssignmentExpression.ts +++ b/src/ast/nodes/AssignmentExpression.ts @@ -29,7 +29,7 @@ export default class AssignmentExpression extends NodeBase { private deoptimized = false; hasEffects(context: HasEffectsContext): boolean { - this.deoptimize(); + if (!this.deoptimized) this.applyDeoptimizations(); return ( this.right.hasEffects(context) || this.left.hasEffects(context) || @@ -41,9 +41,11 @@ export default class AssignmentExpression extends NodeBase { return path.length > 0 && this.right.hasEffectsWhenAccessedAtPath(path, context); } - include(context: InclusionContext, includeChildrenRecursively: IncludeChildren) { - this.deoptimize(); - return super.include(context, includeChildrenRecursively); + include(context: InclusionContext, includeChildrenRecursively: IncludeChildren): void { + if (!this.deoptimized) this.applyDeoptimizations(); + this.included = true; + this.left.include(context, includeChildrenRecursively); + this.right.include(context, includeChildrenRecursively); } render(code: MagicString, options: RenderOptions) { @@ -80,16 +82,9 @@ export default class AssignmentExpression extends NodeBase { } } - shouldBeIncluded(context: InclusionContext): boolean { - this.deoptimize(); - return super.shouldBeIncluded(context); - } - - private deoptimize() { - if (!this.deoptimized) { - this.deoptimized = true; - this.left.deoptimizePath(EMPTY_PATH); - this.right.deoptimizePath(UNKNOWN_PATH); - } + private applyDeoptimizations() { + this.deoptimized = true; + this.left.deoptimizePath(EMPTY_PATH); + this.right.deoptimizePath(UNKNOWN_PATH); } } diff --git a/test/function/samples/assignment-deoptimization/assignee-is-deoptimized/_config.js b/test/function/samples/assignment-deoptimization/assignee-is-deoptimized/_config.js new file mode 100644 index 00000000000..25bb08a0f03 --- /dev/null +++ b/test/function/samples/assignment-deoptimization/assignee-is-deoptimized/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'makes sure the assignee is deoptimized' +}; diff --git a/test/function/samples/assignment-deoptimization/assignee-is-deoptimized/main.js b/test/function/samples/assignment-deoptimization/assignee-is-deoptimized/main.js new file mode 100644 index 00000000000..fc5921b2db5 --- /dev/null +++ b/test/function/samples/assignment-deoptimization/assignee-is-deoptimized/main.js @@ -0,0 +1,5 @@ +const flags = { updated: false }; +let toBeUpdated = {}; +toBeUpdated = flags; +toBeUpdated.updated = true; +if (!flags.updated) throw new Error('Update was not tracked'); diff --git a/test/function/samples/assignment-deoptimization/assignment-target-is-deoptimized/_config.js b/test/function/samples/assignment-deoptimization/assignment-target-is-deoptimized/_config.js new file mode 100644 index 00000000000..cd94f45ae26 --- /dev/null +++ b/test/function/samples/assignment-deoptimization/assignment-target-is-deoptimized/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'makes sure the assignment target is deoptimized' +}; diff --git a/test/function/samples/assignment-deoptimization/assignment-target-is-deoptimized/main.js b/test/function/samples/assignment-deoptimization/assignment-target-is-deoptimized/main.js new file mode 100644 index 00000000000..f7112f60773 --- /dev/null +++ b/test/function/samples/assignment-deoptimization/assignment-target-is-deoptimized/main.js @@ -0,0 +1,3 @@ +let updated = false; +updated = true; +if (!updated) throw new Error('Update was not tracked'); diff --git a/test/function/samples/assignment-deoptimization/nested-assignment/_config.js b/test/function/samples/assignment-deoptimization/nested-assignment/_config.js new file mode 100644 index 00000000000..7c3114ddadc --- /dev/null +++ b/test/function/samples/assignment-deoptimization/nested-assignment/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'tracks assigments nested in expressions that are included for other reasons' +}; diff --git a/test/function/samples/assignment-deoptimization/nested-assignment/main.js b/test/function/samples/assignment-deoptimization/nested-assignment/main.js new file mode 100644 index 00000000000..57e5d4fc85c --- /dev/null +++ b/test/function/samples/assignment-deoptimization/nested-assignment/main.js @@ -0,0 +1,3 @@ +let updated = false; +assert.ok(!updated) || (updated = true); +if (!updated) throw new Error('Update was not tracked'); diff --git a/test/function/samples/assignment-deoptimization/try-catch-inclusion/_config.js b/test/function/samples/assignment-deoptimization/try-catch-inclusion/_config.js new file mode 100644 index 00000000000..4a7b55c699a --- /dev/null +++ b/test/function/samples/assignment-deoptimization/try-catch-inclusion/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'tracks assigments included via try-catch-deoptimization' +}; diff --git a/test/function/samples/assignment-deoptimization/try-catch-inclusion/main.js b/test/function/samples/assignment-deoptimization/try-catch-inclusion/main.js new file mode 100644 index 00000000000..1a34c1d59b0 --- /dev/null +++ b/test/function/samples/assignment-deoptimization/try-catch-inclusion/main.js @@ -0,0 +1,6 @@ +let updated = false; +try { + updated = true; +} catch (err) {} + +if (!updated) throw new Error('Update was not tracked');