<!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>[37275] trunk/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/37275">37275</a></dd>
<dt>Author</dt> <dd>mjs@apple.com</dd>
<dt>Date</dt> <dd>2008-10-03 18:39:43 -0700 (Fri, 03 Oct 2008)</dd>
</dl>

<h3>Log Message</h3>
<pre>2008-10-03  Maciej Stachowiak  &lt;mjs@apple.com&gt;

        Reviewed by Cameron Zwarich.
        
        - Some code cleanup to how we handle code features.
        
        1) Rename FeatureInfo typedef to CodeFeatures.
        2) Rename NodeFeatureInfo template to NodeInfo.
        3) Keep CodeFeature bitmask in ScopeNode instead of trying to break it out into individual bools.
        4) Rename misleadingly named &quot;needsClosure&quot; method to &quot;containsClosures&quot;, which better describes the meaning
        of ClosureFeature.
        5) Make setUsersArguments() not take an argument since it only goes one way.

        * JavaScriptCore.exp:
        * VM/CodeBlock.h:
        (JSC::CodeBlock::CodeBlock):
        * kjs/NodeInfo.h:
        * kjs/Parser.cpp:
        (JSC::Parser::didFinishParsing):
        * kjs/Parser.h:
        (JSC::Parser::parse):
        * kjs/grammar.y:
        * kjs/nodes.cpp:
        (JSC::ScopeNode::ScopeNode):
        (JSC::ProgramNode::ProgramNode):
        (JSC::ProgramNode::create):
        (JSC::EvalNode::EvalNode):
        (JSC::EvalNode::create):
        (JSC::FunctionBodyNode::FunctionBodyNode):
        (JSC::FunctionBodyNode::create):
        * kjs/nodes.h:
        (JSC::ScopeNode::usesEval):
        (JSC::ScopeNode::containsClosures):
        (JSC::ScopeNode::usesArguments):
        (JSC::ScopeNode::setUsesArguments):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJavaScriptCoreChangeLog">trunk/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkJavaScriptCoreJavaScriptCoreexp">trunk/JavaScriptCore/JavaScriptCore.exp</a></li>
