18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *  Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Library General Public
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Library General Public License for more details.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Library General Public License
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  along with this library; see the file COPYING.LIB.  If not, write to
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Parser.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Debugger.h"
2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "JSParser.h"
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Lexer.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid Parser::parse(JSGlobalData* globalData, FunctionParameters* parameters, JSParserStrictness strictness, JSParserMode mode, int* errLine, UString* errMsg)
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    ASSERT(globalData);
355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_sourceElements = 0;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int defaultErrLine;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UString defaultErrMsg;
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!errLine)
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        errLine = &defaultErrLine;
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!errMsg)
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        errMsg = &defaultErrMsg;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *errLine = -1;
468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    *errMsg = UString();
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Lexer& lexer = *globalData->lexer;
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    lexer.setCode(*m_source, m_arena);
50ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    const char* parseError = jsParse(globalData, parameters, strictness, mode, m_source);
525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    int lineNumber = lexer.lineNumber();
5306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool lexError = lexer.sawError();
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lexer.clear();
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parseError || lexError) {
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        *errLine = lineNumber;
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        *errMsg = parseError ? parseError : "Parse error";
595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_sourceElements = 0;
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Parser::didFinishParsing(SourceElements* sourceElements, ParserArenaData<DeclarationStacks::VarStack>* varStack,
6468513a70bcd92384395513322f1b801e7bf9c729Steve Block                              ParserArenaData<DeclarationStacks::FunctionStack>* funcStack, CodeFeatures features, int lastLine, int numConstants, IdentifierSet& capturedVars)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sourceElements = sourceElements;
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_varDeclarations = varStack;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_funcDeclarations = funcStack;
6968513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_capturedVariables.swap(capturedVars);
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_features = features;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lastLine = lastLine;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_numConstants = numConstants;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
76