X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..14957cd040308e3eeec43d26bae5d76da13fcd85:/parser/Parser.cpp?ds=inline diff --git a/parser/Parser.cpp b/parser/Parser.cpp index 886a513..fc1e986 100644 --- a/parser/Parser.cpp +++ b/parser/Parser.cpp @@ -24,22 +24,15 @@ #include "Parser.h" #include "Debugger.h" +#include "JSParser.h" #include "Lexer.h" -#include -#include -#include - -using std::auto_ptr; - -#ifndef yyparse -extern int jscyyparse(void*); -#endif namespace JSC { -void Parser::parse(JSGlobalData* globalData, int* errLine, UString* errMsg) +void Parser::parse(JSGlobalData* globalData, FunctionParameters* parameters, JSParserStrictness strictness, JSParserMode mode, int* errLine, UString* errMsg) { - ASSERT(!m_sourceElements); + ASSERT(globalData); + m_sourceElements = 0; int defaultErrLine; UString defaultErrMsg; @@ -50,54 +43,30 @@ void Parser::parse(JSGlobalData* globalData, int* errLine, UString* errMsg) errMsg = &defaultErrMsg; *errLine = -1; - *errMsg = 0; + *errMsg = UString(); Lexer& lexer = *globalData->lexer; - lexer.setCode(*m_source); + lexer.setCode(*m_source, m_arena); - int parseError = jscyyparse(globalData); + const char* parseError = jsParse(globalData, parameters, strictness, mode, m_source); + int lineNumber = lexer.lineNumber(); bool lexError = lexer.sawError(); lexer.clear(); - ParserRefCounted::deleteNewObjects(globalData); - if (parseError || lexError) { - *errLine = lexer.lineNo(); - *errMsg = "Parse error"; - m_sourceElements.clear(); + *errLine = lineNumber; + *errMsg = parseError ? parseError : "Parse error"; + m_sourceElements = 0; } } -void Parser::reparseInPlace(JSGlobalData* globalData, FunctionBodyNode* functionBodyNode) -{ - ASSERT(!functionBodyNode->data()); - - m_source = &functionBodyNode->source(); - globalData->lexer->setIsReparsing(); - parse(globalData, 0, 0); - ASSERT(m_sourceElements); - - functionBodyNode->adoptData(std::auto_ptr(new ScopeNodeData(m_sourceElements.get(), - m_varDeclarations ? &m_varDeclarations->data : 0, - m_funcDeclarations ? &m_funcDeclarations->data : 0, - m_numConstants))); - bool usesArguments = functionBodyNode->usesArguments(); - functionBodyNode->setFeatures(m_features); - if (usesArguments && !functionBodyNode->usesArguments()) - functionBodyNode->setUsesArguments(); - - m_source = 0; - m_sourceElements = 0; - m_varDeclarations = 0; - m_funcDeclarations = 0; -} - -void Parser::didFinishParsing(SourceElements* sourceElements, ParserRefCountedData* varStack, - ParserRefCountedData* funcStack, CodeFeatures features, int lastLine, int numConstants) +void Parser::didFinishParsing(SourceElements* sourceElements, ParserArenaData* varStack, + ParserArenaData* funcStack, CodeFeatures features, int lastLine, int numConstants, IdentifierSet& capturedVars) { m_sourceElements = sourceElements; m_varDeclarations = varStack; m_funcDeclarations = funcStack; + m_capturedVariables.swap(capturedVars); m_features = features; m_lastLine = lastLine; m_numConstants = numConstants;