Changeset 31809 in webkit for trunk/JavaScriptCore/kjs/lexer.cpp


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.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
Note: See TracChangeset for help on using the changeset viewer.