speed up has_parens() (take 2) (#3052)

fixes #3050
This commit is contained in:
Alex Lam S.L
2018-04-05 04:12:04 +08:00
committed by GitHub
parent 81603ecd15
commit b5bab254ce
2 changed files with 24 additions and 3 deletions

View File

@@ -197,6 +197,7 @@ function OutputStream(options) {
/* -----[ beautification/minification ]----- */ /* -----[ beautification/minification ]----- */
var has_parens = false;
var might_need_space = false; var might_need_space = false;
var might_need_semicolon = false; var might_need_semicolon = false;
var might_add_newline = 0; var might_add_newline = 0;
@@ -340,6 +341,7 @@ function OutputStream(options) {
} }
OUTPUT += str; OUTPUT += str;
has_parens = str[str.length - 1] == "(";
current_pos += str.length; current_pos += str.length;
var a = str.split(/\r?\n/), n = a.length - 1; var a = str.split(/\r?\n/), n = a.length - 1;
current_line += n; current_line += n;
@@ -576,7 +578,7 @@ function OutputStream(options) {
indentation : function() { return indentation }, indentation : function() { return indentation },
current_width : function() { return current_col - indentation }, current_width : function() { return current_col - indentation },
should_break : function() { return options.width && this.current_width() >= options.width }, 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, newline : newline,
print : print, print : print,
space : space, space : space,

View File

@@ -1,7 +1,7 @@
var assert = require("assert"); var assert = require("assert");
var uglify = require("../../"); var uglify = require("../../");
describe("New", function() { describe("parentheses", function() {
it("Should add trailing parentheses for new expressions with zero arguments in beautify mode", function() { it("Should add trailing parentheses for new expressions with zero arguments in beautify mode", function() {
var tests = [ var tests = [
"new x(1);", "new x(1);",
@@ -83,4 +83,23 @@ describe("New", function() {
); );
} }
}); });
});
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);
});
});