Changeset 31072 in webkit for trunk/JavaScriptCore/kjs


Ignore:
Timestamp:
Mar 14, 2008, 6:05:55 PM (17 years ago)
Author:
[email protected]
Message:

Add logic to track whether a function uses a locally scoped eval or requires a closure

Reviewed by Maciej

Now that we limit eval we can track those uses of eval that operate
in the local scope and functions that require a closure. We track
this information during initial parsing to avoid yet another tree
walk.

Location:
trunk/JavaScriptCore/kjs
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/NodeInfo.h

    r29663 r31072  
    2626namespace KJS {
    2727
    28 template <typename T> struct NodeInfo {
    29     T m_node;
    30     ParserRefCountedData<DeclarationStacks::VarStack>* m_varDeclarations;
    31     ParserRefCountedData<DeclarationStacks::FunctionStack>* m_funcDeclarations;
    32 };
     28    typedef unsigned int FeatureInfo;
    3329
    34 typedef NodeInfo<StatementNode*> StatementNodeInfo;
    35 typedef NodeInfo<CaseBlockNode*> CaseBlockNodeInfo;
    36 typedef NodeInfo<CaseClauseNode*> CaseClauseNodeInfo;
    37 typedef NodeInfo<SourceElements*> SourceElementsInfo;
    38 typedef NodeInfo<ClauseList> ClauseListInfo;
    39 typedef NodeInfo<ExpressionNode*> VarDeclListInfo;
    40 typedef NodeInfo<ConstDeclList> ConstDeclListInfo;
     30    const FeatureInfo NoFeatures = 0;
     31    const FeatureInfo EvalFeature = 1 << 0;
     32    const FeatureInfo ClosureFeature = 1 << 1;
     33
     34    template <typename T> struct NodeFeatureInfo {
     35        T m_node;
     36        FeatureInfo m_featureInfo;
     37    };
     38   
     39    typedef NodeFeatureInfo<FuncExprNode*> FuncExprNodeInfo;
     40    typedef NodeFeatureInfo<ExpressionNode*> ExpressionNodeInfo;
     41    typedef NodeFeatureInfo<ArgumentsNode*> ArgumentsNodeInfo;
     42    typedef NodeFeatureInfo<ConstDeclNode*> ConstDeclNodeInfo;
     43    typedef NodeFeatureInfo<PropertyNode*> PropertyNodeInfo;
     44    typedef NodeFeatureInfo<PropertyList> PropertyListInfo;
     45    typedef NodeFeatureInfo<ElementList> ElementListInfo;
     46    typedef NodeFeatureInfo<ArgumentList> ArgumentListInfo;
     47   
     48    template <typename T> struct NodeDeclarationInfo {
     49        T m_node;
     50        ParserRefCountedData<DeclarationStacks::VarStack>* m_varDeclarations;
     51        ParserRefCountedData<DeclarationStacks::FunctionStack>* m_funcDeclarations;
     52        FeatureInfo m_featureInfo;
     53    };
     54   
     55    typedef NodeDeclarationInfo<StatementNode*> StatementNodeInfo;
     56    typedef NodeDeclarationInfo<CaseBlockNode*> CaseBlockNodeInfo;
     57    typedef NodeDeclarationInfo<CaseClauseNode*> CaseClauseNodeInfo;
     58    typedef NodeDeclarationInfo<SourceElements*> SourceElementsInfo;
     59    typedef NodeDeclarationInfo<ClauseList> ClauseListInfo;
     60    typedef NodeDeclarationInfo<ExpressionNode*> VarDeclListInfo;
     61    typedef NodeDeclarationInfo<ConstDeclList> ConstDeclListInfo;
    4162
    4263} // namespace KJS
  • trunk/JavaScriptCore/kjs/Parser.cpp

    r28937 r31072  
    7373
    7474void Parser::didFinishParsing(SourceElements* sourceElements, ParserRefCountedData<DeclarationStacks::VarStack>* varStack,
    75                               ParserRefCountedData<DeclarationStacks::FunctionStack>* funcStack, int lastLine)
     75                              ParserRefCountedData<DeclarationStacks::FunctionStack>* funcStack, bool usesEval, bool needsClosure, int lastLine)
    7676{
    7777    m_sourceElements = sourceElements ? sourceElements : new SourceElements;
    7878    m_varDeclarations = varStack;
    7979    m_funcDeclarations = funcStack;
     80    m_usesEval = usesEval;
     81    m_needsClosure = needsClosure;
    8082    m_lastLine = lastLine;
    8183}
  • trunk/JavaScriptCore/kjs/Parser.h

    r30942 r31072  
    5353
    5454        void didFinishParsing(SourceElements*, ParserRefCountedData<DeclarationStacks::VarStack>*,
    55                               ParserRefCountedData<DeclarationStacks::FunctionStack>*, int lastLine);
     55                              ParserRefCountedData<DeclarationStacks::FunctionStack>*, bool usesEval, bool needsClosure, int lastLine);
    5656
    5757    private:
     
    6767        RefPtr<ParserRefCountedData<DeclarationStacks::VarStack> > m_varDeclarations;
    6868        RefPtr<ParserRefCountedData<DeclarationStacks::FunctionStack> > m_funcDeclarations;
     69        bool m_usesEval;
     70        bool m_needsClosure;
    6971        int m_lastLine;
    7072    };
     
    8587        RefPtr<ParsedNode> node = ParsedNode::create(m_sourceElements.release().get(),
    8688                                                     m_varDeclarations ? &m_varDeclarations->data : 0,
    87                                                      m_funcDeclarations ? &m_funcDeclarations->data : 0);
     89                                                     m_funcDeclarations ? &m_funcDeclarations->data : 0,
     90                                                     m_usesEval,
     91                                                     m_needsClosure);
    8892        m_varDeclarations = 0;
    8993        m_funcDeclarations = 0;
  • trunk/JavaScriptCore/kjs/grammar.y

    r30871 r31072  
    6767static ExpressionNode* makePostfixNode(ExpressionNode* expr, Operator);
    6868static PropertyNode* makeGetterOrSetterPropertyNode(const Identifier &getOrSet, const Identifier& name, ParameterNode*, FunctionBodyNode*);
    69 static ExpressionNode* makeFunctionCallNode(ExpressionNode* func, ArgumentsNode*);
     69static ExpressionNodeInfo makeFunctionCallNode(ExpressionNodeInfo func, ArgumentsNodeInfo);
    7070static ExpressionNode* makeTypeOfNode(ExpressionNode*);
    7171static ExpressionNode* makeDeleteNode(ExpressionNode*);
     
    9090#endif
    9191
    92 template <typename T> NodeInfo<T> createNodeInfo(T node, ParserRefCountedData<DeclarationStacks::VarStack>* varDecls,
    93                                                  ParserRefCountedData<DeclarationStacks::FunctionStack>* funcDecls)
    94 {
    95     NodeInfo<T> result = {node, varDecls, funcDecls};
     92template <typename T> NodeDeclarationInfo<T> createNodeDeclarationInfo(T node, ParserRefCountedData<DeclarationStacks::VarStack>* varDecls,
     93                                                                       ParserRefCountedData<DeclarationStacks::FunctionStack>* funcDecls,
     94                                                                       FeatureInfo info)
     95{
     96    ASSERT((info & ~(EvalFeature | ClosureFeature)) == 0);
     97    NodeDeclarationInfo<T> result = {node, varDecls, funcDecls, info};
     98    return result;
     99}
     100
     101template <typename T> NodeFeatureInfo<T> createNodeFeatureInfo(T node, FeatureInfo info)
     102{
     103    ASSERT((info & ~(EvalFeature | ClosureFeature)) == 0);
     104    NodeFeatureInfo<T> result = {node, info};
    96105    return result;
    97106}
     
    142151
    143152    // expression subtrees
    144     ExpressionNode*     expressionNode;
     153    ExpressionNodeInfo  expressionNode;
    145154    FuncDeclNode*       funcDeclNode;
    146     PropertyNode*       propertyNode;
    147     ArgumentsNode*      argumentsNode;
    148     ConstDeclNode*      constDeclNode;
     155    PropertyNodeInfo    propertyNode;
     156    ArgumentsNodeInfo   argumentsNode;
     157    ConstDeclNodeInfo   constDeclNode;
    149158    CaseBlockNodeInfo   caseBlockNode;
    150159    CaseClauseNodeInfo  caseClauseNode;
    151     FuncExprNode*       funcExprNode;
     160    FuncExprNodeInfo    funcExprNode;
    152161
    153162    // statement nodes
     
    157166
    158167    SourceElementsInfo  sourceElements;
    159     PropertyList        propertyList;
    160     ArgumentList        argumentList;
     168    PropertyListInfo    propertyList;
     169    ArgumentListInfo    argumentList;
    161170    VarDeclListInfo     varDeclList;
    162171    ConstDeclListInfo   constDeclList;
    163172    ClauseListInfo      clauseList;
    164     ElementList         elementList;
     173    ElementListInfo     elementList;
    165174    ParameterList       parameterList;
    166175
     
    265274
    266275Literal:
    267     NULLTOKEN                           { $$ = new NullNode; }
    268   | TRUETOKEN                           { $$ = new TrueNode; }
    269   | FALSETOKEN                          { $$ = new FalseNode; }
    270   | NUMBER                              { $$ = makeNumberNode($1); }
    271   | STRING                              { $$ = new StringNode($1); }
     276    NULLTOKEN                           { $$ = createNodeFeatureInfo<ExpressionNode*>(new NullNode, 0); }
     277  | TRUETOKEN                           { $$ = createNodeFeatureInfo<ExpressionNode*>(new TrueNode, 0); }
     278  | FALSETOKEN                          { $$ = createNodeFeatureInfo<ExpressionNode*>(new FalseNode, 0); }
     279  | NUMBER                              { $$ = createNodeFeatureInfo<ExpressionNode*>(makeNumberNode($1), 0); }
     280  | STRING                              { $$ = createNodeFeatureInfo<ExpressionNode*>(new StringNode($1), 0); }
    272281  | '/' /* regexp */                    {
    273282                                            Lexer& l = lexer();
    274283                                            if (!l.scanRegExp())
    275284                                                YYABORT;
    276                                             $$ = new RegExpNode(l.pattern(), l.flags());
     285                                            $$ = createNodeFeatureInfo<ExpressionNode*>(new RegExpNode(l.pattern(), l.flags()), 0);
    277286                                        }
    278287  | DIVEQUAL /* regexp with /= */       {
     
    280289                                            if (!l.scanRegExp())
    281290                                                YYABORT;
    282                                             $$ = new RegExpNode("=" + l.pattern(), l.flags());
     291                                            $$ = createNodeFeatureInfo<ExpressionNode*>(new RegExpNode("=" + l.pattern(), l.flags()), 0);
    283292                                        }
    284293;
    285294
    286295Property:
    287     IDENT ':' AssignmentExpr            { $$ = new PropertyNode(*$1, $3, PropertyNode::Constant); }
    288   | STRING ':' AssignmentExpr           { $$ = new PropertyNode(Identifier(*$1), $3, PropertyNode::Constant); }
    289   | NUMBER ':' AssignmentExpr           { $$ = new PropertyNode(Identifier(UString::from($1)), $3, PropertyNode::Constant); }
    290   | IDENT IDENT '(' ')' '{' FunctionBody '}'    { $$ = makeGetterOrSetterPropertyNode(*$1, *$2, 0, $6); DBG($6, @5, @7); if (!$$) YYABORT; }
     296    IDENT ':' AssignmentExpr            { $$ = createNodeFeatureInfo<PropertyNode*>(new PropertyNode(*$1, $3.m_node, PropertyNode::Constant), $3.m_featureInfo); }
     297  | STRING ':' AssignmentExpr           { $$ = createNodeFeatureInfo<PropertyNode*>(new PropertyNode(Identifier(*$1), $3.m_node, PropertyNode::Constant), $3.m_featureInfo); }
     298  | NUMBER ':' AssignmentExpr           { $$ = createNodeFeatureInfo<PropertyNode*>(new PropertyNode(Identifier(UString::from($1)), $3.m_node, PropertyNode::Constant), $3.m_featureInfo); }
     299  | IDENT IDENT '(' ')' '{' FunctionBody '}'    { $$ = createNodeFeatureInfo<PropertyNode*>(makeGetterOrSetterPropertyNode(*$1, *$2, 0, $6), ClosureFeature); DBG($6, @5, @7); if (!$$.m_node) YYABORT; }
    291300  | IDENT IDENT '(' FormalParameterList ')' '{' FunctionBody '}'
    292                                         { $$ = makeGetterOrSetterPropertyNode(*$1, *$2, $4.head, $7); DBG($7, @6, @8); if (!$$) YYABORT; }
     301                                        { $$ = createNodeFeatureInfo<PropertyNode*>(makeGetterOrSetterPropertyNode(*$1, *$2, $4.head, $7), ClosureFeature); DBG($7, @6, @8); if (!$$.m_node) YYABORT; }
    293302;
    294303
    295304PropertyList:
    296     Property                            { $$.head = new PropertyListNode($1);
    297                                           $$.tail = $$.head; }
    298   | PropertyList ',' Property           { $$.head = $1.head;
    299                                           $$.tail = new PropertyListNode($3, $1.tail); }
     305    Property                            { $$.m_node.head = new PropertyListNode($1.m_node);
     306                                          $$.m_node.tail = $$.m_node.head;
     307                                          $$.m_featureInfo = $1.m_featureInfo; }
     308  | PropertyList ',' Property           { $$.m_node.head = $1.m_node.head;
     309                                          $$.m_node.tail = new PropertyListNode($3.m_node, $1.m_node.tail);
     310                                          $$.m_featureInfo = $1.m_featureInfo | $3.m_featureInfo;  }
    300311;
    301312
    302313PrimaryExpr:
    303314    PrimaryExprNoBrace
    304   | '{' '}'                             { $$ = new ObjectLiteralNode(); }
    305   | '{' PropertyList '}'                { $$ = new ObjectLiteralNode($2.head); }
     315  | '{' '}'                             { $$ = createNodeFeatureInfo<ExpressionNode*>(new ObjectLiteralNode(), 0); }
     316  | '{' PropertyList '}'                { $$ = createNodeFeatureInfo<ExpressionNode*>(new ObjectLiteralNode($2.m_node.head), $2.m_featureInfo); }
    306317  /* allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939 */
    307   | '{' PropertyList ',' '}'            { $$ = new ObjectLiteralNode($2.head); }
     318  | '{' PropertyList ',' '}'            { $$ = createNodeFeatureInfo<ExpressionNode*>(new ObjectLiteralNode($2.m_node.head), $2.m_featureInfo); }
    308319;
    309320
    310321PrimaryExprNoBrace:
    311     THISTOKEN                           { $$ = new ThisNode(); }
     322    THISTOKEN                           { $$ = createNodeFeatureInfo<ExpressionNode*>(new ThisNode(), 0); }
    312323  | Literal
    313324  | ArrayLiteral
    314   | IDENT                               { $$ = new ResolveNode(*$1); }
     325  | IDENT                               { $$ = createNodeFeatureInfo<ExpressionNode*>(new ResolveNode(*$1), 0); }
    315326  | '(' Expr ')'                        { $$ = $2; }
    316327;
    317328
    318329ArrayLiteral:
    319     '[' ElisionOpt ']'                  { $$ = new ArrayNode($2); }
    320   | '[' ElementList ']'                 { $$ = new ArrayNode($2.head); }
    321   | '[' ElementList ',' ElisionOpt ']'  { $$ = new ArrayNode($4, $2.head); }
     330    '[' ElisionOpt ']'                  { $$ = createNodeFeatureInfo<ExpressionNode*>(new ArrayNode($2), 0); }
     331  | '[' ElementList ']'                 { $$ = createNodeFeatureInfo<ExpressionNode*>(new ArrayNode($2.m_node.head), $2.m_featureInfo); }
     332  | '[' ElementList ',' ElisionOpt ']'  { $$ = createNodeFeatureInfo<ExpressionNode*>(new ArrayNode($4, $2.m_node.head), $2.m_featureInfo); }
    322333;
    323334
    324335ElementList:
    325     ElisionOpt AssignmentExpr           { $$.head = new ElementNode($1, $2);
    326                                           $$.tail = $$.head; }
     336    ElisionOpt AssignmentExpr           { $$.m_node.head = new ElementNode($1, $2.m_node);
     337                                          $$.m_node.tail = $$.m_node.head;
     338                                          $$.m_featureInfo = $2.m_featureInfo; }
    327339  | ElementList ',' ElisionOpt AssignmentExpr
    328                                         { $$.head = $1.head;
    329                                           $$.tail = new ElementNode($1.tail, $3, $4); }
     340                                        { $$.m_node.head = $1.m_node.head;
     341                                          $$.m_node.tail = new ElementNode($1.m_node.tail, $3, $4.m_node);
     342                                          $$.m_featureInfo = $1.m_featureInfo | $4.m_featureInfo; }
    330343;
    331344
     
    342355MemberExpr:
    343356    PrimaryExpr
    344   | FunctionExpr                        { $$ = $1; }
    345   | MemberExpr '[' Expr ']'             { $$ = new BracketAccessorNode($1, $3); }
    346   | MemberExpr '.' IDENT                { $$ = new DotAccessorNode($1, *$3); }
    347   | NEW MemberExpr Arguments            { $$ = new NewExprNode($2, $3); }
     357  | FunctionExpr                        { $$ = createNodeFeatureInfo<ExpressionNode*>($1.m_node, $1.m_featureInfo); }
     358  | MemberExpr '[' Expr ']'             { $$ = createNodeFeatureInfo<ExpressionNode*>(new BracketAccessorNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     359  | MemberExpr '.' IDENT                { $$ = createNodeFeatureInfo<ExpressionNode*>(new DotAccessorNode($1.m_node, *$3), $1.m_featureInfo); }
     360  | NEW MemberExpr Arguments            { $$ = createNodeFeatureInfo<ExpressionNode*>(new NewExprNode($2.m_node, $3.m_node), $2.m_featureInfo | $3.m_featureInfo); }
    348361;
    349362
    350363MemberExprNoBF:
    351364    PrimaryExprNoBrace
    352   | MemberExprNoBF '[' Expr ']'         { $$ = new BracketAccessorNode($1, $3); }
    353   | MemberExprNoBF '.' IDENT            { $$ = new DotAccessorNode($1, *$3); }
    354   | NEW MemberExpr Arguments            { $$ = new NewExprNode($2, $3); }
     365  | MemberExprNoBF '[' Expr ']'         { $$ = createNodeFeatureInfo<ExpressionNode*>(new BracketAccessorNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     366  | MemberExprNoBF '.' IDENT            { $$ = createNodeFeatureInfo<ExpressionNode*>(new DotAccessorNode($1.m_node, *$3), $1.m_featureInfo); }
     367  | NEW MemberExpr Arguments            { $$ = createNodeFeatureInfo<ExpressionNode*>(new NewExprNode($2.m_node, $3.m_node), $2.m_featureInfo | $3.m_featureInfo); }
    355368;
    356369
    357370NewExpr:
    358371    MemberExpr
    359   | NEW NewExpr                         { $$ = new NewExprNode($2); }
     372  | NEW NewExpr                         { $$ = createNodeFeatureInfo<ExpressionNode*>(new NewExprNode($2.m_node), $2.m_featureInfo); }
    360373;
    361374
    362375NewExprNoBF:
    363376    MemberExprNoBF
    364   | NEW NewExpr                         { $$ = new NewExprNode($2); }
     377  | NEW NewExpr                         { $$ = createNodeFeatureInfo<ExpressionNode*>(new NewExprNode($2.m_node), $2.m_featureInfo); }
    365378;
    366379
     
    368381    MemberExpr Arguments                { $$ = makeFunctionCallNode($1, $2); }
    369382  | CallExpr Arguments                  { $$ = makeFunctionCallNode($1, $2); }
    370   | CallExpr '[' Expr ']'               { $$ = new BracketAccessorNode($1, $3); }
    371   | CallExpr '.' IDENT                  { $$ = new DotAccessorNode($1, *$3); }
     383  | CallExpr '[' Expr ']'               { $$ = createNodeFeatureInfo<ExpressionNode*>(new BracketAccessorNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     384  | CallExpr '.' IDENT                  { $$ = createNodeFeatureInfo<ExpressionNode*>(new DotAccessorNode($1.m_node, *$3), $1.m_featureInfo); }
    372385;
    373386
     
    375388    MemberExprNoBF Arguments            { $$ = makeFunctionCallNode($1, $2); }
    376389  | CallExprNoBF Arguments              { $$ = makeFunctionCallNode($1, $2); }
    377   | CallExprNoBF '[' Expr ']'           { $$ = new BracketAccessorNode($1, $3); }
    378   | CallExprNoBF '.' IDENT              { $$ = new DotAccessorNode($1, *$3); }
     390  | CallExprNoBF '[' Expr ']'           { $$ = createNodeFeatureInfo<ExpressionNode*>(new BracketAccessorNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     391  | CallExprNoBF '.' IDENT              { $$ = createNodeFeatureInfo<ExpressionNode*>(new DotAccessorNode($1.m_node, *$3), $1.m_featureInfo); }
    379392;
    380393
    381394Arguments:
    382     '(' ')'                             { $$ = new ArgumentsNode(); }
    383   | '(' ArgumentList ')'                { $$ = new ArgumentsNode($2.head); }
     395    '(' ')'                             { $$ = createNodeFeatureInfo<ArgumentsNode*>(new ArgumentsNode(), 0); }
     396  | '(' ArgumentList ')'                { $$ = createNodeFeatureInfo<ArgumentsNode*>(new ArgumentsNode($2.m_node.head), $2.m_featureInfo); }
    384397;
    385398
    386399ArgumentList:
    387     AssignmentExpr                      { $$.head = new ArgumentListNode($1);
    388                                           $$.tail = $$.head; }
    389   | ArgumentList ',' AssignmentExpr     { $$.head = $1.head;
    390                                           $$.tail = new ArgumentListNode($1.tail, $3); }
     400    AssignmentExpr                      { $$.m_node.head = new ArgumentListNode($1.m_node);
     401                                          $$.m_node.tail = $$.m_node.head;
     402                                          $$.m_featureInfo = $1.m_featureInfo; }
     403  | ArgumentList ',' AssignmentExpr     { $$.m_node.head = $1.m_node.head;
     404                                          $$.m_node.tail = new ArgumentListNode($1.m_node.tail, $3.m_node);
     405                                          $$.m_featureInfo = $1.m_featureInfo | $3.m_featureInfo; }
    391406;
    392407
     
    403418PostfixExpr:
    404419    LeftHandSideExpr
    405   | LeftHandSideExpr PLUSPLUS           { $$ = makePostfixNode($1, OpPlusPlus); }
    406   | LeftHandSideExpr MINUSMINUS         { $$ = makePostfixNode($1, OpMinusMinus); }
     420  | LeftHandSideExpr PLUSPLUS           { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpPlusPlus), $1.m_featureInfo); }
     421  | LeftHandSideExpr MINUSMINUS         { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpMinusMinus), $1.m_featureInfo); }
    407422;
    408423
    409424PostfixExprNoBF:
    410425    LeftHandSideExprNoBF
    411   | LeftHandSideExprNoBF PLUSPLUS       { $$ = makePostfixNode($1, OpPlusPlus); }
    412   | LeftHandSideExprNoBF MINUSMINUS     { $$ = makePostfixNode($1, OpMinusMinus); }
     426  | LeftHandSideExprNoBF PLUSPLUS       { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpPlusPlus), $1.m_featureInfo); }
     427  | LeftHandSideExprNoBF MINUSMINUS     { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpMinusMinus), $1.m_featureInfo); }
    413428;
    414429
    415430UnaryExprCommon:
    416     DELETETOKEN UnaryExpr               { $$ = makeDeleteNode($2); }
    417   | VOIDTOKEN UnaryExpr                 { $$ = new VoidNode($2); }
    418   | TYPEOF UnaryExpr                    { $$ = makeTypeOfNode($2); }
    419   | PLUSPLUS UnaryExpr                  { $$ = makePrefixNode($2, OpPlusPlus); }
    420   | AUTOPLUSPLUS UnaryExpr              { $$ = makePrefixNode($2, OpPlusPlus); }
    421   | MINUSMINUS UnaryExpr                { $$ = makePrefixNode($2, OpMinusMinus); }
    422   | AUTOMINUSMINUS UnaryExpr            { $$ = makePrefixNode($2, OpMinusMinus); }
    423   | '+' UnaryExpr                       { $$ = new UnaryPlusNode($2); }
    424   | '-' UnaryExpr                       { $$ = makeNegateNode($2); }
    425   | '~' UnaryExpr                       { $$ = new BitwiseNotNode($2); }
    426   | '!' UnaryExpr                       { $$ = new LogicalNotNode($2); }
     431    DELETETOKEN UnaryExpr               { $$ = createNodeFeatureInfo<ExpressionNode*>(makeDeleteNode($2.m_node), $2.m_featureInfo); }
     432  | VOIDTOKEN UnaryExpr                 { $$ = createNodeFeatureInfo<ExpressionNode*>(new VoidNode($2.m_node), $2.m_featureInfo); }
     433  | TYPEOF UnaryExpr                    { $$ = createNodeFeatureInfo<ExpressionNode*>(makeTypeOfNode($2.m_node), $2.m_featureInfo); }
     434  | PLUSPLUS UnaryExpr                  { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode($2.m_node, OpPlusPlus), $2.m_featureInfo); }
     435  | AUTOPLUSPLUS UnaryExpr              { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode($2.m_node, OpPlusPlus), $2.m_featureInfo); }
     436  | MINUSMINUS UnaryExpr                { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode($2.m_node, OpMinusMinus), $2.m_featureInfo); }
     437  | AUTOMINUSMINUS UnaryExpr            { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode($2.m_node, OpMinusMinus), $2.m_featureInfo); }
     438  | '+' UnaryExpr                       { $$ = createNodeFeatureInfo<ExpressionNode*>(new UnaryPlusNode($2.m_node), $2.m_featureInfo); }
     439  | '-' UnaryExpr                       { $$ = createNodeFeatureInfo<ExpressionNode*>(makeNegateNode($2.m_node), $2.m_featureInfo); }
     440  | '~' UnaryExpr                       { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitwiseNotNode($2.m_node), $2.m_featureInfo); }
     441  | '!' UnaryExpr                       { $$ = createNodeFeatureInfo<ExpressionNode*>(new LogicalNotNode($2.m_node), $2.m_featureInfo); }
    427442
    428443UnaryExpr:
     
    438453MultiplicativeExpr:
    439454    UnaryExpr
    440   | MultiplicativeExpr '*' UnaryExpr    { $$ = new MultNode($1, $3); }
    441   | MultiplicativeExpr '/' UnaryExpr    { $$ = new DivNode($1, $3); }
    442   | MultiplicativeExpr '%' UnaryExpr    { $$ = new ModNode($1, $3); }
     455  | MultiplicativeExpr '*' UnaryExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new MultNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     456  | MultiplicativeExpr '/' UnaryExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new DivNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     457  | MultiplicativeExpr '%' UnaryExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new ModNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    443458;
    444459
     
    446461    UnaryExprNoBF
    447462  | MultiplicativeExprNoBF '*' UnaryExpr
    448                                         { $$ = new MultNode($1, $3); }
     463                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new MultNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    449464  | MultiplicativeExprNoBF '/' UnaryExpr
    450                                         { $$ = new DivNode($1, $3); }
     465                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new DivNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    451466  | MultiplicativeExprNoBF '%' UnaryExpr
    452                                         { $$ = new ModNode($1, $3); }
     467                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new ModNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    453468;
    454469
    455470AdditiveExpr:
    456471    MultiplicativeExpr
    457   | AdditiveExpr '+' MultiplicativeExpr { $$ = makeAddNode($1, $3); }
    458   | AdditiveExpr '-' MultiplicativeExpr { $$ = new SubNode($1, $3); }
     472  | AdditiveExpr '+' MultiplicativeExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAddNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     473  | AdditiveExpr '-' MultiplicativeExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new SubNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    459474;
    460475
     
    462477    MultiplicativeExprNoBF
    463478  | AdditiveExprNoBF '+' MultiplicativeExpr
    464                                         { $$ = makeAddNode($1, $3); }
     479                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAddNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    465480  | AdditiveExprNoBF '-' MultiplicativeExpr
    466                                         { $$ = new SubNode($1, $3); }
     481                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new SubNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    467482;
    468483
    469484ShiftExpr:
    470485    AdditiveExpr
    471   | ShiftExpr LSHIFT AdditiveExpr       { $$ = new LeftShiftNode($1, $3); }
    472   | ShiftExpr RSHIFT AdditiveExpr       { $$ = new RightShiftNode($1, $3); }
    473   | ShiftExpr URSHIFT AdditiveExpr      { $$ = new UnsignedRightShiftNode($1, $3); }
     486  | ShiftExpr LSHIFT AdditiveExpr       { $$ = createNodeFeatureInfo<ExpressionNode*>(new LeftShiftNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     487  | ShiftExpr RSHIFT AdditiveExpr       { $$ = createNodeFeatureInfo<ExpressionNode*>(new RightShiftNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     488  | ShiftExpr URSHIFT AdditiveExpr      { $$ = createNodeFeatureInfo<ExpressionNode*>(new UnsignedRightShiftNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    474489;
    475490
    476491ShiftExprNoBF:
    477492    AdditiveExprNoBF
    478   | ShiftExprNoBF LSHIFT AdditiveExpr   { $$ = new LeftShiftNode($1, $3); }
    479   | ShiftExprNoBF RSHIFT AdditiveExpr   { $$ = new RightShiftNode($1, $3); }
    480   | ShiftExprNoBF URSHIFT AdditiveExpr  { $$ = new UnsignedRightShiftNode($1, $3); }
     493  | ShiftExprNoBF LSHIFT AdditiveExpr   { $$ = createNodeFeatureInfo<ExpressionNode*>(new LeftShiftNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     494  | ShiftExprNoBF RSHIFT AdditiveExpr   { $$ = createNodeFeatureInfo<ExpressionNode*>(new RightShiftNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     495  | ShiftExprNoBF URSHIFT AdditiveExpr  { $$ = createNodeFeatureInfo<ExpressionNode*>(new UnsignedRightShiftNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    481496;
    482497
    483498RelationalExpr:
    484499    ShiftExpr
    485   | RelationalExpr '<' ShiftExpr        { $$ = makeLessNode($1, $3); }
    486   | RelationalExpr '>' ShiftExpr        { $$ = new GreaterNode($1, $3); }
    487   | RelationalExpr LE ShiftExpr         { $$ = new LessEqNode($1, $3); }
    488   | RelationalExpr GE ShiftExpr         { $$ = new GreaterEqNode($1, $3); }
    489   | RelationalExpr INSTANCEOF ShiftExpr { $$ = new InstanceOfNode($1, $3); }
    490   | RelationalExpr INTOKEN ShiftExpr    { $$ = new InNode($1, $3); }
     500  | RelationalExpr '<' ShiftExpr        { $$ = createNodeFeatureInfo<ExpressionNode*>(makeLessNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     501  | RelationalExpr '>' ShiftExpr        { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     502  | RelationalExpr LE ShiftExpr         { $$ = createNodeFeatureInfo<ExpressionNode*>(new LessEqNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     503  | RelationalExpr GE ShiftExpr         { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterEqNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     504  | RelationalExpr INSTANCEOF ShiftExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new InstanceOfNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     505  | RelationalExpr INTOKEN ShiftExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new InNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    491506;
    492507
    493508RelationalExprNoIn:
    494509    ShiftExpr
    495   | RelationalExprNoIn '<' ShiftExpr    { $$ = makeLessNode($1, $3); }
    496   | RelationalExprNoIn '>' ShiftExpr    { $$ = new GreaterNode($1, $3); }
    497   | RelationalExprNoIn LE ShiftExpr     { $$ = new LessEqNode($1, $3); }
    498   | RelationalExprNoIn GE ShiftExpr     { $$ = new GreaterEqNode($1, $3); }
     510  | RelationalExprNoIn '<' ShiftExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(makeLessNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     511  | RelationalExprNoIn '>' ShiftExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     512  | RelationalExprNoIn LE ShiftExpr     { $$ = createNodeFeatureInfo<ExpressionNode*>(new LessEqNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     513  | RelationalExprNoIn GE ShiftExpr     { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterEqNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    499514  | RelationalExprNoIn INSTANCEOF ShiftExpr
    500                                         { $$ = new InstanceOfNode($1, $3); }
     515                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new InstanceOfNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    501516;
    502517
    503518RelationalExprNoBF:
    504519    ShiftExprNoBF
    505   | RelationalExprNoBF '<' ShiftExpr    { $$ = makeLessNode($1, $3); }
    506   | RelationalExprNoBF '>' ShiftExpr    { $$ = new GreaterNode($1, $3); }
    507   | RelationalExprNoBF LE ShiftExpr     { $$ = new LessEqNode($1, $3); }
    508   | RelationalExprNoBF GE ShiftExpr     { $$ = new GreaterEqNode($1, $3); }
     520  | RelationalExprNoBF '<' ShiftExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(makeLessNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     521  | RelationalExprNoBF '>' ShiftExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     522  | RelationalExprNoBF LE ShiftExpr     { $$ = createNodeFeatureInfo<ExpressionNode*>(new LessEqNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     523  | RelationalExprNoBF GE ShiftExpr     { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterEqNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    509524  | RelationalExprNoBF INSTANCEOF ShiftExpr
    510                                         { $$ = new InstanceOfNode($1, $3); }
    511   | RelationalExprNoBF INTOKEN ShiftExpr     { $$ = new InNode($1, $3); }
     525                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new InstanceOfNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     526  | RelationalExprNoBF INTOKEN ShiftExpr     { $$ = createNodeFeatureInfo<ExpressionNode*>(new InNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    512527;
    513528
    514529EqualityExpr:
    515530    RelationalExpr
    516   | EqualityExpr EQEQ RelationalExpr    { $$ = new EqualNode($1, $3); }
    517   | EqualityExpr NE RelationalExpr      { $$ = new NotEqualNode($1, $3); }
    518   | EqualityExpr STREQ RelationalExpr   { $$ = new StrictEqualNode($1, $3); }
    519   | EqualityExpr STRNEQ RelationalExpr  { $$ = new NotStrictEqualNode($1, $3); }
     531  | EqualityExpr EQEQ RelationalExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new EqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     532  | EqualityExpr NE RelationalExpr      { $$ = createNodeFeatureInfo<ExpressionNode*>(new NotEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     533  | EqualityExpr STREQ RelationalExpr   { $$ = createNodeFeatureInfo<ExpressionNode*>(new StrictEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     534  | EqualityExpr STRNEQ RelationalExpr  { $$ = createNodeFeatureInfo<ExpressionNode*>(new NotStrictEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    520535;
    521536
     
    523538    RelationalExprNoIn
    524539  | EqualityExprNoIn EQEQ RelationalExprNoIn
    525                                         { $$ = new EqualNode($1, $3); }
     540                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new EqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    526541  | EqualityExprNoIn NE RelationalExprNoIn
    527                                         { $$ = new NotEqualNode($1, $3); }
     542                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new NotEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    528543  | EqualityExprNoIn STREQ RelationalExprNoIn
    529                                         { $$ = new StrictEqualNode($1, $3); }
     544                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new StrictEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    530545  | EqualityExprNoIn STRNEQ RelationalExprNoIn
    531                                         { $$ = new NotStrictEqualNode($1, $3); }
     546                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new NotStrictEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    532547;
    533548
     
    535550    RelationalExprNoBF
    536551  | EqualityExprNoBF EQEQ RelationalExpr
    537                                         { $$ = new EqualNode($1, $3); }
    538   | EqualityExprNoBF NE RelationalExpr  { $$ = new NotEqualNode($1, $3); }
     552                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new EqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
     553  | EqualityExprNoBF NE RelationalExpr  { $$ = createNodeFeatureInfo<ExpressionNode*>(new NotEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    539554  | EqualityExprNoBF STREQ RelationalExpr
    540                                         { $$ = new StrictEqualNode($1, $3); }
     555                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new StrictEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    541556  | EqualityExprNoBF STRNEQ RelationalExpr
    542                                         { $$ = new NotStrictEqualNode($1, $3); }
     557                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new NotStrictEqualNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    543558;
    544559
    545560BitwiseANDExpr:
    546561    EqualityExpr
    547   | BitwiseANDExpr '&' EqualityExpr     { $$ = new BitAndNode($1, $3); }
     562  | BitwiseANDExpr '&' EqualityExpr     { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitAndNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    548563;
    549564
     
    551566    EqualityExprNoIn
    552567  | BitwiseANDExprNoIn '&' EqualityExprNoIn
    553                                         { $$ = new BitAndNode($1, $3); }
     568                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitAndNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    554569;
    555570
    556571BitwiseANDExprNoBF:
    557572    EqualityExprNoBF
    558   | BitwiseANDExprNoBF '&' EqualityExpr { $$ = new BitAndNode($1, $3); }
     573  | BitwiseANDExprNoBF '&' EqualityExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitAndNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    559574;
    560575
    561576BitwiseXORExpr:
    562577    BitwiseANDExpr
    563   | BitwiseXORExpr '^' BitwiseANDExpr   { $$ = new BitXOrNode($1, $3); }
     578  | BitwiseXORExpr '^' BitwiseANDExpr   { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitXOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    564579;
    565580
     
    567582    BitwiseANDExprNoIn
    568583  | BitwiseXORExprNoIn '^' BitwiseANDExprNoIn
    569                                         { $$ = new BitXOrNode($1, $3); }
     584                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitXOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    570585;
    571586
     
    573588    BitwiseANDExprNoBF
    574589  | BitwiseXORExprNoBF '^' BitwiseANDExpr
    575                                         { $$ = new BitXOrNode($1, $3); }
     590                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitXOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    576591;
    577592
    578593BitwiseORExpr:
    579594    BitwiseXORExpr
    580   | BitwiseORExpr '|' BitwiseXORExpr    { $$ = new BitOrNode($1, $3); }
     595  | BitwiseORExpr '|' BitwiseXORExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    581596;
    582597
     
    584599    BitwiseXORExprNoIn
    585600  | BitwiseORExprNoIn '|' BitwiseXORExprNoIn
    586                                         { $$ = new BitOrNode($1, $3); }
     601                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    587602;
    588603
     
    590605    BitwiseXORExprNoBF
    591606  | BitwiseORExprNoBF '|' BitwiseXORExpr
    592                                         { $$ = new BitOrNode($1, $3); }
     607                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new BitOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    593608;
    594609
    595610LogicalANDExpr:
    596611    BitwiseORExpr
    597   | LogicalANDExpr AND BitwiseORExpr    { $$ = new LogicalAndNode($1, $3); }
     612  | LogicalANDExpr AND BitwiseORExpr    { $$ = createNodeFeatureInfo<ExpressionNode*>(new LogicalAndNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    598613;
    599614
     
    601616    BitwiseORExprNoIn
    602617  | LogicalANDExprNoIn AND BitwiseORExprNoIn
    603                                         { $$ = new LogicalAndNode($1, $3); }
     618                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new LogicalAndNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    604619;
    605620
     
    607622    BitwiseORExprNoBF
    608623  | LogicalANDExprNoBF AND BitwiseORExpr
    609                                         { $$ = new LogicalAndNode($1, $3); }
     624                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new LogicalAndNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    610625;
    611626
    612627LogicalORExpr:
    613628    LogicalANDExpr
    614   | LogicalORExpr OR LogicalANDExpr     { $$ = new LogicalOrNode($1, $3); }
     629  | LogicalORExpr OR LogicalANDExpr     { $$ = createNodeFeatureInfo<ExpressionNode*>(new LogicalOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    615630;
    616631
     
    618633    LogicalANDExprNoIn
    619634  | LogicalORExprNoIn OR LogicalANDExprNoIn
    620                                         { $$ = new LogicalOrNode($1, $3); }
     635                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new LogicalOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    621636;
    622637
    623638LogicalORExprNoBF:
    624639    LogicalANDExprNoBF
    625   | LogicalORExprNoBF OR LogicalANDExpr { $$ = new LogicalOrNode($1, $3); }
     640  | LogicalORExprNoBF OR LogicalANDExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new LogicalOrNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    626641;
    627642
     
    629644    LogicalORExpr
    630645  | LogicalORExpr '?' AssignmentExpr ':' AssignmentExpr
    631                                         { $$ = new ConditionalNode($1, $3, $5); }
     646                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new ConditionalNode($1.m_node, $3.m_node, $5.m_node), $1.m_featureInfo | $3.m_featureInfo | $5.m_featureInfo); }
    632647;
    633648
     
    635650    LogicalORExprNoIn
    636651  | LogicalORExprNoIn '?' AssignmentExprNoIn ':' AssignmentExprNoIn
    637                                         { $$ = new ConditionalNode($1, $3, $5); }
     652                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new ConditionalNode($1.m_node, $3.m_node, $5.m_node), $1.m_featureInfo | $3.m_featureInfo | $5.m_featureInfo); }
    638653;
    639654
     
    641656    LogicalORExprNoBF
    642657  | LogicalORExprNoBF '?' AssignmentExpr ':' AssignmentExpr
    643                                         { $$ = new ConditionalNode($1, $3, $5); }
     658                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(new ConditionalNode($1.m_node, $3.m_node, $5.m_node), $1.m_featureInfo | $3.m_featureInfo | $5.m_featureInfo); }
    644659;
    645660
     
    647662    ConditionalExpr
    648663  | LeftHandSideExpr AssignmentOperator AssignmentExpr
    649                                         { $$ = makeAssignNode($1, $2, $3); }
     664                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode($1.m_node, $2, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    650665;
    651666
     
    653668    ConditionalExprNoIn
    654669  | LeftHandSideExpr AssignmentOperator AssignmentExprNoIn
    655                                         { $$ = makeAssignNode($1, $2, $3); }
     670                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode($1.m_node, $2, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    656671;
    657672
     
    659674    ConditionalExprNoBF
    660675  | LeftHandSideExprNoBF AssignmentOperator AssignmentExpr
    661                                         { $$ = makeAssignNode($1, $2, $3); }
     676                                        { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode($1.m_node, $2, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    662677;
    663678
     
    679694Expr:
    680695    AssignmentExpr
    681   | Expr ',' AssignmentExpr             { $$ = new CommaNode($1, $3); }
     696  | Expr ',' AssignmentExpr             { $$ = createNodeFeatureInfo<ExpressionNode*>(new CommaNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    682697;
    683698
    684699ExprNoIn:
    685700    AssignmentExprNoIn
    686   | ExprNoIn ',' AssignmentExprNoIn     { $$ = new CommaNode($1, $3); }
     701  | ExprNoIn ',' AssignmentExprNoIn     { $$ = createNodeFeatureInfo<ExpressionNode*>(new CommaNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    687702;
    688703
    689704ExprNoBF:
    690705    AssignmentExprNoBF
    691   | ExprNoBF ',' AssignmentExpr         { $$ = new CommaNode($1, $3); }
     706  | ExprNoBF ',' AssignmentExpr         { $$ = createNodeFeatureInfo<ExpressionNode*>(new CommaNode($1.m_node, $3.m_node), $1.m_featureInfo | $3.m_featureInfo); }
    692707;
    693708
     
    712727
    713728Block:
    714     '{' '}'                             { $$ = createNodeInfo<StatementNode*>(new BlockNode(0), 0, 0);
     729    '{' '}'                             { $$ = createNodeDeclarationInfo<StatementNode*>(new BlockNode(0), 0, 0, 0);
    715730                                          DBG($$.m_node, @1, @2); }
    716   | '{' SourceElements '}'              { $$ = createNodeInfo<StatementNode*>(new BlockNode($2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations);
     731  | '{' SourceElements '}'              { $$ = createNodeDeclarationInfo<StatementNode*>(new BlockNode($2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo);
    717732                                          DBG($$.m_node, @1, @3); }
    718733;
    719734
    720735VariableStatement:
    721     VAR VariableDeclarationList ';'     { $$ = createNodeInfo<StatementNode*>(makeVarStatementNode($2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations);
     736    VAR VariableDeclarationList ';'     { $$ = createNodeDeclarationInfo<StatementNode*>(makeVarStatementNode($2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo);
    722737                                          DBG($$.m_node, @1, @3); }
    723   | VAR VariableDeclarationList error   { $$ = createNodeInfo<StatementNode*>(makeVarStatementNode($2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations);
     738  | VAR VariableDeclarationList error   { $$ = createNodeDeclarationInfo<StatementNode*>(makeVarStatementNode($2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo);
    724739                                          DBG($$.m_node, @1, @2);
    725740                                          AUTO_SEMICOLON; }
     
    731746                                          appendToVarDeclarationList($$.m_varDeclarations, *$1, 0);
    732747                                          $$.m_funcDeclarations = 0;
    733                                         }
    734   | IDENT Initializer                   { $$.m_node = new AssignResolveNode(*$1, $2);
     748                                          $$.m_featureInfo = 0;
     749                                        }
     750  | IDENT Initializer                   { $$.m_node = new AssignResolveNode(*$1, $2.m_node);
    735751                                          $$.m_varDeclarations = new ParserRefCountedData<DeclarationStacks::VarStack>;
    736752                                          appendToVarDeclarationList($$.m_varDeclarations, *$1, DeclarationStacks::HasInitializer);
    737753                                          $$.m_funcDeclarations = 0;
     754                                          $$.m_featureInfo = $2.m_featureInfo;
    738755                                        }
    739756  | VariableDeclarationList ',' IDENT
     
    742759                                          appendToVarDeclarationList($$.m_varDeclarations, *$3, 0);
    743760                                          $$.m_funcDeclarations = 0;
     761                                          $$.m_featureInfo = $1.m_featureInfo;
    744762                                        }
    745763  | VariableDeclarationList ',' IDENT Initializer
    746                                         { $$.m_node = combineVarInitializers($1.m_node, new AssignResolveNode(*$3, $4));
     764                                        { $$.m_node = combineVarInitializers($1.m_node, new AssignResolveNode(*$3, $4.m_node));
    747765                                          $$.m_varDeclarations = $1.m_varDeclarations;
    748766                                          appendToVarDeclarationList($$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer);
    749767                                          $$.m_funcDeclarations = 0;
     768                                          $$.m_featureInfo = $1.m_featureInfo | $4.m_featureInfo;
    750769                                        }
    751770;
     
    756775                                          appendToVarDeclarationList($$.m_varDeclarations, *$1, 0);
    757776                                          $$.m_funcDeclarations = 0;
    758                                         }
    759   | IDENT InitializerNoIn               { $$.m_node = new AssignResolveNode(*$1, $2);
     777                                          $$.m_featureInfo = 0;
     778                                        }
     779  | IDENT InitializerNoIn               { $$.m_node = new AssignResolveNode(*$1, $2.m_node);
    760780                                          $$.m_varDeclarations = new ParserRefCountedData<DeclarationStacks::VarStack>;
    761781                                          appendToVarDeclarationList($$.m_varDeclarations, *$1, DeclarationStacks::HasInitializer);
    762782                                          $$.m_funcDeclarations = 0;
     783                                          $$.m_featureInfo = $2.m_featureInfo;
    763784                                        }
    764785  | VariableDeclarationListNoIn ',' IDENT
     
    767788                                          appendToVarDeclarationList($$.m_varDeclarations, *$3, 0);
    768789                                          $$.m_funcDeclarations = 0;
     790                                          $$.m_featureInfo = $1.m_featureInfo;
    769791                                        }
    770792  | VariableDeclarationListNoIn ',' IDENT InitializerNoIn
    771                                         { $$.m_node = combineVarInitializers($1.m_node, new AssignResolveNode(*$3, $4));
     793                                        { $$.m_node = combineVarInitializers($1.m_node, new AssignResolveNode(*$3, $4.m_node));
    772794                                          $$.m_varDeclarations = $1.m_varDeclarations;
    773795                                          appendToVarDeclarationList($$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer);
    774796                                          $$.m_funcDeclarations = 0;
     797                                          $$.m_featureInfo = $1.m_featureInfo | $4.m_featureInfo;
    775798                                        }
    776799;
    777800
    778801ConstStatement:
    779     CONSTTOKEN ConstDeclarationList ';' { $$ = createNodeInfo<StatementNode*>(new ConstStatementNode($2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations);
     802    CONSTTOKEN ConstDeclarationList ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new ConstStatementNode($2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo);
    780803                                          DBG($$.m_node, @1, @3); }
    781804  | CONSTTOKEN ConstDeclarationList error
    782                                         { $$ = createNodeInfo<StatementNode*>(new ConstStatementNode($2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations);
     805                                        { $$ = createNodeDeclarationInfo<StatementNode*>(new ConstStatementNode($2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo);
    783806                                          DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
    784807;
    785808
    786809ConstDeclarationList:
    787     ConstDeclaration                    { $$.m_node.head = $1;
     810    ConstDeclaration                    { $$.m_node.head = $1.m_node;
    788811                                          $$.m_node.tail = $$.m_node.head;
    789812                                          $$.m_varDeclarations = new ParserRefCountedData<DeclarationStacks::VarStack>;
    790                                           appendToVarDeclarationList($$.m_varDeclarations, $1);
    791                                           $$.m_funcDeclarations = 0; }
     813                                          appendToVarDeclarationList($$.m_varDeclarations, $1.m_node);
     814                                          $$.m_funcDeclarations = 0;
     815                                          $$.m_featureInfo = $1.m_featureInfo;
     816    }
    792817  | ConstDeclarationList ',' ConstDeclaration
    793818                                        {  $$.m_node.head = $1.m_node.head;
    794                                           $1.m_node.tail->m_next = $3;
    795                                           $$.m_node.tail = $3;
     819                                          $1.m_node.tail->m_next = $3.m_node;
     820                                          $$.m_node.tail = $3.m_node;
    796821                                          $$.m_varDeclarations = $1.m_varDeclarations;
    797                                           appendToVarDeclarationList($$.m_varDeclarations, $3);
    798                                           $$.m_funcDeclarations = 0; }
     822                                          appendToVarDeclarationList($$.m_varDeclarations, $3.m_node);
     823                                          $$.m_funcDeclarations = 0;
     824                                          $$.m_featureInfo = $1.m_featureInfo | $3.m_featureInfo;}
    799825;
    800826
    801827ConstDeclaration:
    802     IDENT                               { $$ = new ConstDeclNode(*$1, 0); }
    803   | IDENT Initializer                   { $$ = new ConstDeclNode(*$1, $2); }
     828    IDENT                               { $$ = createNodeFeatureInfo<ConstDeclNode*>(new ConstDeclNode(*$1, 0), 0); }
     829  | IDENT Initializer                   { $$ = createNodeFeatureInfo<ConstDeclNode*>(new ConstDeclNode(*$1, $2.m_node), $2.m_featureInfo); }
    804830;
    805831
     
    813839
    814840EmptyStatement:
    815     ';'                                 { $$ = createNodeInfo<StatementNode*>(new EmptyStatementNode(), 0, 0); }
     841    ';'                                 { $$ = createNodeDeclarationInfo<StatementNode*>(new EmptyStatementNode(), 0, 0, 0); }
    816842;
    817843
    818844ExprStatement:
    819     ExprNoBF ';'                        { $$ = createNodeInfo<StatementNode*>(new ExprStatementNode($1), 0, 0);
     845    ExprNoBF ';'                        { $$ = createNodeDeclarationInfo<StatementNode*>(new ExprStatementNode($1.m_node), 0, 0, $1.m_featureInfo);
    820846                                          DBG($$.m_node, @1, @2); }
    821   | ExprNoBF error                      { $$ = createNodeInfo<StatementNode*>(new ExprStatementNode($1), 0, 0);
     847  | ExprNoBF error                      { $$ = createNodeDeclarationInfo<StatementNode*>(new ExprStatementNode($1.m_node), 0, 0, $1.m_featureInfo);
    822848                                          DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
    823849;
     
    825851IfStatement:
    826852    IF '(' Expr ')' Statement %prec IF_WITHOUT_ELSE
    827                                         { $$ = createNodeInfo<StatementNode*>(new IfNode($3, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations);
     853                                        { $$ = createNodeDeclarationInfo<StatementNode*>(new IfNode($3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_featureInfo | $5.m_featureInfo);
    828854                                          DBG($$.m_node, @1, @4); }
    829855  | IF '(' Expr ')' Statement ELSE Statement
    830                                         { $$ = createNodeInfo<StatementNode*>(new IfElseNode($3, $5.m_node, $7.m_node), mergeDeclarationLists($5.m_varDeclarations, $7.m_varDeclarations), mergeDeclarationLists($5.m_funcDeclarations, $7.m_funcDeclarations));
     856                                        { $$ = createNodeDeclarationInfo<StatementNode*>(new IfElseNode($3.m_node, $5.m_node, $7.m_node),
     857                                                                                         mergeDeclarationLists($5.m_varDeclarations, $7.m_varDeclarations), mergeDeclarationLists($5.m_funcDeclarations, $7.m_funcDeclarations),
     858                                                                                         $3.m_featureInfo | $5.m_featureInfo | $7.m_featureInfo);
    831859                                          DBG($$.m_node, @1, @4); }
    832860;
    833861
    834862IterationStatement:
    835     DO Statement WHILE '(' Expr ')' ';'    { $$ = createNodeInfo<StatementNode*>(new DoWhileNode($2.m_node, $5), $2.m_varDeclarations, $2.m_funcDeclarations);
     863    DO Statement WHILE '(' Expr ')' ';'    { $$ = createNodeDeclarationInfo<StatementNode*>(new DoWhileNode($2.m_node, $5.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo | $5.m_featureInfo);
    836864                                             DBG($$.m_node, @1, @3); }
    837   | DO Statement WHILE '(' Expr ')' error  { $$ = createNodeInfo<StatementNode*>(new DoWhileNode($2.m_node, $5), $2.m_varDeclarations, $2.m_funcDeclarations);
     865  | DO Statement WHILE '(' Expr ')' error  { $$ = createNodeDeclarationInfo<StatementNode*>(new DoWhileNode($2.m_node, $5.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo | $5.m_featureInfo);
    838866                                             DBG($$.m_node, @1, @3); } // Always performs automatic semicolon insertion.
    839   | WHILE '(' Expr ')' Statement        { $$ = createNodeInfo<StatementNode*>(new WhileNode($3, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations);
     867  | WHILE '(' Expr ')' Statement        { $$ = createNodeDeclarationInfo<StatementNode*>(new WhileNode($3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_featureInfo | $5.m_featureInfo);
    840868                                          DBG($$.m_node, @1, @4); }
    841869  | FOR '(' ExprNoInOpt ';' ExprOpt ';' ExprOpt ')' Statement
    842                                         { $$ = createNodeInfo<StatementNode*>(new ForNode($3, $5, $7, $9.m_node, false), $9.m_varDeclarations, $9.m_funcDeclarations);
     870                                        { $$ = createNodeDeclarationInfo<StatementNode*>(new ForNode($3.m_node, $5.m_node, $7.m_node, $9.m_node, false), $9.m_varDeclarations, $9.m_funcDeclarations,
     871                                                                                         $3.m_featureInfo | $5.m_featureInfo | $7.m_featureInfo | $9.m_featureInfo);
    843872                                          DBG($$.m_node, @1, @8);
    844873                                        }
    845874  | FOR '(' VAR VariableDeclarationListNoIn ';' ExprOpt ';' ExprOpt ')' Statement
    846                                                                             { $$ = createNodeInfo<StatementNode*>(new ForNode($4.m_node, $6, $8, $10.m_node, true),
    847                                                                               mergeDeclarationLists($4.m_varDeclarations, $10.m_varDeclarations),
    848                                                                               mergeDeclarationLists($4.m_funcDeclarations, $10.m_funcDeclarations));
     875                                        { $$ = createNodeDeclarationInfo<StatementNode*>(new ForNode($4.m_node, $6.m_node, $8.m_node, $10.m_node, true),
     876                                                                                         mergeDeclarationLists($4.m_varDeclarations, $10.m_varDeclarations),
     877                                                                                         mergeDeclarationLists($4.m_funcDeclarations, $10.m_funcDeclarations),
     878                                                                                         $4.m_featureInfo | $6.m_featureInfo | $8.m_featureInfo | $10.m_featureInfo);
    849879                                          DBG($$.m_node, @1, @9); }
    850880  | FOR '(' LeftHandSideExpr INTOKEN Expr ')' Statement
    851881                                        {
    852                                             ExpressionNode* n = $3;
     882                                            ExpressionNode* n = $3.m_node;
    853883                                            if (!n->isLocation())
    854884                                                YYABORT;
    855                                             $$ = createNodeInfo<StatementNode*>(new ForInNode(n, $5, $7.m_node), $7.m_varDeclarations, $7.m_funcDeclarations);
     885                                            $$ = createNodeDeclarationInfo<StatementNode*>(new ForInNode($3.m_node, $5.m_node, $7.m_node), $7.m_varDeclarations, $7.m_funcDeclarations,
     886                                                                                           $3.m_featureInfo | $5.m_featureInfo | $7.m_featureInfo);
    856887                                            DBG($$.m_node, @1, @6);
    857888                                        }
    858889  | FOR '(' VAR IDENT INTOKEN Expr ')' Statement
    859                                         { ForInNode *forIn = new ForInNode(*$4, 0, $6, $8.m_node);
     890                                        { ForInNode *forIn = new ForInNode(*$4, 0, $6.m_node, $8.m_node);
    860891                                          appendToVarDeclarationList($8.m_varDeclarations, *$4, DeclarationStacks::HasInitializer);
    861                                           $$ = createNodeInfo<StatementNode*>(forIn, $8.m_varDeclarations, $8.m_funcDeclarations);
     892                                          $$ = createNodeDeclarationInfo<StatementNode*>(forIn, $8.m_varDeclarations, $8.m_funcDeclarations, $6.m_featureInfo | $8.m_featureInfo);
    862893                                          DBG($$.m_node, @1, @7); }
    863894  | FOR '(' VAR IDENT InitializerNoIn INTOKEN Expr ')' Statement
    864                                         { ForInNode *forIn = new ForInNode(*$4, $5, $7, $9.m_node);
     895                                        { ForInNode *forIn = new ForInNode(*$4, $5.m_node, $7.m_node, $9.m_node);
    865896                                          appendToVarDeclarationList($9.m_varDeclarations, *$4, DeclarationStacks::HasInitializer);
    866                                           $$ = createNodeInfo<StatementNode*>(forIn, $9.m_varDeclarations, $9.m_funcDeclarations);
     897                                          $$ = createNodeDeclarationInfo<StatementNode*>(forIn, $9.m_varDeclarations, $9.m_funcDeclarations,
     898                                                                                         $5.m_featureInfo | $7.m_featureInfo | $9.m_featureInfo);
    867899                                          DBG($$.m_node, @1, @8); }
    868900;
    869901
    870902ExprOpt:
    871     /* nothing */                       { $$ = 0; }
     903    /* nothing */                       { $$ = createNodeFeatureInfo<ExpressionNode*>(0, 0); }
    872904  | Expr
    873905;
    874906
    875907ExprNoInOpt:
    876     /* nothing */                       { $$ = 0; }
     908    /* nothing */                       { $$ = createNodeFeatureInfo<ExpressionNode*>(0, 0); }
    877909  | ExprNoIn
    878910;
    879911
    880912ContinueStatement:
    881     CONTINUE ';'                        { $$ = createNodeInfo<StatementNode*>(new ContinueNode(), 0, 0);
     913    CONTINUE ';'                        { $$ = createNodeDeclarationInfo<StatementNode*>(new ContinueNode(), 0, 0, 0);
    882914                                          DBG($$.m_node, @1, @2); }
    883   | CONTINUE error                      { $$ = createNodeInfo<StatementNode*>(new ContinueNode(), 0, 0);
     915  | CONTINUE error                      { $$ = createNodeDeclarationInfo<StatementNode*>(new ContinueNode(), 0, 0, 0);
    884916                                          DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
    885   | CONTINUE IDENT ';'                  { $$ = createNodeInfo<StatementNode*>(new ContinueNode(*$2), 0, 0);
     917  | CONTINUE IDENT ';'                  { $$ = createNodeDeclarationInfo<StatementNode*>(new ContinueNode(*$2), 0, 0, 0);
    886918                                          DBG($$.m_node, @1, @3); }
    887   | CONTINUE IDENT error                { $$ = createNodeInfo<StatementNode*>(new ContinueNode(*$2), 0, 0);
     919  | CONTINUE IDENT error                { $$ = createNodeDeclarationInfo<StatementNode*>(new ContinueNode(*$2), 0, 0, 0);
    888920                                          DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
    889921;
    890922
    891923BreakStatement:
    892     BREAK ';'                           { $$ = createNodeInfo<StatementNode*>(new BreakNode(), 0, 0); DBG($$.m_node, @1, @2); }
    893   | BREAK error                         { $$ = createNodeInfo<StatementNode*>(new BreakNode(), 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
    894   | BREAK IDENT ';'                     { $$ = createNodeInfo<StatementNode*>(new BreakNode(*$2), 0, 0); DBG($$.m_node, @1, @3); }
    895   | BREAK IDENT error                   { $$ = createNodeInfo<StatementNode*>(new BreakNode(*$2), 0, 0); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
     924    BREAK ';'                           { $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(), 0, 0, 0); DBG($$.m_node, @1, @2); }
     925  | BREAK error                         { $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(), 0, 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
     926  | BREAK IDENT ';'                     { $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(*$2), 0, 0, 0); DBG($$.m_node, @1, @3); }
     927  | BREAK IDENT error                   { $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(*$2), 0, 0, 0); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
    896928;
    897929
    898930ReturnStatement:
    899     RETURN ';'                          { $$ = createNodeInfo<StatementNode*>(new ReturnNode(0), 0, 0); DBG($$.m_node, @1, @2); }
    900   | RETURN error                        { $$ = createNodeInfo<StatementNode*>(new ReturnNode(0), 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
    901   | RETURN Expr ';'                     { $$ = createNodeInfo<StatementNode*>(new ReturnNode($2), 0, 0); DBG($$.m_node, @1, @3); }
    902   | RETURN Expr error                   { $$ = createNodeInfo<StatementNode*>(new ReturnNode($2), 0, 0); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
     931    RETURN ';'                          { $$ = createNodeDeclarationInfo<StatementNode*>(new ReturnNode(0), 0, 0, 0); DBG($$.m_node, @1, @2); }
     932  | RETURN error                        { $$ = createNodeDeclarationInfo<StatementNode*>(new ReturnNode(0), 0, 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
     933  | RETURN Expr ';'                     { $$ = createNodeDeclarationInfo<StatementNode*>(new ReturnNode($2.m_node), 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @3); }
     934  | RETURN Expr error                   { $$ = createNodeDeclarationInfo<StatementNode*>(new ReturnNode($2.m_node), 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
    903935;
    904936
    905937WithStatement:
    906     WITH '(' Expr ')' Statement         { $$ = createNodeInfo<StatementNode*>(new WithNode($3, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations);
     938    WITH '(' Expr ')' Statement         { $$ = createNodeDeclarationInfo<StatementNode*>(new WithNode($3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations,
     939                                                                                         $3.m_featureInfo | $5.m_featureInfo);
    907940                                          DBG($$.m_node, @1, @4); }
    908941;
    909942
    910943SwitchStatement:
    911     SWITCH '(' Expr ')' CaseBlock       { $$ = createNodeInfo<StatementNode*>(new SwitchNode($3, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations);
     944    SWITCH '(' Expr ')' CaseBlock       { $$ = createNodeDeclarationInfo<StatementNode*>(new SwitchNode($3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations,
     945                                                                                         $3.m_featureInfo | $5.m_featureInfo);
    912946                                          DBG($$.m_node, @1, @4); }
    913947;
    914948
    915949CaseBlock:
    916     '{' CaseClausesOpt '}'              { $$ = createNodeInfo<CaseBlockNode*>(new CaseBlockNode($2.m_node.head, 0, 0), $2.m_varDeclarations, $2.m_funcDeclarations); }
     950    '{' CaseClausesOpt '}'              { $$ = createNodeDeclarationInfo<CaseBlockNode*>(new CaseBlockNode($2.m_node.head, 0, 0), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_featureInfo); }
    917951  | '{' CaseClausesOpt DefaultClause CaseClausesOpt '}'
    918                                         { $$ = createNodeInfo<CaseBlockNode*>(new CaseBlockNode($2.m_node.head, $3.m_node, $4.m_node.head),
    919                                                                               mergeDeclarationLists(mergeDeclarationLists($2.m_varDeclarations, $3.m_varDeclarations), $4.m_varDeclarations),
    920                                                                               mergeDeclarationLists(mergeDeclarationLists($2.m_funcDeclarations, $3.m_funcDeclarations), $4.m_funcDeclarations)); }
     952                                        { $$ = createNodeDeclarationInfo<CaseBlockNode*>(new CaseBlockNode($2.m_node.head, $3.m_node, $4.m_node.head),
     953                                                                                         mergeDeclarationLists(mergeDeclarationLists($2.m_varDeclarations, $3.m_varDeclarations), $4.m_varDeclarations),
     954                                                                                         mergeDeclarationLists(mergeDeclarationLists($2.m_funcDeclarations, $3.m_funcDeclarations), $4.m_funcDeclarations),
     955                                                                                         $2.m_featureInfo | $3.m_featureInfo | $4.m_featureInfo); }
    921956;
    922957
    923958CaseClausesOpt:
    924     /* nothing */                       { $$.m_node.head = 0; $$.m_node.tail = 0; $$.m_varDeclarations = 0; $$.m_funcDeclarations = 0; }
     959/* nothing */                       { $$.m_node.head = 0; $$.m_node.tail = 0; $$.m_varDeclarations = 0; $$.m_funcDeclarations = 0; $$.m_featureInfo = 0; }
    925960  | CaseClauses
    926961;
     
    930965                                          $$.m_node.tail = $$.m_node.head;
    931966                                          $$.m_varDeclarations = $1.m_varDeclarations;
    932                                           $$.m_funcDeclarations = $1.m_funcDeclarations; }
     967                                          $$.m_funcDeclarations = $1.m_funcDeclarations;
     968                                          $$.m_featureInfo = $1.m_featureInfo; }
    933969  | CaseClauses CaseClause              { $$.m_node.head = $1.m_node.head;
    934970                                          $$.m_node.tail = new ClauseListNode($1.m_node.tail, $2.m_node);
    935971                                          $$.m_varDeclarations = mergeDeclarationLists($1.m_varDeclarations, $2.m_varDeclarations);
    936972                                          $$.m_funcDeclarations = mergeDeclarationLists($1.m_funcDeclarations, $2.m_funcDeclarations);
     973                                          $$.m_featureInfo = $1.m_featureInfo | $2.m_featureInfo;
    937974                                        }
    938975;
    939976
    940977CaseClause:
    941     CASE Expr ':'                       { $$ = createNodeInfo<CaseClauseNode*>(new CaseClauseNode($2), 0, 0); }
    942   | CASE Expr ':' SourceElements        { $$ = createNodeInfo<CaseClauseNode*>(new CaseClauseNode($2, $4.m_node), $4.m_varDeclarations, $4.m_funcDeclarations); }
     978    CASE Expr ':'                       { $$ = createNodeDeclarationInfo<CaseClauseNode*>(new CaseClauseNode($2.m_node), 0, 0, $2.m_featureInfo); }
     979  | CASE Expr ':' SourceElements        { $$ = createNodeDeclarationInfo<CaseClauseNode*>(new CaseClauseNode($2.m_node, $4.m_node), $4.m_varDeclarations, $4.m_funcDeclarations, $2.m_featureInfo | $4.m_featureInfo); }
    943980;
    944981
    945982DefaultClause:
    946     DEFAULT ':'                         { $$ = createNodeInfo<CaseClauseNode*>(new CaseClauseNode(0), 0, 0); }
    947   | DEFAULT ':' SourceElements          { $$ = createNodeInfo<CaseClauseNode*>(new CaseClauseNode(0, $3.m_node), $3.m_varDeclarations, $3.m_funcDeclarations); }
     983    DEFAULT ':'                         { $$ = createNodeDeclarationInfo<CaseClauseNode*>(new CaseClauseNode(0), 0, 0, 0); }
     984  | DEFAULT ':' SourceElements          { $$ = createNodeDeclarationInfo<CaseClauseNode*>(new CaseClauseNode(0, $3.m_node), $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_featureInfo); }
    948985;
    949986
    950987LabelledStatement:
    951988    IDENT ':' Statement                 { $3.m_node->pushLabel(*$1);
    952                                           $$ = createNodeInfo<StatementNode*>(new LabelNode(*$1, $3.m_node), $3.m_varDeclarations, $3.m_funcDeclarations); }
     989                                          $$ = createNodeDeclarationInfo<StatementNode*>(new LabelNode(*$1, $3.m_node), $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_featureInfo); }
    953990;
    954991
    955992ThrowStatement:
    956     THROW Expr ';'                      { $$ = createNodeInfo<StatementNode*>(new ThrowNode($2), 0, 0); DBG($$.m_node, @1, @3); }
    957   | THROW Expr error                    { $$ = createNodeInfo<StatementNode*>(new ThrowNode($2), 0, 0); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
     993    THROW Expr ';'                      { $$ = createNodeDeclarationInfo<StatementNode*>(new ThrowNode($2.m_node), 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @3); }
     994  | THROW Expr error                    { $$ = createNodeDeclarationInfo<StatementNode*>(new ThrowNode($2.m_node), 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; }
    958995;
    959996
    960997TryStatement:
    961     TRY Block FINALLY Block             { $$ = createNodeInfo<StatementNode*>(new TryNode($2.m_node, CommonIdentifiers::shared()->nullIdentifier, 0, $4.m_node),
    962                                                                               mergeDeclarationLists($2.m_varDeclarations, $4.m_varDeclarations),
    963                                                                               mergeDeclarationLists($2.m_funcDeclarations, $4.m_funcDeclarations));
     998    TRY Block FINALLY Block             { $$ = createNodeDeclarationInfo<StatementNode*>(new TryNode($2.m_node, CommonIdentifiers::shared()->nullIdentifier, 0, $4.m_node),
     999                                                                                         mergeDeclarationLists($2.m_varDeclarations, $4.m_varDeclarations),
     1000                                                                                         mergeDeclarationLists($2.m_funcDeclarations, $4.m_funcDeclarations),
     1001                                                                                         $2.m_featureInfo | $4.m_featureInfo);
    9641002                                          DBG($$.m_node, @1, @2); }
    965   | TRY Block CATCH '(' IDENT ')' Block { $$ = createNodeInfo<StatementNode*>(new TryNode($2.m_node, *$5, $7.m_node, 0),
    966                                                                               mergeDeclarationLists($2.m_varDeclarations, $7.m_varDeclarations),
    967                                                                               mergeDeclarationLists($2.m_funcDeclarations, $7.m_funcDeclarations));
     1003  | TRY Block CATCH '(' IDENT ')' Block { $$ = createNodeDeclarationInfo<StatementNode*>(new TryNode($2.m_node, *$5, $7.m_node, 0),
     1004                                                                                         mergeDeclarationLists($2.m_varDeclarations, $7.m_varDeclarations),
     1005                                                                                         mergeDeclarationLists($2.m_funcDeclarations, $7.m_funcDeclarations),
     1006                                                                                         $2.m_featureInfo | $7.m_featureInfo);
    9681007                                          DBG($$.m_node, @1, @2); }
    9691008  | TRY Block CATCH '(' IDENT ')' Block FINALLY Block
    970                                         { $$ = createNodeInfo<StatementNode*>(new TryNode($2.m_node, *$5, $7.m_node, $9.m_node),
    971                                                                               mergeDeclarationLists(mergeDeclarationLists($2.m_varDeclarations, $7.m_varDeclarations), $9.m_varDeclarations),
    972                                                                               mergeDeclarationLists(mergeDeclarationLists($2.m_funcDeclarations, $7.m_funcDeclarations), $9.m_funcDeclarations));
     1009                                        { $$ = createNodeDeclarationInfo<StatementNode*>(new TryNode($2.m_node, *$5, $7.m_node, $9.m_node),
     1010                                                                                         mergeDeclarationLists(mergeDeclarationLists($2.m_varDeclarations, $7.m_varDeclarations), $9.m_varDeclarations),
     1011                                                                                         mergeDeclarationLists(mergeDeclarationLists($2.m_funcDeclarations, $7.m_funcDeclarations), $9.m_funcDeclarations),
     1012                                                                                         $2.m_featureInfo | $7.m_featureInfo | $9.m_featureInfo);
    9731013                                          DBG($$.m_node, @1, @2); }
    9741014;
    9751015
    9761016DebuggerStatement:
    977     DEBUGGER ';'                        { $$ = createNodeInfo<StatementNode*>(new EmptyStatementNode(), 0, 0);
     1017    DEBUGGER ';'                        { $$ = createNodeDeclarationInfo<StatementNode*>(new EmptyStatementNode(), 0, 0, 0);
    9781018                                          DBG($$.m_node, @1, @2); }
    979   | DEBUGGER error                      { $$ = createNodeInfo<StatementNode*>(new EmptyStatementNode(), 0, 0);
     1019  | DEBUGGER error                      { $$ = createNodeDeclarationInfo<StatementNode*>(new EmptyStatementNode(), 0, 0, 0);
    9801020                                          DBG($$.m_node, @1, @1); AUTO_SEMICOLON; }
    9811021;
     
    9881028
    9891029FunctionExpr:
    990     FUNCTION '(' ')' '{' FunctionBody '}' { $$ = new FuncExprNode(CommonIdentifiers::shared()->nullIdentifier, $5); DBG($5, @4, @6); }
    991   | FUNCTION '(' FormalParameterList ')' '{' FunctionBody '}' { $$ = new FuncExprNode(CommonIdentifiers::shared()->nullIdentifier, $6, $3.head); DBG($6, @5, @7); }
    992   | FUNCTION IDENT '(' ')' '{' FunctionBody '}' { $$ = new FuncExprNode(*$2, $6); DBG($6, @5, @7); }
    993   | FUNCTION IDENT '(' FormalParameterList ')' '{' FunctionBody '}' { $$ = new FuncExprNode(*$2, $7, $4.head); DBG($7, @6, @8); }
     1030    FUNCTION '(' ')' '{' FunctionBody '}' { $$ = createNodeFeatureInfo(new FuncExprNode(CommonIdentifiers::shared()->nullIdentifier, $5), ClosureFeature); DBG($5, @4, @6); }
     1031  | FUNCTION '(' FormalParameterList ')' '{' FunctionBody '}' { $$ = createNodeFeatureInfo(new FuncExprNode(CommonIdentifiers::shared()->nullIdentifier, $6, $3.head), ClosureFeature); DBG($6, @5, @7); }
     1032  | FUNCTION IDENT '(' ')' '{' FunctionBody '}' { $$ = createNodeFeatureInfo(new FuncExprNode(*$2, $6), ClosureFeature); DBG($6, @5, @7); }
     1033  | FUNCTION IDENT '(' FormalParameterList ')' '{' FunctionBody '}' { $$ = createNodeFeatureInfo(new FuncExprNode(*$2, $7, $4.head), ClosureFeature); DBG($7, @6, @8); }
    9941034;
    9951035
     
    10021042
    10031043FunctionBody:
    1004     /* not in spec */           { $$ = FunctionBodyNode::create(0, 0, 0); }
     1044    /* not in spec */           { $$ = FunctionBodyNode::create(0, 0, 0, false, false); }
    10051045  | SourceElements              { $$ = FunctionBodyNode::create($1.m_node, $1.m_varDeclarations ? &$1.m_varDeclarations->data : 0,
    1006                                                                 $1.m_funcDeclarations ? &$1.m_funcDeclarations->data : 0);
     1046                                                                $1.m_funcDeclarations ? &$1.m_funcDeclarations->data : 0,
     1047                                                                ($1.m_featureInfo & EvalFeature) != 0, ($1.m_featureInfo & ClosureFeature) != 0);
    10071048                                  // As in mergeDeclarationLists() we have to ref/deref to safely get rid of
    10081049                                  // the declaration lists.
     
    10191060
    10201061Program:
    1021     /* not in spec */                   { parser().didFinishParsing(0, 0, 0, @0.last_line); }
    1022     | SourceElements                    { parser().didFinishParsing($1.m_node, $1.m_varDeclarations, $1.m_funcDeclarations, @1.last_line); }
     1062    /* not in spec */                   { parser().didFinishParsing(0, 0, 0, false, false, @0.last_line); }
     1063    | SourceElements                    { parser().didFinishParsing($1.m_node, $1.m_varDeclarations, $1.m_funcDeclarations,
     1064                                                                    ($1.m_featureInfo & EvalFeature) != 0, ($1.m_featureInfo & ClosureFeature) != 0,
     1065                                                                    @1.last_line); }
    10231066;
    10241067
     
    10281071                                          $$.m_varDeclarations = $1.m_varDeclarations;
    10291072                                          $$.m_funcDeclarations = $1.m_funcDeclarations;
     1073                                          $$.m_featureInfo = $1.m_featureInfo;
    10301074                                        }
    10311075  | SourceElements SourceElement        { $$.m_node->append($2.m_node);
    10321076                                          $$.m_varDeclarations = mergeDeclarationLists($1.m_varDeclarations, $2.m_varDeclarations);
    10331077                                          $$.m_funcDeclarations = mergeDeclarationLists($1.m_funcDeclarations, $2.m_funcDeclarations);
     1078                                          $$.m_featureInfo = $1.m_featureInfo | $2.m_featureInfo;
    10341079                                        }
    10351080;
    10361081
    10371082SourceElement:
    1038     FunctionDeclaration                 { $$ = createNodeInfo<StatementNode*>($1, 0, new ParserRefCountedData<DeclarationStacks::FunctionStack>); $$.m_funcDeclarations->data.append($1); }
     1083    FunctionDeclaration                 { $$ = createNodeDeclarationInfo<StatementNode*>($1, 0, new ParserRefCountedData<DeclarationStacks::FunctionStack>, ClosureFeature); $$.m_funcDeclarations->data.append($1); }
    10391084  | Statement                           { $$ = $1; }
    10401085;
     
    11541199}
    11551200
    1156 static ExpressionNode* makeFunctionCallNode(ExpressionNode* func, ArgumentsNode* args)
    1157 {
    1158     if (!func->isLocation())
    1159         return new FunctionCallValueNode(func, args);
    1160     if (func->isResolveNode()) {
    1161         ResolveNode* resolve = static_cast<ResolveNode*>(func);
     1201static ExpressionNodeInfo makeFunctionCallNode(ExpressionNodeInfo func, ArgumentsNodeInfo args)
     1202{
     1203    FeatureInfo features = func.m_featureInfo | args.m_featureInfo;
     1204    if (!func.m_node->isLocation())
     1205        return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallValueNode(func.m_node, args.m_node), features);
     1206    if (func.m_node->isResolveNode()) {
     1207        ResolveNode* resolve = static_cast<ResolveNode*>(func.m_node);
    11621208        const Identifier& identifier = resolve->identifier();
    11631209        if (identifier == CommonIdentifiers::shared()->eval)
    1164             return new EvalFunctionCallNode(args);
    1165         return new FunctionCallResolveNode(identifier, args);
     1210            return createNodeFeatureInfo<ExpressionNode*>(new EvalFunctionCallNode(args.m_node), EvalFeature | features);
     1211        return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallResolveNode(identifier, args.m_node), features);
    11661212    }
    1167     if (func->isBracketAccessorNode()) {
    1168         BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(func);
    1169         return new FunctionCallBracketNode(bracket->base(), bracket->subscript(), args);
     1213    if (func.m_node->isBracketAccessorNode()) {
     1214        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(func.m_node);
     1215        return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallBracketNode(bracket->base(), bracket->subscript(), args.m_node), features);
    11701216    }
    1171     ASSERT(func->isDotAccessorNode());
    1172     DotAccessorNode* dot = static_cast<DotAccessorNode*>(func);
    1173     return new FunctionCallDotNode(dot->base(), dot->identifier(), args);
     1217    ASSERT(func.m_node->isDotAccessorNode());
     1218    DotAccessorNode* dot = static_cast<DotAccessorNode*>(func.m_node);
     1219    return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallDotNode(dot->base(), dot->identifier(), args.m_node), features);
    11741220}
    11751221
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r30871 r31072  
    4747class FunctionBodyNodeWithDebuggerHooks : public FunctionBodyNode {
    4848public:
    49     FunctionBodyNodeWithDebuggerHooks(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
     49    FunctionBodyNodeWithDebuggerHooks(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
    5050    virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    5151};
     
    43464346// ------------------------------ FunctionBodyNode -----------------------------
    43474347
    4348 ScopeNode::ScopeNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack)
     4348ScopeNode::ScopeNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
    43494349    : BlockNode(children)
    43504350    , m_sourceURL(parser().sourceURL())
    43514351    , m_sourceId(parser().sourceId())
     4352    , m_usesEval(usesEval)
     4353    , m_needsClosure(needsClosure)
    43524354{
    43534355    if (varStack)
     
    43594361// ------------------------------ ProgramNode -----------------------------
    43604362
    4361 ProgramNode::ProgramNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack)
    4362     : ScopeNode(children, varStack, funcStack)
    4363 {
    4364 }
    4365 
    4366 ProgramNode* ProgramNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack)
    4367 {
    4368     return new ProgramNode(children, varStack, funcStack);
     4363ProgramNode::ProgramNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
     4364    : ScopeNode(children, varStack, funcStack, usesEval, needsClosure)
     4365{
     4366}
     4367
     4368ProgramNode* ProgramNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
     4369{
     4370    return new ProgramNode(children, varStack, funcStack, usesEval, needsClosure);
    43694371}
    43704372
    43714373// ------------------------------ EvalNode -----------------------------
    43724374
    4373 EvalNode::EvalNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack)
    4374     : ScopeNode(children, varStack, funcStack)
    4375 {
    4376 }
    4377 
    4378 EvalNode* EvalNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack)
    4379 {
    4380     return new EvalNode(children, varStack, funcStack);
     4375EvalNode::EvalNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
     4376    : ScopeNode(children, varStack, funcStack, usesEval, needsClosure)
     4377{
     4378}
     4379
     4380EvalNode* EvalNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
     4381{
     4382    return new EvalNode(children, varStack, funcStack, usesEval, needsClosure);
    43814383}
    43824384
    43834385// ------------------------------ FunctionBodyNode -----------------------------
    43844386
    4385 FunctionBodyNode::FunctionBodyNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack)
    4386     : ScopeNode(children, varStack, funcStack)
     4387FunctionBodyNode::FunctionBodyNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
     4388    : ScopeNode(children, varStack, funcStack, usesEval, needsClosure)
    43874389    , m_initialized(false)
    43884390{
    43894391}
    43904392
    4391 FunctionBodyNode* FunctionBodyNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack)
     4393FunctionBodyNode* FunctionBodyNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
    43924394{
    43934395    if (Debugger::debuggersPresent)
    4394         return new FunctionBodyNodeWithDebuggerHooks(children, varStack, funcStack);
    4395     return new FunctionBodyNode(children, varStack, funcStack);
     4396        return new FunctionBodyNodeWithDebuggerHooks(children, varStack, funcStack, usesEval, needsClosure);
     4397    return new FunctionBodyNode(children, varStack, funcStack, usesEval, needsClosure);
    43964398}
    43974399
     
    46484650// ------------------------------ FunctionBodyNodeWithDebuggerHooks ---------------------------------
    46494651
    4650 FunctionBodyNodeWithDebuggerHooks::FunctionBodyNodeWithDebuggerHooks(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack)
    4651     : FunctionBodyNode(children, varStack, funcStack)
     4652FunctionBodyNodeWithDebuggerHooks::FunctionBodyNodeWithDebuggerHooks(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack, bool usesEval, bool needsClosure)
     4653    : FunctionBodyNode(children, varStack, funcStack, usesEval, needsClosure)
    46524654{
    46534655}
  • trunk/JavaScriptCore/kjs/nodes.h

    r30871 r31072  
    26752675    class ScopeNode : public BlockNode {
    26762676    public:
    2677         ScopeNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
     2677        ScopeNode(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
    26782678
    26792679        int sourceId() const KJS_FAST_CALL { return m_sourceId; }
    26802680        const UString& sourceURL() const KJS_FAST_CALL { return m_sourceURL; }
    26812681        virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    2682 
     2682       
     2683        bool usesEval() const { return m_usesEval; }
     2684        bool needsClosure() const { return m_needsClosure; }
     2685       
    26832686    protected:
    26842687        void optimizeVariableAccess(ExecState*) KJS_FAST_CALL;
     
    26862689        VarStack m_varStack;
    26872690        FunctionStack m_functionStack;
    2688 
    26892691    private:
    26902692        UString m_sourceURL;
    26912693        int m_sourceId;
     2694        bool m_usesEval;
     2695        bool m_needsClosure;
    26922696    };
    26932697
    26942698    class ProgramNode : public ScopeNode {
    26952699    public:
    2696         static ProgramNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
     2700        static ProgramNode* create(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
    26972701
    26982702        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    26992703
    27002704    private:
    2701         ProgramNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
     2705        ProgramNode(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
    27022706
    27032707        void initializeSymbolTable(ExecState*) KJS_FAST_CALL;
     
    27102714    class EvalNode : public ScopeNode {
    27112715    public:
    2712         static EvalNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
     2716        static EvalNode* create(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
    27132717
    27142718        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
    27152719
    27162720    private:
    2717         EvalNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
     2721        EvalNode(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
    27182722
    27192723        ALWAYS_INLINE void processDeclarations(ExecState*) KJS_FAST_CALL;
     
    27222726    class FunctionBodyNode : public ScopeNode {
    27232727    public:
    2724         static FunctionBodyNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
     2728        static FunctionBodyNode* create(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
    27252729
    27262730        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
     
    27322736
    27332737    protected:
    2734         FunctionBodyNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL;
     2738        FunctionBodyNode(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
    27352739
    27362740    private:
Note: See TracChangeset for help on using the changeset viewer.