Skip to content

Commit

Permalink
Store line number and range right when creating the token object.
Browse files Browse the repository at this point in the history
In the modern JavaScript engines with the property-access optimization
via object structure cache ("hidden class"), modifying the object right
after its construction causes small performance penalty and thus should
be avoided.

In our case, since advance() mandates the need for line number and range
in the token object, we might as well prepare these properties during
token construction.

Firefox 9 running the full benchmarks suite shows 14% speed-up.
The performance change is not noticeable on Chrome and Safari.

http://code.google.com/p/esprima/issues/detail?id=136
  • Loading branch information
ariya committed Jan 16, 2012
1 parent 9171405 commit 4f9af77
Showing 1 changed file with 73 additions and 34 deletions.
107 changes: 73 additions & 34 deletions esprima.js
Expand Up @@ -309,13 +309,14 @@ parseStatement: true, parseSourceElement: true */
}

function scanIdentifier() {
var ch, id;
var ch, start, id;

ch = source[index];
if (!isIdentifierStart(ch)) {
return;
}

start = index;
id = nextChar();
while (index < length) {
ch = source[index];
Expand All @@ -330,14 +331,18 @@ parseStatement: true, parseSourceElement: true */
if (id.length === 1) {
return {
type: Token.Identifier,
value: id
value: id,
lineNumber: lineNumber,
range: [start, index]
};
}

if (isKeyword(id)) {
return {
type: Token.Keyword,
value: id
value: id,
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -346,7 +351,9 @@ parseStatement: true, parseSourceElement: true */
if (id === 'null') {
return {
type: Token.NullLiteral,
value: id
value: id,
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -355,20 +362,25 @@ parseStatement: true, parseSourceElement: true */
if (id === 'true' || id === 'false') {
return {
type: Token.BooleanLiteral,
value: id
value: id,
lineNumber: lineNumber,
range: [start, index]
};
}

return {
type: Token.Identifier,
value: id
value: id,
lineNumber: lineNumber,
range: [start, index]
};
}

// 7.7 Punctuators

function scanPunctuator() {
var ch1 = source[index],
var start = index,
ch1 = source[index],
ch2,
ch3,
ch4;
Expand All @@ -379,15 +391,19 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: ch1
value: ch1,
lineNumber: lineNumber,
range: [start, index]
};
}

if (ch1 === ',' || ch1 === '(' || ch1 === ')') {
nextChar();
return {
type: Token.Punctuator,
value: ch1
value: ch1,
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -398,7 +414,9 @@ parseStatement: true, parseSourceElement: true */
if (ch1 === '.' && !isDecimalDigit(ch2)) {
return {
type: Token.Punctuator,
value: nextChar()
value: nextChar(),
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -417,7 +435,9 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: '>>>='
value: '>>>=',
lineNumber: lineNumber,
range: [start, index]
};
}
}
Expand All @@ -430,7 +450,9 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: '==='
value: '===',
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -440,7 +462,9 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: '!=='
value: '!==',
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -450,7 +474,9 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: '>>>'
value: '>>>',
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -460,7 +486,9 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: '<<='
value: '<<=',
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -470,7 +498,9 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: '>>='
value: '>>=',
lineNumber: lineNumber,
range: [start, index]
};
}

Expand All @@ -483,7 +513,9 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: ch1 + ch2
value: ch1 + ch2,
lineNumber: lineNumber,
range: [start, index]
};
}
}
Expand All @@ -494,7 +526,9 @@ parseStatement: true, parseSourceElement: true */
nextChar();
return {
type: Token.Punctuator,
value: ch1 + ch2
value: ch1 + ch2,
lineNumber: lineNumber,
range: [start, index]
};
}
}
Expand All @@ -504,21 +538,24 @@ parseStatement: true, parseSourceElement: true */
if ('[]<>+-*%&|^!~?:=/'.indexOf(ch1) >= 0) {
return {
type: Token.Punctuator,
value: nextChar()
value: nextChar(),
lineNumber: lineNumber,
range: [start, index]
};
}
}

// 7.8.3 Numeric Literals

function scanNumericLiteral() {
var number, ch;
var number, start, ch;

ch = source[index];
if (!isDecimalDigit(ch) && (ch !== '.')) {
return;
}

start = index;
number = '';
if (ch !== '.') {
number = nextChar();
Expand All @@ -536,7 +573,9 @@ parseStatement: true, parseSourceElement: true */
}
return {
type: Token.NumericLiteral,
value: parseInt(number, 16)
value: parseInt(number, 16),
lineNumber: lineNumber,
range: [start, index]
};
}

Expand Down Expand Up @@ -583,20 +622,23 @@ parseStatement: true, parseSourceElement: true */

return {
type: Token.NumericLiteral,
value: parseFloat(number)
value: parseFloat(number),
lineNumber: lineNumber,
range: [start, index]
};
}

// 7.8.4 String Literals

// TODO Unicode
function scanStringLiteral() {
var str = '', quote, ch;
var str = '', quote, start, ch;

quote = source[index];
if (quote !== '\'' && quote !== '"') {
return;
}
start = index;
nextChar();

while (index < length) {
Expand All @@ -622,7 +664,9 @@ parseStatement: true, parseSourceElement: true */

return {
type: Token.StringLiteral,
value: str
value: str,
lineNumber: lineNumber,
range: [start, index]
};
}

Expand Down Expand Up @@ -702,7 +746,9 @@ parseStatement: true, parseSourceElement: true */

if (index >= length) {
return {
type: Token.EOF
type: Token.EOF,
lineNumber: lineNumber,
range: [index, index]
};
}

Expand Down Expand Up @@ -730,7 +776,7 @@ parseStatement: true, parseSourceElement: true */
}

function lex() {
var pos, token;
var token;

if (buffer) {
index = buffer.range[1];
Expand All @@ -743,12 +789,7 @@ parseStatement: true, parseSourceElement: true */
buffer = null;
skipComment();

pos = index;
token = advance();
token.range = [pos, index];
token.lineNumber = lineNumber;

return token;
return advance();
}

function lookahead() {
Expand Down Expand Up @@ -2546,8 +2587,6 @@ parseStatement: true, parseSourceElement: true */

pos = index;
token = advance();
token.range = [pos, index];
token.lineNumber = lineNumber;

if (token.type !== Token.EOF) {
value = source.slice(pos, index);
Expand Down

0 comments on commit 4f9af77

Please sign in to comment.