Add missing labels.pop() to allow re-using labels in a block

Issue #15
This commit is contained in:
Marijn Haverbeke 2012-11-22 10:11:00 +01:00
parent 5c44c13465
commit d36c70bbbf
3 changed files with 38 additions and 0 deletions

View File

@ -1233,6 +1233,7 @@
var kind = tokType.isLoop ? "loop" : tokType === _switch ? "switch" : null;
labels.push({name: maybeName, kind: kind});
node.body = parseStatement();
labels.pop();
node.label = expr;
return finishNode(node, "LabeledStatement");
} else {

View File

@ -902,6 +902,7 @@ Identifier node, we switch to interpreting it as a label.</p> </td>
<span class="kd">var</span> <span class="nx">kind</span> <span class="o">=</span> <span class="nx">tokType</span><span class="p">.</span><span class="nx">isLoop</span> <span class="o">?</span> <span class="s2">&quot;loop&quot;</span> <span class="o">:</span> <span class="nx">tokType</span> <span class="o">===</span> <span class="nx">_switch</span> <span class="o">?</span> <span class="s2">&quot;switch&quot;</span> <span class="o">:</span> <span class="kc">null</span><span class="p">;</span>
<span class="nx">labels</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span><span class="nx">name</span><span class="o">:</span> <span class="nx">maybeName</span><span class="p">,</span> <span class="nx">kind</span><span class="o">:</span> <span class="nx">kind</span><span class="p">});</span>
<span class="nx">node</span><span class="p">.</span><span class="nx">body</span> <span class="o">=</span> <span class="nx">parseStatement</span><span class="p">();</span>
<span class="nx">labels</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
<span class="nx">node</span><span class="p">.</span><span class="nx">label</span> <span class="o">=</span> <span class="nx">expr</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">finishNode</span><span class="p">(</span><span class="nx">node</span><span class="p">,</span> <span class="s2">&quot;LabeledStatement&quot;</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>

View File

@ -26029,6 +26029,42 @@ test("'a\\u0026b'", {
]
});
test("foo: 10; foo: 20;", {
type: "Program",
body: [
{
type: "LabeledStatement",
body: {
type: "ExpressionStatement",
expression: {
type: "Literal",
value: 10,
raw: "10"
}
},
label: {
type: "Identifier",
name: "foo"
}
},
{
type: "LabeledStatement",
body: {
type: "ExpressionStatement",
expression: {
type: "Literal",
value: 20,
raw: "20"
}
},
label: {
type: "Identifier",
name: "foo"
}
}
]
});
// Failure tests
testFail("{",