41
struct ParserRefCountedData : ParserRefCounted {
42
ParserRefCountedData(JSGlobalData* globalData)
43
: ParserRefCounted(globalData)
50
class Parser : Noncopyable {
44
template <typename T> struct ParserArenaData : ParserArenaDeletable { T data; };
46
class Parser : public Noncopyable {
52
template <class ParsedNode> PassRefPtr<ParsedNode> parse(ExecState*, Debugger*, const SourceCode&, int* errLine = 0, UString* errMsg = 0);
53
template <class ParsedNode> PassRefPtr<ParsedNode> reparse(JSGlobalData*, ParsedNode*);
54
void reparseInPlace(JSGlobalData*, FunctionBodyNode*);
56
void didFinishParsing(SourceElements*, ParserRefCountedData<DeclarationStacks::VarStack>*,
57
ParserRefCountedData<DeclarationStacks::FunctionStack>*, CodeFeatures features, int lastLine, int numConstants);
48
template <class ParsedNode>
49
PassRefPtr<ParsedNode> parse(JSGlobalData* globalData, Debugger*, ExecState*, const SourceCode& source, int* errLine = 0, UString* errMsg = 0);
51
void didFinishParsing(SourceElements*, ParserArenaData<DeclarationStacks::VarStack>*,
52
ParserArenaData<DeclarationStacks::FunctionStack>*, CodeFeatures features, int lastLine, int numConstants);
54
ParserArena& arena() { return m_arena; }
60
57
void parse(JSGlobalData*, int* errLine, UString* errMsg);
62
60
const SourceCode* m_source;
63
RefPtr<SourceElements> m_sourceElements;
64
RefPtr<ParserRefCountedData<DeclarationStacks::VarStack> > m_varDeclarations;
65
RefPtr<ParserRefCountedData<DeclarationStacks::FunctionStack> > m_funcDeclarations;
61
SourceElements* m_sourceElements;
62
ParserArenaData<DeclarationStacks::VarStack>* m_varDeclarations;
63
ParserArenaData<DeclarationStacks::FunctionStack>* m_funcDeclarations;
66
64
CodeFeatures m_features;
68
66
int m_numConstants;
71
template <class ParsedNode> PassRefPtr<ParsedNode> Parser::parse(ExecState* exec, Debugger* debugger, const SourceCode& source, int* errLine, UString* errMsg)
69
template <class ParsedNode>
70
PassRefPtr<ParsedNode> Parser::parse(JSGlobalData* globalData, Debugger* debugger, ExecState* debuggerExecState, const SourceCode& source, int* errLine, UString* errMsg)
73
72
m_source = &source;
74
parse(&exec->globalData(), errLine, errMsg);
75
RefPtr<ParsedNode> result;
76
if (m_sourceElements) {
77
result = ParsedNode::create(&exec->globalData(),
78
m_sourceElements.get(),
79
m_varDeclarations ? &m_varDeclarations->data : 0,
80
m_funcDeclarations ? &m_funcDeclarations->data : 0,
84
result->setLoc(m_source->firstLine(), m_lastLine);
89
m_varDeclarations = 0;
90
m_funcDeclarations = 0;
93
debugger->sourceParsed(exec, source, *errLine, *errMsg);
94
return result.release();
97
template <class ParsedNode> PassRefPtr<ParsedNode> Parser::reparse(JSGlobalData* globalData, ParsedNode* oldParsedNode)
99
m_source = &oldParsedNode->source();
100
parse(globalData, 0, 0);
73
if (ParsedNode::scopeIsFunction)
74
globalData->lexer->setIsReparsing();
75
parse(globalData, errLine, errMsg);
101
77
RefPtr<ParsedNode> result;
102
78
if (m_sourceElements) {
103
79
result = ParsedNode::create(globalData,
104
m_sourceElements.get(),
105
m_varDeclarations ? &m_varDeclarations->data : 0,
106
m_funcDeclarations ? &m_funcDeclarations->data : 0,
108
oldParsedNode->features(),
81
m_varDeclarations ? &m_varDeclarations->data : 0,
82
m_funcDeclarations ? &m_funcDeclarations->data : 0,
110
86
result->setLoc(m_source->firstLine(), m_lastLine);
114
92
m_sourceElements = 0;
115
93
m_varDeclarations = 0;
116
94
m_funcDeclarations = 0;
96
if (debugger && !ParsedNode::scopeIsFunction)
97
debugger->sourceParsed(debuggerExecState, source, *errLine, *errMsg);
118
98
return result.release();