Changeset 27842 in webkit for trunk/JavaScriptCore/kjs/Parser.cpp


Ignore:
Timestamp:
Nov 15, 2007, 10:54:09 PM (18 years ago)
Author:
[email protected]
Message:

Reviewed by Eric Seidel.

Another round of grammar / parsing cleanup.


  1. Created distinct parser calls for parsing function bodies vs programs. This will help later with optimizing global variable access.


  1. Turned Parser into a singleton. Cleaned up Lexer's singleton interface.


  1. Modified Lexer to free a little more memory when done lexing. (Added FIXMEs for similar issues that I didn't fix.)


  1. Changed Lexer::makeIdentifier and Lexer::makeUString to start respecting the arguments passed to them. (No behavior change, but this problem could have caused serious problems for an unsuspecting user of these functions.)


  1. Removed KJS_DEBUG_MEM because it was bit-rotted.


  1. Removed Parser::prettyPrint because the same work was simpler to do at the call site.


  1. Some renames:


"Parser::accept" => "Parser::didFinishParsing"
"Parser::sid" => "Parser::m_sourceID"
"Lexer::doneParsing" => "Lexer::clear"
"sid" => "sourceId"
"lineno" => "lineNo"


  • JavaScriptCore.exp:
  • kjs/Parser.cpp: (KJS::Parser::Parser): (KJS::Parser::parseProgram): (KJS::Parser::parseFunctionBody): (KJS::Parser::parse): (KJS::Parser::didFinishParsing): (KJS::parser):
  • kjs/Parser.h: (KJS::Parser::sourceId):
  • kjs/function.cpp: (KJS::GlobalFuncImp::callAsFunction):
  • kjs/function_object.cpp: (FunctionObjectImp::construct):
  • kjs/grammar.y:
  • kjs/interpreter.cpp: (KJS::Interpreter::checkSyntax): (KJS::Interpreter::evaluate):
  • kjs/interpreter.h:
  • kjs/lexer.cpp: (kjsyylex): (KJS::lexer): (KJS::Lexer::Lexer): (KJS::Lexer::~Lexer): (KJS::Lexer::scanRegExp): (KJS::Lexer::doneParsing): (KJS::Lexer::makeIdentifier): (KJS::Lexer::makeUString):
  • kjs/lexer.h: (KJS::Lexer::pattern): (KJS::Lexer::flags): (KJS::Lexer::sawError):
  • kjs/nodes.cpp: (KJS::Node::Node): (KJS::FunctionBodyNode::FunctionBodyNode):
  • kjs/nodes.h:
  • kjs/testkjs.cpp: (prettyPrintScript): (kjsmain):
  • kjs/ustring.cpp:
  • kjs/ustring.h:
File:
1 edited

Legend:

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

    r27215 r27842  
    44 *  Copyright (C) 1999-2001 Harri Porten ([email protected])
    55 *  Copyright (C) 2001 Peter Kelly ([email protected])
    6  *  Copyright (C) 2003, 2006 Apple Computer, Inc.
     6 *  Copyright (C) 2003, 2006, 2007 Apple Inc.
    77 *
    88 *  This library is free software; you can redistribute it and/or
     
    3131#include <wtf/Vector.h>
    3232
    33 extern int kjsyyparse();
    34 
    3533namespace KJS {
    3634
    37 int Parser::sid = 0;
     35Parser::Parser()
     36    : m_sourceId(0)
     37{
     38}
    3839
    39 static RefPtr<ProgramNode>* progNode;
    40 
    41 PassRefPtr<ProgramNode> Parser::parse(const UString& sourceURL, int startingLineNumber,
     40PassRefPtr<ProgramNode> Parser::parseProgram(const UString& sourceURL, int startingLineNumber,
    4241    const UChar* code, unsigned length,
    4342    int* sourceId, int* errLine, UString* errMsg)
    4443{
     44    parse(sourceURL, startingLineNumber, code, length, sourceId, errLine, errMsg);
     45    return m_progNode.release();
     46}
     47
     48PassRefPtr<FunctionBodyNode> Parser::parseFunctionBody(const UString& sourceURL, int startingLineNumber,
     49    const UChar* code, unsigned length,
     50    int* sourceId, int* errLine, UString* errMsg)
     51{
     52    parse(sourceURL, startingLineNumber, code, length, sourceId, errLine, errMsg);
     53    return m_progNode.release();
     54}
     55
     56void Parser::parse(const UString& sourceURL, int startingLineNumber,
     57    const UChar* code, unsigned length,
     58    int* sourceId, int* errLine, UString* errMsg)
     59{
     60    ASSERT(!m_progNode);
     61
    4562    if (errLine)
    4663        *errLine = -1;
    4764    if (errMsg)
    4865        *errMsg = 0;
    49     if (!progNode)
    50         progNode = new RefPtr<ProgramNode>;
     66       
     67    Lexer& lexer = KJS::lexer();
    5168
    52     Lexer::curr()->setCode(sourceURL, startingLineNumber, code, length);
    53     *progNode = 0;
    54     sid++;
     69    lexer.setCode(sourceURL, startingLineNumber, code, length);
     70    m_sourceId++;
    5571    if (sourceId)
    56         *sourceId = sid;
    57 
    58     // Enable this and the #define YYDEBUG in grammar.y to debug a parse error
    59     //extern int kjsyydebug;
    60     //kjsyydebug=1;
     72        *sourceId = m_sourceId;
    6173
    6274    int parseError = kjsyyparse();
    63     bool lexError = Lexer::curr()->sawError();
    64     Lexer::curr()->doneParsing();
    65     PassRefPtr<ProgramNode> prog = progNode->release();
    66     *progNode = 0;
     75    bool lexError = lexer.sawError();
     76    lexer.clear();
    6777
    6878    Node::clearNewNodes();
    6979
    7080    if (parseError || lexError) {
    71         int eline = Lexer::curr()->lineNo();
    7281        if (errLine)
    73             *errLine = eline;
     82            *errLine = lexer.lineNo();
    7483        if (errMsg)
    7584            *errMsg = "Parse error";
    76         return 0;
     85        m_progNode = 0;
    7786    }
    78 
    79     return prog;
    8087}
    8188
    82 void Parser::accept(PassRefPtr<ProgramNode> prog)
     89void Parser::didFinishParsing(PassRefPtr<ProgramNode> progNode)
    8390{
    84     *progNode = prog;
     91    m_progNode = progNode;
    8592}
    8693
    87 UString Parser::prettyPrint(const UString& code, int* errLine, UString* errMsg)
     94Parser& parser()
    8895{
    89     RefPtr<ProgramNode> progNode = parse(UString(), 0, code.data(), code.size(), 0, errLine, errMsg);
    90     if (!progNode)
    91         return 0;
    92    
    93     return progNode->toString();
     96    ASSERT(JSLock::currentThreadIsHoldingLock());
     97
     98    static Parser staticParser;
     99    return staticParser;
    94100}
    95101
    96 }
     102} // namespace KJS
Note: See TracChangeset for help on using the changeset viewer.