[webkit-changes] cvs commit: JavaScriptCore/kjs grammar.y lexer.cpp nodes.h grammar_types.h

Maciej mjs at opensource.apple.com
Tue Sep 20 22:53:06 PDT 2005


mjs         05/09/20 22:53:05

  Modified:    .        ChangeLog
               kjs      grammar.y lexer.cpp nodes.h
  Removed:     kjs      grammar_types.h
  Log:
          Reviewed by Geoff and partly by Darin.
  
  	- fixed http://bugzilla.opendarwin.org/post_bug.cgi
  	(Reduce conflicts in JavaScriptCore grammar)
  
  	This change gets us down from over 200 shift/reduce and 45 reduce/reduce to
  	9 shift/reduce and 45 reduce/reduce.
  
          * kjs/grammar.y:
          * kjs/grammar_types.h: Removed.
          * kjs/lexer.cpp:
          * kjs/nodes.h:
          (KJS::Node::isGroupNode):
          (KJS::Node::isLocation):
          (KJS::Node::isResolveNode):
          (KJS::Node::isBracketAccessorNode):
          (KJS::Node::isDotAccessorNode):
          (KJS::ResolveNode::isLocation):
          (KJS::ResolveNode::isResolveNode):
          (KJS::ResolveNode::identifier):
          (KJS::GroupNode::isGroupNode):
          (KJS::GroupNode::leafNode):
          (KJS::BracketAccessorNode::isLocation):
          (KJS::BracketAccessorNode::isBracketAccessorNode):
          (KJS::BracketAccessorNode::base):
          (KJS::BracketAccessorNode::subscript):
          (KJS::DotAccessorNode::isLocation):
          (KJS::DotAccessorNode::isDotAccessorNode):
          (KJS::DotAccessorNode::base):
          (KJS::DotAccessorNode::identifier):
          (KJS::FuncExprNode::FuncExprNode):
          (KJS::FuncExprNode::identifier):
          (KJS::FuncDeclNode::FuncDeclNode):
          (KJS::FuncDeclNode::execute):
  
  Revision  Changes    Path
  1.834     +37 -0     JavaScriptCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/ChangeLog,v
  retrieving revision 1.833
  retrieving revision 1.834
  diff -u -r1.833 -r1.834
  --- ChangeLog	21 Sep 2005 01:10:54 -0000	1.833
  +++ ChangeLog	21 Sep 2005 05:53:04 -0000	1.834
  @@ -1,3 +1,40 @@
  +2005-09-20  Maciej Stachowiak  <mjs at apple.com>
  +
  +        Reviewed by Geoff and partly by Darin.
  +
  +	- fixed http://bugzilla.opendarwin.org/post_bug.cgi
  +	(Reduce conflicts in JavaScriptCore grammar)
  +
  +	This change gets us down from over 200 shift/reduce and 45 reduce/reduce to
  +	9 shift/reduce and 45 reduce/reduce.
  +
  +        * kjs/grammar.y:
  +        * kjs/grammar_types.h: Removed.
  +        * kjs/lexer.cpp:
  +        * kjs/nodes.h:
  +        (KJS::Node::isGroupNode):
  +        (KJS::Node::isLocation):
  +        (KJS::Node::isResolveNode):
  +        (KJS::Node::isBracketAccessorNode):
  +        (KJS::Node::isDotAccessorNode):
  +        (KJS::ResolveNode::isLocation):
  +        (KJS::ResolveNode::isResolveNode):
  +        (KJS::ResolveNode::identifier):
  +        (KJS::GroupNode::isGroupNode):
  +        (KJS::GroupNode::leafNode):
  +        (KJS::BracketAccessorNode::isLocation):
  +        (KJS::BracketAccessorNode::isBracketAccessorNode):
  +        (KJS::BracketAccessorNode::base):
  +        (KJS::BracketAccessorNode::subscript):
  +        (KJS::DotAccessorNode::isLocation):
  +        (KJS::DotAccessorNode::isDotAccessorNode):
  +        (KJS::DotAccessorNode::base):
  +        (KJS::DotAccessorNode::identifier):
  +        (KJS::FuncExprNode::FuncExprNode):
  +        (KJS::FuncExprNode::identifier):
  +        (KJS::FuncDeclNode::FuncDeclNode):
  +        (KJS::FuncDeclNode::execute):
  +
   2005-09-20  Geoffrey Garen  <ggaren at apple.com>
   
           - Oops. The 4263434 change was only appropriate on the branch. Rolling out.
  
  
  
  1.29      +61 -65    JavaScriptCore/kjs/grammar.y
  
  Index: grammar.y
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/grammar.y,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- grammar.y	4 Sep 2005 06:21:54 -0000	1.28
  +++ grammar.y	21 Sep 2005 05:53:05 -0000	1.29
  @@ -32,7 +32,6 @@
   #include "nodes.h"
   #include "lexer.h"
   #include "internal.h"
  -#include "grammar_types.h"
   
   // Not sure why, but yacc doesn't add this define along with the others.
   #define yylloc kjsyylloc
  @@ -50,6 +49,8 @@
   
   using namespace KJS;
   
  +static Node *makeFunctionCallNode(Node *func, ArgumentsNode *args);
  +
   %}
   
   %union {
  @@ -62,6 +63,7 @@
     ParameterNode       *param;
     FunctionBodyNode    *body;
     FuncDeclNode        *func;
  +  FuncExprNode        *funcExpr;
     ProgramNode         *prog;
     AssignExprNode      *init;
     SourceElementsNode  *srcs;
  @@ -79,8 +81,6 @@
     PropertyNode        *pnode;
     CatchNode           *cnode;
     FinallyNode         *fnode;
  -  NodePair            np;
  -  NodeWithIdent       ni;
   }
   
   %start Program
  @@ -124,7 +124,7 @@
   %token AUTOPLUSPLUS AUTOMINUSMINUS
   
   /* non-terminal types */
  -%type <node>  Literal PrimaryExpr Expr MemberExpr FunctionExpr NewExpr CallExpr
  +%type <node>  Literal PrimaryExpr Expr MemberExpr NewExpr CallExpr
   %type <node>  ArrayLiteral
   %type <node>  LeftHandSideExpr PostfixExpr UnaryExpr
   %type <node>  MultiplicativeExpr AdditiveExpr
  @@ -148,6 +148,7 @@
   %type <slist> StatementList
   %type <init>  Initializer
   %type <func>  FunctionDeclaration
  +%type <funcExpr>  FunctionExpr
   %type <body>  FunctionBody
   %type <srcs>  SourceElements
   %type <param> FormalParameterList
  @@ -164,10 +165,7 @@
   %type <elm>   ElementList
   %type <plist> PropertyNameAndValueList
   %type <pnode> PropertyName
  -
   %type <ident> ParenthesizedIdent
  -%type <np>    MemberBracketExpr CallBracketExpr ParenthesizedBracketExpr
  -%type <ni>    MemberDotExpr CallDotExpr ParenthesizedDotExpr
   
   %%
   
  @@ -196,8 +194,6 @@
     | Literal
     | ArrayLiteral
     | ParenthesizedIdent             { $$ = new ResolveNode(*$1); }
  -  | ParenthesizedBracketExpr       { $$ = new GroupNode(new BracketAccessorNode($1.first, $1.second)); }
  -  | ParenthesizedDotExpr           { $$ = new GroupNode(new DotAccessorNode($1.node, *$1.ident)); }
     | '(' Expr ')'                   { $$ = new GroupNode($2); }
     | '{' '}'                        { $$ = new ObjectLiteralNode(); }
     | '{' PropertyNameAndValueList '}'   { $$ = new ObjectLiteralNode($2); }
  @@ -237,39 +233,11 @@
     | NUMBER                         { $$ = new PropertyNode($1); }
   ;
   
  -CallBracketExpr:
  -  CallExpr '[' Expr ']' { $$ = makeNodePair($1, $3); }
  -;
  -
  -MemberBracketExpr:
  -  MemberExpr '[' Expr ']' { $$ = makeNodePair($1, $3); }
  -;
  -
  -ParenthesizedBracketExpr:
  -    '(' MemberBracketExpr ')' { $$ = $2; }
  -  | '(' CallBracketExpr ')' { $$ = $2; }
  -  | '(' ParenthesizedBracketExpr ')' { $$ = $2; }
  -;
  -
  -CallDotExpr:
  -  CallExpr '.' IDENT { $$ = makeNodeWithIdent($1, $3); }
  -;
  -
  -MemberDotExpr:
  -  MemberExpr '.' IDENT { $$ = makeNodeWithIdent($1, $3); }
  -;
  -
  -ParenthesizedDotExpr:
  -    '(' MemberDotExpr ')' { $$ = $2; }
  -  | '(' CallDotExpr ')' { $$ = $2; }
  -  | '(' ParenthesizedDotExpr ')' { $$ = $2; }
  -;
  -
   MemberExpr:
       PrimaryExpr
  -  | FunctionExpr
  -  | MemberBracketExpr              { $$ = new BracketAccessorNode($1.first, $1.second); }
  -  | MemberDotExpr                  { $$ = new DotAccessorNode($1.node, *$1.ident); }
  +  | FunctionExpr                   { $$ = $1; }
  +  | MemberExpr '[' Expr ']'        { $$ = new BracketAccessorNode($1, $3); }
  +  | MemberExpr '.' IDENT           { $$ = new DotAccessorNode($1, *$3); }
     | NEW MemberExpr Arguments       { $$ = new NewExprNode($2, $3); }
   ;
   
  @@ -279,17 +247,10 @@
   ;
   
   CallExpr:
  -    ParenthesizedIdent Arguments       { $$ = new FunctionCallResolveNode(*$1, $2); }
  -  | MemberBracketExpr Arguments        { $$ = new FunctionCallBracketNode($1.first, $1.second, $2); }
  -  | CallBracketExpr Arguments          { $$ = new FunctionCallBracketNode($1.first, $1.second, $2); }
  -  | ParenthesizedBracketExpr Arguments { $$ = new FunctionCallParenBracketNode($1.first, $1.second, $2); }
  -  | MemberDotExpr Arguments        { $$ = new FunctionCallDotNode($1.node, *$1.ident, $2); }
  -  | CallDotExpr Arguments          { $$ = new FunctionCallDotNode($1.node, *$1.ident, $2); }
  -  | ParenthesizedDotExpr Arguments { $$ = new FunctionCallParenDotNode($1.node, *$1.ident, $2); }
  -  | MemberExpr Arguments           { $$ = new FunctionCallValueNode($1, $2); }
  -  | CallExpr Arguments             { $$ = new FunctionCallValueNode($1, $2); }
  -  | CallBracketExpr                { $$ = new BracketAccessorNode($1.first, $1.second); }
  -  | CallDotExpr                    { $$ = new DotAccessorNode($1.node, *$1.ident); }
  +    MemberExpr Arguments { $$ = makeFunctionCallNode($1, $2); }
  +  | CallExpr Arguments   { $$ = makeFunctionCallNode($1, $2); }
  +  | CallExpr '[' Expr ']'  { $$ = new BracketAccessorNode($1, $3); }
  +  | CallExpr '.' IDENT     { $$ = new DotAccessorNode($1, *$3); }
   ;
   
   Arguments:
  @@ -407,20 +368,27 @@
   
   AssignmentExpr:
       ConditionalExpr
  -  | ParenthesizedIdent AssignmentOperator AssignmentExpr
  -                           { $$ = new AssignResolveNode(*$1, $2, $3); }
  -  | MemberBracketExpr AssignmentOperator AssignmentExpr
  -                           { $$ = new AssignBracketNode($1.first, $1.second, $2, $3); }
  -  | CallBracketExpr AssignmentOperator AssignmentExpr
  -                           { $$ = new AssignBracketNode($1.first, $1.second, $2, $3); }
  -  | ParenthesizedBracketExpr AssignmentOperator AssignmentExpr
  -                           { $$ = new AssignBracketNode($1.first, $1.second, $2, $3); }
  -  | MemberDotExpr AssignmentOperator AssignmentExpr
  -                           { $$ = new AssignDotNode($1.node, *$1.ident, $2, $3); }
  -  | CallDotExpr AssignmentOperator AssignmentExpr
  -                           { $$ = new AssignDotNode($1.node, *$1.ident, $2, $3); }
  -  | ParenthesizedDotExpr AssignmentOperator AssignmentExpr
  -                           { $$ = new AssignDotNode($1.node, *$1.ident, $2, $3); }
  +  | LeftHandSideExpr AssignmentOperator AssignmentExpr
  +                           { 
  +                               Node *n = $1;
  +                               bool paren = n->isGroupNode();
  +                               if (paren)
  +                                   n = static_cast<GroupNode *>(n)->nodeInsideAllParens();
  +
  +                               if (!n->isLocation())
  +                                   YYABORT; 
  +                               else if (n->isResolveNode()) {
  +                                   ResolveNode *resolve = static_cast<ResolveNode *>(n);
  +                                   $$ = new AssignResolveNode(resolve->identifier(), $2, $3);
  +                               } else if (n->isBracketAccessorNode()) {
  +                                   BracketAccessorNode *bracket = static_cast<BracketAccessorNode *>(n);
  +                                   $$ = new AssignBracketNode(bracket->base(), bracket->subscript(), $2, $3);
  +                               } else {
  +                                   assert(n->isDotAccessorNode());
  +                                   DotAccessorNode *dot = static_cast<DotAccessorNode *>(n);
  +                                   $$ = new AssignDotNode(dot->base(), dot->identifier(), $2, $3);
  +                               }
  +                           }
   ;
   
   AssignmentOperator:
  @@ -717,6 +685,34 @@
   
   %%
   
  +static Node *makeFunctionCallNode(Node *func, ArgumentsNode *args)
  +{
  +    Node *n = func;
  +    bool paren = n->isGroupNode();
  +    if (paren)
  +        n = static_cast<GroupNode *>(n)->nodeInsideAllParens();
  +    
  +    if (!n->isLocation())
  +        return new FunctionCallValueNode(func, args);
  +    else if (n->isResolveNode()) {
  +        ResolveNode *resolve = static_cast<ResolveNode *>(n);
  +        return new FunctionCallResolveNode(resolve->identifier(), args);
  +    } else if (n->isBracketAccessorNode()) {
  +        BracketAccessorNode *bracket = static_cast<BracketAccessorNode *>(n);
  +        if (paren)
  +            return new FunctionCallParenBracketNode(bracket->base(), bracket->subscript(), args);
  +        else
  +            return new FunctionCallBracketNode(bracket->base(), bracket->subscript(), args);
  +    } else {
  +        assert(n->isDotAccessorNode());
  +        DotAccessorNode *dot = static_cast<DotAccessorNode *>(n);
  +        if (paren)
  +            return new FunctionCallParenDotNode(dot->base(), dot->identifier(), args);
  +        else
  +            return new FunctionCallDotNode(dot->base(), dot->identifier(), args);
  +    }
  +}
  +
   int yyerror (const char * /* s */)  /* Called by yyparse on error */
   {
     // fprintf(stderr, "ERROR: %s at line %d\n",
  
  
  
  1.20      +0 -1      JavaScriptCore/kjs/lexer.cpp
  
  Index: lexer.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/lexer.cpp,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- lexer.cpp	11 Aug 2005 10:26:53 -0000	1.19
  +++ lexer.cpp	21 Sep 2005 05:53:05 -0000	1.20
  @@ -39,7 +39,6 @@
   #include "identifier.h"
   #include "lookup.h"
   #include "internal.h"
  -#include "grammar_types.h"
   
   // we can't specify the namespace in yacc's C output, so do it here
   using namespace KJS;
  
  
  
  1.34      +48 -10    JavaScriptCore/kjs/nodes.h
  
  Index: nodes.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/nodes.h,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- nodes.h	19 Sep 2005 06:57:27 -0000	1.33
  +++ nodes.h	21 Sep 2005 05:53:05 -0000	1.34
  @@ -97,6 +97,13 @@
       void deref() { --m_refcount; if (!m_refcount) delete this; }
       unsigned int refcount() { return m_refcount; }
   
  +    virtual bool isGroupNode() const { return false; }
  +
  +    virtual bool isLocation() const { return false; }
  +    virtual bool isResolveNode() const { return false; }
  +    virtual bool isBracketAccessorNode() const { return false; }
  +    virtual bool isDotAccessorNode() const { return false; }
  +
     protected:
       ValueImp *throwError(ExecState *exec, ErrorType e, const char *msg);
       ValueImp *throwError(ExecState *exec, ErrorType e, const char *msg, ValueImp *, Node *);
  @@ -194,6 +201,11 @@
       ValueImp *evaluate(ExecState *exec);
       virtual Reference evaluateReference(ExecState *exec);
       virtual void streamTo(SourceStream &s) const;
  +
  +    virtual bool isLocation() const { return true; }
  +    virtual bool isResolveNode() const { return true; }
  +    const Identifier& identifier() const { return ident; }
  +
     private:
       Identifier ident;
     };
  @@ -204,6 +216,17 @@
       virtual ValueImp *evaluate(ExecState *exec);
       virtual Reference evaluateReference(ExecState *exec);
       virtual void streamTo(SourceStream &s) const;
  +
  +    virtual bool isGroupNode() const { return true; }
  +    Node *nodeInsideAllParens()
  +    { 
  +        Node *n = group.get();
  +        while (n->isGroupNode()) {
  +            n = static_cast<GroupNode *>(n)->group.get();
  +        }
  +        return n;
  +    }
  +        
     private:
       KXMLCore::SharedPtr<Node> group;
     };
  @@ -281,6 +304,12 @@
       ValueImp *evaluate(ExecState *exec);
       virtual Reference evaluateReference(ExecState *exec);
       virtual void streamTo(SourceStream &s) const;
  +
  +    virtual bool isLocation() const { return true; }
  +    virtual bool isBracketAccessorNode() const { return true; }
  +    Node *base() { return expr1.get(); }
  +    Node *subscript() { return expr2.get(); }
  +
     private:
       KXMLCore::SharedPtr<Node> expr1;
       KXMLCore::SharedPtr<Node> expr2;
  @@ -292,6 +321,12 @@
       ValueImp *evaluate(ExecState *exec);
       virtual Reference evaluateReference(ExecState *exec);
       virtual void streamTo(SourceStream &s) const;
  +
  +    virtual bool isLocation() const { return true; }
  +    virtual bool isDotAccessorNode() const { return true; }
  +    Node *base() const { return expr.get(); }
  +    const Identifier& identifier() const { return ident; }
  +
     private:
       KXMLCore::SharedPtr<Node> expr;
       Identifier ident;
  @@ -953,29 +988,32 @@
       void processFuncDecl(ExecState *exec);
     };
   
  -  class FuncDeclNode : public StatementNode {
  +  class FuncExprNode : public Node {
     public:
  -    FuncDeclNode(const Identifier &i, FunctionBodyNode *b)
  +    FuncExprNode(const Identifier &i, FunctionBodyNode *b)
         : ident(i), param(0), body(b) { }
  -    FuncDeclNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
  +    FuncExprNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
         : ident(i), param(p->next), body(b) { p->next = 0; }
  -    Completion execute(ExecState */*exec*/)
  -      { /* empty */ return Completion(); }
  -    void processFuncDecl(ExecState *exec);
  +    ValueImp *evaluate(ExecState *exec);
       virtual void streamTo(SourceStream &s) const;
  +
     private:
  +    friend class FuncDeclNode;
  +
       Identifier ident;
       KXMLCore::SharedPtr<ParameterNode> param;
       KXMLCore::SharedPtr<FunctionBodyNode> body;
     };
   
  -  class FuncExprNode : public Node {
  +  class FuncDeclNode : public StatementNode {
     public:
  -    FuncExprNode(const Identifier &i, FunctionBodyNode *b)
  +    FuncDeclNode(const Identifier &i, FunctionBodyNode *b)
         : ident(i), param(0), body(b) { }
  -    FuncExprNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
  +    FuncDeclNode(const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
         : ident(i), param(p->next), body(b) { p->next = 0; }
  -    ValueImp *evaluate(ExecState *exec);
  +    Completion execute(ExecState */*exec*/)
  +      { /* empty */ return Completion(); }
  +    void processFuncDecl(ExecState *exec);
       virtual void streamTo(SourceStream &s) const;
     private:
       Identifier ident;
  
  
  



More information about the webkit-changes mailing list