From 0f13097f596e06e6ac005cfb0d405c410179efca Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 4 Jun 2015 22:08:38 +0100 Subject: [PATCH] add basic naive constant folding of assignment expressions --- .../transformation/transformers/index.js | 4 ++- .../minification/constant-folding.js | 23 +++++++++++++++- src/babel/traversal/path/evaluation.js | 5 ++++ src/babel/traversal/scope/binding.js | 26 ++++++++++++++++--- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/babel/transformation/transformers/index.js b/src/babel/transformation/transformers/index.js index 2f551ea014..502443f5d2 100644 --- a/src/babel/transformation/transformers/index.js +++ b/src/babel/transformation/transformers/index.js @@ -1,4 +1,7 @@ export default { + //- builtin-prepass + "minification.constantFolding": require("./minification/constant-folding"), + //- builtin-setup strict: require("./other/strict"), _explode: require("./internal/explode"), @@ -7,7 +10,6 @@ export default { "minification.removeDebugger": require("./minification/remove-debugger"), "minification.removeConsole": require("./minification/remove-console"), "utility.inlineEnvironmentVariables": require("./utility/inline-environment-variables"), - "minification.constantFolding": require("./minification/constant-folding"), "minification.deadCodeElimination": require("./minification/dead-code-elimination"), _modules: require("./internal/modules"), "spec.functionName": require("./spec/function-name"), diff --git a/src/babel/transformation/transformers/minification/constant-folding.js b/src/babel/transformation/transformers/minification/constant-folding.js index a208767889..8866b9e732 100644 --- a/src/babel/transformation/transformers/minification/constant-folding.js +++ b/src/babel/transformation/transformers/minification/constant-folding.js @@ -2,7 +2,28 @@ import * as t from "../../../types"; export var metadata = { optional: true, - group: "builtin-setup" + group: "builtin-prepass" +}; + +export function AssignmentExpression() { + var left = this.get("left"); + if (!left.isIdentifier()) return; + + var binding = this.scope.getBinding(left.node.name); + if (!binding) return; + + var right = this.get("right"); + var evaluated = right.evaluate(); + //if (evaluated.confident) binding.setValue(evaluated.value); +} + +export var Scopable = { + exit() { + for (var name in this.scope.bindings) { + var binding = this.scope.bindings[name]; + binding.clearValue(); + } + } }; export var Expression = { diff --git a/src/babel/traversal/path/evaluation.js b/src/babel/traversal/path/evaluation.js index 3c7d8f9215..9ba21d35cd 100644 --- a/src/babel/traversal/path/evaluation.js +++ b/src/babel/traversal/path/evaluation.js @@ -100,6 +100,11 @@ export function evaluate(): { confident: boolean; value: any } { } } + if (path.isReferencedIdentifier()) { + var binding = path.scope.getBinding(node.name); + if (binding && binding.hasValue) return binding.value; + } + if ((path.isIdentifier() || path.isMemberExpression()) && path.isReferenced()) { path = path.resolve(); if (path) { diff --git a/src/babel/traversal/scope/binding.js b/src/babel/traversal/scope/binding.js index b7bc36dafb..9f202a0612 100644 --- a/src/babel/traversal/scope/binding.js +++ b/src/babel/traversal/scope/binding.js @@ -7,9 +7,29 @@ export default class Binding { this.references = 0; this.referenced = false; - this.scope = scope; - this.path = path; - this.kind = kind; + this.scope = scope; + this.path = path; + this.kind = kind; + + this.clearValue(); + } + + /** + * Description + */ + + setValue(value) { + this.hasValue = true; + this.value = value; + } + + /** + * Description + */ + + clearValue() { + this.hasValue = false; + this.value = null; } /**