Changeset 31809 in webkit for trunk/JavaScriptCore/kjs


Ignore:
Timestamp:
Apr 11, 2008, 1:14:45 AM (17 years ago)
Author:
[email protected]
Message:

Reviewed by Geoff.

Generate a pure (re-entrant) parser with Bison.

No change on SunSpider.

  • kjs/Parser.cpp: (KJS::Parser::parse):
  • kjs/grammar.y:
  • kjs/lexer.cpp: (kjsyylex): (KJS::Lexer::lex):
  • kjs/lexer.h: Pass state as function arguments, instead of global data. Don't call lexer() as often as before, as this function is about to become slower due to thread-specific storage.
  • kjs/function.cpp: (KJS::isStrWhiteSpace): Don't call isSeparatorSpace() for 8-bit characters, as these are already taken care of. This is a small speedup, compensating for a small slowdown caused by switching Bison mode.
Location:
trunk/JavaScriptCore/kjs
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/Parser.cpp

    r31072 r31809  
    3030#include <wtf/Vector.h>
    3131
    32 extern int kjsyyparse();
     32extern int kjsyyparse(void*);
    3333
    3434namespace KJS {
     
    5757        *sourceId = m_sourceId;
    5858
    59     int parseError = kjsyyparse();
     59    int parseError = kjsyyparse(&lexer);
    6060    bool lexError = lexer.sawError();
    6161    lexer.clear();
  • trunk/JavaScriptCore/kjs/function.cpp

    r31746 r31809  
    587587            return true;
    588588        default:
    589             return isSeparatorSpace(c);
     589            return c > 0xff && isSeparatorSpace(c);
    590590    }
    591591}
  • trunk/JavaScriptCore/kjs/grammar.y

    r31072 r31809  
     1%pure_parser
     2
    13%{
    24
     
    3739#include <wtf/MathExtras.h>
    3840
    39 // Not sure why, but yacc doesn't add this define along with the others.
    40 #define yylloc kjsyylloc
    41 
    4241#define YYMAXDEPTH 10000
    4342#define YYENABLE_NLS 0
     
    5150#endif
    5251
    53 extern int kjsyylex();
    54 int kjsyyerror(const char *);
    55 static bool allowAutomaticSemicolon();
    56 
    57 #define AUTO_SEMICOLON do { if (!allowAutomaticSemicolon()) YYABORT; } while (0)
     52extern int kjsyylex(YYSTYPE* lvalp, YYLTYPE* llocp, void* lexer);
     53int kjsyyerror(const char*);
     54static inline bool allowAutomaticSemicolon(Lexer&, int);
     55
     56#define AUTO_SEMICOLON do { if (!allowAutomaticSemicolon(*static_cast<Lexer*>(lexer), yychar)) YYABORT; } while (0)
    5857#define DBG(l, s, e) (l)->setLoc((s).first_line, (e).last_line)
    5958
     
    8988
    9089#endif
     90
     91#define YYPARSE_PARAM lexer
     92#define YYLEX_PARAM lexer
    9193
    9294template <typename T> NodeDeclarationInfo<T> createNodeDeclarationInfo(T node, ParserRefCountedData<DeclarationStacks::VarStack>* varDecls,
     
    280282  | STRING                              { $$ = createNodeFeatureInfo<ExpressionNode*>(new StringNode($1), 0); }
    281283  | '/' /* regexp */                    {
    282                                             Lexer& l = lexer();
     284                                            Lexer& l = *static_cast<Lexer*>(lexer);
    283285                                            if (!l.scanRegExp())
    284286                                                YYABORT;
     
    286288                                        }
    287289  | DIVEQUAL /* regexp with /= */       {
    288                                             Lexer& l = lexer();
     290                                            Lexer& l = *static_cast<Lexer*>(lexer);
    289291                                            if (!l.scanRegExp())
    290292                                                YYABORT;
     
    12871289
    12881290/* may we automatically insert a semicolon ? */
    1289 static bool allowAutomaticSemicolon()
    1290 {
    1291     return yychar == '}' || yychar == 0 || lexer().prevTerminator();
     1291static bool allowAutomaticSemicolon(Lexer& lexer, int yychar)
     1292{
     1293    return yychar == '}' || yychar == 0 || lexer.prevTerminator();
    12921294}
    12931295
  • trunk/JavaScriptCore/kjs/lexer.cpp

    r31147 r31809  
    4848#include "lexer.lut.h"
    4949
    50 extern YYLTYPE kjsyylloc; // global bison variable holding token info
    51 
    5250// a bridge for yacc from the C world to C++
    53 int kjsyylex()
    54 {
    55   return lexer().lex();
     51int kjsyylex(YYSTYPE* lvalp, YYLTYPE* llocp, void* lexer)
     52{
     53  return static_cast<Lexer*>(lexer)->lex(lvalp, llocp);
    5654}
    5755
     
    144142}
    145143
    146 int Lexer::lex()
     144int Lexer::lex(YYSTYPE* lvalp, YYLTYPE* llocp)
    147145{
    148146  int token = 0;
     
    529527  restrKeyword = false;
    530528  delimited = false;
    531   kjsyylloc.first_line = yylineno; // ???
    532   kjsyylloc.last_line = yylineno;
     529  llocp->first_line = yylineno; // ???
     530  llocp->last_line = yylineno;
    533531
    534532  switch (state) {
     
    544542    if (eatNextIdentifier) {
    545543      eatNextIdentifier = false;
    546       token = lex();
     544      token = lex(lvalp, llocp);
    547545      break;
    548546    }
    549     kjsyylval.ident = makeIdentifier(m_buffer16);
     547    lvalp->ident = makeIdentifier(m_buffer16);
    550548    token = IDENT;
    551549    break;
    552550  case IdentifierOrKeyword:
    553     kjsyylval.ident = makeIdentifier(m_buffer16);
    554     if ((token = mainTable.value(*kjsyylval.ident)) < 0) {
     551    lvalp->ident = makeIdentifier(m_buffer16);
     552    if ((token = mainTable.value(*lvalp->ident)) < 0) {
    555553      // Lookup for keyword failed, means this is an identifier.
    556554      token = IDENT;
     
    563561    break;
    564562  case String:
    565     kjsyylval.string = makeUString(m_buffer16);
     563    lvalp->string = makeUString(m_buffer16);
    566564    token = STRING;
    567565    break;
    568566  case Number:
    569     kjsyylval.doubleValue = dval;
     567    lvalp->doubleValue = dval;
    570568    token = NUMBER;
    571569    break;
  • trunk/JavaScriptCore/kjs/lexer.h

    r29538 r31809  
    2828#include <wtf/Vector.h>
    2929
     30union YYSTYPE;
     31struct YYLTYPE;
     32
    3033namespace KJS {
    3134
     
    3639  public:
    3740    void setCode(int startingLineNumber, const UChar *c, unsigned int len);
    38     int lex();
     41    int lex(YYSTYPE* lvalp, YYLTYPE* llocp);
    3942
    4043    int lineNo() const { return yylineno; }
Note: See TracChangeset for help on using the changeset viewer.