aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2018-04-05 04:12:04 +0800
committerGitHub <noreply@github.com>2018-04-05 04:12:04 +0800
commitb5bab254ce2122a43e9ca0fdc757aecda7191576 (patch)
treed88a5122bbce4c7e2dfa5411b2dae4c47a531721
parent81603ecd156f494a6b0c02655c5361152711300d (diff)
downloadtracifyjs-b5bab254ce2122a43e9ca0fdc757aecda7191576.tar.gz
tracifyjs-b5bab254ce2122a43e9ca0fdc757aecda7191576.zip
speed up `has_parens()` (take 2) (#3052)
fixes #3050
-rw-r--r--lib/output.js4
-rw-r--r--test/mocha/parentheses.js (renamed from test/mocha/new.js)23
2 files changed, 24 insertions, 3 deletions
diff --git a/lib/output.js b/lib/output.js
index cad6fd82..0f349046 100644
--- a/lib/output.js
+++ b/lib/output.js
@@ -197,6 +197,7 @@ function OutputStream(options) {
/* -----[ beautification/minification ]----- */
+ var has_parens = false;
var might_need_space = false;
var might_need_semicolon = false;
var might_add_newline = 0;
@@ -340,6 +341,7 @@ function OutputStream(options) {
}
OUTPUT += str;
+ has_parens = str[str.length - 1] == "(";
current_pos += str.length;
var a = str.split(/\r?\n/), n = a.length - 1;
current_line += n;
@@ -576,7 +578,7 @@ function OutputStream(options) {
indentation : function() { return indentation },
current_width : function() { return current_col - indentation },
should_break : function() { return options.width && this.current_width() >= options.width },
- has_parens : function() { return OUTPUT[OUTPUT.length - 1] == "(" },
+ has_parens : function() { return has_parens },
newline : newline,
print : print,
space : space,
diff --git a/test/mocha/new.js b/test/mocha/parentheses.js
index 8f653f7a..a3ef8604 100644
--- a/test/mocha/new.js
+++ b/test/mocha/parentheses.js
@@ -1,7 +1,7 @@
var assert = require("assert");
var uglify = require("../../");
-describe("New", function() {
+describe("parentheses", function() {
it("Should add trailing parentheses for new expressions with zero arguments in beautify mode", function() {
var tests = [
"new x(1);",
@@ -83,4 +83,23 @@ describe("New", function() {
);
}
});
-}); \ No newline at end of file
+
+ it("Should compress leading parenthesis with reasonable performance", function() {
+ this.timeout(30000);
+ var code = [
+ "({}?0:1)&&x();",
+ "(function(){}).name;",
+ ];
+ for (var i = 16; --i >= 0;) {
+ [].push.apply(code, code);
+ }
+ code = code.join("");
+ var result = uglify.minify(code, {
+ compress: false,
+ mangle: false,
+ });
+ if (result.error) throw result.error;
+ // Dismal performance for `assert.strictEqual()` in Node.js 6
+ assert.ok(result.code === code);
+ });
+});