<!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>[160383] trunk/Source/JavaScriptCore</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/160383">160383</a></dd>
<dt>Author</dt> <dd>oliver@apple.com</dd>
<dt>Date</dt> <dd>2013-12-10 13:19:15 -0800 (Tue, 10 Dec 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Reduce the mass templatizing of the JS parser
https://bugs.webkit.org/show_bug.cgi?id=125535

Reviewed by Michael Saboff.

The various caches we have now have removed the need for many of
the template vs. regular parameters.  This patch converts those
template parameters to regular parameters and updates the call
sites.  This reduces the code size of the parser by around 15%.

* parser/ASTBuilder.h:
(JSC::ASTBuilder::createGetterOrSetterProperty):
(JSC::ASTBuilder::createProperty):
* parser/Parser.cpp:
(JSC::::parseInner):
(JSC::::parseSourceElements):
(JSC::::parseVarDeclarationList):
(JSC::::createBindingPattern):
(JSC::::tryParseDeconstructionPatternExpression):
(JSC::::parseDeconstructionPattern):
(JSC::::parseSwitchClauses):
(JSC::::parseSwitchDefaultClause):
(JSC::::parseBlockStatement):
(JSC::::parseFormalParameters):
(JSC::::parseFunctionInfo):
(JSC::::parseFunctionDeclaration):
(JSC::::parseProperty):
(JSC::::parseObjectLiteral):
(JSC::::parseStrictObjectLiteral):
(JSC::::parseMemberExpression):
* parser/Parser.h:
* parser/SyntaxChecker.h:
(JSC::SyntaxChecker::createProperty):
(JSC::SyntaxChecker::createGetterOrSetterProperty):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserASTBuilderh">trunk/Source/JavaScriptCore/parser/ASTBuilder.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="#trunkSourceJavaScriptCoreparserSyntaxCheckerh">trunk/Source/JavaScriptCore/parser/SyntaxChecker.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (160382 => 160383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2013-12-10 21:10:13 UTC (rev 160382)
+++ trunk/Source/JavaScriptCore/ChangeLog        2013-12-10 21:19:15 UTC (rev 160383)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2013-12-10  Oliver Hunt  &lt;oliver@apple.com&gt;
+
+        Reduce the mass templatizing of the JS parser
+        https://bugs.webkit.org/show_bug.cgi?id=125535
+
+        Reviewed by Michael Saboff.
+
+        The various caches we have now have removed the need for many of
+        the template vs. regular parameters.  This patch converts those
+        template parameters to regular parameters and updates the call
+        sites.  This reduces the code size of the parser by around 15%.
+
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::createGetterOrSetterProperty):
+        (JSC::ASTBuilder::createProperty):
+        * parser/Parser.cpp:
+        (JSC::::parseInner):
+        (JSC::::parseSourceElements):
+        (JSC::::parseVarDeclarationList):
+        (JSC::::createBindingPattern):
+        (JSC::::tryParseDeconstructionPatternExpression):
+        (JSC::::parseDeconstructionPattern):
+        (JSC::::parseSwitchClauses):
+        (JSC::::parseSwitchDefaultClause):
+        (JSC::::parseBlockStatement):
+        (JSC::::parseFormalParameters):
+        (JSC::::parseFunctionInfo):
+        (JSC::::parseFunctionDeclaration):
+        (JSC::::parseProperty):
+        (JSC::::parseObjectLiteral):
+        (JSC::::parseStrictObjectLiteral):
+        (JSC::::parseMemberExpression):
+        * parser/Parser.h:
+        * parser/SyntaxChecker.h:
+        (JSC::SyntaxChecker::createProperty):
+        (JSC::SyntaxChecker::createGetterOrSetterProperty):
+
</ins><span class="cx"> 2013-12-10  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         ASSERT !heap.vm()-&gt;isInitializingObject() when finishing DFG compilation at beginning of GC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserASTBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/ASTBuilder.h (160382 => 160383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2013-12-10 21:10:13 UTC (rev 160382)
+++ trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2013-12-10 21:19:15 UTC (rev 160383)
</span><span class="lines">@@ -293,7 +293,7 @@
</span><span class="cx">         body-&gt;setFunctionNameStart(functionNameStart);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    template &lt;bool&gt; PropertyNode* createGetterOrSetterProperty(const JSTokenLocation&amp; location, PropertyNode::Type type, const Identifier* name, ParameterNode* params, FunctionBodyNode* body, unsigned openBraceOffset, unsigned closeBraceOffset, int bodyStartLine, int bodyEndLine, unsigned bodyStartColumn)
</del><ins>+    NEVER_INLINE PropertyNode* createGetterOrSetterProperty(const JSTokenLocation&amp; location, PropertyNode::Type type, bool, const Identifier* name, ParameterNode* params, FunctionBodyNode* body, unsigned openBraceOffset, unsigned closeBraceOffset, int bodyStartLine, int bodyEndLine, unsigned bodyStartColumn)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(name);
</span><span class="cx">         body-&gt;setLoc(bodyStartLine, bodyEndLine, location.startOffset, location.lineStartOffset);
</span><span class="lines">@@ -301,7 +301,7 @@
</span><span class="cx">         return new (m_vm) PropertyNode(m_vm, *name, new (m_vm) FuncExprNode(location, m_vm-&gt;propertyNames-&gt;nullIdentifier, body, m_sourceCode-&gt;subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), params), type);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    template &lt;bool&gt; PropertyNode* createGetterOrSetterProperty(VM*, const JSTokenLocation&amp; location, PropertyNode::Type type, double name, ParameterNode* params, FunctionBodyNode* body, unsigned openBraceOffset, unsigned closeBraceOffset, int bodyStartLine, int bodyEndLine, unsigned bodyStartColumn)
</del><ins>+    NEVER_INLINE PropertyNode* createGetterOrSetterProperty(VM*, const JSTokenLocation&amp; location, PropertyNode::Type type, bool, double name, ParameterNode* params, FunctionBodyNode* body, unsigned openBraceOffset, unsigned closeBraceOffset, int bodyStartLine, int bodyEndLine, unsigned bodyStartColumn)
</ins><span class="cx">     {
</span><span class="cx">         body-&gt;setLoc(bodyStartLine, bodyEndLine, location.startOffset, location.lineStartOffset);
</span><span class="cx">         return new (m_vm) PropertyNode(m_vm, name, new (m_vm) FuncExprNode(location, m_vm-&gt;propertyNames-&gt;nullIdentifier, body, m_sourceCode-&gt;subExpression(openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn), params), type);
</span><span class="lines">@@ -312,14 +312,14 @@
</span><span class="cx">     ArgumentListNode* createArgumentsList(const JSTokenLocation&amp; location, ExpressionNode* arg) { return new (m_vm) ArgumentListNode(location, arg); }
</span><span class="cx">     ArgumentListNode* createArgumentsList(const JSTokenLocation&amp; location, ArgumentListNode* args, ExpressionNode* arg) { return new (m_vm) ArgumentListNode(location, args, arg); }
</span><span class="cx"> 
</span><del>-    template &lt;bool&gt; PropertyNode* createProperty(const Identifier* propertyName, ExpressionNode* node, PropertyNode::Type type)
</del><ins>+    PropertyNode* createProperty(const Identifier* propertyName, ExpressionNode* node, PropertyNode::Type type, bool)
</ins><span class="cx">     {
</span><span class="cx">         if (node-&gt;isFuncExprNode())
</span><span class="cx">             static_cast&lt;FuncExprNode*&gt;(node)-&gt;body()-&gt;setInferredName(*propertyName);
</span><span class="cx">         return new (m_vm) PropertyNode(m_vm, *propertyName, node, type);
</span><span class="cx">     }
</span><del>-    template &lt;bool&gt; PropertyNode* createProperty(VM*, double propertyName, ExpressionNode* node, PropertyNode::Type type) { return new (m_vm) PropertyNode(m_vm, propertyName, node, type); }
-    template &lt;bool&gt; PropertyNode* createProperty(VM*, ExpressionNode* propertyName, ExpressionNode* node, PropertyNode::Type type) { return new (m_vm) PropertyNode(m_vm, propertyName, node, type); }
</del><ins>+    PropertyNode* createProperty(VM*, double propertyName, ExpressionNode* node, PropertyNode::Type type, bool) { return new (m_vm) PropertyNode(m_vm, propertyName, node, type); }
+    PropertyNode* createProperty(VM*, ExpressionNode* propertyName, ExpressionNode* node, PropertyNode::Type type, bool) { return new (m_vm) PropertyNode(m_vm, propertyName, node, type); }
</ins><span class="cx">     PropertyListNode* createPropertyList(const JSTokenLocation&amp; location, PropertyNode* property) { return new (m_vm) PropertyListNode(location, property); }
</span><span class="cx">     PropertyListNode* createPropertyList(const JSTokenLocation&amp; location, PropertyNode* property, PropertyListNode* tail) { return new (m_vm) PropertyListNode(location, property, tail); }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.cpp (160382 => 160383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.cpp        2013-12-10 21:10:13 UTC (rev 160382)
+++ trunk/Source/JavaScriptCore/parser/Parser.cpp        2013-12-10 21:19:15 UTC (rev 160383)
</span><span class="lines">@@ -245,7 +245,7 @@
</span><span class="cx">     if (m_lexer-&gt;isReparsing())
</span><span class="cx">         m_statementDepth--;
</span><span class="cx">     ScopeRef scope = currentScope();
</span><del>-    SourceElements* sourceElements = parseSourceElements&lt;CheckForStrictMode&gt;(context);
</del><ins>+    SourceElements* sourceElements = parseSourceElements(context, CheckForStrictMode);
</ins><span class="cx">     if (!sourceElements || !consume(EOFTOK)) {
</span><span class="cx">         if (hasError())
</span><span class="cx">             parseError = m_errorMessage;
</span><span class="lines">@@ -289,7 +289,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><del>-template &lt;SourceElementsMode mode, class TreeBuilder&gt; TreeSourceElements Parser&lt;LexerType&gt;::parseSourceElements(TreeBuilder&amp; context)
</del><ins>+template &lt;class TreeBuilder&gt; TreeSourceElements Parser&lt;LexerType&gt;::parseSourceElements(TreeBuilder&amp; context, SourceElementsMode mode)
</ins><span class="cx"> {
</span><span class="cx">     const unsigned lengthOfUseStrictLiteral = 12; // &quot;use strict&quot;.length
</span><span class="cx">     TreeSourceElements sourceElements = context.createSourceElements();
</span><span class="lines">@@ -446,7 +446,7 @@
</span><span class="cx">             }
</span><span class="cx">         } else {
</span><span class="cx">             lastIdent = 0;
</span><del>-            auto pattern = parseDeconstructionPattern&lt;DeconstructToVariables&gt;(context);
</del><ins>+            auto pattern = parseDeconstructionPattern(context, DeconstructToVariables);
</ins><span class="cx">             failIfFalse(pattern, &quot;Cannot parse this deconstruction pattern&quot;);
</span><span class="cx">             hasInitializer = match(EQUAL);
</span><span class="cx">             lastPattern = pattern;
</span><span class="lines">@@ -465,12 +465,12 @@
</span><span class="cx">         }
</span><span class="cx">     } while (match(COMMA));
</span><span class="cx">     if (lastIdent)
</span><del>-        lastPattern = createBindingPattern&lt;DeconstructToVariables&gt;(context, *lastIdent, 0);
</del><ins>+        lastPattern = createBindingPattern(context, DeconstructToVariables, *lastIdent, 0);
</ins><span class="cx">     return varDecls;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><del>-template &lt;DeconstructionKind kind, class TreeBuilder&gt; TreeDeconstructionPattern Parser&lt;LexerType&gt;::createBindingPattern(TreeBuilder&amp; context, const Identifier&amp; name, int depth)
</del><ins>+template &lt;class TreeBuilder&gt; TreeDeconstructionPattern Parser&lt;LexerType&gt;::createBindingPattern(TreeBuilder&amp; context, DeconstructionKind kind, const Identifier&amp; name, int depth)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!name.isEmpty());
</span><span class="cx">     ASSERT(!name.isNull());
</span><span class="lines">@@ -524,11 +524,11 @@
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><span class="cx"> template &lt;class TreeBuilder&gt; TreeDeconstructionPattern Parser&lt;LexerType&gt;::tryParseDeconstructionPatternExpression(TreeBuilder&amp; context)
</span><span class="cx"> {
</span><del>-    return parseDeconstructionPattern&lt;DeconstructToExpressions&gt;(context);
</del><ins>+    return parseDeconstructionPattern(context, DeconstructToExpressions);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><del>-template &lt;DeconstructionKind kind, class TreeBuilder&gt; TreeDeconstructionPattern Parser&lt;LexerType&gt;::parseDeconstructionPattern(TreeBuilder&amp; context, int depth)
</del><ins>+template &lt;class TreeBuilder&gt; TreeDeconstructionPattern Parser&lt;LexerType&gt;::parseDeconstructionPattern(TreeBuilder&amp; context, DeconstructionKind kind, int depth)
</ins><span class="cx"> {
</span><span class="cx">     failIfStackOverflow();
</span><span class="cx">     int nonLHSCount = m_nonLHSCount;
</span><span class="lines">@@ -547,7 +547,7 @@
</span><span class="cx">             }
</span><span class="cx">             propagateError();
</span><span class="cx">             JSTokenLocation location = m_token.m_location;
</span><del>-            auto innerPattern = parseDeconstructionPattern&lt;kind&gt;(context, depth + 1);
</del><ins>+            auto innerPattern = parseDeconstructionPattern(context, kind, depth + 1);
</ins><span class="cx">             if (kind == DeconstructToExpressions &amp;&amp; !innerPattern)
</span><span class="cx">                 return 0;
</span><span class="cx">             failIfFalse(innerPattern, &quot;Cannot parse this deconstruction pattern&quot;);
</span><span class="lines">@@ -578,9 +578,9 @@
</span><span class="cx">                 propertyName = *m_token.m_data.ident;
</span><span class="cx">                 next();
</span><span class="cx">                 if (consume(COLON))
</span><del>-                    innerPattern = parseDeconstructionPattern&lt;kind&gt;(context, depth + 1);
</del><ins>+                    innerPattern = parseDeconstructionPattern(context, kind, depth + 1);
</ins><span class="cx">                 else
</span><del>-                    innerPattern = createBindingPattern&lt;kind&gt;(context, propertyName, depth);
</del><ins>+                    innerPattern = createBindingPattern(context, kind, propertyName, depth);
</ins><span class="cx">             } else {
</span><span class="cx">                 JSTokenType tokenType = m_token.m_type;
</span><span class="cx">                 switch (m_token.m_type) {
</span><span class="lines">@@ -610,7 +610,7 @@
</span><span class="cx">                     
</span><span class="cx">                     failWithMessage(&quot;Expected a ':' prior to named property deconstruction&quot;);
</span><span class="cx">                 }
</span><del>-                innerPattern = parseDeconstructionPattern&lt;kind&gt;(context, depth + 1);
</del><ins>+                innerPattern = parseDeconstructionPattern(context, kind, depth + 1);
</ins><span class="cx">             }
</span><span class="cx">             if (kind == DeconstructToExpressions &amp;&amp; !innerPattern)
</span><span class="cx">                 return 0;
</span><span class="lines">@@ -631,7 +631,7 @@
</span><span class="cx">             semanticFailureDueToKeyword(&quot;variable name&quot;);
</span><span class="cx">             failWithMessage(&quot;Expected a parameter pattern or a ')' in parameter list&quot;);
</span><span class="cx">         }
</span><del>-        pattern = createBindingPattern&lt;kind&gt;(context, *m_token.m_data.ident, depth);
</del><ins>+        pattern = createBindingPattern(context, kind, *m_token.m_data.ident, depth);
</ins><span class="cx">         next();
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -961,7 +961,7 @@
</span><span class="cx">     TreeExpression condition = parseExpression(context);
</span><span class="cx">     failIfFalse(condition, &quot;Cannot parse switch clause&quot;);
</span><span class="cx">     consumeOrFail(COLON, &quot;Expected a ':' after switch clause expression&quot;);
</span><del>-    TreeSourceElements statements = parseSourceElements&lt;DontCheckForStrictMode&gt;(context);
</del><ins>+    TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode);
</ins><span class="cx">     failIfFalse(statements, &quot;Cannot parse the body of a switch clause&quot;);
</span><span class="cx">     TreeClause clause = context.createClause(condition, statements);
</span><span class="cx">     TreeClauseList clauseList = context.createClauseList(clause);
</span><span class="lines">@@ -972,7 +972,7 @@
</span><span class="cx">         TreeExpression condition = parseExpression(context);
</span><span class="cx">         failIfFalse(condition, &quot;Cannot parse switch case expression&quot;);
</span><span class="cx">         consumeOrFail(COLON, &quot;Expected a ':' after switch clause expression&quot;);
</span><del>-        TreeSourceElements statements = parseSourceElements&lt;DontCheckForStrictMode&gt;(context);
</del><ins>+        TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode);
</ins><span class="cx">         failIfFalse(statements, &quot;Cannot parse the body of a switch clause&quot;);
</span><span class="cx">         clause = context.createClause(condition, statements);
</span><span class="cx">         tail = context.createClauseList(tail, clause);
</span><span class="lines">@@ -987,7 +987,7 @@
</span><span class="cx">         return 0;
</span><span class="cx">     next();
</span><span class="cx">     consumeOrFail(COLON, &quot;Expected a ':' after switch default clause&quot;);
</span><del>-    TreeSourceElements statements = parseSourceElements&lt;DontCheckForStrictMode&gt;(context);
</del><ins>+    TreeSourceElements statements = parseSourceElements(context, DontCheckForStrictMode);
</ins><span class="cx">     failIfFalse(statements, &quot;Cannot parse the body of a switch default clause&quot;);
</span><span class="cx">     return context.createClause(0, statements);
</span><span class="cx"> }
</span><span class="lines">@@ -1065,7 +1065,7 @@
</span><span class="cx">         next();
</span><span class="cx">         return context.createBlockStatement(location, 0, start, m_lastTokenEndPosition.line);
</span><span class="cx">     }
</span><del>-    TreeSourceElements subtree = parseSourceElements&lt;DontCheckForStrictMode&gt;(context);
</del><ins>+    TreeSourceElements subtree = parseSourceElements(context, DontCheckForStrictMode);
</ins><span class="cx">     failIfFalse(subtree, &quot;Cannot parse the body of the block statement&quot;);
</span><span class="cx">     matchOrFail(CLOSEBRACE, &quot;Expected a closing '}' at the end of a block statement&quot;);
</span><span class="cx">     next();
</span><span class="lines">@@ -1143,12 +1143,12 @@
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><span class="cx"> template &lt;class TreeBuilder&gt; TreeFormalParameterList Parser&lt;LexerType&gt;::parseFormalParameters(TreeBuilder&amp; context)
</span><span class="cx"> {
</span><del>-    auto parameter = parseDeconstructionPattern&lt;DeconstructToParameters&gt;(context);
</del><ins>+    auto parameter = parseDeconstructionPattern(context, DeconstructToParameters);
</ins><span class="cx">     failIfFalse(parameter, &quot;Cannot parse parameter pattern&quot;);
</span><span class="cx">     TreeFormalParameterList list = context.createFormalParameterList(parameter);
</span><span class="cx">     TreeFormalParameterList tail = list;
</span><span class="cx">     while (consume(COMMA)) {
</span><del>-        parameter = parseDeconstructionPattern&lt;DeconstructToParameters&gt;(context);
</del><ins>+        parameter = parseDeconstructionPattern(context, DeconstructToParameters);
</ins><span class="cx">         failIfFalse(parameter, &quot;Cannot parse parameter pattern&quot;);
</span><span class="cx">         tail = context.createFormalParameterList(tail, parameter);
</span><span class="cx">     }
</span><span class="lines">@@ -1169,7 +1169,7 @@
</span><span class="cx">     DepthManager statementDepth(&amp;m_statementDepth);
</span><span class="cx">     m_statementDepth = 0;
</span><span class="cx">     typename TreeBuilder::FunctionBodyBuilder bodyBuilder(const_cast&lt;VM*&gt;(m_vm), m_lexer.get());
</span><del>-    failIfFalse(parseSourceElements&lt;CheckForStrictMode&gt;(bodyBuilder), &quot;Cannot parse body of this function&quot;);
</del><ins>+    failIfFalse(parseSourceElements(bodyBuilder, CheckForStrictMode), &quot;Cannot parse body of this function&quot;);
</ins><span class="cx">     unsigned endColumn = tokenColumn();
</span><span class="cx">     return context.createFunctionBody(startLocation, tokenLocation(), startColumn, endColumn, strictMode());
</span><span class="cx"> }
</span><span class="lines">@@ -1189,7 +1189,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><del>-template &lt;FunctionRequirements requirements, FunctionParseMode mode, bool nameIsInContainingScope, class TreeBuilder&gt; bool Parser&lt;LexerType&gt;::parseFunctionInfo(TreeBuilder&amp; context, const Identifier*&amp; name, TreeFormalParameterList&amp; parameters, TreeFunctionBody&amp; body, unsigned&amp; openBraceOffset, unsigned&amp; closeBraceOffset, int&amp; bodyStartLine, unsigned&amp; bodyStartColumn)
</del><ins>+template &lt;class TreeBuilder&gt; bool Parser&lt;LexerType&gt;::parseFunctionInfo(TreeBuilder&amp; context, FunctionRequirements requirements, FunctionParseMode mode, bool nameIsInContainingScope, const Identifier*&amp; name, TreeFormalParameterList&amp; parameters, TreeFunctionBody&amp; body, unsigned&amp; openBraceOffset, unsigned&amp; closeBraceOffset, int&amp; bodyStartLine, unsigned&amp; bodyStartColumn)
</ins><span class="cx"> {
</span><span class="cx">     AutoPopScopeRef functionScope(this, pushScope());
</span><span class="cx">     functionScope-&gt;setIsFunction();
</span><span class="lines">@@ -1311,7 +1311,7 @@
</span><span class="cx">     unsigned closeBraceOffset = 0;
</span><span class="cx">     int bodyStartLine = 0;
</span><span class="cx">     unsigned bodyStartColumn = 0;
</span><del>-    failIfFalse((parseFunctionInfo&lt;FunctionNeedsName, FunctionMode, true&gt;(context, name, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn)), &quot;Cannot parse this function&quot;);
</del><ins>+    failIfFalse((parseFunctionInfo(context, FunctionNeedsName, FunctionMode, true, name, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn)), &quot;Cannot parse this function&quot;);
</ins><span class="cx">     failIfFalse(name, &quot;Function statements must have a name&quot;);
</span><span class="cx">     failIfFalseIfStrict(declareVariable(name), &quot;Cannot declare a function named '&quot;, name-&gt;impl(), &quot;' in strict mode&quot;);
</span><span class="cx">     return context.createFuncDeclStatement(location, name, body, parameters, openBraceOffset, closeBraceOffset, bodyStartLine, m_lastTokenEndPosition.line, bodyStartColumn);
</span><span class="lines">@@ -1673,7 +1673,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><del>-template &lt;bool complete, class TreeBuilder&gt; TreeProperty Parser&lt;LexerType&gt;::parseProperty(TreeBuilder&amp; context)
</del><ins>+template &lt;class TreeBuilder&gt; TreeProperty Parser&lt;LexerType&gt;::parseProperty(TreeBuilder&amp; context, bool complete)
</ins><span class="cx"> {
</span><span class="cx">     bool wasIdent = false;
</span><span class="cx">     switch (m_token.m_type) {
</span><span class="lines">@@ -1691,7 +1691,7 @@
</span><span class="cx">             next();
</span><span class="cx">             TreeExpression node = parseAssignmentExpression(context);
</span><span class="cx">             failIfFalse(node, &quot;Cannot parse expression for property declaration&quot;);
</span><del>-            return context.template createProperty&lt;complete&gt;(ident, node, PropertyNode::Constant);
</del><ins>+            return context.createProperty(ident, node, PropertyNode::Constant, complete);
</ins><span class="cx">         }
</span><span class="cx">         failIfFalse(wasIdent, &quot;Expected an identifier as property name&quot;);
</span><span class="cx">         const Identifier* accessorName = 0;
</span><span class="lines">@@ -1720,14 +1720,14 @@
</span><span class="cx">         next();
</span><span class="cx">         if (type == PropertyNode::Getter) {
</span><span class="cx">             failIfFalse(match(OPENPAREN), &quot;Expected a parameter list for getter definition&quot;);
</span><del>-            failIfFalse((parseFunctionInfo&lt;FunctionNoRequirements, GetterMode, false&gt;(context, accessorName, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn)), &quot;Cannot parse getter definition&quot;);
</del><ins>+            failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, GetterMode, false, accessorName, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn)), &quot;Cannot parse getter definition&quot;);
</ins><span class="cx">         } else {
</span><span class="cx">             failIfFalse(match(OPENPAREN), &quot;Expected a parameter list for setter definition&quot;);
</span><del>-            failIfFalse((parseFunctionInfo&lt;FunctionNoRequirements, SetterMode, false&gt;(context, accessorName, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn)), &quot;Cannot parse setter definition&quot;);
</del><ins>+            failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, SetterMode, false, accessorName, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn)), &quot;Cannot parse setter definition&quot;);
</ins><span class="cx">         }
</span><span class="cx">         if (stringPropertyName)
</span><del>-            return context.template createGetterOrSetterProperty&lt;complete&gt;(location, type, stringPropertyName, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, m_lastTokenEndPosition.line, bodyStartColumn);
-        return context.template createGetterOrSetterProperty&lt;complete&gt;(const_cast&lt;VM*&gt;(m_vm), location, type, numericPropertyName, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, m_lastTokenEndPosition.line, bodyStartColumn);
</del><ins>+            return context.createGetterOrSetterProperty(location, type, complete, stringPropertyName, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, m_lastTokenEndPosition.line, bodyStartColumn);
+        return context.createGetterOrSetterProperty(const_cast&lt;VM*&gt;(m_vm), location, type, complete, numericPropertyName, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, m_lastTokenEndPosition.line, bodyStartColumn);
</ins><span class="cx">     }
</span><span class="cx">     case NUMBER: {
</span><span class="cx">         double propertyName = m_token.m_data.doubleValue;
</span><span class="lines">@@ -1735,7 +1735,7 @@
</span><span class="cx">         consumeOrFail(COLON, &quot;Expected ':' after property name&quot;);
</span><span class="cx">         TreeExpression node = parseAssignmentExpression(context);
</span><span class="cx">         failIfFalse(node, &quot;Cannot parse expression for property declaration&quot;);
</span><del>-        return context.template createProperty&lt;complete&gt;(const_cast&lt;VM*&gt;(m_vm), propertyName, node, PropertyNode::Constant);
</del><ins>+        return context.createProperty(const_cast&lt;VM*&gt;(m_vm), propertyName, node, PropertyNode::Constant, complete);
</ins><span class="cx">     }
</span><span class="cx">     case OPENBRACKET: {
</span><span class="cx">         next();
</span><span class="lines">@@ -1746,7 +1746,7 @@
</span><span class="cx">         consumeOrFail(COLON, &quot;Expected ':' after property name&quot;);
</span><span class="cx">         TreeExpression node = parseAssignmentExpression(context);
</span><span class="cx">         failIfFalse(node, &quot;Cannot parse expression for property declaration&quot;);
</span><del>-        return context.template createProperty&lt;complete&gt;(const_cast&lt;VM*&gt;(m_vm), propertyName, node, PropertyNode::Constant);
</del><ins>+        return context.createProperty(const_cast&lt;VM*&gt;(m_vm), propertyName, node, PropertyNode::Constant, complete);
</ins><span class="cx">     }
</span><span class="cx">     default:
</span><span class="cx">         failIfFalse(m_token.m_type &amp; KeywordTokenFlag, &quot;Expected a property name&quot;);
</span><span class="lines">@@ -1768,7 +1768,7 @@
</span><span class="cx">         return context.createObjectLiteral(location);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    TreeProperty property = parseProperty&lt;false&gt;(context);
</del><ins>+    TreeProperty property = parseProperty(context, false);
</ins><span class="cx">     failIfFalse(property, &quot;Cannot parse object literal property&quot;);
</span><span class="cx">     if (!m_syntaxAlreadyValidated &amp;&amp; context.getType(property) != PropertyNode::Constant) {
</span><span class="cx">         restoreSavePoint(savePoint);
</span><span class="lines">@@ -1782,7 +1782,7 @@
</span><span class="cx">         if (match(CLOSEBRACE))
</span><span class="cx">             break;
</span><span class="cx">         JSTokenLocation propertyLocation(tokenLocation());
</span><del>-        property = parseProperty&lt;false&gt;(context);
</del><ins>+        property = parseProperty(context, false);
</ins><span class="cx">         failIfFalse(property, &quot;Cannot parse object literal property&quot;);
</span><span class="cx">         if (!m_syntaxAlreadyValidated &amp;&amp; context.getType(property) != PropertyNode::Constant) {
</span><span class="cx">             restoreSavePoint(savePoint);
</span><span class="lines">@@ -1812,7 +1812,7 @@
</span><span class="cx">         return context.createObjectLiteral(location);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    TreeProperty property = parseProperty&lt;true&gt;(context);
</del><ins>+    TreeProperty property = parseProperty(context, true);
</ins><span class="cx">     failIfFalse(property, &quot;Cannot parse object literal property&quot;);
</span><span class="cx">     
</span><span class="cx">     typedef HashMap&lt;RefPtr&lt;StringImpl&gt;, unsigned, IdentifierRepHash&gt; ObjectValidationMap;
</span><span class="lines">@@ -1829,7 +1829,7 @@
</span><span class="cx">         if (match(CLOSEBRACE))
</span><span class="cx">             break;
</span><span class="cx">         JSTokenLocation propertyLocation(tokenLocation());
</span><del>-        property = parseProperty&lt;true&gt;(context);
</del><ins>+        property = parseProperty(context, true);
</ins><span class="cx">         failIfFalse(property, &quot;Cannot parse object literal property&quot;);
</span><span class="cx">         if (!m_syntaxAlreadyValidated &amp;&amp; context.getName(property)) {
</span><span class="cx">             ObjectValidationMap::AddResult propertyEntry = objectValidator.add(context.getName(property)-&gt;impl(), context.getType(property));
</span><span class="lines">@@ -2076,7 +2076,7 @@
</span><span class="cx">         unsigned bodyStartColumn = 0;
</span><span class="cx">         location = tokenLocation();
</span><span class="cx">         next();
</span><del>-        failIfFalse((parseFunctionInfo&lt;FunctionNoRequirements, FunctionMode, false&gt;(context, name, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn)), &quot;Cannot parse function expression&quot;);
</del><ins>+        failIfFalse((parseFunctionInfo(context, FunctionNoRequirements, FunctionMode, false, name, parameters, body, openBraceOffset, closeBraceOffset, bodyStartLine, bodyStartColumn)), &quot;Cannot parse function expression&quot;);
</ins><span class="cx">         base = context.createFunctionExpr(location, name, body, parameters, openBraceOffset, closeBraceOffset, bodyStartLine, m_lastTokenEndPosition.line, bodyStartColumn);
</span><span class="cx">     } else
</span><span class="cx">         base = parsePrimaryExpression(context);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.h (160382 => 160383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.h        2013-12-10 21:10:13 UTC (rev 160382)
+++ trunk/Source/JavaScriptCore/parser/Parser.h        2013-12-10 21:19:15 UTC (rev 160383)
</span><span class="lines">@@ -699,7 +699,7 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    template &lt;SourceElementsMode mode, class TreeBuilder&gt; TreeSourceElements parseSourceElements(TreeBuilder&amp;);
</del><ins>+    template &lt;class TreeBuilder&gt; TreeSourceElements parseSourceElements(TreeBuilder&amp;, SourceElementsMode);
</ins><span class="cx">     template &lt;class TreeBuilder&gt; TreeStatement parseStatement(TreeBuilder&amp;, const Identifier*&amp; directive, unsigned* directiveLiteralLength = 0);
</span><span class="cx">     template &lt;class TreeBuilder&gt; TreeStatement parseFunctionDeclaration(TreeBuilder&amp;);
</span><span class="cx">     template &lt;class TreeBuilder&gt; TreeStatement parseVarDeclaration(TreeBuilder&amp;);
</span><span class="lines">@@ -720,7 +720,7 @@
</span><span class="cx">     template &lt;class TreeBuilder&gt; TreeStatement parseExpressionStatement(TreeBuilder&amp;);
</span><span class="cx">     template &lt;class TreeBuilder&gt; TreeStatement parseExpressionOrLabelStatement(TreeBuilder&amp;);
</span><span class="cx">     template &lt;class TreeBuilder&gt; TreeStatement parseIfStatement(TreeBuilder&amp;);
</span><del>-    template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeStatement parseBlockStatement(TreeBuilder&amp;);
</del><ins>+    template &lt;class TreeBuilder&gt; TreeStatement parseBlockStatement(TreeBuilder&amp;);
</ins><span class="cx">     template &lt;class TreeBuilder&gt; TreeExpression parseExpression(TreeBuilder&amp;);
</span><span class="cx">     template &lt;class TreeBuilder&gt; TreeExpression parseAssignmentExpression(TreeBuilder&amp;);
</span><span class="cx">     template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeExpression parseConditionalExpression(TreeBuilder&amp;);
</span><span class="lines">@@ -730,19 +730,19 @@
</span><span class="cx">     template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeExpression parsePrimaryExpression(TreeBuilder&amp;);
</span><span class="cx">     template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeExpression parseArrayLiteral(TreeBuilder&amp;);
</span><span class="cx">     template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeExpression parseObjectLiteral(TreeBuilder&amp;);
</span><del>-    template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeExpression parseStrictObjectLiteral(TreeBuilder&amp;);
</del><ins>+    template &lt;class TreeBuilder&gt; NEVER_INLINE TreeExpression parseStrictObjectLiteral(TreeBuilder&amp;);
</ins><span class="cx">     enum SpreadMode { AllowSpread, DontAllowSpread };
</span><span class="cx">     template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeArguments parseArguments(TreeBuilder&amp;, SpreadMode);
</span><del>-    template &lt;bool strict, class TreeBuilder&gt; ALWAYS_INLINE TreeProperty parseProperty(TreeBuilder&amp;);
</del><ins>+    template &lt;class TreeBuilder&gt; TreeProperty parseProperty(TreeBuilder&amp;, bool strict);
</ins><span class="cx">     template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeFunctionBody parseFunctionBody(TreeBuilder&amp;);
</span><span class="cx">     template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeFormalParameterList parseFormalParameters(TreeBuilder&amp;);
</span><del>-    template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeExpression parseVarDeclarationList(TreeBuilder&amp;, int&amp; declarations, TreeDeconstructionPattern&amp; lastPattern, TreeExpression&amp; lastInitializer, JSTextPosition&amp; identStart, JSTextPosition&amp; initStart, JSTextPosition&amp; initEnd);
-    template &lt;class TreeBuilder&gt; ALWAYS_INLINE TreeConstDeclList parseConstDeclarationList(TreeBuilder&amp;);
</del><ins>+    template &lt;class TreeBuilder&gt; TreeExpression parseVarDeclarationList(TreeBuilder&amp;, int&amp; declarations, TreeDeconstructionPattern&amp; lastPattern, TreeExpression&amp; lastInitializer, JSTextPosition&amp; identStart, JSTextPosition&amp; initStart, JSTextPosition&amp; initEnd);
+    template &lt;class TreeBuilder&gt; NEVER_INLINE TreeConstDeclList parseConstDeclarationList(TreeBuilder&amp;);
</ins><span class="cx"> 
</span><del>-    template &lt;DeconstructionKind, class TreeBuilder&gt; ALWAYS_INLINE TreeDeconstructionPattern createBindingPattern(TreeBuilder&amp;, const Identifier&amp;, int depth);
-    template &lt;DeconstructionKind, class TreeBuilder&gt; TreeDeconstructionPattern parseDeconstructionPattern(TreeBuilder&amp;, int depth = 0);
</del><ins>+    template &lt;class TreeBuilder&gt; NEVER_INLINE TreeDeconstructionPattern createBindingPattern(TreeBuilder&amp;, DeconstructionKind, const Identifier&amp;, int depth);
+    template &lt;class TreeBuilder&gt; NEVER_INLINE TreeDeconstructionPattern parseDeconstructionPattern(TreeBuilder&amp;, DeconstructionKind, int depth = 0);
</ins><span class="cx">     template &lt;class TreeBuilder&gt; NEVER_INLINE TreeDeconstructionPattern tryParseDeconstructionPatternExpression(TreeBuilder&amp;);
</span><del>-    template &lt;FunctionRequirements, FunctionParseMode, bool nameIsInContainingScope, class TreeBuilder&gt; bool parseFunctionInfo(TreeBuilder&amp;, const Identifier*&amp;, TreeFormalParameterList&amp;, TreeFunctionBody&amp;, unsigned&amp; openBraceOffset, unsigned&amp; closeBraceOffset, int&amp; bodyStartLine, unsigned&amp; bodyStartColumn);
</del><ins>+    template &lt;class TreeBuilder&gt; NEVER_INLINE bool parseFunctionInfo(TreeBuilder&amp;, FunctionRequirements, FunctionParseMode, bool nameIsInContainingScope, const Identifier*&amp;, TreeFormalParameterList&amp;, TreeFunctionBody&amp;, unsigned&amp; openBraceOffset, unsigned&amp; closeBraceOffset, int&amp; bodyStartLine, unsigned&amp; bodyStartColumn);
</ins><span class="cx">     ALWAYS_INLINE int isBinaryOperator(JSTokenType);
</span><span class="cx">     bool allowAutomaticSemicolon();
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSyntaxCheckerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SyntaxChecker.h (160382 => 160383)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2013-12-10 21:10:13 UTC (rev 160382)
+++ trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2013-12-10 21:19:15 UTC (rev 160383)
</span><span class="lines">@@ -160,20 +160,20 @@
</span><span class="cx">     ExpressionType createSpreadExpression(const JSTokenLocation&amp;, ExpressionType, int, int, int) { return 1; }
</span><span class="cx">     int createArgumentsList(const JSTokenLocation&amp;, int) { return 1; }
</span><span class="cx">     int createArgumentsList(const JSTokenLocation&amp;, int, int) { return 1; }
</span><del>-    template &lt;bool complete&gt; Property createProperty(const Identifier* name, int, PropertyNode::Type type)
</del><ins>+    Property createProperty(const Identifier* name, int, PropertyNode::Type type, bool complete)
</ins><span class="cx">     {
</span><span class="cx">         if (!complete)
</span><span class="cx">             return Property(type);
</span><span class="cx">         ASSERT(name);
</span><span class="cx">         return Property(name, type);
</span><span class="cx">     }
</span><del>-    template &lt;bool complete&gt; Property createProperty(VM* vm, double name, int, PropertyNode::Type type)
</del><ins>+    Property createProperty(VM* vm, double name, int, PropertyNode::Type type, bool complete)
</ins><span class="cx">     {
</span><span class="cx">         if (!complete)
</span><span class="cx">             return Property(type);
</span><span class="cx">         return Property(&amp;vm-&gt;parserArena-&gt;identifierArena().makeNumericIdentifier(vm, name), type);
</span><span class="cx">     }
</span><del>-    template &lt;bool complete&gt; Property createProperty(VM*, ExpressionNode*, int, PropertyNode::Type type)
</del><ins>+    Property createProperty(VM*, ExpressionNode*, int, PropertyNode::Type type, bool)
</ins><span class="cx">     {
</span><span class="cx">         return Property(type);
</span><span class="cx">     }
</span><span class="lines">@@ -212,14 +212,14 @@
</span><span class="cx">     int createDebugger(const JSTokenLocation&amp;, int, int) { return 1; }
</span><span class="cx">     int createConstStatement(const JSTokenLocation&amp;, int, int, int) { return 1; }
</span><span class="cx">     int appendConstDecl(const JSTokenLocation&amp;, int, const Identifier*, int) { return 1; }
</span><del>-    template &lt;bool strict&gt; Property createGetterOrSetterProperty(const JSTokenLocation&amp;, PropertyNode::Type type, const Identifier* name, int, int, int, int, int, int, int)
</del><ins>+    Property createGetterOrSetterProperty(const JSTokenLocation&amp;, PropertyNode::Type type, bool strict, const Identifier* name, int, int, int, int, int, int, int)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(name);
</span><span class="cx">         if (!strict)
</span><span class="cx">             return Property(type);
</span><span class="cx">         return Property(name, type);
</span><span class="cx">     }
</span><del>-    template &lt;bool strict&gt; Property createGetterOrSetterProperty(VM* vm, const JSTokenLocation&amp;, PropertyNode::Type type, double name, int, int, int, int, int, int, int)
</del><ins>+    Property createGetterOrSetterProperty(VM* vm, const JSTokenLocation&amp;, PropertyNode::Type type, bool strict, double name, int, int, int, int, int, int, int)
</ins><span class="cx">     {
</span><span class="cx">         if (!strict)
</span><span class="cx">             return Property(type);
</span></span></pre>
</div>
</div>

</body>
</html>