X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/ba379fdc102753d6be2c4d937058fe40257329fe..14957cd040308e3eeec43d26bae5d76da13fcd85:/parser/Parser.cpp?ds=sidebyside diff --git a/parser/Parser.cpp b/parser/Parser.cpp index 96f4ae6..fc1e986 100644 --- a/parser/Parser.cpp +++ b/parser/Parser.cpp @@ -24,21 +24,14 @@ #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(globalData); m_sourceElements = 0; int defaultErrLine; @@ -50,56 +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); - bool lexError = lexer.sawError(); + const char* parseError = jsParse(globalData, parameters, strictness, mode, m_source); int lineNumber = lexer.lineNumber(); + bool lexError = lexer.sawError(); lexer.clear(); if (parseError || lexError) { *errLine = lineNumber; - *errMsg = "Parse error"; + *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(globalData->parser->arena(), - m_sourceElements, - 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(); - - ASSERT(globalData->parser->arena().isEmpty()); - - m_source = 0; - m_sourceElements = 0; - m_varDeclarations = 0; - m_funcDeclarations = 0; -} - void Parser::didFinishParsing(SourceElements* sourceElements, ParserArenaData* varStack, - ParserArenaData* funcStack, CodeFeatures features, int lastLine, int numConstants) + 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;