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


Ignore:
Timestamp:
Oct 30, 2003, 10:42:38 AM (22 years ago)
Author:
mjs
Message:

Reviewed by Darin.

  • kjs/grammar.cpp: (yyerror): Updated the commented code.
  • kjs/grammar.y: Don't delete string and identifier tokens when done with them any more, they'll get cleaned up by the lexer now.
  • kjs/internal.cpp: (Parser::parse): Tell lexer when done parsing.
  • kjs/lexer.cpp: (Lexer::Lexer): Initialize new data members. (Lexer::lex): Use new methods to make strings and identifiers, and save them. (Lexer::makeIdentifier): Make a new Identifier and save it in an auto-growing array. (Lexer::makeUString): Likewise for UStrings. (Lexer::doneParsing): Clean up arrays of Ifentifiers and UStrings.
  • kjs/lexer.h:
File:
1 edited

Legend:

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

    r5083 r5314  
    6868    bol(true),
    6969#endif
    70     current(0), next1(0), next2(0), next3(0)
     70    current(0), next1(0), next2(0), next3(0),
     71    strings(0), numStrings(0), stringsCapacity(0),
     72    identifiers(0), numIdentifiers(0), identifiersCapacity(0)
    7173{
    7274  // allocate space for read buffers
     
    7476  buffer16 = new UChar[size16];
    7577  currLexer = this;
    76 
    7778}
    7879
    7980Lexer::~Lexer()
    8081{
     82  doneParsing();
    8183  delete [] buffer8;
    8284  delete [] buffer16;
     
    503505        break;
    504506      }
    505       /* TODO: close leak on parse error. same holds true for String */
    506       kjsyylval.ident = new KJS::Identifier(buffer16, pos16);
     507      kjsyylval.ident = makeIdentifier(buffer16, pos16);
    507508      token = IDENT;
    508509      break;
     
    519520    break;
    520521  case String:
    521     kjsyylval.ustr = new UString(buffer16, pos16);
     522    kjsyylval.ustr = makeUString(buffer16, pos16);
    522523    token = STRING;
    523524    break;
     
    817818  return true;
    818819}
     820
     821
     822void Lexer::doneParsing()
     823{
     824  for (unsigned i = 0; i < numIdentifiers; i++) {
     825    delete identifiers[i];
     826  }
     827  free (identifiers);
     828  identifiers = 0;
     829  numIdentifiers = 0;
     830  identifiersCapacity = 0;
     831
     832  for (unsigned i = 0; i < numStrings; i++) {
     833    delete strings[i];
     834  }
     835  free (strings);
     836  strings = 0;
     837  numStrings = 0;
     838  stringsCapacity = 0;
     839}
     840
     841const int initialCapacity = 64;
     842const int growthFactor = 2;
     843
     844Identifier *Lexer::makeIdentifier(UChar *buffer, unsigned int pos)
     845{
     846  if (numIdentifiers == identifiersCapacity) {
     847    identifiersCapacity = (identifiersCapacity == 0) ? initialCapacity : identifiersCapacity *growthFactor;
     848    identifiers = (KJS::Identifier **)realloc(identifiers, sizeof(KJS::Identifier *) * identifiersCapacity);
     849  }
     850
     851  KJS::Identifier *identifier = new KJS::Identifier(buffer16, pos16);
     852  identifiers[numIdentifiers++] = identifier;
     853  return identifier;
     854}
     855 
     856UString *Lexer::makeUString(UChar *buffer, unsigned int pos)
     857{
     858  if (numStrings == stringsCapacity) {
     859    stringsCapacity = (stringsCapacity == 0) ? initialCapacity : stringsCapacity *growthFactor;
     860    strings = (UString **)realloc(strings, sizeof(UString *) * stringsCapacity);
     861  }
     862
     863  UString *string = new UString(buffer16, pos16);
     864  strings[numStrings++] = string;
     865  return string;
     866}
Note: See TracChangeset for help on using the changeset viewer.