Properly back up line state when re-reading a token on strict mode
Issue #38
This commit is contained in:
parent
a8a24f538b
commit
54e78b7035
4
acorn.js
4
acorn.js
@ -945,6 +945,10 @@
|
|||||||
function setStrict(strct) {
|
function setStrict(strct) {
|
||||||
strict = strct;
|
strict = strct;
|
||||||
tokPos = lastEnd;
|
tokPos = lastEnd;
|
||||||
|
while (tokPos < tokLineStart) {
|
||||||
|
tokLineStart = input.lastIndexOf("\n", tokLineStart - 2) + 1;
|
||||||
|
--tokCurLine;
|
||||||
|
}
|
||||||
skipSpace();
|
skipSpace();
|
||||||
readToken();
|
readToken();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -590,7 +590,7 @@ will return <code>null</code> unless the integer has exactly <code>len</code> di
|
|||||||
<span class="k">case</span> <span class="mi">85</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span><span class="p">(</span><span class="nx">readHexChar</span><span class="p">(</span><span class="mi">8</span><span class="p">));</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 'U'</span>
|
<span class="k">case</span> <span class="mi">85</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span><span class="p">(</span><span class="nx">readHexChar</span><span class="p">(</span><span class="mi">8</span><span class="p">));</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 'U'</span>
|
||||||
<span class="k">case</span> <span class="mi">116</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\t"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 't' -> '\t'</span>
|
<span class="k">case</span> <span class="mi">116</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\t"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 't' -> '\t'</span>
|
||||||
<span class="k">case</span> <span class="mi">98</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\b"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 'b' -> '\b'</span>
|
<span class="k">case</span> <span class="mi">98</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\b"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 'b' -> '\b'</span>
|
||||||
<span class="k">case</span> <span class="mi">118</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\v"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 'v' -> '\u000b'</span>
|
<span class="k">case</span> <span class="mi">118</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\u000b"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 'v' -> '\u000b'</span>
|
||||||
<span class="k">case</span> <span class="mi">102</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\f"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 'f' -> '\f'</span>
|
<span class="k">case</span> <span class="mi">102</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\f"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 'f' -> '\f'</span>
|
||||||
<span class="k">case</span> <span class="mi">48</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\0"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 0 -> '\0'</span>
|
<span class="k">case</span> <span class="mi">48</span><span class="o">:</span> <span class="nx">out</span> <span class="o">+=</span> <span class="s2">"\0"</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 0 -> '\0'</span>
|
||||||
<span class="k">case</span> <span class="mi">13</span><span class="o">:</span> <span class="k">if</span> <span class="p">(</span><span class="nx">input</span><span class="p">.</span><span class="nx">charCodeAt</span><span class="p">(</span><span class="nx">tokPos</span><span class="p">)</span> <span class="o">===</span> <span class="mi">10</span><span class="p">)</span> <span class="o">++</span><span class="nx">tokPos</span><span class="p">;</span> <span class="c1">// '\r\n'</span>
|
<span class="k">case</span> <span class="mi">13</span><span class="o">:</span> <span class="k">if</span> <span class="p">(</span><span class="nx">input</span><span class="p">.</span><span class="nx">charCodeAt</span><span class="p">(</span><span class="nx">tokPos</span><span class="p">)</span> <span class="o">===</span> <span class="mi">10</span><span class="p">)</span> <span class="o">++</span><span class="nx">tokPos</span><span class="p">;</span> <span class="c1">// '\r\n'</span>
|
||||||
@ -678,6 +678,10 @@ precedence levels that JavaScript defines.</p> </td> <td
|
|||||||
tests ("use strict"; 010; -- should fail).</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">setStrict</span><span class="p">(</span><span class="nx">strct</span><span class="p">)</span> <span class="p">{</span>
|
tests ("use strict"; 010; -- should fail).</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">setStrict</span><span class="p">(</span><span class="nx">strct</span><span class="p">)</span> <span class="p">{</span>
|
||||||
<span class="nx">strict</span> <span class="o">=</span> <span class="nx">strct</span><span class="p">;</span>
|
<span class="nx">strict</span> <span class="o">=</span> <span class="nx">strct</span><span class="p">;</span>
|
||||||
<span class="nx">tokPos</span> <span class="o">=</span> <span class="nx">lastEnd</span><span class="p">;</span>
|
<span class="nx">tokPos</span> <span class="o">=</span> <span class="nx">lastEnd</span><span class="p">;</span>
|
||||||
|
<span class="k">while</span> <span class="p">(</span><span class="nx">tokPos</span> <span class="o"><</span> <span class="nx">tokLineStart</span><span class="p">)</span> <span class="p">{</span>
|
||||||
|
<span class="nx">tokLineStart</span> <span class="o">=</span> <span class="nx">input</span><span class="p">.</span><span class="nx">lastIndexOf</span><span class="p">(</span><span class="s2">"\n"</span><span class="p">,</span> <span class="nx">tokLineStart</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
|
||||||
|
<span class="o">--</span><span class="nx">tokCurLine</span><span class="p">;</span>
|
||||||
|
<span class="p">}</span>
|
||||||
<span class="nx">skipSpace</span><span class="p">();</span>
|
<span class="nx">skipSpace</span><span class="p">();</span>
|
||||||
<span class="nx">readToken</span><span class="p">();</span>
|
<span class="nx">readToken</span><span class="p">();</span>
|
||||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-79"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-79">¶</a> </div> <p>Start an AST node, attaching a start offset.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">node_t</span><span class="p">()</span> <span class="p">{</span>
|
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-79"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-79">¶</a> </div> <p>Start an AST node, attaching a start offset.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">node_t</span><span class="p">()</span> <span class="p">{</span>
|
||||||
|
|||||||
@ -25798,33 +25798,33 @@ test("foo: if (true) break foo;", {
|
|||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
test("(function () { 'use strict'; '\0'; }())", {
|
test("(function () {\n 'use strict';\n '\0';\n}())", {
|
||||||
type: "Program",
|
type: "Program",
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 38,
|
end: 40,
|
||||||
loc: {
|
loc: {
|
||||||
start: {
|
start: {
|
||||||
line: 1,
|
line: 1,
|
||||||
column: 0
|
column: 0
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 4,
|
||||||
column: 38
|
column: 4
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
body: [
|
body: [
|
||||||
{
|
{
|
||||||
type: "ExpressionStatement",
|
type: "ExpressionStatement",
|
||||||
start: 0,
|
start: 0,
|
||||||
end: 38,
|
end: 40,
|
||||||
loc: {
|
loc: {
|
||||||
start: {
|
start: {
|
||||||
line: 1,
|
line: 1,
|
||||||
column: 0
|
column: 0
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 4,
|
||||||
column: 38
|
column: 4
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
expression: {
|
expression: {
|
||||||
@ -25836,22 +25836,22 @@ test("(function () { 'use strict'; '\0'; }())", {
|
|||||||
column: 0
|
column: 0
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 4,
|
||||||
column: 38
|
column: 4
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
callee: {
|
callee: {
|
||||||
type: "FunctionExpression",
|
type: "FunctionExpression",
|
||||||
start: 1,
|
start: 1,
|
||||||
end: 35,
|
end: 37,
|
||||||
loc: {
|
loc: {
|
||||||
start: {
|
start: {
|
||||||
line: 1,
|
line: 1,
|
||||||
column: 1
|
column: 1
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 4,
|
||||||
column: 35
|
column: 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
id: null,
|
id: null,
|
||||||
@ -25859,44 +25859,44 @@ test("(function () { 'use strict'; '\0'; }())", {
|
|||||||
body: {
|
body: {
|
||||||
type: "BlockStatement",
|
type: "BlockStatement",
|
||||||
start: 13,
|
start: 13,
|
||||||
end: 35,
|
end: 37,
|
||||||
loc: {
|
loc: {
|
||||||
start: {
|
start: {
|
||||||
line: 1,
|
line: 1,
|
||||||
column: 13
|
column: 13
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 4,
|
||||||
column: 35
|
column: 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
body: [
|
body: [
|
||||||
{
|
{
|
||||||
type: "ExpressionStatement",
|
type: "ExpressionStatement",
|
||||||
start: 15,
|
start: 16,
|
||||||
end: 28,
|
end: 29,
|
||||||
loc: {
|
loc: {
|
||||||
start: {
|
start: {
|
||||||
line: 1,
|
line: 2,
|
||||||
column: 15
|
column: 1
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 2,
|
||||||
column: 28
|
column: 14
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
expression: {
|
expression: {
|
||||||
type: "Literal",
|
type: "Literal",
|
||||||
start: 15,
|
start: 16,
|
||||||
end: 27,
|
end: 28,
|
||||||
loc: {
|
loc: {
|
||||||
start: {
|
start: {
|
||||||
line: 1,
|
line: 2,
|
||||||
column: 15
|
column: 1
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 2,
|
||||||
column: 27
|
column: 13
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
value: "use strict"
|
value: "use strict"
|
||||||
@ -25904,30 +25904,30 @@ test("(function () { 'use strict'; '\0'; }())", {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "ExpressionStatement",
|
type: "ExpressionStatement",
|
||||||
start: 29,
|
start: 31,
|
||||||
end: 33,
|
end: 35,
|
||||||
loc: {
|
loc: {
|
||||||
start: {
|
start: {
|
||||||
line: 1,
|
line: 3,
|
||||||
column: 29
|
column: 1
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 3,
|
||||||
column: 33
|
column: 5
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
expression: {
|
expression: {
|
||||||
type: "Literal",
|
type: "Literal",
|
||||||
start: 29,
|
start: 31,
|
||||||
end: 32,
|
end: 34,
|
||||||
loc: {
|
loc: {
|
||||||
start: {
|
start: {
|
||||||
line: 1,
|
line: 3,
|
||||||
column: 29
|
column: 1
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
line: 1,
|
line: 3,
|
||||||
column: 32
|
column: 4
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
value: "\u0000"
|
value: "\u0000"
|
||||||
@ -25937,7 +25937,7 @@ test("(function () { 'use strict'; '\0'; }())", {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
arguments: [],
|
arguments: [],
|
||||||
end: 38
|
end: 40
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user