| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 #include "scopeinfo.h" | 40 #include "scopeinfo.h" |
| 41 #include "scopes.h" | 41 #include "scopes.h" |
| 42 #include "string-stream.h" | 42 #include "string-stream.h" |
| 43 | 43 |
| 44 #include "ast-inl.h" | 44 #include "ast-inl.h" |
| 45 #include "jump-target-inl.h" | 45 #include "jump-target-inl.h" |
| 46 | 46 |
| 47 namespace v8 { | 47 namespace v8 { |
| 48 namespace internal { | 48 namespace internal { |
| 49 | 49 |
| 50 class ParserFactory; | |
| 51 class ParserLog; | |
| 52 class TemporaryScope; | |
| 53 class Target; | |
| 54 | |
| 55 template <typename T> class ZoneListWrapper; | |
| 56 | |
| 57 | |
| 58 // PositionStack is used for on-stack allocation of token positions for | 50 // PositionStack is used for on-stack allocation of token positions for |
| 59 // new expressions. Please look at ParseNewExpression. | 51 // new expressions. Please look at ParseNewExpression. |
| 60 | 52 |
| 61 class PositionStack { | 53 class PositionStack { |
| 62 public: | 54 public: |
| 63 explicit PositionStack(bool* ok) : top_(NULL), ok_(ok) {} | 55 explicit PositionStack(bool* ok) : top_(NULL), ok_(ok) {} |
| 64 ~PositionStack() { ASSERT(!*ok_ || is_empty()); } | 56 ~PositionStack() { ASSERT(!*ok_ || is_empty()); } |
| 65 | 57 |
| 66 class Element { | 58 class Element { |
| 67 public: | 59 public: |
| (...skipping 20 matching lines...) Expand all Loading... |
| 88 } | 80 } |
| 89 | 81 |
| 90 private: | 82 private: |
| 91 Element* top() { return top_; } | 83 Element* top() { return top_; } |
| 92 void set_top(Element* value) { top_ = value; } | 84 void set_top(Element* value) { top_ = value; } |
| 93 Element* top_; | 85 Element* top_; |
| 94 bool* ok_; | 86 bool* ok_; |
| 95 }; | 87 }; |
| 96 | 88 |
| 97 | 89 |
| 98 class Parser { | |
| 99 public: | |
| 100 Parser(Handle<Script> script, bool allow_natives_syntax, | |
| 101 v8::Extension* extension, ParserMode is_pre_parsing, | |
| 102 ParserFactory* factory, ParserLog* log, ScriptDataImpl* pre_data); | |
| 103 virtual ~Parser() { } | |
| 104 | |
| 105 // Pre-parse the program from the character stream; returns true on | |
| 106 // success, false if a stack-overflow happened during parsing. | |
| 107 bool PreParseProgram(Handle<String> source, unibrow::CharacterStream* stream); | |
| 108 | |
| 109 void ReportMessage(const char* message, Vector<const char*> args); | |
| 110 virtual void ReportMessageAt(Scanner::Location loc, | |
| 111 const char* message, | |
| 112 Vector<const char*> args) = 0; | |
| 113 | |
| 114 | |
| 115 // Returns NULL if parsing failed. | |
| 116 FunctionLiteral* ParseProgram(Handle<String> source, | |
| 117 bool in_global_context); | |
| 118 FunctionLiteral* ParseLazy(Handle<SharedFunctionInfo> info); | |
| 119 FunctionLiteral* ParseJson(Handle<String> source); | |
| 120 | |
| 121 // The minimum number of contiguous assignment that will | |
| 122 // be treated as an initialization block. Benchmarks show that | |
| 123 // the overhead exceeds the savings below this limit. | |
| 124 static const int kMinInitializationBlock = 3; | |
| 125 | |
| 126 protected: | |
| 127 | |
| 128 enum Mode { | |
| 129 PARSE_LAZILY, | |
| 130 PARSE_EAGERLY | |
| 131 }; | |
| 132 | |
| 133 // Report syntax error | |
| 134 void ReportUnexpectedToken(Token::Value token); | |
| 135 void ReportInvalidPreparseData(Handle<String> name, bool* ok); | |
| 136 | |
| 137 Handle<Script> script_; | |
| 138 Scanner scanner_; | |
| 139 | |
| 140 Scope* top_scope_; | |
| 141 int with_nesting_level_; | |
| 142 | |
| 143 TemporaryScope* temp_scope_; | |
| 144 Mode mode_; | |
| 145 | |
| 146 Target* target_stack_; // for break, continue statements | |
| 147 bool allow_natives_syntax_; | |
| 148 v8::Extension* extension_; | |
| 149 ParserFactory* factory_; | |
| 150 ParserLog* log_; | |
| 151 bool is_pre_parsing_; | |
| 152 ScriptDataImpl* pre_data_; | |
| 153 FuncNameInferrer* fni_; | |
| 154 | |
| 155 bool inside_with() const { return with_nesting_level_ > 0; } | |
| 156 ParserFactory* factory() const { return factory_; } | |
| 157 ParserLog* log() const { return log_; } | |
| 158 Scanner& scanner() { return scanner_; } | |
| 159 Mode mode() const { return mode_; } | |
| 160 ScriptDataImpl* pre_data() const { return pre_data_; } | |
| 161 | |
| 162 // All ParseXXX functions take as the last argument an *ok parameter | |
| 163 // which is set to false if parsing failed; it is unchanged otherwise. | |
| 164 // By making the 'exception handling' explicit, we are forced to check | |
| 165 // for failure at the call sites. | |
| 166 void* ParseSourceElements(ZoneListWrapper<Statement>* processor, | |
| 167 int end_token, bool* ok); | |
| 168 Statement* ParseStatement(ZoneStringList* labels, bool* ok); | |
| 169 Statement* ParseFunctionDeclaration(bool* ok); | |
| 170 Statement* ParseNativeDeclaration(bool* ok); | |
| 171 Block* ParseBlock(ZoneStringList* labels, bool* ok); | |
| 172 Block* ParseVariableStatement(bool* ok); | |
| 173 Block* ParseVariableDeclarations(bool accept_IN, Expression** var, bool* ok); | |
| 174 Statement* ParseExpressionOrLabelledStatement(ZoneStringList* labels, | |
| 175 bool* ok); | |
| 176 IfStatement* ParseIfStatement(ZoneStringList* labels, bool* ok); | |
| 177 Statement* ParseContinueStatement(bool* ok); | |
| 178 Statement* ParseBreakStatement(ZoneStringList* labels, bool* ok); | |
| 179 Statement* ParseReturnStatement(bool* ok); | |
| 180 Block* WithHelper(Expression* obj, | |
| 181 ZoneStringList* labels, | |
| 182 bool is_catch_block, | |
| 183 bool* ok); | |
| 184 Statement* ParseWithStatement(ZoneStringList* labels, bool* ok); | |
| 185 CaseClause* ParseCaseClause(bool* default_seen_ptr, bool* ok); | |
| 186 SwitchStatement* ParseSwitchStatement(ZoneStringList* labels, bool* ok); | |
| 187 DoWhileStatement* ParseDoWhileStatement(ZoneStringList* labels, bool* ok); | |
| 188 WhileStatement* ParseWhileStatement(ZoneStringList* labels, bool* ok); | |
| 189 Statement* ParseForStatement(ZoneStringList* labels, bool* ok); | |
| 190 Statement* ParseThrowStatement(bool* ok); | |
| 191 Expression* MakeCatchContext(Handle<String> id, VariableProxy* value); | |
| 192 TryStatement* ParseTryStatement(bool* ok); | |
| 193 DebuggerStatement* ParseDebuggerStatement(bool* ok); | |
| 194 | |
| 195 Expression* ParseExpression(bool accept_IN, bool* ok); | |
| 196 Expression* ParseAssignmentExpression(bool accept_IN, bool* ok); | |
| 197 Expression* ParseConditionalExpression(bool accept_IN, bool* ok); | |
| 198 Expression* ParseBinaryExpression(int prec, bool accept_IN, bool* ok); | |
| 199 Expression* ParseUnaryExpression(bool* ok); | |
| 200 Expression* ParsePostfixExpression(bool* ok); | |
| 201 Expression* ParseLeftHandSideExpression(bool* ok); | |
| 202 Expression* ParseNewExpression(bool* ok); | |
| 203 Expression* ParseMemberExpression(bool* ok); | |
| 204 Expression* ParseNewPrefix(PositionStack* stack, bool* ok); | |
| 205 Expression* ParseMemberWithNewPrefixesExpression(PositionStack* stack, | |
| 206 bool* ok); | |
| 207 Expression* ParsePrimaryExpression(bool* ok); | |
| 208 Expression* ParseArrayLiteral(bool* ok); | |
| 209 Expression* ParseObjectLiteral(bool* ok); | |
| 210 ObjectLiteral::Property* ParseObjectLiteralGetSet(bool is_getter, bool* ok); | |
| 211 Expression* ParseRegExpLiteral(bool seen_equal, bool* ok); | |
| 212 | |
| 213 Expression* NewCompareNode(Token::Value op, | |
| 214 Expression* x, | |
| 215 Expression* y, | |
| 216 int position); | |
| 217 | |
| 218 // Populate the constant properties fixed array for a materialized object | |
| 219 // literal. | |
| 220 void BuildObjectLiteralConstantProperties( | |
| 221 ZoneList<ObjectLiteral::Property*>* properties, | |
| 222 Handle<FixedArray> constants, | |
| 223 bool* is_simple, | |
| 224 bool* fast_elements, | |
| 225 int* depth); | |
| 226 | |
| 227 // Populate the literals fixed array for a materialized array literal. | |
| 228 void BuildArrayLiteralBoilerplateLiterals(ZoneList<Expression*>* properties, | |
| 229 Handle<FixedArray> constants, | |
| 230 bool* is_simple, | |
| 231 int* depth); | |
| 232 | |
| 233 // Decide if a property should be in the object boilerplate. | |
| 234 bool IsBoilerplateProperty(ObjectLiteral::Property* property); | |
| 235 // If the expression is a literal, return the literal value; | |
| 236 // if the expression is a materialized literal and is simple return a | |
| 237 // compile time value as encoded by CompileTimeValue::GetValue(). | |
| 238 // Otherwise, return undefined literal as the placeholder | |
| 239 // in the object literal boilerplate. | |
| 240 Handle<Object> GetBoilerplateValue(Expression* expression); | |
| 241 | |
| 242 enum FunctionLiteralType { | |
| 243 EXPRESSION, | |
| 244 DECLARATION, | |
| 245 NESTED | |
| 246 }; | |
| 247 | |
| 248 ZoneList<Expression*>* ParseArguments(bool* ok); | |
| 249 FunctionLiteral* ParseFunctionLiteral(Handle<String> var_name, | |
| 250 int function_token_position, | |
| 251 FunctionLiteralType type, | |
| 252 bool* ok); | |
| 253 | |
| 254 | |
| 255 // Magical syntax support. | |
| 256 Expression* ParseV8Intrinsic(bool* ok); | |
| 257 | |
| 258 INLINE(Token::Value peek()) { return scanner_.peek(); } | |
| 259 INLINE(Token::Value Next()) { return scanner_.Next(); } | |
| 260 INLINE(void Consume(Token::Value token)); | |
| 261 void Expect(Token::Value token, bool* ok); | |
| 262 bool Check(Token::Value token); | |
| 263 void ExpectSemicolon(bool* ok); | |
| 264 | |
| 265 Handle<String> GetSymbol(bool* ok); | |
| 266 | |
| 267 // Get odd-ball literals. | |
| 268 Literal* GetLiteralUndefined(); | |
| 269 Literal* GetLiteralTheHole(); | |
| 270 Literal* GetLiteralNumber(double value); | |
| 271 | |
| 272 Handle<String> ParseIdentifier(bool* ok); | |
| 273 Handle<String> ParseIdentifierName(bool* ok); | |
| 274 Handle<String> ParseIdentifierOrGetOrSet(bool* is_get, | |
| 275 bool* is_set, | |
| 276 bool* ok); | |
| 277 | |
| 278 // Parser support | |
| 279 virtual VariableProxy* Declare(Handle<String> name, Variable::Mode mode, | |
| 280 FunctionLiteral* fun, | |
| 281 bool resolve, | |
| 282 bool* ok) = 0; | |
| 283 | |
| 284 bool TargetStackContainsLabel(Handle<String> label); | |
| 285 BreakableStatement* LookupBreakTarget(Handle<String> label, bool* ok); | |
| 286 IterationStatement* LookupContinueTarget(Handle<String> label, bool* ok); | |
| 287 | |
| 288 void RegisterTargetUse(BreakTarget* target, Target* stop); | |
| 289 | |
| 290 // Create a number literal. | |
| 291 Literal* NewNumberLiteral(double value); | |
| 292 | |
| 293 // Generate AST node that throw a ReferenceError with the given type. | |
| 294 Expression* NewThrowReferenceError(Handle<String> type); | |
| 295 | |
| 296 // Generate AST node that throw a SyntaxError with the given | |
| 297 // type. The first argument may be null (in the handle sense) in | |
| 298 // which case no arguments are passed to the constructor. | |
| 299 Expression* NewThrowSyntaxError(Handle<String> type, Handle<Object> first); | |
| 300 | |
| 301 // Generate AST node that throw a TypeError with the given | |
| 302 // type. Both arguments must be non-null (in the handle sense). | |
| 303 Expression* NewThrowTypeError(Handle<String> type, | |
| 304 Handle<Object> first, | |
| 305 Handle<Object> second); | |
| 306 | |
| 307 // Generic AST generator for throwing errors from compiled code. | |
| 308 Expression* NewThrowError(Handle<String> constructor, | |
| 309 Handle<String> type, | |
| 310 Vector< Handle<Object> > arguments); | |
| 311 | |
| 312 // JSON is a subset of JavaScript, as specified in, e.g., the ECMAScript 5 | |
| 313 // specification section 15.12.1 (and appendix A.8). | |
| 314 // The grammar is given section 15.12.1.2 (and appendix A.8.2). | |
| 315 | |
| 316 // Parse JSON input as a single JSON value. | |
| 317 Expression* ParseJson(bool* ok); | |
| 318 | |
| 319 // Parse a single JSON value from input (grammar production JSONValue). | |
| 320 // A JSON value is either a (double-quoted) string literal, a number literal, | |
| 321 // one of "true", "false", or "null", or an object or array literal. | |
| 322 Expression* ParseJsonValue(bool* ok); | |
| 323 // Parse a JSON object literal (grammar production JSONObject). | |
| 324 // An object literal is a squiggly-braced and comma separated sequence | |
| 325 // (possibly empty) of key/value pairs, where the key is a JSON string | |
| 326 // literal, the value is a JSON value, and the two are spearated by a colon. | |
| 327 // A JavaScript object also allows numbers and identifiers as keys. | |
| 328 Expression* ParseJsonObject(bool* ok); | |
| 329 // Parses a JSON array literal (grammar production JSONArray). An array | |
| 330 // literal is a square-bracketed and comma separated sequence (possibly empty) | |
| 331 // of JSON values. | |
| 332 // A JavaScript array allows leaving out values from the sequence. | |
| 333 Expression* ParseJsonArray(bool* ok); | |
| 334 | |
| 335 friend class Target; | |
| 336 friend class TargetScope; | |
| 337 friend class LexicalScope; | |
| 338 friend class TemporaryScope; | |
| 339 }; | |
| 340 | |
| 341 | |
| 342 template <typename T, int initial_size> | 90 template <typename T, int initial_size> |
| 343 class BufferedZoneList { | 91 class BufferedZoneList { |
| 344 public: | 92 public: |
| 345 BufferedZoneList() : list_(NULL), last_(NULL) {} | 93 BufferedZoneList() : list_(NULL), last_(NULL) {} |
| 346 | 94 |
| 347 // Adds element at end of list. This element is buffered and can | 95 // Adds element at end of list. This element is buffered and can |
| 348 // be read using last() or removed using RemoveLast until a new Add or until | 96 // be read using last() or removed using RemoveLast until a new Add or until |
| 349 // RemoveLast or GetList has been called. | 97 // RemoveLast or GetList has been called. |
| 350 void Add(T* value) { | 98 void Add(T* value) { |
| 351 if (last_ != NULL) { | 99 if (last_ != NULL) { |
| (...skipping 5142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5494 } | 5242 } |
| 5495 | 5243 |
| 5496 | 5244 |
| 5497 bool ScriptDataImpl::HasError() { | 5245 bool ScriptDataImpl::HasError() { |
| 5498 return has_error(); | 5246 return has_error(); |
| 5499 } | 5247 } |
| 5500 | 5248 |
| 5501 | 5249 |
| 5502 // Preparse, but only collect data that is immediately useful, | 5250 // Preparse, but only collect data that is immediately useful, |
| 5503 // even if the preparser data is only used once. | 5251 // even if the preparser data is only used once. |
| 5504 ScriptDataImpl* PartialPreParse(Handle<String> source, | 5252 ScriptDataImpl* Parser::PartialPreParse(Handle<String> source, |
| 5505 unibrow::CharacterStream* stream, | 5253 unibrow::CharacterStream* stream, |
| 5506 v8::Extension* extension) { | 5254 v8::Extension* extension) { |
| 5507 Handle<Script> no_script; | 5255 Handle<Script> no_script; |
| 5508 bool allow_natives_syntax = | 5256 bool allow_natives_syntax = |
| 5509 FLAG_allow_natives_syntax || Bootstrapper::IsActive(); | 5257 FLAG_allow_natives_syntax || Bootstrapper::IsActive(); |
| 5510 PartialPreParser parser(no_script, allow_natives_syntax, extension); | 5258 PartialPreParser parser(no_script, allow_natives_syntax, extension); |
| 5511 if (!parser.PreParseProgram(source, stream)) return NULL; | 5259 if (!parser.PreParseProgram(source, stream)) return NULL; |
| 5512 // Extract the accumulated data from the recorder as a single | 5260 // Extract the accumulated data from the recorder as a single |
| 5513 // contiguous vector that we are responsible for disposing. | 5261 // contiguous vector that we are responsible for disposing. |
| 5514 Vector<unsigned> store = parser.recorder()->ExtractData(); | 5262 Vector<unsigned> store = parser.recorder()->ExtractData(); |
| 5515 return new ScriptDataImpl(store); | 5263 return new ScriptDataImpl(store); |
| 5516 } | 5264 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5552 if (data >= symbol_data_end_) return -1; | 5300 if (data >= symbol_data_end_) return -1; |
| 5553 input = *data; | 5301 input = *data; |
| 5554 result = (result << 7) | (input & 0x7f); | 5302 result = (result << 7) | (input & 0x7f); |
| 5555 data++; | 5303 data++; |
| 5556 } | 5304 } |
| 5557 *source = data; | 5305 *source = data; |
| 5558 return result; | 5306 return result; |
| 5559 } | 5307 } |
| 5560 | 5308 |
| 5561 | 5309 |
| 5562 ScriptDataImpl* PreParse(Handle<String> source, | 5310 ScriptDataImpl* Parser::PreParse(Handle<String> source, |
| 5563 unibrow::CharacterStream* stream, | 5311 unibrow::CharacterStream* stream, |
| 5564 v8::Extension* extension) { | 5312 v8::Extension* extension) { |
| 5565 Handle<Script> no_script; | 5313 Handle<Script> no_script; |
| 5566 bool allow_natives_syntax = | 5314 bool allow_natives_syntax = |
| 5567 FLAG_allow_natives_syntax || Bootstrapper::IsActive(); | 5315 FLAG_allow_natives_syntax || Bootstrapper::IsActive(); |
| 5568 CompletePreParser parser(no_script, allow_natives_syntax, extension); | 5316 CompletePreParser parser(no_script, allow_natives_syntax, extension); |
| 5569 if (!parser.PreParseProgram(source, stream)) return NULL; | 5317 if (!parser.PreParseProgram(source, stream)) return NULL; |
| 5570 // Extract the accumulated data from the recorder as a single | 5318 // Extract the accumulated data from the recorder as a single |
| 5571 // contiguous vector that we are responsible for disposing. | 5319 // contiguous vector that we are responsible for disposing. |
| 5572 Vector<unsigned> store = parser.recorder()->ExtractData(); | 5320 Vector<unsigned> store = parser.recorder()->ExtractData(); |
| 5573 return new ScriptDataImpl(store); | 5321 return new ScriptDataImpl(store); |
| 5574 } | 5322 } |
| 5575 | 5323 |
| 5576 | 5324 |
| 5577 bool ParseRegExp(FlatStringReader* input, | 5325 bool Parser::ParseRegExp(FlatStringReader* input, |
| 5578 bool multiline, | 5326 bool multiline, |
| 5579 RegExpCompileData* result) { | 5327 RegExpCompileData* result) { |
| 5580 ASSERT(result != NULL); | 5328 ASSERT(result != NULL); |
| 5581 RegExpParser parser(input, &result->error, multiline); | 5329 RegExpParser parser(input, &result->error, multiline); |
| 5582 RegExpTree* tree = parser.ParsePattern(); | 5330 RegExpTree* tree = parser.ParsePattern(); |
| 5583 if (parser.failed()) { | 5331 if (parser.failed()) { |
| 5584 ASSERT(tree == NULL); | 5332 ASSERT(tree == NULL); |
| 5585 ASSERT(!result->error.is_null()); | 5333 ASSERT(!result->error.is_null()); |
| 5586 } else { | 5334 } else { |
| 5587 ASSERT(tree != NULL); | 5335 ASSERT(tree != NULL); |
| 5588 ASSERT(result->error.is_null()); | 5336 ASSERT(result->error.is_null()); |
| 5589 result->tree = tree; | 5337 result->tree = tree; |
| 5590 int capture_count = parser.captures_started(); | 5338 int capture_count = parser.captures_started(); |
| 5591 result->simple = tree->IsAtom() && parser.simple() && capture_count == 0; | 5339 result->simple = tree->IsAtom() && parser.simple() && capture_count == 0; |
| 5592 result->contains_anchor = parser.contains_anchor(); | 5340 result->contains_anchor = parser.contains_anchor(); |
| 5593 result->capture_count = capture_count; | 5341 result->capture_count = capture_count; |
| 5594 } | 5342 } |
| 5595 return !parser.failed(); | 5343 return !parser.failed(); |
| 5596 } | 5344 } |
| 5597 | 5345 |
| 5598 | 5346 |
| 5599 // MakeAST is just a wrapper for the corresponding Parser calls so we don't | 5347 FunctionLiteral* Parser::MakeAST(bool compile_in_global_context, |
| 5600 // have to expose the entire Parser class in the .h file. | 5348 Handle<Script> script, |
| 5601 FunctionLiteral* MakeAST(bool compile_in_global_context, | 5349 v8::Extension* extension, |
| 5602 Handle<Script> script, | 5350 ScriptDataImpl* pre_data, |
| 5603 v8::Extension* extension, | 5351 bool is_json) { |
| 5604 ScriptDataImpl* pre_data, | |
| 5605 bool is_json) { | |
| 5606 bool allow_natives_syntax = | 5352 bool allow_natives_syntax = |
| 5607 FLAG_allow_natives_syntax || Bootstrapper::IsActive(); | 5353 FLAG_allow_natives_syntax || Bootstrapper::IsActive(); |
| 5608 AstBuildingParser parser(script, allow_natives_syntax, extension, pre_data); | 5354 AstBuildingParser parser(script, allow_natives_syntax, extension, pre_data); |
| 5609 if (pre_data != NULL && pre_data->has_error()) { | 5355 if (pre_data != NULL && pre_data->has_error()) { |
| 5610 Scanner::Location loc = pre_data->MessageLocation(); | 5356 Scanner::Location loc = pre_data->MessageLocation(); |
| 5611 const char* message = pre_data->BuildMessage(); | 5357 const char* message = pre_data->BuildMessage(); |
| 5612 Vector<const char*> args = pre_data->BuildArgs(); | 5358 Vector<const char*> args = pre_data->BuildArgs(); |
| 5613 parser.ReportMessageAt(loc, message, args); | 5359 parser.ReportMessageAt(loc, message, args); |
| 5614 DeleteArray(message); | 5360 DeleteArray(message); |
| 5615 for (int i = 0; i < args.length(); i++) { | 5361 for (int i = 0; i < args.length(); i++) { |
| 5616 DeleteArray(args[i]); | 5362 DeleteArray(args[i]); |
| 5617 } | 5363 } |
| 5618 DeleteArray(args.start()); | 5364 DeleteArray(args.start()); |
| 5619 return NULL; | 5365 return NULL; |
| 5620 } | 5366 } |
| 5621 Handle<String> source = Handle<String>(String::cast(script->source())); | 5367 Handle<String> source = Handle<String>(String::cast(script->source())); |
| 5622 FunctionLiteral* result; | 5368 FunctionLiteral* result; |
| 5623 if (is_json) { | 5369 if (is_json) { |
| 5624 ASSERT(compile_in_global_context); | 5370 ASSERT(compile_in_global_context); |
| 5625 result = parser.ParseJson(source); | 5371 result = parser.ParseJson(source); |
| 5626 } else { | 5372 } else { |
| 5627 result = parser.ParseProgram(source, compile_in_global_context); | 5373 result = parser.ParseProgram(source, compile_in_global_context); |
| 5628 } | 5374 } |
| 5629 return result; | 5375 return result; |
| 5630 } | 5376 } |
| 5631 | 5377 |
| 5632 | 5378 |
| 5633 FunctionLiteral* MakeLazyAST(Handle<SharedFunctionInfo> info) { | 5379 FunctionLiteral* Parser::MakeLazyAST(Handle<SharedFunctionInfo> info) { |
| 5634 Handle<Script> script(Script::cast(info->script())); | 5380 Handle<Script> script(Script::cast(info->script())); |
| 5635 AstBuildingParser parser(script, true, NULL, NULL); | 5381 AstBuildingParser parser(script, true, NULL, NULL); |
| 5636 FunctionLiteral* result = parser.ParseLazy(info); | 5382 FunctionLiteral* result = parser.ParseLazy(info); |
| 5637 return result; | 5383 return result; |
| 5638 } | 5384 } |
| 5639 | 5385 |
| 5640 #undef NEW | 5386 #undef NEW |
| 5641 | 5387 |
| 5642 } } // namespace v8::internal | 5388 } } // namespace v8::internal |
| OLD | NEW |