<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[170034] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/170034">170034</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2014-06-16 16:19:29 -0700 (Mon, 16 Jun 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Parser statementDepth accounting needs to account for when a function body excludes its braces.
&lt;https://webkit.org/b/133832&gt;

Reviewed by Oliver Hunt.


Source/JavaScriptCore: 
In some cases (e.g. when a Function object is instantiated from a string), the
function body source may not include its braces.  The parser needs to account
for this when calculating its statementDepth.

* bytecode/UnlinkedCodeBlock.cpp:
(JSC::generateFunctionCodeBlock):
(JSC::UnlinkedFunctionExecutable::codeBlockFor):
* bytecode/UnlinkedCodeBlock.h:
* parser/Parser.cpp:
(JSC::Parser&lt;LexerType&gt;::parseStatement):
- Also fixed the error message for declaring nested functions in strict mode
  to be more accurate.
* parser/Parser.h:
(JSC::Parser&lt;LexerType&gt;::parse):
(JSC::parse):
* runtime/Executable.cpp:
(JSC::ScriptExecutable::newCodeBlockFor):

LayoutTests: 
* js/parser-syntax-check-expected.txt:
* js/script-tests/parser-syntax-check.js:
  - Added cases for declaring functions in strict mode.
  - Added caught error to the test result logging if it's not a SyntaxError.
    This helps catch the issue in this bug which was erroneously throwing
    RangeErrors.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsjsparsersyntaxcheckexpectedtxt">trunk/LayoutTests/js/parser-syntax-check-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsscripttestsparsersyntaxcheckjs">trunk/LayoutTests/js/script-tests/parser-syntax-check.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh">trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParsercpp">trunk/Source/JavaScriptCore/parser/Parser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParserh">trunk/Source/JavaScriptCore/parser/Parser.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeExecutablecpp">trunk/Source/JavaScriptCore/runtime/Executable.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/LayoutTests/ChangeLog        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-06-12  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Parser statementDepth accounting needs to account for when a function body excludes its braces.
