1 /* 2 * Copyright (C) 1999-2001 Harri Porten (porten (at) kde.org) 3 * Copyright (C) 2001 Peter Kelly (pmk (at) post.com) 4 * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public License 17 * along with this library; see the file COPYING.LIB. If not, write to 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #ifndef Parser_h 24 #define Parser_h 25 26 #include "Debugger.h" 27 #include "Executable.h" 28 #include "JSGlobalObject.h" 29 #include "Lexer.h" 30 #include "Nodes.h" 31 #include "ParserArena.h" 32 #include "SourceProvider.h" 33 #include <wtf/Forward.h> 34 #include <wtf/Noncopyable.h> 35 #include <wtf/OwnPtr.h> 36 #include <wtf/RefPtr.h> 37 38 namespace JSC { 39 40 class FunctionBodyNode; 41 class ProgramNode; 42 class UString; 43 44 template <typename T> struct ParserArenaData : ParserArenaDeletable { T data; }; 45 46 class Parser : public Noncopyable { 47 public: 48 template <class ParsedNode> 49 PassRefPtr<ParsedNode> parse(JSGlobalData* globalData, Debugger*, ExecState*, const SourceCode& source, int* errLine = 0, UString* errMsg = 0); 50 51 void didFinishParsing(SourceElements*, ParserArenaData<DeclarationStacks::VarStack>*, 52 ParserArenaData<DeclarationStacks::FunctionStack>*, CodeFeatures features, int lastLine, int numConstants); 53 54 ParserArena& arena() { return m_arena; } 55 56 private: 57 void parse(JSGlobalData*, int* errLine, UString* errMsg); 58 59 ParserArena m_arena; 60 const SourceCode* m_source; 61 SourceElements* m_sourceElements; 62 ParserArenaData<DeclarationStacks::VarStack>* m_varDeclarations; 63 ParserArenaData<DeclarationStacks::FunctionStack>* m_funcDeclarations; 64 CodeFeatures m_features; 65 int m_lastLine; 66 int m_numConstants; 67 }; 68 69 template <class ParsedNode> 70 PassRefPtr<ParsedNode> Parser::parse(JSGlobalData* globalData, Debugger* debugger, ExecState* debuggerExecState, const SourceCode& source, int* errLine, UString* errMsg) 71 { 72 m_source = &source; 73 if (ParsedNode::scopeIsFunction) 74 globalData->lexer->setIsReparsing(); 75 parse(globalData, errLine, errMsg); 76 77 RefPtr<ParsedNode> result; 78 if (m_sourceElements) { 79 result = ParsedNode::create(globalData, 80 m_sourceElements, 81 m_varDeclarations ? &m_varDeclarations->data : 0, 82 m_funcDeclarations ? &m_funcDeclarations->data : 0, 83 source, 84 m_features, 85 m_numConstants); 86 result->setLoc(m_source->firstLine(), m_lastLine); 87 } 88 89 m_arena.reset(); 90 91 m_source = 0; 92 m_sourceElements = 0; 93 m_varDeclarations = 0; 94 m_funcDeclarations = 0; 95 96 if (debugger && !ParsedNode::scopeIsFunction) 97 debugger->sourceParsed(debuggerExecState, source, *errLine, *errMsg); 98 return result.release(); 99 } 100 101 } // namespace JSC 102 103 #endif // Parser_h 104