Fix performance regression introduced in 6.8.2

This commit e6c11a0 (#19) made a big performance regression.
The reason was that parseConditional was always cloning the current state
even if no question mark (potential conditional or flow-optional
token) was at the current position.
Simply checking if questionmark matches the current token solves the problem.

Fixes #62
This commit is contained in:
Daniel Tschinder 2016-07-02 17:06:06 +02:00
parent 84b1bc52e1
commit 4e2072def8
No known key found for this signature in database
GPG Key ID: 46A883CAEC8A94BD
2 changed files with 17 additions and 11 deletions

View File

@ -732,18 +732,24 @@ export default function (instance) {
instance.extend("parseConditional", function (inner) { instance.extend("parseConditional", function (inner) {
return function (expr, noIn, startPos, startLoc, refNeedsArrowPos) { return function (expr, noIn, startPos, startLoc, refNeedsArrowPos) {
const state = this.state.clone(); // only do the expensive clone if there is a question mark
try { // and if we come from inside parens
return inner.call(this, expr, noIn, startPos, startLoc); if (refNeedsArrowPos && this.match(tt.question)) {
} catch (err) { const state = this.state.clone();
if (refNeedsArrowPos && err instanceof SyntaxError) { try {
this.state = state; return inner.call(this, expr, noIn, startPos, startLoc);
refNeedsArrowPos.start = this.state.start; } catch (err) {
return expr; if (err instanceof SyntaxError) {
} else { this.state = state;
throw err; refNeedsArrowPos.start = err.pos || this.state.start;
return expr;
} else {
throw err;
}
} }
} }
return inner.call(this, expr, noIn, startPos, startLoc);
}; };
}); });

View File

@ -1,3 +1,3 @@
{ {
"throws": "Unexpected token (1:12)" "throws": "Unexpected token (1:13)"
} }