<li><a href="#trunkJavaScriptCoreVMCodeBlockh">trunk/JavaScriptCore/VM/CodeBlock.h</a></li>
<li><a href="#trunkJavaScriptCorekjsNodeInfoh">trunk/JavaScriptCore/kjs/NodeInfo.h</a></li>
<li><a href="#trunkJavaScriptCorekjsParsercpp">trunk/JavaScriptCore/kjs/Parser.cpp</a></li>
<li><a href="#trunkJavaScriptCorekjsParserh">trunk/JavaScriptCore/kjs/Parser.h</a></li>
<li><a href="#trunkJavaScriptCorekjsgrammary">trunk/JavaScriptCore/kjs/grammar.y</a></li>
<li><a href="#trunkJavaScriptCorekjsnodescpp">trunk/JavaScriptCore/kjs/nodes.cpp</a></li>
<li><a href="#trunkJavaScriptCorekjsnodesh">trunk/JavaScriptCore/kjs/nodes.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/ChangeLog (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/ChangeLog        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/ChangeLog        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2008-10-03  Maciej Stachowiak  &lt;mjs@apple.com&gt;
+
+        Reviewed by Cameron Zwarich.
+        
+        - Some code cleanup to how we handle code features.
+        
+        1) Rename FeatureInfo typedef to CodeFeatures.
+        2) Rename NodeFeatureInfo template to NodeInfo.
+        3) Keep CodeFeature bitmask in ScopeNode instead of trying to break it out into individual bools.
+        4) Rename misleadingly named &quot;needsClosure&quot; method to &quot;containsClosures&quot;, which better describes the meaning
+        of ClosureFeature.
+        5) Make setUsersArguments() not take an argument since it only goes one way.
+
+        * JavaScriptCore.exp:
+        * VM/CodeBlock.h:
+        (JSC::CodeBlock::CodeBlock):
+        * kjs/NodeInfo.h:
+        * kjs/Parser.cpp:
+        (JSC::Parser::didFinishParsing):
+        * kjs/Parser.h:
+        (JSC::Parser::parse):
+        * kjs/grammar.y:
+        * kjs/nodes.cpp:
+        (JSC::ScopeNode::ScopeNode):
+        (JSC::ProgramNode::ProgramNode):
+        (JSC::ProgramNode::create):
+        (JSC::EvalNode::EvalNode):
+        (JSC::EvalNode::create):
+        (JSC::FunctionBodyNode::FunctionBodyNode):
+        (JSC::FunctionBodyNode::create):
+        * kjs/nodes.h:
+        (JSC::ScopeNode::usesEval):
+        (JSC::ScopeNode::containsClosures):
+        (JSC::ScopeNode::usesArguments):
+        (JSC::ScopeNode::setUsesArguments):
+
</ins><span class="cx"> 2008-10-03  Cameron Zwarich  &lt;zwarich@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Maciej Stachowiak.
</span></span></pre></div>
<a id="trunkJavaScriptCoreJavaScriptCoreexp"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/JavaScriptCore.exp (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/JavaScriptCore.exp        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/JavaScriptCore.exp        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -107,7 +107,7 @@
</span><span class="cx"> __ZN3JSC11JSImmediate8toStringEPKNS_7JSValueE
</span><span class="cx"> __ZN3JSC11JSImmediate9prototypeEPKNS_7JSValueEPNS_9ExecStateE
</span><span class="cx"> __ZN3JSC11ProfileNode4sortEPFbRKN3WTF6RefPtrIS0_EES5_E
</span><del>-__ZN3JSC11ProgramNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm16EEERKNS_10SourceCodeEbbbi
</del><ins>+__ZN3JSC11ProgramNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm16EEERKNS_10SourceCodeEji
</ins><span class="cx"> __ZN3JSC11PropertyMap3putERKNS_10IdentifierEPNS_7JSValueEjbPNS_8JSObjectERNS_15PutPropertySlotERPS5_
</span><span class="cx"> __ZN3JSC11PropertyMap9getOffsetERKNS_10IdentifierERj
</span><span class="cx"> __ZN3JSC11PropertyMapD1Ev
</span></span></pre></div>
<a id="trunkJavaScriptCoreVMCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/VM/CodeBlock.h (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/VM/CodeBlock.h        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/VM/CodeBlock.h        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -192,7 +192,7 @@
</span><span class="cx">             , numConstants(0)
</span><span class="cx">             , numVars(0)
</span><span class="cx">             , numParameters(0)
</span><del>-            , needsFullScopeChain(ownerNode_-&gt;usesEval() || ownerNode_-&gt;needsClosure())
</del><ins>+            , needsFullScopeChain(ownerNode_-&gt;usesEval() || ownerNode_-&gt;containsClosures())
</ins><span class="cx">             , usesEval(ownerNode_-&gt;usesEval())
</span><span class="cx">             , codeType(codeType_)
</span><span class="cx">             , source(source_)
</span></span></pre></div>
<a id="trunkJavaScriptCorekjsNodeInfoh"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/kjs/NodeInfo.h (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/kjs/NodeInfo.h        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/kjs/NodeInfo.h        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -25,39 +25,27 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-    typedef unsigned int FeatureInfo;
-
-    const FeatureInfo NoFeatures = 0;
-    const FeatureInfo EvalFeature = 1 &lt;&lt; 0;
-    const FeatureInfo ClosureFeature = 1 &lt;&lt; 1;
-    const FeatureInfo AssignFeature = 1 &lt;&lt; 2;
-    const FeatureInfo ArgumentsFeature = 1 &lt;&lt; 3;
-    const FeatureInfo WithFeature = 1 &lt;&lt; 4;
-    const FeatureInfo CatchFeature = 1 &lt;&lt; 5;
-    const FeatureInfo ThisFeature = 1 &lt;&lt; 6;
-    const FeatureInfo AllFeatures = EvalFeature | ClosureFeature | AssignFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature;
-
-    template &lt;typename T&gt; struct NodeFeatureInfo {
</del><ins>+    template &lt;typename T&gt; struct NodeInfo {
</ins><span class="cx">         T m_node;
</span><del>-        FeatureInfo m_featureInfo;
</del><ins>+        CodeFeatures m_features;
</ins><span class="cx">         int m_numConstants;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    typedef NodeFeatureInfo&lt;FuncDeclNode*&gt; FuncDeclNodeInfo;    
-    typedef NodeFeatureInfo&lt;FuncExprNode*&gt; FuncExprNodeInfo;
-    typedef NodeFeatureInfo&lt;ExpressionNode*&gt; ExpressionNodeInfo;
-    typedef NodeFeatureInfo&lt;ArgumentsNode*&gt; ArgumentsNodeInfo;
-    typedef NodeFeatureInfo&lt;ConstDeclNode*&gt; ConstDeclNodeInfo;
-    typedef NodeFeatureInfo&lt;PropertyNode*&gt; PropertyNodeInfo;
-    typedef NodeFeatureInfo&lt;PropertyList&gt; PropertyListInfo;
-    typedef NodeFeatureInfo&lt;ElementList&gt; ElementListInfo;
-    typedef NodeFeatureInfo&lt;ArgumentList&gt; ArgumentListInfo;
</del><ins>+    typedef NodeInfo&lt;FuncDeclNode*&gt; FuncDeclNodeInfo;    
+    typedef NodeInfo&lt;FuncExprNode*&gt; FuncExprNodeInfo;
+    typedef NodeInfo&lt;ExpressionNode*&gt; ExpressionNodeInfo;
+    typedef NodeInfo&lt;ArgumentsNode*&gt; ArgumentsNodeInfo;
+    typedef NodeInfo&lt;ConstDeclNode*&gt; ConstDeclNodeInfo;
+    typedef NodeInfo&lt;PropertyNode*&gt; PropertyNodeInfo;
+    typedef NodeInfo&lt;PropertyList&gt; PropertyListInfo;
+    typedef NodeInfo&lt;ElementList&gt; ElementListInfo;
+    typedef NodeInfo&lt;ArgumentList&gt; ArgumentListInfo;
</ins><span class="cx">     
</span><span class="cx">     template &lt;typename T&gt; struct NodeDeclarationInfo {
</span><span class="cx">         T m_node;
</span><span class="cx">         ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;* m_varDeclarations;
</span><span class="cx">         ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt;* m_funcDeclarations;
</span><del>-        FeatureInfo m_featureInfo;
</del><ins>+        CodeFeatures m_features;
</ins><span class="cx">         int m_numConstants;
</span><span class="cx">     };
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkJavaScriptCorekjsParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/kjs/Parser.cpp (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/kjs/Parser.cpp        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/kjs/Parser.cpp        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -67,14 +67,12 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Parser::didFinishParsing(SourceElements* sourceElements, ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;* varStack, 
</span><del>-                              ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt;* funcStack, bool usesEval, bool needsClosure, bool usesArguments, int lastLine, int numConstants)
</del><ins>+                              ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt;* funcStack, CodeFeatures features, int lastLine, int numConstants)
</ins><span class="cx"> {
</span><span class="cx">     m_sourceElements = sourceElements;
</span><span class="cx">     m_varDeclarations = varStack;
</span><span class="cx">     m_funcDeclarations = funcStack;
</span><del>-    m_usesEval = usesEval;
-    m_needsClosure = needsClosure;
-    m_usesArguments = usesArguments;
</del><ins>+    m_features = features;
</ins><span class="cx">     m_lastLine = lastLine;
</span><span class="cx">     m_numConstants = numConstants;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkJavaScriptCorekjsParserh"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/kjs/Parser.h (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/kjs/Parser.h        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/kjs/Parser.h        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx">         template &lt;class ParsedNode&gt; PassRefPtr&lt;ParsedNode&gt; parse(ExecState*, const SourceCode&amp;, int* errLine = 0, UString* errMsg = 0);
</span><span class="cx"> 
</span><span class="cx">         void didFinishParsing(SourceElements*, ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;*, 
</span><del>-                              ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt;*, bool usesEval, bool needsClosure, bool usesArguments, int lastLine, int numConstants);
</del><ins>+                              ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt;*, CodeFeatures features, int lastLine, int numConstants);
</ins><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         friend class JSGlobalData;
</span><span class="lines">@@ -63,9 +63,7 @@
</span><span class="cx">         RefPtr&lt;SourceElements&gt; m_sourceElements;
</span><span class="cx">         RefPtr&lt;ParserRefCountedData&lt;DeclarationStacks::VarStack&gt; &gt; m_varDeclarations;
</span><span class="cx">         RefPtr&lt;ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt; &gt; m_funcDeclarations;
</span><del>-        bool m_usesEval;
-        bool m_needsClosure;
-        bool m_usesArguments;
</del><ins>+        CodeFeatures m_features;
</ins><span class="cx">         int m_lastLine;
</span><span class="cx">         int m_numConstants;
</span><span class="cx">     };
</span><span class="lines">@@ -81,9 +79,7 @@
</span><span class="cx">                                          m_varDeclarations ? &amp;m_varDeclarations-&gt;data : 0, 
</span><span class="cx">                                          m_funcDeclarations ? &amp;m_funcDeclarations-&gt;data : 0,
</span><span class="cx">                                          *m_source,
</span><del>-                                         m_usesEval,
-                                         m_needsClosure,
-                                         m_usesArguments,
</del><ins>+                                         m_features,
</ins><span class="cx">                                          m_numConstants);
</span><span class="cx">             result-&gt;setLoc(m_source-&gt;firstLine(), m_lastLine);
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkJavaScriptCorekjsgrammary"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/kjs/grammar.y (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/kjs/grammar.y        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/kjs/grammar.y        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -100,7 +100,7 @@
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename T&gt; NodeDeclarationInfo&lt;T&gt; createNodeDeclarationInfo(T node, ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;* varDecls, 
</span><span class="cx">                                                                        ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt;* funcDecls,
</span><del>-                                                                       FeatureInfo info,
</del><ins>+                                                                       CodeFeatures info,
</ins><span class="cx">                                                                        int numConstants) 
</span><span class="cx"> {
</span><span class="cx">     ASSERT((info &amp; ~AllFeatures) == 0);
</span><span class="lines">@@ -108,10 +108,10 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename T&gt; NodeFeatureInfo&lt;T&gt; createNodeFeatureInfo(T node, FeatureInfo info, int numConstants)
</del><ins>+template &lt;typename T&gt; NodeInfo&lt;T&gt; createNodeInfo(T node, CodeFeatures info, int numConstants)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT((info &amp; ~AllFeatures) == 0);
</span><del>-    NodeFeatureInfo&lt;T&gt; result = {node, info, numConstants};
</del><ins>+    NodeInfo&lt;T&gt; result = {node, info, numConstants};
</ins><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -283,11 +283,11 @@
</span><span class="cx"> %%
</span><span class="cx"> 
</span><span class="cx"> Literal:
</span><del>-    NULLTOKEN                           { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new NullNode(GLOBAL_DATA), 0, 1); }
-  | TRUETOKEN                           { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BooleanNode(GLOBAL_DATA, true), 0, 1); }
-  | FALSETOKEN                          { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BooleanNode(GLOBAL_DATA, false), 0, 1); }
-  | NUMBER                              { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeNumberNode(GLOBAL_DATA, $1), 0, 1); }
-  | STRING                              { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new StringNode(GLOBAL_DATA, *$1), 0, 1); }
</del><ins>+    NULLTOKEN                           { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new NullNode(GLOBAL_DATA), 0, 1); }
+  | TRUETOKEN                           { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BooleanNode(GLOBAL_DATA, true), 0, 1); }
+  | FALSETOKEN                          { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BooleanNode(GLOBAL_DATA, false), 0, 1); }
+  | NUMBER                              { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeNumberNode(GLOBAL_DATA, $1), 0, 1); }
+  | STRING                              { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new StringNode(GLOBAL_DATA, *$1), 0, 1); }
</ins><span class="cx">   | '/' /* regexp */                    {
</span><span class="cx">                                             Lexer&amp; l = *LEXER;
</span><span class="cx">                                             if (!l.scanRegExp())
</span><span class="lines">@@ -295,7 +295,7 @@
</span><span class="cx">                                             RegExpNode* node = new RegExpNode(GLOBAL_DATA, l.pattern(), l.flags());
</span><span class="cx">                                             int size = l.pattern().size() + 2; // + 2 for the two /'s
</span><span class="cx">                                             SET_EXCEPTION_LOCATION(node, @1.first_column, @1.first_column + size, @1.first_column + size);
</span><del>-                                            $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, 0, 0);
</del><ins>+                                            $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, 0, 0);
</ins><span class="cx">                                         }
</span><span class="cx">   | DIVEQUAL /* regexp with /= */       {
</span><span class="cx">                                             Lexer&amp; l = *LEXER;
</span><span class="lines">@@ -304,61 +304,68 @@
</span><span class="cx">                                             RegExpNode* node = new RegExpNode(GLOBAL_DATA, &quot;=&quot; + l.pattern(), l.flags());
</span><span class="cx">                                             int size = l.pattern().size() + 2; // + 2 for the two /'s
</span><span class="cx">                                             SET_EXCEPTION_LOCATION(node, @1.first_column, @1.first_column + size, @1.first_column + size);
</span><del>-                                            $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, 0, 0);
</del><ins>+                                            $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, 0, 0);
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> Property:
</span><del>-    IDENT ':' AssignmentExpr            { $$ = createNodeFeatureInfo&lt;PropertyNode*&gt;(new PropertyNode(GLOBAL_DATA, *$1, $3.m_node, PropertyNode::Constant), $3.m_featureInfo, $3.m_numConstants); }
-  | STRING ':' AssignmentExpr           { $$ = createNodeFeatureInfo&lt;PropertyNode*&gt;(new PropertyNode(GLOBAL_DATA, *$1, $3.m_node, PropertyNode::Constant), $3.m_featureInfo, $3.m_numConstants); }
-  | NUMBER ':' AssignmentExpr           { $$ = createNodeFeatureInfo&lt;PropertyNode*&gt;(new PropertyNode(GLOBAL_DATA, Identifier(GLOBAL_DATA, UString::from($1)), $3.m_node, PropertyNode::Constant), $3.m_featureInfo, $3.m_numConstants); }
-  | IDENT IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE    { $$ = createNodeFeatureInfo&lt;PropertyNode*&gt;(makeGetterOrSetterPropertyNode(globalPtr, *$1, *$2, 0, $6, LEXER-&gt;sourceCode($5, $7, @5.first_line)), ClosureFeature, 0); DBG($6, @5, @7); if (!$$.m_node) YYABORT; }
</del><ins>+    IDENT ':' AssignmentExpr            { $$ = createNodeInfo&lt;PropertyNode*&gt;(new PropertyNode(GLOBAL_DATA, *$1, $3.m_node, PropertyNode::Constant), $3.m_features, $3.m_numConstants); }
+  | STRING ':' AssignmentExpr           { $$ = createNodeInfo&lt;PropertyNode*&gt;(new PropertyNode(GLOBAL_DATA, *$1, $3.m_node, PropertyNode::Constant), $3.m_features, $3.m_numConstants); }
+  | NUMBER ':' AssignmentExpr           { $$ = createNodeInfo&lt;PropertyNode*&gt;(new PropertyNode(GLOBAL_DATA, Identifier(GLOBAL_DATA, UString::from($1)), $3.m_node, PropertyNode::Constant), $3.m_features, $3.m_numConstants); }
+  | IDENT IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE    { $$ = createNodeInfo&lt;PropertyNode*&gt;(makeGetterOrSetterPropertyNode(globalPtr, *$1, *$2, 0, $6, LEXER-&gt;sourceCode($5, $7, @5.first_line)), ClosureFeature, 0); DBG($6, @5, @7); if (!$$.m_node) YYABORT; }
</ins><span class="cx">   | IDENT IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;PropertyNode*&gt;(makeGetterOrSetterPropertyNode(globalPtr, *$1, *$2, $4.m_node.head, $7, LEXER-&gt;sourceCode($6, $8, @6.first_line)), $4.m_featureInfo | ClosureFeature, 0); $7-&gt;setUsesArguments($7-&gt;usesArguments() || (($4.m_featureInfo &amp; ArgumentsFeature) != 0)); DBG($7, @6, @8); if (!$$.m_node) YYABORT; }
</del><ins>+                                                             {
+                                                                 $$ = createNodeInfo&lt;PropertyNode*&gt;(makeGetterOrSetterPropertyNode(globalPtr, *$1, *$2, $4.m_node.head, $7, LEXER-&gt;sourceCode($6, $8, @6.first_line)), $4.m_features | ClosureFeature, 0); 
+                                                                 if ($4.m_features &amp; ArgumentsFeature)
+                                                                     $7-&gt;setUsesArguments(); 
+                                                                 DBG($7, @6, @8); 
+                                                                 if (!$$.m_node) 
+                                                                     YYABORT; 
+                                                             }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> PropertyList:
</span><span class="cx">     Property                            { $$.m_node.head = new PropertyListNode(GLOBAL_DATA, $1.m_node); 
</span><span class="cx">                                           $$.m_node.tail = $$.m_node.head;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants; }
</span><span class="cx">   | PropertyList ',' Property           { $$.m_node.head = $1.m_node.head;
</span><span class="cx">                                           $$.m_node.tail = new PropertyListNode(GLOBAL_DATA, $3.m_node, $1.m_node.tail);
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | $3.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features | $3.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants + $3.m_numConstants; }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> PrimaryExpr:
</span><span class="cx">     PrimaryExprNoBrace
</span><del>-  | OPENBRACE CLOSEBRACE                             { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ObjectLiteralNode(GLOBAL_DATA), 0, 0); }
-  | OPENBRACE PropertyList CLOSEBRACE                { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ObjectLiteralNode(GLOBAL_DATA, $2.m_node.head), $2.m_featureInfo, $2.m_numConstants); }
</del><ins>+  | OPENBRACE CLOSEBRACE                             { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ObjectLiteralNode(GLOBAL_DATA), 0, 0); }
+  | OPENBRACE PropertyList CLOSEBRACE                { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ObjectLiteralNode(GLOBAL_DATA, $2.m_node.head), $2.m_features, $2.m_numConstants); }
</ins><span class="cx">   /* allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939 */
</span><del>-  | OPENBRACE PropertyList ',' CLOSEBRACE            { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ObjectLiteralNode(GLOBAL_DATA, $2.m_node.head), $2.m_featureInfo, $2.m_numConstants); }
</del><ins>+  | OPENBRACE PropertyList ',' CLOSEBRACE            { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ObjectLiteralNode(GLOBAL_DATA, $2.m_node.head), $2.m_features, $2.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> PrimaryExprNoBrace:
</span><del>-    THISTOKEN                           { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ThisNode(GLOBAL_DATA), ThisFeature, 0); }
</del><ins>+    THISTOKEN                           { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ThisNode(GLOBAL_DATA), ThisFeature, 0); }
</ins><span class="cx">   | Literal
</span><span class="cx">   | ArrayLiteral
</span><del>-  | IDENT                               { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ResolveNode(GLOBAL_DATA, *$1, @1.first_column), (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0, 0); }
</del><ins>+  | IDENT                               { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ResolveNode(GLOBAL_DATA, *$1, @1.first_column), (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0, 0); }
</ins><span class="cx">   | '(' Expr ')'                        { $$ = $2; }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ArrayLiteral:
</span><del>-    '[' ElisionOpt ']'                  { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ArrayNode(GLOBAL_DATA, $2), 0, $2 ? 1 : 0); }
-  | '[' ElementList ']'                 { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ArrayNode(GLOBAL_DATA, $2.m_node.head), $2.m_featureInfo, $2.m_numConstants); }
-  | '[' ElementList ',' ElisionOpt ']'  { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ArrayNode(GLOBAL_DATA, $4, $2.m_node.head), $2.m_featureInfo, $4 ? $2.m_numConstants + 1 : $2.m_numConstants); }
</del><ins>+    '[' ElisionOpt ']'                  { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ArrayNode(GLOBAL_DATA, $2), 0, $2 ? 1 : 0); }
+  | '[' ElementList ']'                 { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ArrayNode(GLOBAL_DATA, $2.m_node.head), $2.m_features, $2.m_numConstants); }
+  | '[' ElementList ',' ElisionOpt ']'  { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ArrayNode(GLOBAL_DATA, $4, $2.m_node.head), $2.m_features, $4 ? $2.m_numConstants + 1 : $2.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ElementList:
</span><span class="cx">     ElisionOpt AssignmentExpr           { $$.m_node.head = new ElementNode(GLOBAL_DATA, $1, $2.m_node);
</span><span class="cx">                                           $$.m_node.tail = $$.m_node.head;
</span><del>-                                          $$.m_featureInfo = $2.m_featureInfo;
</del><ins>+                                          $$.m_features = $2.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $2.m_numConstants; }
</span><span class="cx">   | ElementList ',' ElisionOpt AssignmentExpr
</span><span class="cx">                                         { $$.m_node.head = $1.m_node.head;
</span><span class="cx">                                           $$.m_node.tail = new ElementNode(GLOBAL_DATA, $1.m_node.tail, $3, $4.m_node);
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | $4.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features | $4.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants + $4.m_numConstants; }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -374,34 +381,34 @@
</span><span class="cx"> 
</span><span class="cx"> MemberExpr:
</span><span class="cx">     PrimaryExpr
</span><del>-  | FunctionExpr                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;($1.m_node, $1.m_featureInfo, $1.m_numConstants); }
-  | MemberExpr '[' Expr ']'             { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+  | FunctionExpr                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;($1.m_node, $1.m_features, $1.m_numConstants); }
+  | MemberExpr '[' Expr ']'             { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @4.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); 
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); 
</ins><span class="cx">                                         }
</span><span class="cx">   | MemberExpr '.' IDENT                { DotAccessorNode* node = new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @3.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo, $1.m_numConstants);
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features, $1.m_numConstants);
</ins><span class="cx">                                         }
</span><span class="cx">   | NEW MemberExpr Arguments            { NewExprNode* node = new NewExprNode(GLOBAL_DATA, $2.m_node, $3.m_node);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @3.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $2.m_featureInfo | $3.m_featureInfo, $2.m_numConstants + $3.m_numConstants);
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $2.m_features | $3.m_features, $2.m_numConstants + $3.m_numConstants);
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> MemberExprNoBF:
</span><span class="cx">     PrimaryExprNoBrace
</span><del>-  | MemberExprNoBF '[' Expr ']'         { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+  | MemberExprNoBF '[' Expr ']'         { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @4.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); 
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); 
</ins><span class="cx">                                         }
</span><span class="cx">   | MemberExprNoBF '.' IDENT            { DotAccessorNode* node = new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @3.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo, $1.m_numConstants);
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features, $1.m_numConstants);
</ins><span class="cx">                                         }
</span><span class="cx">   | NEW MemberExpr Arguments            { NewExprNode* node = new NewExprNode(GLOBAL_DATA, $2.m_node, $3.m_node);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @3.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $2.m_featureInfo | $3.m_featureInfo, $2.m_numConstants + $3.m_numConstants);
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $2.m_features | $3.m_features, $2.m_numConstants + $3.m_numConstants);
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -409,7 +416,7 @@
</span><span class="cx">     MemberExpr
</span><span class="cx">   | NEW NewExpr                         { NewExprNode* node = new NewExprNode(GLOBAL_DATA, $2.m_node);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $2.m_featureInfo, $2.m_numConstants); 
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $2.m_features, $2.m_numConstants); 
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -417,48 +424,48 @@
</span><span class="cx">     MemberExprNoBF
</span><span class="cx">   | NEW NewExpr                         { NewExprNode* node = new NewExprNode(GLOBAL_DATA, $2.m_node);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $2.m_featureInfo, $2.m_numConstants);
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $2.m_features, $2.m_numConstants);
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> CallExpr:
</span><span class="cx">     MemberExpr Arguments                { $$ = makeFunctionCallNode(globalPtr, $1, $2, @1.first_column, @1.last_column, @2.last_column); }
</span><span class="cx">   | CallExpr Arguments                  { $$ = makeFunctionCallNode(globalPtr, $1, $2, @1.first_column, @1.last_column, @2.last_column); }
</span><del>-  | CallExpr '[' Expr ']'               { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+  | CallExpr '[' Expr ']'               { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @4.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); 
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); 
</ins><span class="cx">                                         }
</span><span class="cx">   | CallExpr '.' IDENT                  { DotAccessorNode* node = new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @3.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo, $1.m_numConstants); }
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features, $1.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> CallExprNoBF:
</span><span class="cx">     MemberExprNoBF Arguments            { $$ = makeFunctionCallNode(globalPtr, $1, $2, @1.first_column, @1.last_column, @2.last_column); }
</span><span class="cx">   | CallExprNoBF Arguments              { $$ = makeFunctionCallNode(globalPtr, $1, $2, @1.first_column, @1.last_column, @2.last_column); }
</span><del>-  | CallExprNoBF '[' Expr ']'           { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+  | CallExprNoBF '[' Expr ']'           { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @4.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); 
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); 
</ins><span class="cx">                                         }
</span><span class="cx">   | CallExprNoBF '.' IDENT              { DotAccessorNode* node = new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @3.last_column);
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo, $1.m_numConstants); 
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features, $1.m_numConstants); 
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> Arguments:
</span><del>-    '(' ')'                             { $$ = createNodeFeatureInfo&lt;ArgumentsNode*&gt;(new ArgumentsNode(GLOBAL_DATA), 0, 0); }
-  | '(' ArgumentList ')'                { $$ = createNodeFeatureInfo&lt;ArgumentsNode*&gt;(new ArgumentsNode(GLOBAL_DATA, $2.m_node.head), $2.m_featureInfo, $2.m_numConstants); }
</del><ins>+    '(' ')'                             { $$ = createNodeInfo&lt;ArgumentsNode*&gt;(new ArgumentsNode(GLOBAL_DATA), 0, 0); }
+  | '(' ArgumentList ')'                { $$ = createNodeInfo&lt;ArgumentsNode*&gt;(new ArgumentsNode(GLOBAL_DATA, $2.m_node.head), $2.m_features, $2.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ArgumentList:
</span><span class="cx">     AssignmentExpr                      { $$.m_node.head = new ArgumentListNode(GLOBAL_DATA, $1.m_node);
</span><span class="cx">                                           $$.m_node.tail = $$.m_node.head;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants; }
</span><span class="cx">   | ArgumentList ',' AssignmentExpr     { $$.m_node.head = $1.m_node.head;
</span><span class="cx">                                           $$.m_node.tail = new ArgumentListNode(GLOBAL_DATA, $1.m_node.tail, $3.m_node);
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | $3.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features | $3.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants + $3.m_numConstants; }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -474,28 +481,28 @@
</span><span class="cx"> 
</span><span class="cx"> PostfixExpr:
</span><span class="cx">     LeftHandSideExpr
</span><del>-  | LeftHandSideExpr PLUSPLUS           { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus, @1.first_column, @1.last_column, @2.last_column), $1.m_featureInfo | AssignFeature, $1.m_numConstants); }
-  | LeftHandSideExpr MINUSMINUS         { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus, @1.first_column, @1.last_column, @2.last_column), $1.m_featureInfo | AssignFeature, $1.m_numConstants); }
</del><ins>+  | LeftHandSideExpr PLUSPLUS           { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus, @1.first_column, @1.last_column, @2.last_column), $1.m_features | AssignFeature, $1.m_numConstants); }
+  | LeftHandSideExpr MINUSMINUS         { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus, @1.first_column, @1.last_column, @2.last_column), $1.m_features | AssignFeature, $1.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> PostfixExprNoBF:
</span><span class="cx">     LeftHandSideExprNoBF
</span><del>-  | LeftHandSideExprNoBF PLUSPLUS       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus, @1.first_column, @1.last_column, @2.last_column), $1.m_featureInfo | AssignFeature, $1.m_numConstants); }
-  | LeftHandSideExprNoBF MINUSMINUS     { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus, @1.first_column, @1.last_column, @2.last_column), $1.m_featureInfo | AssignFeature, $1.m_numConstants); }
</del><ins>+  | LeftHandSideExprNoBF PLUSPLUS       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus, @1.first_column, @1.last_column, @2.last_column), $1.m_features | AssignFeature, $1.m_numConstants); }
+  | LeftHandSideExprNoBF MINUSMINUS     { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus, @1.first_column, @1.last_column, @2.last_column), $1.m_features | AssignFeature, $1.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> UnaryExprCommon:
</span><del>-    DELETETOKEN UnaryExpr               { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeDeleteNode(GLOBAL_DATA, $2.m_node, @1.first_column, @2.last_column, @2.last_column), $2.m_featureInfo, $2.m_numConstants); }
-  | VOIDTOKEN UnaryExpr                 { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new VoidNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo, $2.m_numConstants + 1); }
-  | TYPEOF UnaryExpr                    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeTypeOfNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo, $2.m_numConstants); }
-  | PLUSPLUS UnaryExpr                  { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_featureInfo | AssignFeature, $2.m_numConstants); }
-  | AUTOPLUSPLUS UnaryExpr              { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_featureInfo | AssignFeature, $2.m_numConstants); }
-  | MINUSMINUS UnaryExpr                { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_featureInfo | AssignFeature, $2.m_numConstants); }
-  | AUTOMINUSMINUS UnaryExpr            { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_featureInfo | AssignFeature, $2.m_numConstants); }
-  | '+' UnaryExpr                       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new UnaryPlusNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo, $2.m_numConstants); }
-  | '-' UnaryExpr                       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeNegateNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo, $2.m_numConstants); }
-  | '~' UnaryExpr                       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeBitwiseNotNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo, $2.m_numConstants); }
-  | '!' UnaryExpr                       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LogicalNotNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo, $2.m_numConstants); }
</del><ins>+    DELETETOKEN UnaryExpr               { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeDeleteNode(GLOBAL_DATA, $2.m_node, @1.first_column, @2.last_column, @2.last_column), $2.m_features, $2.m_numConstants); }
+  | VOIDTOKEN UnaryExpr                 { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new VoidNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants + 1); }
+  | TYPEOF UnaryExpr                    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeTypeOfNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
+  | PLUSPLUS UnaryExpr                  { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_features | AssignFeature, $2.m_numConstants); }
+  | AUTOPLUSPLUS UnaryExpr              { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_features | AssignFeature, $2.m_numConstants); }
+  | MINUSMINUS UnaryExpr                { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_features | AssignFeature, $2.m_numConstants); }
+  | AUTOMINUSMINUS UnaryExpr            { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_features | AssignFeature, $2.m_numConstants); }
+  | '+' UnaryExpr                       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new UnaryPlusNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
+  | '-' UnaryExpr                       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeNegateNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
+  | '~' UnaryExpr                       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeBitwiseNotNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
+  | '!' UnaryExpr                       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LogicalNotNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
</ins><span class="cx"> 
</span><span class="cx"> UnaryExpr:
</span><span class="cx">     PostfixExpr
</span><span class="lines">@@ -509,244 +516,244 @@
</span><span class="cx"> 
</span><span class="cx"> MultiplicativeExpr:
</span><span class="cx">     UnaryExpr
</span><del>-  | MultiplicativeExpr '*' UnaryExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeMultNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | MultiplicativeExpr '/' UnaryExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeDivNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | MultiplicativeExpr '%' UnaryExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ModNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | MultiplicativeExpr '*' UnaryExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeMultNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | MultiplicativeExpr '/' UnaryExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeDivNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | MultiplicativeExpr '%' UnaryExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ModNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> MultiplicativeExprNoBF:
</span><span class="cx">     UnaryExprNoBF
</span><span class="cx">   | MultiplicativeExprNoBF '*' UnaryExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new MultNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new MultNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | MultiplicativeExprNoBF '/' UnaryExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new DivNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new DivNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | MultiplicativeExprNoBF '%' UnaryExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ModNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ModNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> AdditiveExpr:
</span><span class="cx">     MultiplicativeExpr
</span><del>-  | AdditiveExpr '+' MultiplicativeExpr { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeAddNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | AdditiveExpr '-' MultiplicativeExpr { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new SubNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | AdditiveExpr '+' MultiplicativeExpr { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeAddNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | AdditiveExpr '-' MultiplicativeExpr { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new SubNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> AdditiveExprNoBF:
</span><span class="cx">     MultiplicativeExprNoBF
</span><span class="cx">   | AdditiveExprNoBF '+' MultiplicativeExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new AddNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new AddNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | AdditiveExprNoBF '-' MultiplicativeExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new SubNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new SubNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ShiftExpr:
</span><span class="cx">     AdditiveExpr
</span><del>-  | ShiftExpr LSHIFT AdditiveExpr       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeLeftShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | ShiftExpr RSHIFT AdditiveExpr       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | ShiftExpr URSHIFT AdditiveExpr      { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new UnsignedRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | ShiftExpr LSHIFT AdditiveExpr       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeLeftShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | ShiftExpr RSHIFT AdditiveExpr       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | ShiftExpr URSHIFT AdditiveExpr      { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new UnsignedRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ShiftExprNoBF:
</span><span class="cx">     AdditiveExprNoBF
</span><del>-  | ShiftExprNoBF LSHIFT AdditiveExpr   { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LeftShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | ShiftExprNoBF RSHIFT AdditiveExpr   { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new RightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | ShiftExprNoBF URSHIFT AdditiveExpr  { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new UnsignedRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | ShiftExprNoBF LSHIFT AdditiveExpr   { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LeftShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | ShiftExprNoBF RSHIFT AdditiveExpr   { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new RightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | ShiftExprNoBF URSHIFT AdditiveExpr  { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new UnsignedRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> RelationalExpr:
</span><span class="cx">     ShiftExpr
</span><del>-  | RelationalExpr '&lt;' ShiftExpr        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExpr '&gt;' ShiftExpr        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExpr LE ShiftExpr         { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExpr GE ShiftExpr         { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExpr INSTANCEOF ShiftExpr { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+  | RelationalExpr '&lt;' ShiftExpr        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExpr '&gt;' ShiftExpr        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExpr LE ShiftExpr         { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExpr GE ShiftExpr         { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExpr INSTANCEOF ShiftExpr { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column);  
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExpr INTOKEN ShiftExpr    { InNode* node = new InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExpr INTOKEN ShiftExpr    { InNode* node = new InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column);  
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> RelationalExprNoIn:
</span><span class="cx">     ShiftExpr
</span><del>-  | RelationalExprNoIn '&lt;' ShiftExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExprNoIn '&gt;' ShiftExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExprNoIn LE ShiftExpr     { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExprNoIn GE ShiftExpr     { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | RelationalExprNoIn '&lt;' ShiftExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExprNoIn '&gt;' ShiftExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExprNoIn LE ShiftExpr     { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExprNoIn GE ShiftExpr     { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | RelationalExprNoIn INSTANCEOF ShiftExpr
</span><del>-                                        { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+                                        { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column);  
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> RelationalExprNoBF:
</span><span class="cx">     ShiftExprNoBF
</span><del>-  | RelationalExprNoBF '&lt;' ShiftExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExprNoBF '&gt;' ShiftExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExprNoBF LE ShiftExpr     { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | RelationalExprNoBF GE ShiftExpr     { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | RelationalExprNoBF '&lt;' ShiftExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExprNoBF '&gt;' ShiftExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExprNoBF LE ShiftExpr     { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | RelationalExprNoBF GE ShiftExpr     { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | RelationalExprNoBF INSTANCEOF ShiftExpr
</span><del>-                                        { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+                                        { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column);  
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | RelationalExprNoBF INTOKEN ShiftExpr 
</span><del>-                                        { InNode* node = new InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature);
</del><ins>+                                        { InNode* node = new InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column);  
</span><del>-                                          $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                          $$ = createNodeInfo&lt;ExpressionNode*&gt;(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> EqualityExpr:
</span><span class="cx">     RelationalExpr
</span><del>-  | EqualityExpr EQEQ RelationalExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | EqualityExpr NE RelationalExpr      { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | EqualityExpr STREQ RelationalExpr   { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | EqualityExpr STRNEQ RelationalExpr  { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | EqualityExpr EQEQ RelationalExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | EqualityExpr NE RelationalExpr      { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | EqualityExpr STREQ RelationalExpr   { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | EqualityExpr STRNEQ RelationalExpr  { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> EqualityExprNoIn:
</span><span class="cx">     RelationalExprNoIn
</span><span class="cx">   | EqualityExprNoIn EQEQ RelationalExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | EqualityExprNoIn NE RelationalExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | EqualityExprNoIn STREQ RelationalExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | EqualityExprNoIn STRNEQ RelationalExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> EqualityExprNoBF:
</span><span class="cx">     RelationalExprNoBF
</span><span class="cx">   | EqualityExprNoBF EQEQ RelationalExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
-  | EqualityExprNoBF NE RelationalExpr  { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
+  | EqualityExprNoBF NE RelationalExpr  { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | EqualityExprNoBF STREQ RelationalExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx">   | EqualityExprNoBF STRNEQ RelationalExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseANDExpr:
</span><span class="cx">     EqualityExpr
</span><del>-  | BitwiseANDExpr '&amp;' EqualityExpr     { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | BitwiseANDExpr '&amp;' EqualityExpr     { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseANDExprNoIn:
</span><span class="cx">     EqualityExprNoIn
</span><span class="cx">   | BitwiseANDExprNoIn '&amp;' EqualityExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseANDExprNoBF:
</span><span class="cx">     EqualityExprNoBF
</span><del>-  | BitwiseANDExprNoBF '&amp;' EqualityExpr { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | BitwiseANDExprNoBF '&amp;' EqualityExpr { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseXORExpr:
</span><span class="cx">     BitwiseANDExpr
</span><del>-  | BitwiseXORExpr '^' BitwiseANDExpr   { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | BitwiseXORExpr '^' BitwiseANDExpr   { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseXORExprNoIn:
</span><span class="cx">     BitwiseANDExprNoIn
</span><span class="cx">   | BitwiseXORExprNoIn '^' BitwiseANDExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseXORExprNoBF:
</span><span class="cx">     BitwiseANDExprNoBF
</span><span class="cx">   | BitwiseXORExprNoBF '^' BitwiseANDExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseORExpr:
</span><span class="cx">     BitwiseXORExpr
</span><del>-  | BitwiseORExpr '|' BitwiseXORExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | BitwiseORExpr '|' BitwiseXORExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseORExprNoIn:
</span><span class="cx">     BitwiseXORExprNoIn
</span><span class="cx">   | BitwiseORExprNoIn '|' BitwiseXORExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> BitwiseORExprNoBF:
</span><span class="cx">     BitwiseXORExprNoBF
</span><span class="cx">   | BitwiseORExprNoBF '|' BitwiseXORExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo &amp; AssignFeature), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features &amp; AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> LogicalANDExpr:
</span><span class="cx">     BitwiseORExpr
</span><del>-  | LogicalANDExpr AND BitwiseORExpr    { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | LogicalANDExpr AND BitwiseORExpr    { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> LogicalANDExprNoIn:
</span><span class="cx">     BitwiseORExprNoIn
</span><span class="cx">   | LogicalANDExprNoIn AND BitwiseORExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> LogicalANDExprNoBF:
</span><span class="cx">     BitwiseORExprNoBF
</span><span class="cx">   | LogicalANDExprNoBF AND BitwiseORExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> LogicalORExpr:
</span><span class="cx">     LogicalANDExpr
</span><del>-  | LogicalORExpr OR LogicalANDExpr     { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | LogicalORExpr OR LogicalANDExpr     { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> LogicalORExprNoIn:
</span><span class="cx">     LogicalANDExprNoIn
</span><span class="cx">   | LogicalORExprNoIn OR LogicalANDExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> LogicalORExprNoBF:
</span><span class="cx">     LogicalANDExprNoBF
</span><del>-  | LogicalORExprNoBF OR LogicalANDExpr { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | LogicalORExprNoBF OR LogicalANDExpr { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ConditionalExpr:
</span><span class="cx">     LogicalORExpr
</span><span class="cx">   | LogicalORExpr '?' AssignmentExpr ':' AssignmentExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_featureInfo | $3.m_featureInfo | $5.m_featureInfo, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_features | $3.m_features | $5.m_features, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ConditionalExprNoIn:
</span><span class="cx">     LogicalORExprNoIn
</span><span class="cx">   | LogicalORExprNoIn '?' AssignmentExprNoIn ':' AssignmentExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_featureInfo | $3.m_featureInfo | $5.m_featureInfo, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_features | $3.m_features | $5.m_features, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ConditionalExprNoBF:
</span><span class="cx">     LogicalORExprNoBF
</span><span class="cx">   | LogicalORExprNoBF '?' AssignmentExpr ':' AssignmentExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_featureInfo | $3.m_featureInfo | $5.m_featureInfo, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_features | $3.m_features | $5.m_features, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> AssignmentExpr:
</span><span class="cx">     ConditionalExpr
</span><span class="cx">   | LeftHandSideExpr AssignmentOperator AssignmentExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo &amp; AssignFeature, $3.m_featureInfo &amp; AssignFeature, 
-                                                                                                     @1.first_column, @2.first_column + 1, @3.last_column), $1.m_featureInfo | $3.m_featureInfo | AssignFeature, $1.m_numConstants + $3.m_numConstants); 
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features &amp; AssignFeature, $3.m_features &amp; AssignFeature, 
+                                                                                                     @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants); 
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> AssignmentExprNoIn:
</span><span class="cx">     ConditionalExprNoIn
</span><span class="cx">   | LeftHandSideExpr AssignmentOperator AssignmentExprNoIn
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo &amp; AssignFeature, $3.m_featureInfo &amp; AssignFeature, 
-                                                                                                     @1.first_column, @2.first_column + 1, @3.last_column), $1.m_featureInfo | $3.m_featureInfo | AssignFeature, $1.m_numConstants + $3.m_numConstants);
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features &amp; AssignFeature, $3.m_features &amp; AssignFeature, 
+                                                                                                     @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants);
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> AssignmentExprNoBF:
</span><span class="cx">     ConditionalExprNoBF
</span><span class="cx">   | LeftHandSideExprNoBF AssignmentOperator AssignmentExpr
</span><del>-                                        { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo &amp; AssignFeature, $3.m_featureInfo &amp; AssignFeature,
-                                                                                                     @1.first_column, @2.first_column + 1, @3.last_column), $1.m_featureInfo | $3.m_featureInfo | AssignFeature, $1.m_numConstants + $3.m_numConstants); 
</del><ins>+                                        { $$ = createNodeInfo&lt;ExpressionNode*&gt;(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features &amp; AssignFeature, $3.m_features &amp; AssignFeature,
+                                                                                                     @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants); 
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -767,17 +774,17 @@
</span><span class="cx"> 
</span><span class="cx"> Expr:
</span><span class="cx">     AssignmentExpr
</span><del>-  | Expr ',' AssignmentExpr             { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | Expr ',' AssignmentExpr             { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ExprNoIn:
</span><span class="cx">     AssignmentExprNoIn
</span><del>-  | ExprNoIn ',' AssignmentExprNoIn     { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | ExprNoIn ',' AssignmentExprNoIn     { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ExprNoBF:
</span><span class="cx">     AssignmentExprNoBF
</span><del>-  | ExprNoBF ',' AssignmentExpr         { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(new CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo, $1.m_numConstants + $3.m_numConstants); }
</del><ins>+  | ExprNoBF ',' AssignmentExpr         { $$ = createNodeInfo&lt;ExpressionNode*&gt;(new CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> Statement:
</span><span class="lines">@@ -802,14 +809,14 @@
</span><span class="cx"> Block:
</span><span class="cx">     OPENBRACE CLOSEBRACE                             { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new BlockNode(GLOBAL_DATA, 0), 0, 0, 0, 0);
</span><span class="cx">                                           DBG($$.m_node, @1, @2); }
</span><del>-  | OPENBRACE SourceElements CLOSEBRACE              { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new BlockNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo, $2.m_numConstants);
</del><ins>+  | OPENBRACE SourceElements CLOSEBRACE              { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new BlockNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @3); }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> VariableStatement:
</span><del>-    VAR VariableDeclarationList ';'     { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(makeVarStatementNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo, $2.m_numConstants);
</del><ins>+    VAR VariableDeclarationList ';'     { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(makeVarStatementNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @3); }
</span><del>-  | VAR VariableDeclarationList error   { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(makeVarStatementNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo, $2.m_numConstants);
</del><ins>+  | VAR VariableDeclarationList error   { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(makeVarStatementNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @2);
</span><span class="cx">                                           AUTO_SEMICOLON; }
</span><span class="cx"> ;
</span><span class="lines">@@ -819,16 +826,16 @@
</span><span class="cx">                                           $$.m_varDeclarations = new ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;(GLOBAL_DATA);
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, 0);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0;
</del><ins>+                                          $$.m_features = (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0;
</ins><span class="cx">                                           $$.m_numConstants = 0;
</span><span class="cx">                                         }
</span><del>-  | IDENT Initializer                   { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_featureInfo &amp; AssignFeature);
</del><ins>+  | IDENT Initializer                   { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.first_column + 1, @2.last_column);
</span><span class="cx">                                           $$.m_node = node;
</span><span class="cx">                                           $$.m_varDeclarations = new ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;(GLOBAL_DATA);
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, DeclarationStacks::HasInitializer);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = ((*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $2.m_featureInfo;
</del><ins>+                                          $$.m_features = ((*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $2.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $2.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx">   | VariableDeclarationList ',' IDENT
</span><span class="lines">@@ -836,17 +843,17 @@
</span><span class="cx">                                           $$.m_varDeclarations = $1.m_varDeclarations;
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, 0);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0);
</del><ins>+                                          $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0);
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx">   | VariableDeclarationList ',' IDENT Initializer
</span><del>-                                        { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_featureInfo &amp; AssignFeature);
</del><ins>+                                        { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @3.first_column, @4.first_column + 1, @4.last_column);
</span><span class="cx">                                           $$.m_node = combineVarInitializers(GLOBAL_DATA, $1.m_node, node);
</span><span class="cx">                                           $$.m_varDeclarations = $1.m_varDeclarations;
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $4.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $4.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants + $4.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="lines">@@ -856,16 +863,16 @@
</span><span class="cx">                                           $$.m_varDeclarations = new ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;(GLOBAL_DATA);
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, 0);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0;
</del><ins>+                                          $$.m_features = (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0;
</ins><span class="cx">                                           $$.m_numConstants = 0;
</span><span class="cx">                                         }
</span><del>-  | IDENT InitializerNoIn               { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_featureInfo &amp; AssignFeature);
</del><ins>+  | IDENT InitializerNoIn               { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.first_column + 1, @2.last_column);
</span><span class="cx">                                           $$.m_node = node;
</span><span class="cx">                                           $$.m_varDeclarations = new ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;(GLOBAL_DATA);
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, DeclarationStacks::HasInitializer);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = ((*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $2.m_featureInfo;
</del><ins>+                                          $$.m_features = ((*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $2.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $2.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx">   | VariableDeclarationListNoIn ',' IDENT
</span><span class="lines">@@ -873,26 +880,26 @@
</span><span class="cx">                                           $$.m_varDeclarations = $1.m_varDeclarations;
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, 0);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0);
</del><ins>+                                          $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0);
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx">   | VariableDeclarationListNoIn ',' IDENT InitializerNoIn
</span><del>-                                        { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_featureInfo &amp; AssignFeature);
</del><ins>+                                        { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_features &amp; AssignFeature);
</ins><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @3.first_column, @4.first_column + 1, @4.last_column);
</span><span class="cx">                                           $$.m_node = combineVarInitializers(GLOBAL_DATA, $1.m_node, node);
</span><span class="cx">                                           $$.m_varDeclarations = $1.m_varDeclarations;
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $4.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $4.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants + $4.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ConstStatement:
</span><del>-    CONSTTOKEN ConstDeclarationList ';' { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ConstStatementNode(GLOBAL_DATA, $2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo, $2.m_numConstants);
</del><ins>+    CONSTTOKEN ConstDeclarationList ';' { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ConstStatementNode(GLOBAL_DATA, $2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @3); }
</span><span class="cx">   | CONSTTOKEN ConstDeclarationList error
</span><del>-                                        { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ConstStatementNode(GLOBAL_DATA, $2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo, $2.m_numConstants);
</del><ins>+                                        { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ConstStatementNode(GLOBAL_DATA, $2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -902,7 +909,7 @@
</span><span class="cx">                                           $$.m_varDeclarations = new ParserRefCountedData&lt;DeclarationStacks::VarStack&gt;(GLOBAL_DATA);
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, $1.m_node);
</span><span class="cx">                                           $$.m_funcDeclarations = 0; 
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants;
</span><span class="cx">     }
</span><span class="cx">   | ConstDeclarationList ',' ConstDeclaration
</span><span class="lines">@@ -912,13 +919,13 @@
</span><span class="cx">                                           $$.m_varDeclarations = $1.m_varDeclarations;
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, $3.m_node);
</span><span class="cx">                                           $$.m_funcDeclarations = 0;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | $3.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features | $3.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants + $3.m_numConstants; }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ConstDeclaration:
</span><del>-    IDENT                               { $$ = createNodeFeatureInfo&lt;ConstDeclNode*&gt;(new ConstDeclNode(GLOBAL_DATA, *$1, 0), (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0, 0); }
-  | IDENT Initializer                   { $$ = createNodeFeatureInfo&lt;ConstDeclNode*&gt;(new ConstDeclNode(GLOBAL_DATA, *$1, $2.m_node), ((*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $2.m_featureInfo, $2.m_numConstants); }
</del><ins>+    IDENT                               { $$ = createNodeInfo&lt;ConstDeclNode*&gt;(new ConstDeclNode(GLOBAL_DATA, *$1, 0), (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0, 0); }
+  | IDENT Initializer                   { $$ = createNodeInfo&lt;ConstDeclNode*&gt;(new ConstDeclNode(GLOBAL_DATA, *$1, $2.m_node), ((*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $2.m_features, $2.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> Initializer:
</span><span class="lines">@@ -934,34 +941,34 @@
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ExprStatement:
</span><del>-    ExprNoBF ';'                        { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ExprStatementNode(GLOBAL_DATA, $1.m_node), 0, 0, $1.m_featureInfo, $1.m_numConstants);
</del><ins>+    ExprNoBF ';'                        { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ExprStatementNode(GLOBAL_DATA, $1.m_node), 0, 0, $1.m_features, $1.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @2); }
</span><del>-  | ExprNoBF error                      { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ExprStatementNode(GLOBAL_DATA, $1.m_node), 0, 0, $1.m_featureInfo, $1.m_numConstants);
</del><ins>+  | ExprNoBF error                      { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ExprStatementNode(GLOBAL_DATA, $1.m_node), 0, 0, $1.m_features, $1.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> IfStatement:
</span><span class="cx">     IF '(' Expr ')' Statement %prec IF_WITHOUT_ELSE
</span><del>-                                        { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new IfNode(GLOBAL_DATA, $3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_featureInfo | $5.m_featureInfo, $3.m_numConstants + $5.m_numConstants);
</del><ins>+                                        { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new IfNode(GLOBAL_DATA, $3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_features | $5.m_features, $3.m_numConstants + $5.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @4); }
</span><span class="cx">   | IF '(' Expr ')' Statement ELSE Statement
</span><span class="cx">                                         { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new IfElseNode(GLOBAL_DATA, $3.m_node, $5.m_node, $7.m_node), 
</span><span class="cx">                                                                                          mergeDeclarationLists($5.m_varDeclarations, $7.m_varDeclarations), mergeDeclarationLists($5.m_funcDeclarations, $7.m_funcDeclarations),
</span><del>-                                                                                         $3.m_featureInfo | $5.m_featureInfo | $7.m_featureInfo,
</del><ins>+                                                                                         $3.m_features | $5.m_features | $7.m_features,
</ins><span class="cx">                                                                                          $3.m_numConstants + $5.m_numConstants + $7.m_numConstants); 
</span><span class="cx">                                           DBG($$.m_node, @1, @4); }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> IterationStatement:
</span><del>-    DO Statement WHILE '(' Expr ')' ';'    { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new DoWhileNode(GLOBAL_DATA, $2.m_node, $5.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo | $5.m_featureInfo, $2.m_numConstants + $5.m_numConstants);
</del><ins>+    DO Statement WHILE '(' Expr ')' ';'    { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new DoWhileNode(GLOBAL_DATA, $2.m_node, $5.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features | $5.m_features, $2.m_numConstants + $5.m_numConstants);
</ins><span class="cx">                                              DBG($$.m_node, @1, @3); }
</span><del>-  | DO Statement WHILE '(' Expr ')' error  { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new DoWhileNode(GLOBAL_DATA, $2.m_node, $5.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo | $5.m_featureInfo, $2.m_numConstants + $5.m_numConstants);
</del><ins>+  | DO Statement WHILE '(' Expr ')' error  { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new DoWhileNode(GLOBAL_DATA, $2.m_node, $5.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features | $5.m_features, $2.m_numConstants + $5.m_numConstants);
</ins><span class="cx">                                              DBG($$.m_node, @1, @3); } // Always performs automatic semicolon insertion.
</span><del>-  | WHILE '(' Expr ')' Statement        { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new WhileNode(GLOBAL_DATA, $3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_featureInfo | $5.m_featureInfo, $3.m_numConstants + $5.m_numConstants);
</del><ins>+  | WHILE '(' Expr ')' Statement        { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new WhileNode(GLOBAL_DATA, $3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_features | $5.m_features, $3.m_numConstants + $5.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @4); }
</span><span class="cx">   | FOR '(' ExprNoInOpt ';' ExprOpt ';' ExprOpt ')' Statement
</span><span class="cx">                                         { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ForNode(GLOBAL_DATA, $3.m_node, $5.m_node, $7.m_node, $9.m_node, false), $9.m_varDeclarations, $9.m_funcDeclarations, 
</span><del>-                                                                                         $3.m_featureInfo | $5.m_featureInfo | $7.m_featureInfo | $9.m_featureInfo,
</del><ins>+                                                                                         $3.m_features | $5.m_features | $7.m_features | $9.m_features,
</ins><span class="cx">                                                                                          $3.m_numConstants + $5.m_numConstants + $7.m_numConstants + $9.m_numConstants);
</span><span class="cx">                                           DBG($$.m_node, @1, @8); 
</span><span class="cx">                                         }
</span><span class="lines">@@ -969,7 +976,7 @@
</span><span class="cx">                                         { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new ForNode(GLOBAL_DATA, $4.m_node, $6.m_node, $8.m_node, $10.m_node, true),
</span><span class="cx">                                                                                          mergeDeclarationLists($4.m_varDeclarations, $10.m_varDeclarations),
</span><span class="cx">                                                                                          mergeDeclarationLists($4.m_funcDeclarations, $10.m_funcDeclarations),
</span><del>-                                                                                         $4.m_featureInfo | $6.m_featureInfo | $8.m_featureInfo | $10.m_featureInfo,
</del><ins>+                                                                                         $4.m_features | $6.m_features | $8.m_features | $10.m_features,
</ins><span class="cx">                                                                                          $4.m_numConstants + $6.m_numConstants + $8.m_numConstants + $10.m_numConstants);
</span><span class="cx">                                           DBG($$.m_node, @1, @9); }
</span><span class="cx">   | FOR '(' LeftHandSideExpr INTOKEN Expr ')' Statement
</span><span class="lines">@@ -977,7 +984,7 @@
</span><span class="cx">                                             ForInNode* node = new ForInNode(GLOBAL_DATA, $3.m_node, $5.m_node, $7.m_node);
</span><span class="cx">                                             SET_EXCEPTION_LOCATION(node, @3.first_column, @3.last_column, @5.last_column);
</span><span class="cx">                                             $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, $7.m_varDeclarations, $7.m_funcDeclarations,
</span><del>-                                                                                           $3.m_featureInfo | $5.m_featureInfo | $7.m_featureInfo,
</del><ins>+                                                                                           $3.m_features | $5.m_features | $7.m_features,
</ins><span class="cx">                                                                                            $3.m_numConstants + $5.m_numConstants + $7.m_numConstants);
</span><span class="cx">                                             DBG($$.m_node, @1, @6);
</span><span class="cx">                                         }
</span><span class="lines">@@ -985,25 +992,25 @@
</span><span class="cx">                                         { ForInNode *forIn = new ForInNode(GLOBAL_DATA, *$4, 0, $6.m_node, $8.m_node, @5.first_column, @5.first_column - @4.first_column, @6.last_column - @5.first_column);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(forIn, @4.first_column, @5.first_column + 1, @6.last_column);
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $8.m_varDeclarations, *$4, DeclarationStacks::HasInitializer);
</span><del>-                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(forIn, $8.m_varDeclarations, $8.m_funcDeclarations, ((*$4 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $6.m_featureInfo | $8.m_featureInfo, $6.m_numConstants + $8.m_numConstants);
</del><ins>+                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(forIn, $8.m_varDeclarations, $8.m_funcDeclarations, ((*$4 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $6.m_features | $8.m_features, $6.m_numConstants + $8.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @7); }
</span><span class="cx">   | FOR '(' VAR IDENT InitializerNoIn INTOKEN Expr ')' Statement
</span><span class="cx">                                         { ForInNode *forIn = new ForInNode(GLOBAL_DATA, *$4, $5.m_node, $7.m_node, $9.m_node, @5.first_column, @5.first_column - @4.first_column, @5.last_column - @5.first_column);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(forIn, @4.first_column, @6.first_column + 1, @7.last_column);
</span><span class="cx">                                           appendToVarDeclarationList(GLOBAL_DATA, $9.m_varDeclarations, *$4, DeclarationStacks::HasInitializer);
</span><span class="cx">                                           $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(forIn, $9.m_varDeclarations, $9.m_funcDeclarations,
</span><del>-                                                                                         ((*$4 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $5.m_featureInfo | $7.m_featureInfo | $9.m_featureInfo,
</del><ins>+                                                                                         ((*$4 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $5.m_features | $7.m_features | $9.m_features,
</ins><span class="cx">                                                                                          $5.m_numConstants + $7.m_numConstants + $9.m_numConstants);
</span><span class="cx">                                           DBG($$.m_node, @1, @8); }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ExprOpt:
</span><del>-    /* nothing */                       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(0, 0, 0); }
</del><ins>+    /* nothing */                       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(0, 0, 0); }
</ins><span class="cx">   | Expr
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ExprNoInOpt:
</span><del>-    /* nothing */                       { $$ = createNodeFeatureInfo&lt;ExpressionNode*&gt;(0, 0, 0); }
</del><ins>+    /* nothing */                       { $$ = createNodeInfo&lt;ExpressionNode*&gt;(0, 0, 0); }
</ins><span class="cx">   | ExprNoIn
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -1050,36 +1057,36 @@
</span><span class="cx">                                           $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
</span><span class="cx">   | RETURN Expr ';'                     { ReturnNode* node = new ReturnNode(GLOBAL_DATA, $2.m_node); 
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column);
</span><del>-                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, $2.m_featureInfo, $2.m_numConstants); DBG($$.m_node, @1, @3); }
</del><ins>+                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, $2.m_features, $2.m_numConstants); DBG($$.m_node, @1, @3); }
</ins><span class="cx">   | RETURN Expr error                   { ReturnNode* node = new ReturnNode(GLOBAL_DATA, $2.m_node); 
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 
</span><del>-                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, $2.m_featureInfo, $2.m_numConstants); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
</del><ins>+                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, $2.m_features, $2.m_numConstants); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> WithStatement:
</span><span class="cx">     WITH '(' Expr ')' Statement         { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new WithNode(GLOBAL_DATA, $3.m_node, $5.m_node, @3.last_column, @3.last_column - @3.first_column),
</span><del>-                                                                                         $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_featureInfo | $5.m_featureInfo | WithFeature, $3.m_numConstants + $5.m_numConstants);
</del><ins>+                                                                                         $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_features | $5.m_features | WithFeature, $3.m_numConstants + $5.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @4); }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> SwitchStatement:
</span><span class="cx">     SWITCH '(' Expr ')' CaseBlock       { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new SwitchNode(GLOBAL_DATA, $3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations,
</span><del>-                                                                                         $3.m_featureInfo | $5.m_featureInfo, $3.m_numConstants + $5.m_numConstants);
</del><ins>+                                                                                         $3.m_features | $5.m_features, $3.m_numConstants + $5.m_numConstants);
</ins><span class="cx">                                           DBG($$.m_node, @1, @4); }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> CaseBlock:
</span><del>-    OPENBRACE CaseClausesOpt CLOSEBRACE              { $$ = createNodeDeclarationInfo&lt;CaseBlockNode*&gt;(new CaseBlockNode(GLOBAL_DATA, $2.m_node.head, 0, 0), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo, $2.m_numConstants); }
</del><ins>+    OPENBRACE CaseClausesOpt CLOSEBRACE              { $$ = createNodeDeclarationInfo&lt;CaseBlockNode*&gt;(new CaseBlockNode(GLOBAL_DATA, $2.m_node.head, 0, 0), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants); }
</ins><span class="cx">   | OPENBRACE CaseClausesOpt DefaultClause CaseClausesOpt CLOSEBRACE
</span><span class="cx">                                         { $$ = createNodeDeclarationInfo&lt;CaseBlockNode*&gt;(new CaseBlockNode(GLOBAL_DATA, $2.m_node.head, $3.m_node, $4.m_node.head),
</span><span class="cx">                                                                                          mergeDeclarationLists(mergeDeclarationLists($2.m_varDeclarations, $3.m_varDeclarations), $4.m_varDeclarations),
</span><span class="cx">                                                                                          mergeDeclarationLists(mergeDeclarationLists($2.m_funcDeclarations, $3.m_funcDeclarations), $4.m_funcDeclarations),
</span><del>-                                                                                         $2.m_featureInfo | $3.m_featureInfo | $4.m_featureInfo,
</del><ins>+                                                                                         $2.m_features | $3.m_features | $4.m_features,
</ins><span class="cx">                                                                                          $2.m_numConstants + $3.m_numConstants + $4.m_numConstants); }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> CaseClausesOpt:
</span><del>-/* nothing */                       { $$.m_node.head = 0; $$.m_node.tail = 0; $$.m_varDeclarations = 0; $$.m_funcDeclarations = 0; $$.m_featureInfo = 0; $$.m_numConstants = 0; }
</del><ins>+/* nothing */                       { $$.m_node.head = 0; $$.m_node.tail = 0; $$.m_varDeclarations = 0; $$.m_funcDeclarations = 0; $$.m_features = 0; $$.m_numConstants = 0; }
</ins><span class="cx">   | CaseClauses
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -1088,42 +1095,42 @@
</span><span class="cx">                                           $$.m_node.tail = $$.m_node.head;
</span><span class="cx">                                           $$.m_varDeclarations = $1.m_varDeclarations;
</span><span class="cx">                                           $$.m_funcDeclarations = $1.m_funcDeclarations; 
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants; }
</span><span class="cx">   | CaseClauses CaseClause              { $$.m_node.head = $1.m_node.head;
</span><span class="cx">                                           $$.m_node.tail = new ClauseListNode(GLOBAL_DATA, $1.m_node.tail, $2.m_node);
</span><span class="cx">                                           $$.m_varDeclarations = mergeDeclarationLists($1.m_varDeclarations, $2.m_varDeclarations);
</span><span class="cx">                                           $$.m_funcDeclarations = mergeDeclarationLists($1.m_funcDeclarations, $2.m_funcDeclarations);
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | $2.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features | $2.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants + $2.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> CaseClause:
</span><del>-    CASE Expr ':'                       { $$ = createNodeDeclarationInfo&lt;CaseClauseNode*&gt;(new CaseClauseNode(GLOBAL_DATA, $2.m_node), 0, 0, $2.m_featureInfo, $2.m_numConstants); }
-  | CASE Expr ':' SourceElements        { $$ = createNodeDeclarationInfo&lt;CaseClauseNode*&gt;(new CaseClauseNode(GLOBAL_DATA, $2.m_node, $4.m_node), $4.m_varDeclarations, $4.m_funcDeclarations, $2.m_featureInfo | $4.m_featureInfo, $2.m_numConstants + $4.m_numConstants); }
</del><ins>+    CASE Expr ':'                       { $$ = createNodeDeclarationInfo&lt;CaseClauseNode*&gt;(new CaseClauseNode(GLOBAL_DATA, $2.m_node), 0, 0, $2.m_features, $2.m_numConstants); }
+  | CASE Expr ':' SourceElements        { $$ = createNodeDeclarationInfo&lt;CaseClauseNode*&gt;(new CaseClauseNode(GLOBAL_DATA, $2.m_node, $4.m_node), $4.m_varDeclarations, $4.m_funcDeclarations, $2.m_features | $4.m_features, $2.m_numConstants + $4.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> DefaultClause:
</span><span class="cx">     DEFAULT ':'                         { $$ = createNodeDeclarationInfo&lt;CaseClauseNode*&gt;(new CaseClauseNode(GLOBAL_DATA, 0), 0, 0, 0, 0); }
</span><del>-  | DEFAULT ':' SourceElements          { $$ = createNodeDeclarationInfo&lt;CaseClauseNode*&gt;(new CaseClauseNode(GLOBAL_DATA, 0, $3.m_node), $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_featureInfo, $3.m_numConstants); }
</del><ins>+  | DEFAULT ':' SourceElements          { $$ = createNodeDeclarationInfo&lt;CaseClauseNode*&gt;(new CaseClauseNode(GLOBAL_DATA, 0, $3.m_node), $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_features, $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> LabelledStatement:
</span><span class="cx">     IDENT ':' Statement                 { $3.m_node-&gt;pushLabel(*$1);
</span><span class="cx">                                           LabelNode* node = new LabelNode(GLOBAL_DATA, *$1, $3.m_node);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column);
</span><del>-                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_featureInfo, $3.m_numConstants); }
</del><ins>+                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_features, $3.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> ThrowStatement:
</span><span class="cx">     THROW Expr ';'                      { ThrowNode* node = new ThrowNode(GLOBAL_DATA, $2.m_node);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column);
</span><del>-                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, $2.m_featureInfo, $2.m_numConstants); DBG($$.m_node, @1, @2);
</del><ins>+                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, $2.m_features, $2.m_numConstants); DBG($$.m_node, @1, @2);
</ins><span class="cx">                                         }
</span><span class="cx">   | THROW Expr error                    { ThrowNode* node = new ThrowNode(GLOBAL_DATA, $2.m_node);
</span><span class="cx">                                           SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column);
</span><del>-                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, $2.m_featureInfo, $2.m_numConstants); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; 
</del><ins>+                                          $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(node, 0, 0, $2.m_features, $2.m_numConstants); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; 
</ins><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="lines">@@ -1131,20 +1138,20 @@
</span><span class="cx">     TRY Block FINALLY Block             { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new TryNode(GLOBAL_DATA, $2.m_node, GLOBAL_DATA-&gt;propertyNames-&gt;nullIdentifier, 0, $4.m_node),
</span><span class="cx">                                                                                          mergeDeclarationLists($2.m_varDeclarations, $4.m_varDeclarations),
</span><span class="cx">                                                                                          mergeDeclarationLists($2.m_funcDeclarations, $4.m_funcDeclarations),
</span><del>-                                                                                         $2.m_featureInfo | $4.m_featureInfo,
</del><ins>+                                                                                         $2.m_features | $4.m_features,
</ins><span class="cx">                                                                                          $2.m_numConstants + $4.m_numConstants);
</span><span class="cx">                                           DBG($$.m_node, @1, @2); }
</span><span class="cx">   | TRY Block CATCH '(' IDENT ')' Block { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new TryNode(GLOBAL_DATA, $2.m_node, *$5, $7.m_node, 0),
</span><span class="cx">                                                                                          mergeDeclarationLists($2.m_varDeclarations, $7.m_varDeclarations),
</span><span class="cx">                                                                                          mergeDeclarationLists($2.m_funcDeclarations, $7.m_funcDeclarations),
</span><del>-                                                                                         $2.m_featureInfo | $7.m_featureInfo | CatchFeature,
</del><ins>+                                                                                         $2.m_features | $7.m_features | CatchFeature,
</ins><span class="cx">                                                                                          $2.m_numConstants + $7.m_numConstants);
</span><span class="cx">                                           DBG($$.m_node, @1, @2); }
</span><span class="cx">   | TRY Block CATCH '(' IDENT ')' Block FINALLY Block
</span><span class="cx">                                         { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;(new TryNode(GLOBAL_DATA, $2.m_node, *$5, $7.m_node, $9.m_node),
</span><span class="cx">                                                                                          mergeDeclarationLists(mergeDeclarationLists($2.m_varDeclarations, $7.m_varDeclarations), $9.m_varDeclarations),
</span><span class="cx">                                                                                          mergeDeclarationLists(mergeDeclarationLists($2.m_funcDeclarations, $7.m_funcDeclarations), $9.m_funcDeclarations),
</span><del>-                                                                                         $2.m_featureInfo | $7.m_featureInfo | $9.m_featureInfo | CatchFeature,
</del><ins>+                                                                                         $2.m_features | $7.m_features | $9.m_features | CatchFeature,
</ins><span class="cx">                                                                                          $2.m_numConstants + $7.m_numConstants + $9.m_numConstants);
</span><span class="cx">                                           DBG($$.m_node, @1, @2); }
</span><span class="cx"> ;
</span><span class="lines">@@ -1157,33 +1164,49 @@
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> FunctionDeclaration:
</span><del>-    FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncDeclNode(GLOBAL_DATA, *$2, $6, LEXER-&gt;sourceCode($5, $7, @5.first_line)), ((*$2 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | ClosureFeature, 0); DBG($6, @5, @7); }
</del><ins>+    FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeInfo(new FuncDeclNode(GLOBAL_DATA, *$2, $6, LEXER-&gt;sourceCode($5, $7, @5.first_line)), ((*$2 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | ClosureFeature, 0); DBG($6, @5, @7); }
</ins><span class="cx">   | FUNCTION IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE
</span><del>-      { $$ = createNodeFeatureInfo(new FuncDeclNode(GLOBAL_DATA, *$2, $7, LEXER-&gt;sourceCode($6, $8, @6.first_line), $4.m_node.head), ((*$2 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $4.m_featureInfo | ClosureFeature, 0); $7-&gt;setUsesArguments($7-&gt;usesArguments() || (($4.m_featureInfo &amp; ArgumentsFeature) != 0)); DBG($7, @6, @8); }
</del><ins>+      { 
+          $$ = createNodeInfo(new FuncDeclNode(GLOBAL_DATA, *$2, $7, LEXER-&gt;sourceCode($6, $8, @6.first_line), $4.m_node.head), ((*$2 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0) | $4.m_features | ClosureFeature, 0); 
+          if ($4.m_features &amp; ArgumentsFeature)
+              $7-&gt;setUsesArguments(); 
+          DBG($7, @6, @8); 
+      }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> FunctionExpr:
</span><del>-    FUNCTION '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, GLOBAL_DATA-&gt;propertyNames-&gt;nullIdentifier, $5, LEXER-&gt;sourceCode($4, $6, @4.first_line)), ClosureFeature, 0); DBG($5, @4, @6); }
-    | FUNCTION '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, GLOBAL_DATA-&gt;propertyNames-&gt;nullIdentifier, $6, LEXER-&gt;sourceCode($5, $7, @5.first_line), $3.m_node.head), $3.m_featureInfo | ClosureFeature, 0); $6-&gt;setUsesArguments($6-&gt;usesArguments() || (($3.m_featureInfo &amp; ArgumentsFeature) != 0)); DBG($6, @5, @7); }
-  | FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, *$2, $6, LEXER-&gt;sourceCode($5, $7, @5.first_line)), ClosureFeature, 0); DBG($6, @5, @7); }
-  | FUNCTION IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeFeatureInfo(new FuncExprNode(GLOBAL_DATA, *$2, $7, LEXER-&gt;sourceCode($6, $8, @6.first_line), $4.m_node.head), $4.m_featureInfo | ClosureFeature, 0); $7-&gt;setUsesArguments($7-&gt;usesArguments() || (($4.m_featureInfo &amp; ArgumentsFeature) != 0)); DBG($7, @6, @8); }
</del><ins>+    FUNCTION '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeInfo(new FuncExprNode(GLOBAL_DATA, GLOBAL_DATA-&gt;propertyNames-&gt;nullIdentifier, $5, LEXER-&gt;sourceCode($4, $6, @4.first_line)), ClosureFeature, 0); DBG($5, @4, @6); }
+    | FUNCTION '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE 
+      { 
+          $$ = createNodeInfo(new FuncExprNode(GLOBAL_DATA, GLOBAL_DATA-&gt;propertyNames-&gt;nullIdentifier, $6, LEXER-&gt;sourceCode($5, $7, @5.first_line), $3.m_node.head), $3.m_features | ClosureFeature, 0); 
+          if ($3.m_features &amp; ArgumentsFeature) 
+              $6-&gt;setUsesArguments();
+          DBG($6, @5, @7); 
+      }
+  | FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeInfo(new FuncExprNode(GLOBAL_DATA, *$2, $6, LEXER-&gt;sourceCode($5, $7, @5.first_line)), ClosureFeature, 0); DBG($6, @5, @7); }
+  | FUNCTION IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE 
+      { 
+          $$ = createNodeInfo(new FuncExprNode(GLOBAL_DATA, *$2, $7, LEXER-&gt;sourceCode($6, $8, @6.first_line), $4.m_node.head), $4.m_features | ClosureFeature, 0); 
+          if ($4.m_features &amp; ArgumentsFeature)
+              $7-&gt;setUsesArguments();
+          DBG($7, @6, @8); 
+      }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> FormalParameterList:
</span><span class="cx">     IDENT                               { $$.m_node.head = new ParameterNode(GLOBAL_DATA, *$1);
</span><del>-                                          $$.m_featureInfo = (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0;
</del><ins>+                                          $$.m_features = (*$1 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0;
</ins><span class="cx">                                           $$.m_node.tail = $$.m_node.head; }
</span><span class="cx">   | FormalParameterList ',' IDENT       { $$.m_node.head = $1.m_node.head;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0);
</del><ins>+                                          $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA-&gt;propertyNames-&gt;arguments) ? ArgumentsFeature : 0);
</ins><span class="cx">                                           $$.m_node.tail = new ParameterNode(GLOBAL_DATA, $1.m_node.tail, *$3);  }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> FunctionBody:
</span><del>-    /* not in spec */           { $$ = FunctionBodyNode::create(GLOBAL_DATA, 0, 0, 0, false, false, false, 0); }
</del><ins>+    /* not in spec */           { $$ = FunctionBodyNode::create(GLOBAL_DATA, 0, 0, 0, NoFeatures, 0); }
</ins><span class="cx">   | SourceElements              { $$ = FunctionBodyNode::create(GLOBAL_DATA, $1.m_node, $1.m_varDeclarations ? &amp;$1.m_varDeclarations-&gt;data : 0, 
</span><span class="cx">                                                                 $1.m_funcDeclarations ? &amp;$1.m_funcDeclarations-&gt;data : 0,
</span><del>-                                                                ($1.m_featureInfo &amp; EvalFeature) != 0, ($1.m_featureInfo &amp; ClosureFeature) != 0,
-                                                                ($1.m_featureInfo &amp; ArgumentsFeature) != 0, $1.m_numConstants);
</del><ins>+                                                                $1.m_features, $1.m_numConstants);
</ins><span class="cx">                                   // As in mergeDeclarationLists() we have to ref/deref to safely get rid of
</span><span class="cx">                                   // the declaration lists.
</span><span class="cx">                                   if ($1.m_varDeclarations) {
</span><span class="lines">@@ -1198,10 +1221,9 @@
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> Program:
</span><del>-    /* not in spec */                   { GLOBAL_DATA-&gt;parser-&gt;didFinishParsing(new SourceElements(GLOBAL_DATA), 0, 0, false, false, false, @0.last_line, 0); }
-    | SourceElements                    { GLOBAL_DATA-&gt;parser-&gt;didFinishParsing($1.m_node, $1.m_varDeclarations, $1.m_funcDeclarations, 
-                                                                    ($1.m_featureInfo &amp; EvalFeature) != 0, ($1.m_featureInfo &amp; ClosureFeature) != 0,
-                                                                    ($1.m_featureInfo &amp; ArgumentsFeature) != 0, @1.last_line, $1.m_numConstants); }
</del><ins>+    /* not in spec */                   { GLOBAL_DATA-&gt;parser-&gt;didFinishParsing(new SourceElements(GLOBAL_DATA), 0, 0, NoFeatures, @0.last_line, 0); }
+    | SourceElements                    { GLOBAL_DATA-&gt;parser-&gt;didFinishParsing($1.m_node, $1.m_varDeclarations, $1.m_funcDeclarations, $1.m_features, 
+                                                                                @1.last_line, $1.m_numConstants); }
</ins><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> SourceElements:
</span><span class="lines">@@ -1209,19 +1231,19 @@
</span><span class="cx">                                           $$.m_node-&gt;append($1.m_node);
</span><span class="cx">                                           $$.m_varDeclarations = $1.m_varDeclarations;
</span><span class="cx">                                           $$.m_funcDeclarations = $1.m_funcDeclarations;
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx">   | SourceElements SourceElement        { $$.m_node-&gt;append($2.m_node);
</span><span class="cx">                                           $$.m_varDeclarations = mergeDeclarationLists($1.m_varDeclarations, $2.m_varDeclarations);
</span><span class="cx">                                           $$.m_funcDeclarations = mergeDeclarationLists($1.m_funcDeclarations, $2.m_funcDeclarations);
</span><del>-                                          $$.m_featureInfo = $1.m_featureInfo | $2.m_featureInfo;
</del><ins>+                                          $$.m_features = $1.m_features | $2.m_features;
</ins><span class="cx">                                           $$.m_numConstants = $1.m_numConstants + $2.m_numConstants;
</span><span class="cx">                                         }
</span><span class="cx"> ;
</span><span class="cx"> 
</span><span class="cx"> SourceElement:
</span><del>-    FunctionDeclaration                 { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;($1.m_node, 0, new ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt;(GLOBAL_DATA), $1.m_featureInfo, 0); $$.m_funcDeclarations-&gt;data.append($1.m_node); }
</del><ins>+    FunctionDeclaration                 { $$ = createNodeDeclarationInfo&lt;StatementNode*&gt;($1.m_node, 0, new ParserRefCountedData&lt;DeclarationStacks::FunctionStack&gt;(GLOBAL_DATA), $1.m_features, 0); $$.m_funcDeclarations-&gt;data.append($1.m_node); }
</ins><span class="cx">   | Statement                           { $$ = $1; }
</span><span class="cx"> ;
</span><span class="cx">  
</span><span class="lines">@@ -1308,28 +1330,28 @@
</span><span class="cx"> 
</span><span class="cx"> static ExpressionNodeInfo makeFunctionCallNode(void* globalPtr, ExpressionNodeInfo func, ArgumentsNodeInfo args, int start, int divot, int end)
</span><span class="cx"> {
</span><del>-    FeatureInfo features = func.m_featureInfo | args.m_featureInfo;
</del><ins>+    CodeFeatures features = func.m_features | args.m_features;
</ins><span class="cx">     int numConstants = func.m_numConstants + args.m_numConstants;
</span><span class="cx">     if (!func.m_node-&gt;isLocation())
</span><del>-        return createNodeFeatureInfo&lt;ExpressionNode*&gt;(new FunctionCallValueNode(GLOBAL_DATA, func.m_node, args.m_node, divot, divot - start, end - divot), features, numConstants);
</del><ins>+        return createNodeInfo&lt;ExpressionNode*&gt;(new FunctionCallValueNode(GLOBAL_DATA, func.m_node, args.m_node, divot, divot - start, end - divot), features, numConstants);
</ins><span class="cx">     if (func.m_node-&gt;isResolveNode()) {
</span><span class="cx">         ResolveNode* resolve = static_cast&lt;ResolveNode*&gt;(func.m_node);
</span><span class="cx">         const Identifier&amp; identifier = resolve-&gt;identifier();
</span><span class="cx">         if (identifier == GLOBAL_DATA-&gt;propertyNames-&gt;eval)
</span><del>-            return createNodeFeatureInfo&lt;ExpressionNode*&gt;(new EvalFunctionCallNode(GLOBAL_DATA, args.m_node, divot, divot - start, end - divot), EvalFeature | features, numConstants);
-        return createNodeFeatureInfo&lt;ExpressionNode*&gt;(new FunctionCallResolveNode(GLOBAL_DATA, identifier, args.m_node, divot, divot - start, end - divot), features, numConstants);
</del><ins>+            return createNodeInfo&lt;ExpressionNode*&gt;(new EvalFunctionCallNode(GLOBAL_DATA, args.m_node, divot, divot - start, end - divot), EvalFeature | features, numConstants);
+        return createNodeInfo&lt;ExpressionNode*&gt;(new FunctionCallResolveNode(GLOBAL_DATA, identifier, args.m_node, divot, divot - start, end - divot), features, numConstants);
</ins><span class="cx">     }
</span><span class="cx">     if (func.m_node-&gt;isBracketAccessorNode()) {
</span><span class="cx">         BracketAccessorNode* bracket = static_cast&lt;BracketAccessorNode*&gt;(func.m_node);
</span><span class="cx">         FunctionCallBracketNode* node = new FunctionCallBracketNode(GLOBAL_DATA, bracket-&gt;base(), bracket-&gt;subscript(), args.m_node, divot, divot - start, end - divot);
</span><span class="cx">         node-&gt;setSubexpressionInfo(bracket-&gt;divot(), bracket-&gt;endOffset());
</span><del>-        return createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, features, numConstants);
</del><ins>+        return createNodeInfo&lt;ExpressionNode*&gt;(node, features, numConstants);
</ins><span class="cx">     }
</span><span class="cx">     ASSERT(func.m_node-&gt;isDotAccessorNode());
</span><span class="cx">     DotAccessorNode* dot = static_cast&lt;DotAccessorNode*&gt;(func.m_node);
</span><span class="cx">     FunctionCallDotNode* node = new FunctionCallDotNode(GLOBAL_DATA, dot-&gt;base(), dot-&gt;identifier(), args.m_node, divot, divot - start, end - divot);
</span><span class="cx">     node-&gt;setSubexpressionInfo(dot-&gt;divot(), dot-&gt;endOffset());
</span><del>-    return createNodeFeatureInfo&lt;ExpressionNode*&gt;(node, features, numConstants);
</del><ins>+    return createNodeInfo&lt;ExpressionNode*&gt;(node, features, numConstants);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static ExpressionNode* makeTypeOfNode(void* globalPtr, ExpressionNode* expr)
</span></span></pre></div>
<a id="trunkJavaScriptCorekjsnodescpp"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/kjs/nodes.cpp (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/kjs/nodes.cpp        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/kjs/nodes.cpp        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -1698,12 +1698,10 @@
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ ScopeNode -----------------------------
</span><span class="cx"> 
</span><del>-ScopeNode::ScopeNode(JSGlobalData* globalData, const SourceCode&amp; source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
</del><ins>+ScopeNode::ScopeNode(JSGlobalData* globalData, const SourceCode&amp; source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, CodeFeatures features, int numConstants)
</ins><span class="cx">     : BlockNode(globalData, children)
</span><span class="cx">     , m_source(source)
</span><del>-    , m_usesEval(usesEval)
-    , m_needsClosure(needsClosure)
-    , m_usesArguments(usesArguments)
</del><ins>+    , m_features(features)
</ins><span class="cx">     , m_numConstants(numConstants)
</span><span class="cx"> {
</span><span class="cx">     if (varStack)
</span><span class="lines">@@ -1716,20 +1714,20 @@
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ ProgramNode -----------------------------
</span><span class="cx"> 
</span><del>-ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp; source, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
-    : ScopeNode(globalData, source, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
</del><ins>+ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp; source, CodeFeatures features, int numConstants)
+    : ScopeNode(globalData, source, children, varStack, funcStack, features, numConstants)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp; source, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
</del><ins>+ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp; source, CodeFeatures features, int numConstants)
</ins><span class="cx"> {
</span><del>-    return new ProgramNode(globalData, children, varStack, funcStack, source, usesEval, needsClosure, usesArguments, numConstants);
</del><ins>+    return new ProgramNode(globalData, children, varStack, funcStack, source, features, numConstants);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ EvalNode -----------------------------
</span><span class="cx"> 
</span><del>-EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp; source, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
-    : ScopeNode(globalData, source, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
</del><ins>+EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp; source, CodeFeatures features, int numConstants)
+    : ScopeNode(globalData, source, children, varStack, funcStack, features, numConstants)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1758,15 +1756,15 @@
</span><span class="cx">     generator.generate();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp; source, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
</del><ins>+EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp; source, CodeFeatures features, int numConstants)
</ins><span class="cx"> {
</span><del>-    return new EvalNode(globalData, children, varStack, funcStack, source, usesEval, needsClosure, usesArguments, numConstants);
</del><ins>+    return new EvalNode(globalData, children, varStack, funcStack, source, features, numConstants);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ FunctionBodyNode -----------------------------
</span><span class="cx"> 
</span><del>-FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
-    : ScopeNode(globalData, SourceCode(), children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants)
</del><ins>+FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, CodeFeatures features, int numConstants)
+    : ScopeNode(globalData, SourceCode(), children, varStack, funcStack, features, numConstants)
</ins><span class="cx">     , m_parameters(0)
</span><span class="cx">     , m_refCount(0)
</span><span class="cx"> {
</span><span class="lines">@@ -1800,14 +1798,14 @@
</span><span class="cx">         m_code-&gt;mark();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
</del><ins>+FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, CodeFeatures features, int numConstants)
</ins><span class="cx"> {
</span><del>-    return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants);
</del><ins>+    return new FunctionBodyNode(globalData, children, varStack, funcStack, features, numConstants);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp;, bool usesEval, bool needsClosure, bool usesArguments, int numConstants)
</del><ins>+FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode&amp;, CodeFeatures features, int numConstants)
</ins><span class="cx"> {
</span><del>-    return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure, usesArguments, numConstants);
</del><ins>+    return new FunctionBodyNode(globalData, children, varStack, funcStack, features, numConstants);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FunctionBodyNode::generateCode(ScopeChainNode* scopeChainNode)
</span></span></pre></div>
<a id="trunkJavaScriptCorekjsnodesh"></a>
<div class="modfile"><h4>Modified: trunk/JavaScriptCore/kjs/nodes.h (37274 => 37275)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JavaScriptCore/kjs/nodes.h        2008-10-04 01:11:00 UTC (rev 37274)
+++ trunk/JavaScriptCore/kjs/nodes.h        2008-10-04 01:39:43 UTC (rev 37275)
</span><span class="lines">@@ -60,6 +60,18 @@
</span><span class="cx">     class PropertyListNode;
</span><span class="cx">     class SourceStream;
</span><span class="cx"> 
</span><ins>+    typedef unsigned int CodeFeatures;
+
+    const CodeFeatures NoFeatures = 0;
+    const CodeFeatures EvalFeature = 1 &lt;&lt; 0;
+    const CodeFeatures ClosureFeature = 1 &lt;&lt; 1;
+    const CodeFeatures AssignFeature = 1 &lt;&lt; 2;
+    const CodeFeatures ArgumentsFeature = 1 &lt;&lt; 3;
+    const CodeFeatures WithFeature = 1 &lt;&lt; 4;
+    const CodeFeatures CatchFeature = 1 &lt;&lt; 5;
+    const CodeFeatures ThisFeature = 1 &lt;&lt; 6;
+    const CodeFeatures AllFeatures = EvalFeature | ClosureFeature | AssignFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature;
+
</ins><span class="cx">     enum Operator {
</span><span class="cx">         OpEqual,
</span><span class="cx">         OpPlusEq,
</span><span class="lines">@@ -2167,7 +2179,7 @@
</span><span class="cx"> 
</span><span class="cx">     class ScopeNode : public BlockNode {
</span><span class="cx">     public:
</span><del>-        ScopeNode(JSGlobalData*, const SourceCode&amp;, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
</del><ins>+        ScopeNode(JSGlobalData*, const SourceCode&amp;, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants) JSC_FAST_CALL;
</ins><span class="cx"> 
</span><span class="cx">         virtual void streamTo(SourceStream&amp;) const JSC_FAST_CALL;
</span><span class="cx">         
</span><span class="lines">@@ -2176,10 +2188,10 @@
</span><span class="cx">         const UString&amp; sourceURL() const JSC_FAST_CALL { return m_source.provider()-&gt;url(); }
</span><span class="cx">         intptr_t sourceID() const { return m_source.provider()-&gt;asID(); }
</span><span class="cx"> 
</span><del>-        bool usesEval() const { return m_usesEval; }
-        bool needsClosure() const { return m_needsClosure; }
-        bool usesArguments() const { return m_usesArguments; }
-        void setUsesArguments(bool usesArguments) { m_usesArguments = usesArguments; }
</del><ins>+        bool usesEval() const { return m_features &amp; EvalFeature; }
+        bool containsClosures() const { return m_features &amp; ClosureFeature; }
+        bool usesArguments() const { return m_features &amp; ArgumentsFeature; }
+        void setUsesArguments() { m_features |= ArgumentsFeature; }
</ins><span class="cx"> 
</span><span class="cx">         VarStack&amp; varStack() { return m_varStack; }
</span><span class="cx">         FunctionStack&amp; functionStack() { return m_functionStack; }
</span><span class="lines">@@ -2197,15 +2209,13 @@
</span><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         SourceCode m_source;
</span><del>-        bool m_usesEval;
-        bool m_needsClosure;
-        bool m_usesArguments;
</del><ins>+        CodeFeatures m_features;
</ins><span class="cx">         int m_numConstants;
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     class ProgramNode : public ScopeNode {
</span><span class="cx">     public:
</span><del>-        static ProgramNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
</del><ins>+        static ProgramNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, CodeFeatures, int numConstants) JSC_FAST_CALL;
</ins><span class="cx"> 
</span><span class="cx">         ProgramCodeBlock&amp; byteCode(ScopeChainNode* scopeChain) JSC_FAST_CALL
</span><span class="cx">         {
</span><span class="lines">@@ -2215,7 +2225,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">     private:
</span><del>-        ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
</del><ins>+        ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, CodeFeatures, int numConstants) JSC_FAST_CALL;
</ins><span class="cx"> 
</span><span class="cx">         void generateCode(ScopeChainNode*) JSC_FAST_CALL;
</span><span class="cx">         virtual RegisterID* emitCode(CodeGenerator&amp;, RegisterID* = 0) JSC_FAST_CALL;
</span><span class="lines">@@ -2228,7 +2238,7 @@
</span><span class="cx"> 
</span><span class="cx">     class EvalNode : public ScopeNode {
</span><span class="cx">     public:
</span><del>-        static EvalNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
</del><ins>+        static EvalNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, CodeFeatures, int numConstants) JSC_FAST_CALL;
</ins><span class="cx"> 
</span><span class="cx">         EvalCodeBlock&amp; byteCode(ScopeChainNode* scopeChain) JSC_FAST_CALL
</span><span class="cx">         {
</span><span class="lines">@@ -2238,7 +2248,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">     private:
</span><del>-        EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
</del><ins>+        EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, CodeFeatures, int numConstants) JSC_FAST_CALL;
</ins><span class="cx"> 
</span><span class="cx">         void generateCode(ScopeChainNode*) JSC_FAST_CALL;
</span><span class="cx">         virtual RegisterID* emitCode(CodeGenerator&amp;, RegisterID* = 0) JSC_FAST_CALL;
</span><span class="lines">@@ -2248,8 +2258,8 @@
</span><span class="cx"> 
</span><span class="cx">     class FunctionBodyNode : public ScopeNode {
</span><span class="cx">     public:
</span><del>-        static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
-        static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
</del><ins>+        static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&amp;, CodeFeatures, int numConstants) JSC_FAST_CALL;
+        static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants) JSC_FAST_CALL;
</ins><span class="cx">         ~FunctionBodyNode();
</span><span class="cx"> 
</span><span class="cx">         const Identifier* parameters() const JSC_FAST_CALL { return m_parameters; }
</span><span class="lines">@@ -2296,7 +2306,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">     protected:
</span><del>-        FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure, bool usesArguments, int numConstants) JSC_FAST_CALL;
</del><ins>+        FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants) JSC_FAST_CALL;
</ins><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         void generateCode(ScopeChainNode*) JSC_FAST_CALL;
</span></span></pre>
</div>
</div>

</body>
</html>