+        &lt;https://webkit.org/b/133832&gt;
+
+        Reviewed by Oliver Hunt.
+
+        * js/parser-syntax-check-expected.txt:
+        * js/script-tests/parser-syntax-check.js:
+          - Added cases for declaring functions in strict mode.
+          - Added caught error to the test result logging if it's not a SyntaxError.
+            This helps catch the issue in this bug which was erroneously throwing
+            RangeErrors.
+
</ins><span class="cx"> 2014-06-16  Radu Stavila  &lt;stavila@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r168046): Incorrect layout for multicol spanners when moving from one thread to another
</span></span></pre></div>
<a id="trunkLayoutTestsjsparsersyntaxcheckexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/parser-syntax-check-expected.txt (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/parser-syntax-check-expected.txt        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/LayoutTests/js/parser-syntax-check-expected.txt        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -18,25 +18,25 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { () }&quot;
</span><span class="cx"> PASS Invalid: &quot;a.'l'&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a.'l' }&quot;
</span><del>-PASS Valid:   &quot;a: +~!new a&quot;
</del><ins>+PASS Valid:   &quot;a: +~!new a&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a: +~!new a }&quot;
</span><span class="cx"> PASS Invalid: &quot;new -a&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { new -a }&quot;
</span><del>-PASS Valid:   &quot;new (-1)&quot;
</del><ins>+PASS Valid:   &quot;new (-1)&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { new (-1) }&quot;
</span><del>-PASS Valid:   &quot;a: b: c: new f(x++)++&quot;
</del><ins>+PASS Valid:   &quot;a: b: c: new f(x++)++&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a: b: c: new f(x++)++ }&quot;
</span><del>-PASS Valid:   &quot;(a)++&quot;
</del><ins>+PASS Valid:   &quot;(a)++&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { (a)++ }&quot;
</span><del>-PASS Valid:   &quot;(1--).x&quot;
</del><ins>+PASS Valid:   &quot;(1--).x&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { (1--).x }&quot;
</span><span class="cx"> PASS Invalid: &quot;a-- ++&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a-- ++ }&quot;
</span><span class="cx"> PASS Invalid: &quot;(a:) --b&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { (a:) --b }&quot;
</span><del>-PASS Valid:   &quot;++ -- ++ a&quot;
</del><ins>+PASS Valid:   &quot;++ -- ++ a&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ++ -- ++ a }&quot;
</span><del>-PASS Valid:   &quot;++ new new a ++&quot;
</del><ins>+PASS Valid:   &quot;++ new new a ++&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ++ new new a ++ }&quot;
</span><span class="cx"> PASS Valid:   &quot;delete void 0&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { delete void 0 }&quot;
</span><span class="lines">@@ -44,11 +44,11 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { delete the void }&quot;
</span><span class="cx"> PASS Invalid: &quot;(a++&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { (a++ }&quot;
</span><del>-PASS Valid:   &quot;++a--&quot;
</del><ins>+PASS Valid:   &quot;++a--&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ++a-- }&quot;
</span><del>-PASS Valid:   &quot;++((a))--&quot;
</del><ins>+PASS Valid:   &quot;++((a))--&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ++((a))-- }&quot;
</span><del>-PASS Valid:   &quot;(a.x++)++&quot;
</del><ins>+PASS Valid:   &quot;(a.x++)++&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { (a.x++)++ }&quot;
</span><span class="cx"> PASS Invalid: &quot;1: null&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { 1: null }&quot;
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx"> PASS Valid:   &quot;1 .l&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { 1 .l }&quot;
</span><span class="cx"> Binary and conditional operators
</span><del>-PASS Valid:   &quot;a + + typeof this&quot;
</del><ins>+PASS Valid:   &quot;a + + typeof this&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a + + typeof this }&quot;
</span><span class="cx"> PASS Invalid: &quot;a + * b&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a + * b }&quot;
</span><span class="lines">@@ -79,13 +79,13 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { %a }&quot;
</span><span class="cx"> PASS Invalid: &quot;a-&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a- }&quot;
</span><del>-PASS Valid:   &quot;a = b ? b = c : d = e&quot;
</del><ins>+PASS Valid:   &quot;a = b ? b = c : d = e&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a = b ? b = c : d = e }&quot;
</span><del>-PASS Valid:   &quot;s: a[1].l ? b.l['s'] ? c++ : d : true&quot;
</del><ins>+PASS Valid:   &quot;s: a[1].l ? b.l['s'] ? c++ : d : true&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { s: a[1].l ? b.l['s'] ? c++ : d : true }&quot;
</span><del>-PASS Valid:   &quot;a ? b + 1 ? c + 3 * d.l : d[5][6] : e&quot;
</del><ins>+PASS Valid:   &quot;a ? b + 1 ? c + 3 * d.l : d[5][6] : e&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a ? b + 1 ? c + 3 * d.l : d[5][6] : e }&quot;
</span><del>-PASS Valid:   &quot;a in b instanceof delete -c&quot;
</del><ins>+PASS Valid:   &quot;a in b instanceof delete -c&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a in b instanceof delete -c }&quot;
</span><span class="cx"> PASS Invalid: &quot;a in instanceof b.l&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a in instanceof b.l }&quot;
</span><span class="lines">@@ -93,26 +93,26 @@
</span><span class="cx"> PASS Valid:   &quot;function f() { - - true % 5 }&quot;
</span><span class="cx"> PASS Invalid: &quot;- false = 3&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { - false = 3 }&quot;
</span><del>-PASS Valid:   &quot;a: b: c: (1 + null) = 3&quot;
</del><ins>+PASS Valid:   &quot;a: b: c: (1 + null) = 3&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a: b: c: (1 + null) = 3 }&quot;
</span><del>-PASS Valid:   &quot;a[2] = b.l += c /= 4 * 7 ^ !6&quot;
</del><ins>+PASS Valid:   &quot;a[2] = b.l += c /= 4 * 7 ^ !6&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a[2] = b.l += c /= 4 * 7 ^ !6 }&quot;
</span><span class="cx"> PASS Invalid: &quot;a + typeof b += c in d&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a + typeof b += c in d }&quot;
</span><span class="cx"> PASS Invalid: &quot;typeof a &amp;= typeof b&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { typeof a &amp;= typeof b }&quot;
</span><del>-PASS Valid:   &quot;a: ((typeof (a))) &gt;&gt;&gt;= a || b.l &amp;&amp; c&quot;
</del><ins>+PASS Valid:   &quot;a: ((typeof (a))) &gt;&gt;&gt;= a || b.l &amp;&amp; c&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a: ((typeof (a))) &gt;&gt;&gt;= a || b.l &amp;&amp; c }&quot;
</span><del>-PASS Valid:   &quot;a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b &lt;&lt;= f : g&quot;
</del><ins>+PASS Valid:   &quot;a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b &lt;&lt;= f : g&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b &lt;&lt;= f : g }&quot;
</span><del>-PASS Valid:   &quot;-void+x['y'].l == x.l != 5 - f[7]&quot;
</del><ins>+PASS Valid:   &quot;-void+x['y'].l == x.l != 5 - f[7]&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { -void+x['y'].l == x.l != 5 - f[7] }&quot;
</span><span class="cx"> Function calls (and new with arguments)
</span><del>-PASS Valid:   &quot;a()()()&quot;
</del><ins>+PASS Valid:   &quot;a()()()&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a()()() }&quot;
</span><del>-PASS Valid:   &quot;s: l: a[2](4 == 6, 5 = 6)(f[4], 6)&quot;
</del><ins>+PASS Valid:   &quot;s: l: a[2](4 == 6, 5 = 6)(f[4], 6)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { s: l: a[2](4 == 6, 5 = 6)(f[4], 6) }&quot;
</span><del>-PASS Valid:   &quot;s: eval(a.apply(), b.call(c[5] - f[7]))&quot;
</del><ins>+PASS Valid:   &quot;s: eval(a.apply(), b.call(c[5] - f[7]))&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { s: eval(a.apply(), b.call(c[5] - f[7])) }&quot;
</span><span class="cx"> PASS Invalid: &quot;a(&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a( }&quot;
</span><span class="lines">@@ -124,25 +124,25 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { a(5,) }&quot;
</span><span class="cx"> PASS Invalid: &quot;a(5,6&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a(5,6 }&quot;
</span><del>-PASS Valid:   &quot;a(b[7], c &lt;d&gt; e.l, new a() &gt; b)&quot;
</del><ins>+PASS Valid:   &quot;a(b[7], c &lt;d&gt; e.l, new a() &gt; b)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { a(b[7], c &lt;d&gt; e.l, new a() &gt; b) }&quot;
</span><span class="cx"> PASS Invalid: &quot;a(b[5)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a(b[5) }&quot;
</span><span class="cx"> PASS Invalid: &quot;a(b.)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a(b.) }&quot;
</span><del>-PASS Valid:   &quot;~new new a(1)(i++)(c[l])&quot;
</del><ins>+PASS Valid:   &quot;~new new a(1)(i++)(c[l])&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ~new new a(1)(i++)(c[l]) }&quot;
</span><span class="cx"> PASS Invalid: &quot;a(*a)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a(*a) }&quot;
</span><del>-PASS Valid:   &quot;((((a))((b)()).l))()&quot;
</del><ins>+PASS Valid:   &quot;((((a))((b)()).l))()&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ((((a))((b)()).l))() }&quot;
</span><del>-PASS Valid:   &quot;(a)[b + (c) / (d())].l--&quot;
</del><ins>+PASS Valid:   &quot;(a)[b + (c) / (d())].l--&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { (a)[b + (c) / (d())].l-- }&quot;
</span><del>-PASS Valid:   &quot;new (5)&quot;
</del><ins>+PASS Valid:   &quot;new (5)&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { new (5) }&quot;
</span><span class="cx"> PASS Invalid: &quot;new a(5&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { new a(5 }&quot;
</span><del>-PASS Valid:   &quot;new (f + 5)(6, (g)() - 'l'() - true(false))&quot;
</del><ins>+PASS Valid:   &quot;new (f + 5)(6, (g)() - 'l'() - true(false))&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { new (f + 5)(6, (g)() - 'l'() - true(false)) }&quot;
</span><span class="cx"> PASS Invalid: &quot;a(.length)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { a(.length) }&quot;
</span><span class="lines">@@ -169,7 +169,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { (function a{}) }&quot;
</span><span class="cx"> PASS Invalid: &quot;(function this(){})&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { (function this(){}) }&quot;
</span><del>-PASS Valid:   &quot;(delete new function f(){} + function(a,b){}(5)(6))&quot;
</del><ins>+PASS Valid:   &quot;(delete new function f(){} + function(a,b){}(5)(6))&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { (delete new function f(){} + function(a,b){}(5)(6)) }&quot;
</span><span class="cx"> PASS Valid:   &quot;6 - function (m) { function g() {} }&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { 6 - function (m) { function g() {} } }&quot;
</span><span class="lines">@@ -178,7 +178,7 @@
</span><span class="cx"> PASS Invalid: &quot;function l++(){}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { function l++(){} }&quot;
</span><span class="cx"> Array and object literal, comma operator
</span><del>-PASS Valid:   &quot;[] in [5,6] * [,5,] / [,,5,,] || [a,] &amp;&amp; new [,b] % [,,]&quot;
</del><ins>+PASS Valid:   &quot;[] in [5,6] * [,5,] / [,,5,,] || [a,] &amp;&amp; new [,b] % [,,]&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { [] in [5,6] * [,5,] / [,,5,,] || [a,] &amp;&amp; new [,b] % [,,] }&quot;
</span><span class="cx"> PASS Invalid: &quot;[5,&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { [5, }&quot;
</span><span class="lines">@@ -186,7 +186,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { [, }&quot;
</span><span class="cx"> PASS Invalid: &quot;(a,)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { (a,) }&quot;
</span><del>-PASS Valid:   &quot;1 + {get get(){}, set set(a){}, get1:4, set1:get-set, }&quot;
</del><ins>+PASS Valid:   &quot;1 + {get get(){}, set set(a){}, get1:4, set1:get-set, }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { 1 + {get get(){}, set set(a){}, get1:4, set1:get-set, } }&quot;
</span><span class="cx"> PASS Invalid: &quot;1 + {a&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { 1 + {a }&quot;
</span><span class="lines">@@ -196,7 +196,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { 1 + {get l( }&quot;
</span><span class="cx"> PASS Invalid: &quot;,a&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { ,a }&quot;
</span><del>-PASS Valid:   &quot;(4,(5,a(3,4))),f[4,a-6]&quot;
</del><ins>+PASS Valid:   &quot;(4,(5,a(3,4))),f[4,a-6]&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { (4,(5,a(3,4))),f[4,a-6] }&quot;
</span><span class="cx"> PASS Invalid: &quot;(,f)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { (,f) }&quot;
</span><span class="lines">@@ -215,11 +215,11 @@
</span><span class="cx"> PASS Valid:   &quot;function f() { a: { ; } }&quot;
</span><span class="cx"> PASS Invalid: &quot;{ a: }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { { a: } }&quot;
</span><del>-PASS Valid:   &quot;{} f; { 6 + f() }&quot;
</del><ins>+PASS Valid:   &quot;{} f; { 6 + f() }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { {} f; { 6 + f() } }&quot;
</span><del>-PASS Valid:   &quot;{ a[5],6; {} ++b-new (-5)() } c().l++&quot;
</del><ins>+PASS Valid:   &quot;{ a[5],6; {} ++b-new (-5)() } c().l++&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { { a[5],6; {} ++b-new (-5)() } c().l++ }&quot;
</span><del>-PASS Valid:   &quot;{ l1: l2: l3: { this } a = 32 ; { i++ ; { { { } } ++i } } }&quot;
</del><ins>+PASS Valid:   &quot;{ l1: l2: l3: { this } a = 32 ; { i++ ; { { { } } ++i } } }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { { l1: l2: l3: { this } a = 32 ; { i++ ; { { { } } ++i } } } }&quot;
</span><span class="cx"> PASS Valid:   &quot;if (a) ;&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { if (a) ; }&quot;
</span><span class="lines">@@ -235,25 +235,25 @@
</span><span class="cx"> PASS Valid:   &quot;function f() { x: s: if (a) ; else b }&quot;
</span><span class="cx"> PASS Invalid: &quot;else {}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { else {} }&quot;
</span><del>-PASS Valid:   &quot;if (a) if (b) y; else {} else ;&quot;
</del><ins>+PASS Valid:   &quot;if (a) if (b) y; else {} else ;&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { if (a) if (b) y; else {} else ; }&quot;
</span><span class="cx"> PASS Invalid: &quot;if (a) {} else x; else&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { if (a) {} else x; else }&quot;
</span><span class="cx"> PASS Invalid: &quot;if (a) { else }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { if (a) { else } }&quot;
</span><del>-PASS Valid:   &quot;if (a.l + new b()) 4 + 5 - f()&quot;
</del><ins>+PASS Valid:   &quot;if (a.l + new b()) 4 + 5 - f()&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { if (a.l + new b()) 4 + 5 - f() }&quot;
</span><del>-PASS Valid:   &quot;if (a) with (x) ; else with (y) ;&quot;
</del><ins>+PASS Valid:   &quot;if (a) with (x) ; else with (y) ;&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { if (a) with (x) ; else with (y) ; }&quot;
</span><span class="cx"> PASS Invalid: &quot;with a.b { }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { with a.b { } }&quot;
</span><del>-PASS Valid:   &quot;while (a() - new b) ;&quot;
</del><ins>+PASS Valid:   &quot;while (a() - new b) ;&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { while (a() - new b) ; }&quot;
</span><span class="cx"> PASS Invalid: &quot;while a {}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { while a {} }&quot;
</span><del>-PASS Valid:   &quot;do ; while(0) i++&quot;
</del><ins>+PASS Valid:   &quot;do ; while(0) i++&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { do ; while(0) i++ }&quot;
</span><del>-PASS Valid:   &quot;do if (a) x; else y; while(z)&quot;
</del><ins>+PASS Valid:   &quot;do if (a) x; else y; while(z)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { do if (a) x; else y; while(z) }&quot;
</span><span class="cx"> PASS Invalid: &quot;do g; while 4&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { do g; while 4 }&quot;
</span><span class="lines">@@ -263,7 +263,7 @@
</span><span class="cx"> PASS Valid:   &quot;function f() { { { do do do ; while(0) while(0) while(0) } } }&quot;
</span><span class="cx"> PASS Valid:   &quot;do while (0) if (a) {} else y; while(0)&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { do while (0) if (a) {} else y; while(0) }&quot;
</span><del>-PASS Valid:   &quot;if (a) while (b) if (c) with(d) {} else e; else f&quot;
</del><ins>+PASS Valid:   &quot;if (a) while (b) if (c) with(d) {} else e; else f&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { if (a) while (b) if (c) with(d) {} else e; else f }&quot;
</span><span class="cx"> PASS Invalid: &quot;break ; break your_limits ; continue ; continue living ; debugger&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { break ; break your_limits ; continue ; continue living ; debugger }&quot;
</span><span class="lines">@@ -277,7 +277,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { continue (my_friend) }&quot;
</span><span class="cx"> PASS Valid:   &quot;while (1) break&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { while (1) break }&quot;
</span><del>-PASS Valid:   &quot;do if (a) with (b) continue; else debugger; while (false)&quot;
</del><ins>+PASS Valid:   &quot;do if (a) with (b) continue; else debugger; while (false)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { do if (a) with (b) continue; else debugger; while (false) }&quot;
</span><span class="cx"> PASS Invalid: &quot;do if (a) while (false) else debugger&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { do if (a) while (false) else debugger }&quot;
</span><span class="lines">@@ -285,7 +285,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { while if (a) ; }&quot;
</span><span class="cx"> PASS Valid:   &quot;if (a) function f() {} else function g() {}&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { if (a) function f() {} else function g() {} }&quot;
</span><del>-PASS Valid:   &quot;if (a()) while(0) function f() {} else function g() {}&quot;
</del><ins>+PASS Valid:   &quot;if (a()) while(0) function f() {} else function g() {}&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { if (a()) while(0) function f() {} else function g() {} }&quot;
</span><span class="cx"> PASS Invalid: &quot;if (a()) function f() { else function g() }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { if (a()) function f() { else function g() } }&quot;
</span><span class="lines">@@ -293,9 +293,9 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { if (a) if (b) ; else function f {} }&quot;
</span><span class="cx"> PASS Invalid: &quot;if (a) if (b) ; else function (){}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { if (a) if (b) ; else function (){} }&quot;
</span><del>-PASS Valid:   &quot;throw a&quot;
</del><ins>+PASS Valid:   &quot;throw a&quot; with 32
</ins><span class="cx"> PASS Valid:   &quot;function f() { throw a }&quot;
</span><del>-PASS Valid:   &quot;throw a + b in void c&quot;
</del><ins>+PASS Valid:   &quot;throw a + b in void c&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { throw a + b in void c }&quot;
</span><span class="cx"> PASS Invalid: &quot;throw&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { throw }&quot;
</span><span class="lines">@@ -320,7 +320,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { var a = if (b) { c } }&quot;
</span><span class="cx"> PASS Invalid: &quot;var a = var b&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { var a = var b }&quot;
</span><del>-PASS Valid:   &quot;const a = b += c, a, a, a = (b - f())&quot;
</del><ins>+PASS Valid:   &quot;const a = b += c, a, a, a = (b - f())&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { const a = b += c, a, a, a = (b - f()) }&quot;
</span><span class="cx"> PASS Invalid: &quot;var a %= b | 5&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { var a %= b | 5 }&quot;
</span><span class="lines">@@ -332,11 +332,11 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { const 'l' = 3 }&quot;
</span><span class="cx"> PASS Invalid: &quot;var var = 3&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { var var = 3 }&quot;
</span><del>-PASS Valid:   &quot;var varr = 3 in 1&quot;
</del><ins>+PASS Valid:   &quot;var varr = 3 in 1&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { var varr = 3 in 1 }&quot;
</span><span class="cx"> PASS Valid:   &quot;const a, a, a = void 7 - typeof 8, a = 8&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { const a, a, a = void 7 - typeof 8, a = 8 }&quot;
</span><del>-PASS Valid:   &quot;const x_x = 6 /= 7 ? e : f&quot;
</del><ins>+PASS Valid:   &quot;const x_x = 6 /= 7 ? e : f&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { const x_x = 6 /= 7 ? e : f }&quot;
</span><span class="cx"> PASS Invalid: &quot;var a = ?&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { var a = ? }&quot;
</span><span class="lines">@@ -344,7 +344,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { const a = *7 }&quot;
</span><span class="cx"> PASS Invalid: &quot;var a = :)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { var a = :) }&quot;
</span><del>-PASS Valid:   &quot;var a = a in b in c instanceof d&quot;
</del><ins>+PASS Valid:   &quot;var a = a in b in c instanceof d&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { var a = a in b in c instanceof d }&quot;
</span><span class="cx"> PASS Invalid: &quot;var a = b ? c, b&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { var a = b ? c, b }&quot;
</span><span class="lines">@@ -407,9 +407,9 @@
</span><span class="cx"> PASS Valid:   &quot;function f() { for (var a, b ; ; ) { break }  }&quot;
</span><span class="cx"> PASS Valid:   &quot;for (var a = b, b = a ; ; ) break&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { for (var a = b, b = a ; ; ) break }&quot;
</span><del>-PASS Valid:   &quot;for (var a = b, c, d, b = a ; x in b ; ) { break }&quot;
</del><ins>+PASS Valid:   &quot;for (var a = b, c, d, b = a ; x in b ; ) { break }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var a = b, c, d, b = a ; x in b ; ) { break } }&quot;
</span><del>-PASS Valid:   &quot;for (var a = b, c, d ; ; 1 in a()) break&quot;
</del><ins>+PASS Valid:   &quot;for (var a = b, c, d ; ; 1 in a()) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var a = b, c, d ; ; 1 in a()) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for ( ; var a ; ) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for ( ; var a ; ) break }&quot;
</span><span class="lines">@@ -417,47 +417,47 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { for (const a; ; ) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for ( %a ; ; ) { }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for ( %a ; ; ) { } }&quot;
</span><del>-PASS Valid:   &quot;for (a in b) break&quot;
</del><ins>+PASS Valid:   &quot;for (a in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (a in b) break }&quot;
</span><del>-PASS Valid:   &quot;for (a() in b) break&quot;
</del><ins>+PASS Valid:   &quot;for (a() in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (a() in b) break }&quot;
</span><del>-PASS Valid:   &quot;for (a().l[4] in b) break&quot;
</del><ins>+PASS Valid:   &quot;for (a().l[4] in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (a().l[4] in b) break }&quot;
</span><del>-PASS Valid:   &quot;for (new a in b in c in d) break&quot;
</del><ins>+PASS Valid:   &quot;for (new a in b in c in d) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (new a in b in c in d) break }&quot;
</span><del>-PASS Valid:   &quot;for (new new new a in b) break&quot;
</del><ins>+PASS Valid:   &quot;for (new new new a in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (new new new a in b) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (delete new a() in b) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (delete new a() in b) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (a * a in b) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (a * a in b) break }&quot;
</span><del>-PASS Valid:   &quot;for ((a * a) in b) break&quot;
</del><ins>+PASS Valid:   &quot;for ((a * a) in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for ((a * a) in b) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (a++ in b) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (a++ in b) break }&quot;
</span><del>-PASS Valid:   &quot;for ((a++) in b) break&quot;
</del><ins>+PASS Valid:   &quot;for ((a++) in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for ((a++) in b) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (++a in b) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (++a in b) break }&quot;
</span><del>-PASS Valid:   &quot;for ((++a) in b) break&quot;
</del><ins>+PASS Valid:   &quot;for ((++a) in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for ((++a) in b) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (a, b in c) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (a, b in c) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (a,b in c ;;) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (a,b in c ;;) break }&quot;
</span><del>-PASS Valid:   &quot;for (a,(b in c) ;;) break&quot;
</del><ins>+PASS Valid:   &quot;for (a,(b in c) ;;) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (a,(b in c) ;;) break }&quot;
</span><del>-PASS Valid:   &quot;for ((a, b) in c) break&quot;
</del><ins>+PASS Valid:   &quot;for ((a, b) in c) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for ((a, b) in c) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (a ? b : c in c) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (a ? b : c in c) break }&quot;
</span><del>-PASS Valid:   &quot;for ((a ? b : c) in c) break&quot;
</del><ins>+PASS Valid:   &quot;for ((a ? b : c) in c) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for ((a ? b : c) in c) break }&quot;
</span><del>-PASS Valid:   &quot;for (var a in b in c) break&quot;
</del><ins>+PASS Valid:   &quot;for (var a in b in c) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var a in b in c) break }&quot;
</span><del>-PASS Valid:   &quot;for (var a = 5 += 6 in b) break&quot;
</del><ins>+PASS Valid:   &quot;for (var a = 5 += 6 in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var a = 5 += 6 in b) break }&quot;
</span><del>-PASS Valid:   &quot;for (var a = debug('should not be hit') in b) break&quot;
</del><ins>+PASS Valid:   &quot;for (var a = debug('should not be hit') in b) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var a = debug('should not be hit') in b) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (var a += 5 in b) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var a += 5 in b) break }&quot;
</span><span class="lines">@@ -469,18 +469,18 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var a = -6, b in b) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (var a, b = 8 in b) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var a, b = 8 in b) break }&quot;
</span><del>-PASS Valid:   &quot;for (var a = (b in c) in d) break&quot;
</del><ins>+PASS Valid:   &quot;for (var a = (b in c) in d) break&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var a = (b in c) in d) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (var a = (b in c in d) break&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var a = (b in c in d) break }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (var (a) in b) { }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var (a) in b) { } }&quot;
</span><del>-PASS Valid:   &quot;for (var a = 7, b = c &lt; d &gt;= d ; f()[6]++ ; --i()[1]++ ) {}&quot;
</del><ins>+PASS Valid:   &quot;for (var a = 7, b = c &lt; d &gt;= d ; f()[6]++ ; --i()[1]++ ) {}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var a = 7, b = c &lt; d &gt;= d ; f()[6]++ ; --i()[1]++ ) {} }&quot;
</span><span class="cx"> try statement
</span><span class="cx"> PASS Invalid: &quot;try { break } catch(e) {}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { try { break } catch(e) {} }&quot;
</span><del>-PASS Valid:   &quot;try {} finally { c++ }&quot;
</del><ins>+PASS Valid:   &quot;try {} finally { c++ }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { try {} finally { c++ } }&quot;
</span><span class="cx"> PASS Valid:   &quot;try { with (x) { } } catch(e) {} finally { if (a) ; }&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { try { with (x) { } } catch(e) {} finally { if (a) ; } }&quot;
</span><span class="lines">@@ -508,7 +508,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { try {} catch {} }&quot;
</span><span class="cx"> PASS Valid:   &quot;if (a) try {} finally {} else b;&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { if (a) try {} finally {} else b; }&quot;
</span><del>-PASS Valid:   &quot;if (--a()) do with(1) try {} catch(ke) { f() ; g() } while (a in b) else {}&quot;
</del><ins>+PASS Valid:   &quot;if (--a()) do with(1) try {} catch(ke) { f() ; g() } while (a in b) else {}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { if (--a()) do with(1) try {} catch(ke) { f() ; g() } while (a in b) else {} }&quot;
</span><span class="cx"> PASS Invalid: &quot;if (a) try {} else b; catch (e) { }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { if (a) try {} else b; catch (e) { } }&quot;
</span><span class="lines">@@ -527,7 +527,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (a) b; }&quot;
</span><span class="cx"> PASS Invalid: &quot;switch (a) case 3: b;&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (a) case 3: b; }&quot;
</span><del>-PASS Valid:   &quot;switch (f()) { case 5 * f(): default: case '6' - 9: ++i }&quot;
</del><ins>+PASS Valid:   &quot;switch (f()) { case 5 * f(): default: case '6' - 9: ++i }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { switch (f()) { case 5 * f(): default: case '6' - 9: ++i } }&quot;
</span><span class="cx"> PASS Invalid: &quot;switch (true) { default: case 6: default: }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (true) { default: case 6: default: } }&quot;
</span><span class="lines">@@ -535,7 +535,7 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (l) { f(); } }&quot;
</span><span class="cx"> PASS Invalid: &quot;switch (l) { case 1: ; a: case 5: }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (l) { case 1: ; a: case 5: } }&quot;
</span><del>-PASS Valid:   &quot;switch (g() - h[5].l) { case 1 + 6: a: b: c: ++f }&quot;
</del><ins>+PASS Valid:   &quot;switch (g() - h[5].l) { case 1 + 6: a: b: c: ++f }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { switch (g() - h[5].l) { case 1 + 6: a: b: c: ++f } }&quot;
</span><span class="cx"> PASS Invalid: &quot;switch (g) { case 1: a: }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (g) { case 1: a: } }&quot;
</span><span class="lines">@@ -545,13 +545,13 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { switch g { case 1: l() } }&quot;
</span><span class="cx"> PASS Invalid: &quot;switch (g) { case 1:&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (g) { case 1: }&quot;
</span><del>-PASS Valid:   &quot;switch (l) { case a = b ? c : d : }&quot;
</del><ins>+PASS Valid:   &quot;switch (l) { case a = b ? c : d : }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { switch (l) { case a = b ? c : d : } }&quot;
</span><del>-PASS Valid:   &quot;switch (sw) { case a ? b - 7[1] ? [c,,] : d = 6 : { } : }&quot;
</del><ins>+PASS Valid:   &quot;switch (sw) { case a ? b - 7[1] ? [c,,] : d = 6 : { } : }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { switch (sw) { case a ? b - 7[1] ? [c,,] : d = 6 : { } : } }&quot;
</span><span class="cx"> PASS Invalid: &quot;switch (l) { case b ? c : }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (l) { case b ? c : } }&quot;
</span><del>-PASS Valid:   &quot;switch (l) { case 1: a: with(g) switch (g) { case 2: default: } default: }&quot;
</del><ins>+PASS Valid:   &quot;switch (l) { case 1: a: with(g) switch (g) { case 2: default: } default: }&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { switch (l) { case 1: a: with(g) switch (g) { case 2: default: } default: } }&quot;
</span><span class="cx"> PASS Invalid: &quot;switch (4 - ) { }&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { switch (4 - ) { } }&quot;
</span><span class="lines">@@ -575,6 +575,22 @@
</span><span class="cx"> PASS Valid:   &quot;function f() { 'use strict'; function __proto__(){} }&quot;
</span><span class="cx"> PASS Valid:   &quot;'use strict'; (function __proto__(){})&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { 'use strict'; (function __proto__(){}) }&quot;
</span><ins>+PASS Valid:   &quot;'use strict'; function f1(a) { function f2(b) { return b; } return f2(a); } f1(5);&quot;
+PASS Valid:   &quot;function f() { 'use strict'; function f1(a) { function f2(b) { return b; } return f2(a); } f1(5); }&quot;
+PASS Valid:   &quot;'use strict'; function f1(a) { function f2(b) { function f3(c) { return c; } return f3(b); } return f2(a); } f1(5);&quot;
+PASS Valid:   &quot;function f() { 'use strict'; function f1(a) { function f2(b) { function f3(c) { return c; } return f3(b); } return f2(a); } f1(5); }&quot;
+PASS Invalid: &quot;'use strict'; function f1(a) { if (a) { function f2(b) { return b; } return f2(a); } else return a; } f1(5);&quot;
+PASS Invalid: &quot;function f() { 'use strict'; function f1(a) { if (a) { function f2(b) { return b; } return f2(a); } else return a; } f1(5); }&quot;
+PASS Invalid: &quot;'use strict'; function f1(a) { function f2(b) { if (b) { function f3(c) { return c; } return f3(b); } else return b; } return f2(a); } f1(5);&quot;
+PASS Invalid: &quot;function f() { 'use strict'; function f1(a) { function f2(b) { if (b) { function f3(c) { return c; } return f3(b); } else return b; } return f2(a); } f1(5); }&quot;
+PASS Valid:   &quot;var str = &quot;'use strict'; function f1(a) { function f2(b) { return b; } return f2(a); } return f1(arguments[0]);&quot;; var foo = new Function(str); foo(5);&quot;
+PASS Valid:   &quot;function f() { var str = &quot;'use strict'; function f1(a) { function f2(b) { return b; } return f2(a); } return f1(arguments[0]);&quot;; var foo = new Function(str); foo(5); }&quot;
+PASS Valid:   &quot;var str = &quot;'use strict'; function f1(a) { function f2(b) { function f3(c) { return c; } return f3(b); } return f2(a); } return f1(arguments[0]);&quot;; var foo = new Function(str); foo(5);&quot;
+PASS Valid:   &quot;function f() { var str = &quot;'use strict'; function f1(a) { function f2(b) { function f3(c) { return c; } return f3(b); } return f2(a); } return f1(arguments[0]);&quot;; var foo = new Function(str); foo(5); }&quot;
+PASS Invalid: &quot;var str = &quot;'use strict'; function f1(a) { if (a) { function f2(b) { return b; } return f2(a); } else return a; } return f1(arguments[0]);&quot;; var foo = new Function(str); foo(5);&quot;
+FAIL Invalid: &quot;function f() { var str = &quot;'use strict'; function f1(a) { if (a) { function f2(b) { return b; } return f2(a); } else return a; } return f1(arguments[0]);&quot;; var foo = new Function(str); foo(5); }&quot; but did not throw
+PASS Invalid: &quot;var str = &quot;'use strict'; function f1(a) { function f2(b) { if (b) { function f3(c) { return c; } return f3(b); } else return b; } return f2(a); } return f1(arguments[0]);&quot;; var foo = new Function(str); foo(5);&quot;
+FAIL Invalid: &quot;function f() { var str = &quot;'use strict'; function f1(a) { function f2(b) { if (b) { function f3(c) { return c; } return f3(b); } else return b; } return f2(a); } return f1(arguments[0]);&quot;; var foo = new Function(str); foo(5); }&quot; but did not throw
</ins><span class="cx"> PASS Valid:   &quot;if (0) $foo; &quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { if (0) $foo;  }&quot;
</span><span class="cx"> PASS Valid:   &quot;if (0) _foo; &quot;
</span><span class="lines">@@ -605,11 +621,11 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { var a.b = c }&quot;
</span><span class="cx"> PASS Invalid: &quot;var a.b;&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { var a.b; }&quot;
</span><del>-PASS Valid:   &quot;for (of of of){}&quot;
</del><ins>+PASS Valid:   &quot;for (of of of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (of of of){} }&quot;
</span><del>-PASS Valid:   &quot;for (of; of; of){}&quot;
</del><ins>+PASS Valid:   &quot;for (of; of; of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (of; of; of){} }&quot;
</span><del>-PASS Valid:   &quot;for (var of of of){}&quot;
</del><ins>+PASS Valid:   &quot;for (var of of of){}&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var of of of){} }&quot;
</span><span class="cx"> PASS Valid:   &quot;for (var of; of; of){}&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { for (var of; of; of){} }&quot;
</span><span class="lines">@@ -617,23 +633,23 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var of.of of of){} }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (var of[of] of of){}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var of[of] of of){} }&quot;
</span><del>-PASS Valid:   &quot;for (of.of of of){}&quot;
</del><ins>+PASS Valid:   &quot;for (of.of of of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (of.of of of){} }&quot;
</span><del>-PASS Valid:   &quot;for (of[of] of of){}&quot;
</del><ins>+PASS Valid:   &quot;for (of[of] of of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (of[of] of of){} }&quot;
</span><del>-PASS Valid:   &quot;for (var [of] of of){}&quot;
</del><ins>+PASS Valid:   &quot;for (var [of] of of){}&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var [of] of of){} }&quot;
</span><del>-PASS Valid:   &quot;for (var {of} of of){}&quot;
</del><ins>+PASS Valid:   &quot;for (var {of} of of){}&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (var {of} of of){} }&quot;
</span><del>-PASS Valid:   &quot;for (of in of){}&quot;
</del><ins>+PASS Valid:   &quot;for (of in of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (of in of){} }&quot;
</span><span class="cx"> PASS Valid:   &quot;for (var of in of){}&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { for (var of in of){} }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (var of.of in of){}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var of.of in of){} }&quot;
</span><del>-PASS Valid:   &quot;for (of.of in of){}&quot;
</del><ins>+PASS Valid:   &quot;for (of.of in of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (of.of in of){} }&quot;
</span><del>-PASS Valid:   &quot;for (of[of] in of){}&quot;
</del><ins>+PASS Valid:   &quot;for (of[of] in of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for (of[of] in of){} }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (var of[of] in of){}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var of[of] in of){} }&quot;
</span><span class="lines">@@ -641,9 +657,9 @@
</span><span class="cx"> PASS Valid:   &quot;function f() { for (var [of] in of){} }&quot;
</span><span class="cx"> PASS Valid:   &quot;for (var {of} in of){}&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { for (var {of} in of){} }&quot;
</span><del>-PASS Valid:   &quot;for ([of] in of){}&quot;
</del><ins>+PASS Valid:   &quot;for ([of] in of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for ([of] in of){} }&quot;
</span><del>-PASS Valid:   &quot;for ({of} in of){}&quot;
</del><ins>+PASS Valid:   &quot;for ({of} in of){}&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { for ({of} in of){} }&quot;
</span><span class="cx"> PASS Invalid: &quot;for (of of of of){}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (of of of of){} }&quot;
</span><span class="lines">@@ -662,17 +678,17 @@
</span><span class="cx"> PASS Invalid: &quot;for (var of in){}&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { for (var of in){} }&quot;
</span><span class="cx"> spread operator
</span><del>-PASS Valid:   &quot;foo(...bar)&quot;
</del><ins>+PASS Valid:   &quot;foo(...bar)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { foo(...bar) }&quot;
</span><del>-PASS Valid:   &quot;o.foo(...bar)&quot;
</del><ins>+PASS Valid:   &quot;o.foo(...bar)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { o.foo(...bar) }&quot;
</span><del>-PASS Valid:   &quot;o[foo](...bar)&quot;
</del><ins>+PASS Valid:   &quot;o[foo](...bar)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { o[foo](...bar) }&quot;
</span><del>-PASS Valid:   &quot;new foo(...bar)&quot;
</del><ins>+PASS Valid:   &quot;new foo(...bar)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { new foo(...bar) }&quot;
</span><del>-PASS Valid:   &quot;new o.foo(...bar)&quot;
</del><ins>+PASS Valid:   &quot;new o.foo(...bar)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { new o.foo(...bar) }&quot;
</span><del>-PASS Valid:   &quot;new o[foo](...bar)&quot;
</del><ins>+PASS Valid:   &quot;new o[foo](...bar)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { new o[foo](...bar) }&quot;
</span><span class="cx"> PASS Invalid: &quot;foo(...)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { foo(...) }&quot;
</span><span class="lines">@@ -698,37 +714,37 @@
</span><span class="cx"> PASS Invalid: &quot;function f() { o.foo(...bar, a) }&quot;
</span><span class="cx"> PASS Invalid: &quot;o[foo](...bar, a)&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { o[foo](...bar, a) }&quot;
</span><del>-PASS Valid:   &quot;[...bar]&quot;
</del><ins>+PASS Valid:   &quot;[...bar]&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { [...bar] }&quot;
</span><del>-PASS Valid:   &quot;[a, ...bar]&quot;
</del><ins>+PASS Valid:   &quot;[a, ...bar]&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { [a, ...bar] }&quot;
</span><del>-PASS Valid:   &quot;[...bar, a]&quot;
</del><ins>+PASS Valid:   &quot;[...bar, a]&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { [...bar, a] }&quot;
</span><del>-PASS Valid:   &quot;[...bar,,,,]&quot;
</del><ins>+PASS Valid:   &quot;[...bar,,,,]&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { [...bar,,,,] }&quot;
</span><del>-PASS Valid:   &quot;[,,,,...bar]&quot;
</del><ins>+PASS Valid:   &quot;[,,,,...bar]&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { [,,,,...bar] }&quot;
</span><del>-PASS Valid:   &quot;({1: x})&quot;
</del><ins>+PASS Valid:   &quot;({1: x})&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({1: x}) }&quot;
</span><span class="cx"> PASS Valid:   &quot;({1: x}=1)&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { ({1: x}=1) }&quot;
</span><del>-PASS Valid:   &quot;({1: x}=null)&quot;
</del><ins>+PASS Valid:   &quot;({1: x}=null)&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({1: x}=null) }&quot;
</span><span class="cx"> PASS Valid:   &quot;({1: x})&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { ({1: x}) }&quot;
</span><span class="cx"> PASS Valid:   &quot;({1: x}=1)&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { ({1: x}=1) }&quot;
</span><del>-PASS Valid:   &quot;({1: x}=null)&quot;
</del><ins>+PASS Valid:   &quot;({1: x}=null)&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({1: x}=null) }&quot;
</span><del>-PASS Valid:   &quot;({a: b}=null)&quot;
</del><ins>+PASS Valid:   &quot;({a: b}=null)&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({a: b}=null) }&quot;
</span><span class="cx"> PASS Valid:   &quot;'use strict'; ({1: x})&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { 'use strict'; ({1: x}) }&quot;
</span><span class="cx"> PASS Valid:   &quot;'use strict'; ({1: x}=1)&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { 'use strict'; ({1: x}=1) }&quot;
</span><del>-PASS Valid:   &quot;'use strict'; ({1: x}=null)&quot;
</del><ins>+PASS Valid:   &quot;'use strict'; ({1: x}=null)&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { 'use strict'; ({1: x}=null) }&quot;
</span><del>-PASS Valid:   &quot;'use strict'; ({a: b}=null)&quot;
</del><ins>+PASS Valid:   &quot;'use strict'; ({a: b}=null)&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { 'use strict'; ({a: b}=null) }&quot;
</span><span class="cx"> PASS Valid:   &quot;var {1:x}=1&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { var {1:x}=1 }&quot;
</span><span class="lines">@@ -742,17 +758,17 @@
</span><span class="cx"> PASS Valid:   &quot;function f() { delete ({a}=1) }&quot;
</span><span class="cx"> PASS Valid:   &quot;delete ({a:a}=1)&quot;
</span><span class="cx"> PASS Valid:   &quot;function f() { delete ({a:a}=1) }&quot;
</span><del>-PASS Valid:   &quot;({a}=1)()&quot;
</del><ins>+PASS Valid:   &quot;({a}=1)()&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({a}=1)() }&quot;
</span><del>-PASS Valid:   &quot;({a:a}=1)()&quot;
</del><ins>+PASS Valid:   &quot;({a:a}=1)()&quot; with TypeError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({a:a}=1)() }&quot;
</span><del>-PASS Valid:   &quot;({a}=1)=1&quot;
</del><ins>+PASS Valid:   &quot;({a}=1)=1&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({a}=1)=1 }&quot;
</span><del>-PASS Valid:   &quot;({a:a}=1)=1&quot;
</del><ins>+PASS Valid:   &quot;({a:a}=1)=1&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({a:a}=1)=1 }&quot;
</span><del>-PASS Valid:   &quot;({a}=1=1)&quot;
</del><ins>+PASS Valid:   &quot;({a}=1=1)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({a}=1=1) }&quot;
</span><del>-PASS Valid:   &quot;({a:a}=1=1)&quot;
</del><ins>+PASS Valid:   &quot;({a:a}=1=1)&quot; with ReferenceError
</ins><span class="cx"> PASS Valid:   &quot;function f() { ({a:a}=1=1) }&quot;
</span><span class="cx"> PASS Invalid: &quot;({get [x](){}})&quot;
</span><span class="cx"> PASS Invalid: &quot;function f() { ({get [x](){}}) }&quot;
</span></span></pre></div>
<a id="trunkLayoutTestsjsscripttestsparsersyntaxcheckjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/script-tests/parser-syntax-check.js (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/script-tests/parser-syntax-check.js        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/LayoutTests/js/script-tests/parser-syntax-check.js        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -2,27 +2,32 @@
</span><span class="cx"> &quot;This test checks that the following expressions or statements are valid ECMASCRIPT code or should throw parse error&quot;
</span><span class="cx"> );
</span><span class="cx"> 
</span><del>-function runTest(_a, errorType)
</del><ins>+function runTest(_a, expectSyntaxError)
</ins><span class="cx"> {
</span><del>-    var success;
</del><ins>+    var error;
+
</ins><span class="cx">     if (typeof _a != &quot;string&quot;)
</span><span class="cx">         testFailed(&quot;runTest expects string argument: &quot; + _a);
</span><span class="cx">     try {
</span><span class="cx">         eval(_a);
</span><del>-        success = true;
</del><span class="cx">     } catch (e) {
</span><del>-        success = !(e instanceof SyntaxError);
</del><ins>+        error = e;
</ins><span class="cx">     }
</span><del>-    if ((!!errorType) == !success) {
-        if (errorType)
</del><ins>+
+    if (expectSyntaxError) {
+        if (error &amp;&amp; error instanceof SyntaxError)
</ins><span class="cx">             testPassed('Invalid: &quot;' + _a + '&quot;');
</span><ins>+        else if (error)
+            testFailed('Invalid: &quot;' + _a + '&quot; should throw SyntaxError but got ' + (error.name || error));
</ins><span class="cx">         else
</span><ins>+            testFailed('Invalid: &quot;' + _a + '&quot; but did not throw');
+    } else {
+        if (!error)
</ins><span class="cx">             testPassed('Valid:   &quot;' + _a + '&quot;');
</span><del>-    } else {
-        if (errorType)
-            testFailed('Invalid: &quot;' + _a + '&quot; should throw ' + errorType.name);
</del><ins>+        else if (!(error instanceof SyntaxError))
+            testPassed('Valid:   &quot;' + _a + '&quot; with ' + (error.name || error));
</ins><span class="cx">         else
</span><del>-            testFailed('Valid:   &quot;' + _a + '&quot; should NOT throw ');
</del><ins>+            testFailed('Valid:   &quot;' + _a + '&quot; should NOT throw but got ' + (error.name || error));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -33,9 +38,8 @@
</span><span class="cx">     runTest(&quot;function f() { &quot; + _a + &quot; }&quot;, false);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function invalid(_a, _type)
</del><ins>+function invalid(_a)
</ins><span class="cx"> {
</span><del>-    _type = _type || SyntaxError;
</del><span class="cx">     // Test both the grammar and the syntax checker
</span><span class="cx">     runTest(_a, true);
</span><span class="cx">     runTest(&quot;function f() { &quot; + _a + &quot; }&quot;, true);
</span><span class="lines">@@ -366,6 +370,16 @@
</span><span class="cx"> valid(&quot;'use strict'; function __proto__(){}&quot;)
</span><span class="cx"> valid(&quot;'use strict'; (function __proto__(){})&quot;)
</span><span class="cx"> 
</span><ins>+valid(&quot;'use strict'; function f1(a) { function f2(b) { return b; } return f2(a); } f1(5);&quot;)
+valid(&quot;'use strict'; function f1(a) { function f2(b) { function f3(c) { return c; } return f3(b); } return f2(a); } f1(5);&quot;)
+invalid(&quot;'use strict'; function f1(a) { if (a) { function f2(b) { return b; } return f2(a); } else return a; } f1(5);&quot;)
+invalid(&quot;'use strict'; function f1(a) { function f2(b) { if (b) { function f3(c) { return c; } return f3(b); } else return b; } return f2(a); } f1(5);&quot;)
+
+valid(&quot;var str = \&quot;'use strict'; function f1(a) { function f2(b) { return b; } return f2(a); } return f1(arguments[0]);\&quot;; var foo = new Function(str); foo(5);&quot;)
+valid(&quot;var str = \&quot;'use strict'; function f1(a) { function f2(b) { function f3(c) { return c; } return f3(b); } return f2(a); } return f1(arguments[0]);\&quot;; var foo = new Function(str); foo(5);&quot;)
+invalid(&quot;var str = \&quot;'use strict'; function f1(a) { if (a) { function f2(b) { return b; } return f2(a); } else return a; } return f1(arguments[0]);\&quot;; var foo = new Function(str); foo(5);&quot;, SyntaxError, undefined)
+invalid(&quot;var str = \&quot;'use strict'; function f1(a) { function f2(b) { if (b) { function f3(c) { return c; } return f3(b); } else return b; } return f2(a); } return f1(arguments[0]);\&quot;; var foo = new Function(str); foo(5);&quot;, SyntaxError, undefined)
+
</ins><span class="cx"> valid(&quot;if (0) $foo; &quot;)
</span><span class="cx"> valid(&quot;if (0) _foo; &quot;)
</span><span class="cx"> valid(&quot;if (0) foo$; &quot;)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2014-06-16  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Parser statementDepth accounting needs to account for when a function body excludes its braces.
+        &lt;https://webkit.org/b/133832&gt;
+
+        Reviewed by Oliver Hunt.
+
+        In some cases (e.g. when a Function object is instantiated from a string), the
+        function body source may not include its braces.  The parser needs to account
+        for this when calculating its statementDepth.
+
+        * bytecode/UnlinkedCodeBlock.cpp:
+        (JSC::generateFunctionCodeBlock):
+        (JSC::UnlinkedFunctionExecutable::codeBlockFor):
+        * bytecode/UnlinkedCodeBlock.h:
+        * parser/Parser.cpp:
+        (JSC::Parser&lt;LexerType&gt;::parseStatement):
+        - Also fixed the error message for declaring nested functions in strict mode
+          to be more accurate.
+        * parser/Parser.h:
+        (JSC::Parser&lt;LexerType&gt;::parse):
+        (JSC::parse):
+        * runtime/Executable.cpp:
+        (JSC::ScriptExecutable::newCodeBlockFor):
+
</ins><span class="cx"> 2014-06-16  Juergen Ributzka  &lt;juergen@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Change the order of the alias analysis passes to align with the opt pipeline of LLVM
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -49,9 +49,9 @@
</span><span class="cx"> const ClassInfo UnlinkedEvalCodeBlock::s_info = { &quot;UnlinkedEvalCodeBlock&quot;, &amp;Base::s_info, 0, 0, CREATE_METHOD_TABLE(UnlinkedEvalCodeBlock) };
</span><span class="cx"> const ClassInfo UnlinkedFunctionCodeBlock::s_info = { &quot;UnlinkedFunctionCodeBlock&quot;, &amp;Base::s_info, 0, 0, CREATE_METHOD_TABLE(UnlinkedFunctionCodeBlock) };
</span><span class="cx"> 
</span><del>-static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock(VM&amp; vm, UnlinkedFunctionExecutable* executable, const SourceCode&amp; source, CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode, UnlinkedFunctionKind functionKind, ParserError&amp; error)
</del><ins>+static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock(VM&amp; vm, UnlinkedFunctionExecutable* executable, const SourceCode&amp; source, CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode, UnlinkedFunctionKind functionKind, bool bodyIncludesBraces, ParserError&amp; error)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;FunctionBodyNode&gt; body = parse&lt;FunctionBodyNode&gt;(&amp;vm, source, executable-&gt;parameters(), executable-&gt;name(), executable-&gt;toStrictness(), JSParseFunctionCode, error);
</del><ins>+    RefPtr&lt;FunctionBodyNode&gt; body = parse&lt;FunctionBodyNode&gt;(&amp;vm, source, executable-&gt;parameters(), executable-&gt;name(), executable-&gt;toStrictness(), JSParseFunctionCode, error, 0, bodyIncludesBraces);
</ins><span class="cx"> 
</span><span class="cx">     if (!body) {
</span><span class="cx">         ASSERT(error.m_type != ParserError::ErrorNone);
</span><span class="lines">@@ -152,7 +152,7 @@
</span><span class="cx">     return executable;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-UnlinkedFunctionCodeBlock* UnlinkedFunctionExecutable::codeBlockFor(VM&amp; vm, const SourceCode&amp; source, CodeSpecializationKind specializationKind, DebuggerMode debuggerMode, ProfilerMode profilerMode, ParserError&amp; error)
</del><ins>+UnlinkedFunctionCodeBlock* UnlinkedFunctionExecutable::codeBlockFor(VM&amp; vm, const SourceCode&amp; source, CodeSpecializationKind specializationKind, DebuggerMode debuggerMode, ProfilerMode profilerMode, bool bodyIncludesBraces, ParserError&amp; error)
</ins><span class="cx"> {
</span><span class="cx">     switch (specializationKind) {
</span><span class="cx">     case CodeForCall:
</span><span class="lines">@@ -165,7 +165,7 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    UnlinkedFunctionCodeBlock* result = generateFunctionCodeBlock(vm, this, source, specializationKind, debuggerMode, profilerMode, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, error);
</del><ins>+    UnlinkedFunctionCodeBlock* result = generateFunctionCodeBlock(vm, this, source, specializationKind, debuggerMode, profilerMode, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, bodyIncludesBraces, error);
</ins><span class="cx">     
</span><span class="cx">     if (error.m_type != ParserError::ErrorNone)
</span><span class="cx">         return 0;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -128,7 +128,7 @@
</span><span class="cx"> 
</span><span class="cx">     String paramString() const;
</span><span class="cx"> 
</span><del>-    UnlinkedFunctionCodeBlock* codeBlockFor(VM&amp;, const SourceCode&amp;, CodeSpecializationKind, DebuggerMode, ProfilerMode, ParserError&amp;);
</del><ins>+    UnlinkedFunctionCodeBlock* codeBlockFor(VM&amp;, const SourceCode&amp;, CodeSpecializationKind, DebuggerMode, ProfilerMode, bool bodyIncludesBraces, ParserError&amp;);
</ins><span class="cx"> 
</span><span class="cx">     static UnlinkedFunctionExecutable* fromGlobalCode(const Identifier&amp;, ExecState*, Debugger*, const SourceCode&amp;, JSObject** exception);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.cpp (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.cpp        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/Source/JavaScriptCore/parser/Parser.cpp        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -1126,7 +1126,7 @@
</span><span class="cx">     case CONSTTOKEN:
</span><span class="cx">         return parseConstDeclaration(context);
</span><span class="cx">     case FUNCTION:
</span><del>-        failIfFalseIfStrict(m_statementDepth == 1, &quot;Nested functions cannot be declared in strict mode&quot;);
</del><ins>+        failIfFalseIfStrict(m_statementDepth == 1, &quot;Strict mode does not allow function declarations in a lexically nested statement&quot;);
</ins><span class="cx">         return parseFunctionDeclaration(context);
</span><span class="cx">     case SEMICOLON: {
</span><span class="cx">         JSTokenLocation location(tokenLocation());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.h (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.h        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/Source/JavaScriptCore/parser/Parser.h        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -398,7 +398,7 @@
</span><span class="cx">     ~Parser();
</span><span class="cx"> 
</span><span class="cx">     template &lt;class ParsedNode&gt;
</span><del>-    PassRefPtr&lt;ParsedNode&gt; parse(ParserError&amp;);
</del><ins>+    PassRefPtr&lt;ParsedNode&gt; parse(ParserError&amp;, bool needReparsingAdjustment);
</ins><span class="cx"> 
</span><span class="cx">     JSTextPosition positionBeforeLastNewline() const { return m_lexer-&gt;positionBeforeLastNewline(); }
</span><span class="cx">     const Vector&lt;RefPtr&lt;StringImpl&gt;&gt;&amp;&amp; closedVariables() { return std::move(m_closedVariables); }
</span><span class="lines">@@ -857,12 +857,12 @@
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><span class="cx"> template &lt;class ParsedNode&gt;
</span><del>-PassRefPtr&lt;ParsedNode&gt; Parser&lt;LexerType&gt;::parse(ParserError&amp; error)
</del><ins>+PassRefPtr&lt;ParsedNode&gt; Parser&lt;LexerType&gt;::parse(ParserError&amp; error, bool needReparsingAdjustment)
</ins><span class="cx"> {
</span><span class="cx">     int errLine;
</span><span class="cx">     String errMsg;
</span><span class="cx"> 
</span><del>-    if (ParsedNode::scopeIsFunction)
</del><ins>+    if (ParsedNode::scopeIsFunction &amp;&amp; needReparsingAdjustment)
</ins><span class="cx">         m_lexer-&gt;setIsReparsing();
</span><span class="cx"> 
</span><span class="cx">     m_sourceElements = 0;
</span><span class="lines">@@ -937,14 +937,14 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;class ParsedNode&gt;
</span><del>-PassRefPtr&lt;ParsedNode&gt; parse(VM* vm, const SourceCode&amp; source, FunctionParameters* parameters, const Identifier&amp; name, JSParserStrictness strictness, JSParserMode parserMode, ParserError&amp; error, JSTextPosition* positionBeforeLastNewline = 0)
</del><ins>+PassRefPtr&lt;ParsedNode&gt; parse(VM* vm, const SourceCode&amp; source, FunctionParameters* parameters, const Identifier&amp; name, JSParserStrictness strictness, JSParserMode parserMode, ParserError&amp; error, JSTextPosition* positionBeforeLastNewline = 0, bool needReparsingAdjustment = false)
</ins><span class="cx"> {
</span><span class="cx">     SamplingRegion samplingRegion(&quot;Parsing&quot;);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!source.provider()-&gt;source().isNull());
</span><span class="cx">     if (source.provider()-&gt;source().is8Bit()) {
</span><span class="cx">         Parser&lt;Lexer&lt;LChar&gt;&gt; parser(vm, source, parameters, name, strictness, parserMode);
</span><del>-        RefPtr&lt;ParsedNode&gt; result = parser.parse&lt;ParsedNode&gt;(error);
</del><ins>+        RefPtr&lt;ParsedNode&gt; result = parser.parse&lt;ParsedNode&gt;(error, needReparsingAdjustment);
</ins><span class="cx">         if (positionBeforeLastNewline)
</span><span class="cx">             *positionBeforeLastNewline = parser.positionBeforeLastNewline();
</span><span class="cx">         if (strictness == JSParseBuiltin) {
</span><span class="lines">@@ -956,7 +956,7 @@
</span><span class="cx">         return result.release();
</span><span class="cx">     }
</span><span class="cx">     Parser&lt;Lexer&lt;UChar&gt;&gt; parser(vm, source, parameters, name, strictness, parserMode);
</span><del>-    RefPtr&lt;ParsedNode&gt; result = parser.parse&lt;ParsedNode&gt;(error);
</del><ins>+    RefPtr&lt;ParsedNode&gt; result = parser.parse&lt;ParsedNode&gt;(error, needReparsingAdjustment);
</ins><span class="cx">     if (positionBeforeLastNewline)
</span><span class="cx">         *positionBeforeLastNewline = parser.positionBeforeLastNewline();
</span><span class="cx">     return result.release();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeExecutablecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Executable.cpp (170033 => 170034)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Executable.cpp        2014-06-16 22:57:28 UTC (rev 170033)
+++ trunk/Source/JavaScriptCore/runtime/Executable.cpp        2014-06-16 23:19:29 UTC (rev 170034)
</span><span class="lines">@@ -223,7 +223,7 @@
</span><span class="cx">     ProfilerMode profilerMode = globalObject-&gt;hasProfiler() ? ProfilerOn : ProfilerOff;
</span><span class="cx">     UnlinkedFunctionCodeBlock* unlinkedCodeBlock =
</span><span class="cx">         executable-&gt;m_unlinkedExecutable-&gt;codeBlockFor(
</span><del>-            *vm, executable-&gt;m_source, kind, debuggerMode, profilerMode, error);
</del><ins>+            *vm, executable-&gt;m_source, kind, debuggerMode, profilerMode, executable-&gt;bodyIncludesBraces(), error);
</ins><span class="cx">     recordParse(executable-&gt;m_unlinkedExecutable-&gt;features(), executable-&gt;m_unlinkedExecutable-&gt;hasCapturedVariables(), lineNo(), lastLine(), startColumn(), endColumn()); 
</span><span class="cx">     if (!unlinkedCodeBlock) {
</span><span class="cx">         exception = vm-&gt;throwException(
</span></span></pre>
</div>
</div>

</body>
</html>