Properly back up line state when re-reading a token on strict mode

Issue #38
This commit is contained in:
Marijn Haverbeke 2013-03-25 15:10:55 +01:00
parent a8a24f538b
commit 54e78b7035
3 changed files with 49 additions and 41 deletions

View File

@ -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();
} }

View File

@ -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">// &#39;U&#39;</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">// &#39;U&#39;</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">&quot;\t&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// &#39;t&#39; -&gt; &#39;\t&#39;</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">&quot;\t&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// &#39;t&#39; -&gt; &#39;\t&#39;</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">&quot;\b&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// &#39;b&#39; -&gt; &#39;\b&#39;</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">&quot;\b&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// &#39;b&#39; -&gt; &#39;\b&#39;</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">&quot;\v&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// &#39;v&#39; -&gt; &#39;\u000b&#39;</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">&quot;\u000b&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// &#39;v&#39; -&gt; &#39;\u000b&#39;</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">&quot;\f&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// &#39;f&#39; -&gt; &#39;\f&#39;</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">&quot;\f&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// &#39;f&#39; -&gt; &#39;\f&#39;</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">&quot;\0&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 0 -&gt; &#39;\0&#39;</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">&quot;\0&quot;</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="c1">// 0 -&gt; &#39;\0&#39;</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">// &#39;\r\n&#39;</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">// &#39;\r\n&#39;</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">&lt;</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">&quot;\n&quot;</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">&#182;</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">&#182;</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>

View File

@ -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
} }
} }
] ]