| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index a386848d33d125907b0198eb24aa1f134e1ad268..3d48c9c58551d5dd61a44ce7785bc8c6fae80388 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -47,14 +47,6 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -class ParserFactory;
|
| -class ParserLog;
|
| -class TemporaryScope;
|
| -class Target;
|
| -
|
| -template <typename T> class ZoneListWrapper;
|
| -
|
| -
|
| // PositionStack is used for on-stack allocation of token positions for
|
| // new expressions. Please look at ParseNewExpression.
|
|
|
| @@ -95,250 +87,6 @@ class PositionStack {
|
| };
|
|
|
|
|
| -class Parser {
|
| - public:
|
| - Parser(Handle<Script> script, bool allow_natives_syntax,
|
| - v8::Extension* extension, ParserMode is_pre_parsing,
|
| - ParserFactory* factory, ParserLog* log, ScriptDataImpl* pre_data);
|
| - virtual ~Parser() { }
|
| -
|
| - // Pre-parse the program from the character stream; returns true on
|
| - // success, false if a stack-overflow happened during parsing.
|
| - bool PreParseProgram(Handle<String> source, unibrow::CharacterStream* stream);
|
| -
|
| - void ReportMessage(const char* message, Vector<const char*> args);
|
| - virtual void ReportMessageAt(Scanner::Location loc,
|
| - const char* message,
|
| - Vector<const char*> args) = 0;
|
| -
|
| -
|
| - // Returns NULL if parsing failed.
|
| - FunctionLiteral* ParseProgram(Handle<String> source,
|
| - bool in_global_context);
|
| - FunctionLiteral* ParseLazy(Handle<SharedFunctionInfo> info);
|
| - FunctionLiteral* ParseJson(Handle<String> source);
|
| -
|
| - // The minimum number of contiguous assignment that will
|
| - // be treated as an initialization block. Benchmarks show that
|
| - // the overhead exceeds the savings below this limit.
|
| - static const int kMinInitializationBlock = 3;
|
| -
|
| - protected:
|
| -
|
| - enum Mode {
|
| - PARSE_LAZILY,
|
| - PARSE_EAGERLY
|
| - };
|
| -
|
| - // Report syntax error
|
| - void ReportUnexpectedToken(Token::Value token);
|
| - void ReportInvalidPreparseData(Handle<String> name, bool* ok);
|
| -
|
| - Handle<Script> script_;
|
| - Scanner scanner_;
|
| -
|
| - Scope* top_scope_;
|
| - int with_nesting_level_;
|
| -
|
| - TemporaryScope* temp_scope_;
|
| - Mode mode_;
|
| -
|
| - Target* target_stack_; // for break, continue statements
|
| - bool allow_natives_syntax_;
|
| - v8::Extension* extension_;
|
| - ParserFactory* factory_;
|
| - ParserLog* log_;
|
| - bool is_pre_parsing_;
|
| - ScriptDataImpl* pre_data_;
|
| - FuncNameInferrer* fni_;
|
| -
|
| - bool inside_with() const { return with_nesting_level_ > 0; }
|
| - ParserFactory* factory() const { return factory_; }
|
| - ParserLog* log() const { return log_; }
|
| - Scanner& scanner() { return scanner_; }
|
| - Mode mode() const { return mode_; }
|
| - ScriptDataImpl* pre_data() const { return pre_data_; }
|
| -
|
| - // All ParseXXX functions take as the last argument an *ok parameter
|
| - // which is set to false if parsing failed; it is unchanged otherwise.
|
| - // By making the 'exception handling' explicit, we are forced to check
|
| - // for failure at the call sites.
|
| - void* ParseSourceElements(ZoneListWrapper<Statement>* processor,
|
| - int end_token, bool* ok);
|
| - Statement* ParseStatement(ZoneStringList* labels, bool* ok);
|
| - Statement* ParseFunctionDeclaration(bool* ok);
|
| - Statement* ParseNativeDeclaration(bool* ok);
|
| - Block* ParseBlock(ZoneStringList* labels, bool* ok);
|
| - Block* ParseVariableStatement(bool* ok);
|
| - Block* ParseVariableDeclarations(bool accept_IN, Expression** var, bool* ok);
|
| - Statement* ParseExpressionOrLabelledStatement(ZoneStringList* labels,
|
| - bool* ok);
|
| - IfStatement* ParseIfStatement(ZoneStringList* labels, bool* ok);
|
| - Statement* ParseContinueStatement(bool* ok);
|
| - Statement* ParseBreakStatement(ZoneStringList* labels, bool* ok);
|
| - Statement* ParseReturnStatement(bool* ok);
|
| - Block* WithHelper(Expression* obj,
|
| - ZoneStringList* labels,
|
| - bool is_catch_block,
|
| - bool* ok);
|
| - Statement* ParseWithStatement(ZoneStringList* labels, bool* ok);
|
| - CaseClause* ParseCaseClause(bool* default_seen_ptr, bool* ok);
|
| - SwitchStatement* ParseSwitchStatement(ZoneStringList* labels, bool* ok);
|
| - DoWhileStatement* ParseDoWhileStatement(ZoneStringList* labels, bool* ok);
|
| - WhileStatement* ParseWhileStatement(ZoneStringList* labels, bool* ok);
|
| - Statement* ParseForStatement(ZoneStringList* labels, bool* ok);
|
| - Statement* ParseThrowStatement(bool* ok);
|
| - Expression* MakeCatchContext(Handle<String> id, VariableProxy* value);
|
| - TryStatement* ParseTryStatement(bool* ok);
|
| - DebuggerStatement* ParseDebuggerStatement(bool* ok);
|
| -
|
| - Expression* ParseExpression(bool accept_IN, bool* ok);
|
| - Expression* ParseAssignmentExpression(bool accept_IN, bool* ok);
|
| - Expression* ParseConditionalExpression(bool accept_IN, bool* ok);
|
| - Expression* ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
|
| - Expression* ParseUnaryExpression(bool* ok);
|
| - Expression* ParsePostfixExpression(bool* ok);
|
| - Expression* ParseLeftHandSideExpression(bool* ok);
|
| - Expression* ParseNewExpression(bool* ok);
|
| - Expression* ParseMemberExpression(bool* ok);
|
| - Expression* ParseNewPrefix(PositionStack* stack, bool* ok);
|
| - Expression* ParseMemberWithNewPrefixesExpression(PositionStack* stack,
|
| - bool* ok);
|
| - Expression* ParsePrimaryExpression(bool* ok);
|
| - Expression* ParseArrayLiteral(bool* ok);
|
| - Expression* ParseObjectLiteral(bool* ok);
|
| - ObjectLiteral::Property* ParseObjectLiteralGetSet(bool is_getter, bool* ok);
|
| - Expression* ParseRegExpLiteral(bool seen_equal, bool* ok);
|
| -
|
| - Expression* NewCompareNode(Token::Value op,
|
| - Expression* x,
|
| - Expression* y,
|
| - int position);
|
| -
|
| - // Populate the constant properties fixed array for a materialized object
|
| - // literal.
|
| - void BuildObjectLiteralConstantProperties(
|
| - ZoneList<ObjectLiteral::Property*>* properties,
|
| - Handle<FixedArray> constants,
|
| - bool* is_simple,
|
| - bool* fast_elements,
|
| - int* depth);
|
| -
|
| - // Populate the literals fixed array for a materialized array literal.
|
| - void BuildArrayLiteralBoilerplateLiterals(ZoneList<Expression*>* properties,
|
| - Handle<FixedArray> constants,
|
| - bool* is_simple,
|
| - int* depth);
|
| -
|
| - // Decide if a property should be in the object boilerplate.
|
| - bool IsBoilerplateProperty(ObjectLiteral::Property* property);
|
| - // If the expression is a literal, return the literal value;
|
| - // if the expression is a materialized literal and is simple return a
|
| - // compile time value as encoded by CompileTimeValue::GetValue().
|
| - // Otherwise, return undefined literal as the placeholder
|
| - // in the object literal boilerplate.
|
| - Handle<Object> GetBoilerplateValue(Expression* expression);
|
| -
|
| - enum FunctionLiteralType {
|
| - EXPRESSION,
|
| - DECLARATION,
|
| - NESTED
|
| - };
|
| -
|
| - ZoneList<Expression*>* ParseArguments(bool* ok);
|
| - FunctionLiteral* ParseFunctionLiteral(Handle<String> var_name,
|
| - int function_token_position,
|
| - FunctionLiteralType type,
|
| - bool* ok);
|
| -
|
| -
|
| - // Magical syntax support.
|
| - Expression* ParseV8Intrinsic(bool* ok);
|
| -
|
| - INLINE(Token::Value peek()) { return scanner_.peek(); }
|
| - INLINE(Token::Value Next()) { return scanner_.Next(); }
|
| - INLINE(void Consume(Token::Value token));
|
| - void Expect(Token::Value token, bool* ok);
|
| - bool Check(Token::Value token);
|
| - void ExpectSemicolon(bool* ok);
|
| -
|
| - Handle<String> GetSymbol(bool* ok);
|
| -
|
| - // Get odd-ball literals.
|
| - Literal* GetLiteralUndefined();
|
| - Literal* GetLiteralTheHole();
|
| - Literal* GetLiteralNumber(double value);
|
| -
|
| - Handle<String> ParseIdentifier(bool* ok);
|
| - Handle<String> ParseIdentifierName(bool* ok);
|
| - Handle<String> ParseIdentifierOrGetOrSet(bool* is_get,
|
| - bool* is_set,
|
| - bool* ok);
|
| -
|
| - // Parser support
|
| - virtual VariableProxy* Declare(Handle<String> name, Variable::Mode mode,
|
| - FunctionLiteral* fun,
|
| - bool resolve,
|
| - bool* ok) = 0;
|
| -
|
| - bool TargetStackContainsLabel(Handle<String> label);
|
| - BreakableStatement* LookupBreakTarget(Handle<String> label, bool* ok);
|
| - IterationStatement* LookupContinueTarget(Handle<String> label, bool* ok);
|
| -
|
| - void RegisterTargetUse(BreakTarget* target, Target* stop);
|
| -
|
| - // Create a number literal.
|
| - Literal* NewNumberLiteral(double value);
|
| -
|
| - // Generate AST node that throw a ReferenceError with the given type.
|
| - Expression* NewThrowReferenceError(Handle<String> type);
|
| -
|
| - // Generate AST node that throw a SyntaxError with the given
|
| - // type. The first argument may be null (in the handle sense) in
|
| - // which case no arguments are passed to the constructor.
|
| - Expression* NewThrowSyntaxError(Handle<String> type, Handle<Object> first);
|
| -
|
| - // Generate AST node that throw a TypeError with the given
|
| - // type. Both arguments must be non-null (in the handle sense).
|
| - Expression* NewThrowTypeError(Handle<String> type,
|
| - Handle<Object> first,
|
| - Handle<Object> second);
|
| -
|
| - // Generic AST generator for throwing errors from compiled code.
|
| - Expression* NewThrowError(Handle<String> constructor,
|
| - Handle<String> type,
|
| - Vector< Handle<Object> > arguments);
|
| -
|
| - // JSON is a subset of JavaScript, as specified in, e.g., the ECMAScript 5
|
| - // specification section 15.12.1 (and appendix A.8).
|
| - // The grammar is given section 15.12.1.2 (and appendix A.8.2).
|
| -
|
| - // Parse JSON input as a single JSON value.
|
| - Expression* ParseJson(bool* ok);
|
| -
|
| - // Parse a single JSON value from input (grammar production JSONValue).
|
| - // A JSON value is either a (double-quoted) string literal, a number literal,
|
| - // one of "true", "false", or "null", or an object or array literal.
|
| - Expression* ParseJsonValue(bool* ok);
|
| - // Parse a JSON object literal (grammar production JSONObject).
|
| - // An object literal is a squiggly-braced and comma separated sequence
|
| - // (possibly empty) of key/value pairs, where the key is a JSON string
|
| - // literal, the value is a JSON value, and the two are spearated by a colon.
|
| - // A JavaScript object also allows numbers and identifiers as keys.
|
| - Expression* ParseJsonObject(bool* ok);
|
| - // Parses a JSON array literal (grammar production JSONArray). An array
|
| - // literal is a square-bracketed and comma separated sequence (possibly empty)
|
| - // of JSON values.
|
| - // A JavaScript array allows leaving out values from the sequence.
|
| - Expression* ParseJsonArray(bool* ok);
|
| -
|
| - friend class Target;
|
| - friend class TargetScope;
|
| - friend class LexicalScope;
|
| - friend class TemporaryScope;
|
| -};
|
| -
|
| -
|
| template <typename T, int initial_size>
|
| class BufferedZoneList {
|
| public:
|
| @@ -5501,9 +5249,9 @@ bool ScriptDataImpl::HasError() {
|
|
|
| // Preparse, but only collect data that is immediately useful,
|
| // even if the preparser data is only used once.
|
| -ScriptDataImpl* PartialPreParse(Handle<String> source,
|
| - unibrow::CharacterStream* stream,
|
| - v8::Extension* extension) {
|
| +ScriptDataImpl* Parser::PartialPreParse(Handle<String> source,
|
| + unibrow::CharacterStream* stream,
|
| + v8::Extension* extension) {
|
| Handle<Script> no_script;
|
| bool allow_natives_syntax =
|
| FLAG_allow_natives_syntax || Bootstrapper::IsActive();
|
| @@ -5559,9 +5307,9 @@ int ScriptDataImpl::ReadNumber(byte** source) {
|
| }
|
|
|
|
|
| -ScriptDataImpl* PreParse(Handle<String> source,
|
| - unibrow::CharacterStream* stream,
|
| - v8::Extension* extension) {
|
| +ScriptDataImpl* Parser::PreParse(Handle<String> source,
|
| + unibrow::CharacterStream* stream,
|
| + v8::Extension* extension) {
|
| Handle<Script> no_script;
|
| bool allow_natives_syntax =
|
| FLAG_allow_natives_syntax || Bootstrapper::IsActive();
|
| @@ -5574,9 +5322,9 @@ ScriptDataImpl* PreParse(Handle<String> source,
|
| }
|
|
|
|
|
| -bool ParseRegExp(FlatStringReader* input,
|
| - bool multiline,
|
| - RegExpCompileData* result) {
|
| +bool Parser::ParseRegExp(FlatStringReader* input,
|
| + bool multiline,
|
| + RegExpCompileData* result) {
|
| ASSERT(result != NULL);
|
| RegExpParser parser(input, &result->error, multiline);
|
| RegExpTree* tree = parser.ParsePattern();
|
| @@ -5596,13 +5344,11 @@ bool ParseRegExp(FlatStringReader* input,
|
| }
|
|
|
|
|
| -// MakeAST is just a wrapper for the corresponding Parser calls so we don't
|
| -// have to expose the entire Parser class in the .h file.
|
| -FunctionLiteral* MakeAST(bool compile_in_global_context,
|
| - Handle<Script> script,
|
| - v8::Extension* extension,
|
| - ScriptDataImpl* pre_data,
|
| - bool is_json) {
|
| +FunctionLiteral* Parser::MakeAST(bool compile_in_global_context,
|
| + Handle<Script> script,
|
| + v8::Extension* extension,
|
| + ScriptDataImpl* pre_data,
|
| + bool is_json) {
|
| bool allow_natives_syntax =
|
| FLAG_allow_natives_syntax || Bootstrapper::IsActive();
|
| AstBuildingParser parser(script, allow_natives_syntax, extension, pre_data);
|
| @@ -5630,7 +5376,7 @@ FunctionLiteral* MakeAST(bool compile_in_global_context,
|
| }
|
|
|
|
|
| -FunctionLiteral* MakeLazyAST(Handle<SharedFunctionInfo> info) {
|
| +FunctionLiteral* Parser::MakeLazyAST(Handle<SharedFunctionInfo> info) {
|
| Handle<Script> script(Script::cast(info->script()));
|
| AstBuildingParser parser(script, true, NULL, NULL);
|
| FunctionLiteral* result = parser.ParseLazy(info);
|
|
|