| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 // allocated. | 193 // allocated. |
| 194 // Elements must not be NULL pointers. | 194 // Elements must not be NULL pointers. |
| 195 template <typename T, int initial_size> | 195 template <typename T, int initial_size> |
| 196 class BufferedZoneList { | 196 class BufferedZoneList { |
| 197 public: | 197 public: |
| 198 BufferedZoneList() : list_(NULL), last_(NULL) {} | 198 BufferedZoneList() : list_(NULL), last_(NULL) {} |
| 199 | 199 |
| 200 // Adds element at end of list. This element is buffered and can | 200 // Adds element at end of list. This element is buffered and can |
| 201 // be read using last() or removed using RemoveLast until a new Add or until | 201 // be read using last() or removed using RemoveLast until a new Add or until |
| 202 // RemoveLast or GetList has been called. | 202 // RemoveLast or GetList has been called. |
| 203 void Add(T* value) { | 203 void Add(T* value, Zone* zone) { |
| 204 if (last_ != NULL) { | 204 if (last_ != NULL) { |
| 205 if (list_ == NULL) { | 205 if (list_ == NULL) { |
| 206 list_ = new ZoneList<T*>(initial_size); | 206 list_ = new(zone) ZoneList<T*>(initial_size, zone); |
| 207 } | 207 } |
| 208 list_->Add(last_); | 208 list_->Add(last_, zone); |
| 209 } | 209 } |
| 210 last_ = value; | 210 last_ = value; |
| 211 } | 211 } |
| 212 | 212 |
| 213 T* last() { | 213 T* last() { |
| 214 ASSERT(last_ != NULL); | 214 ASSERT(last_ != NULL); |
| 215 return last_; | 215 return last_; |
| 216 } | 216 } |
| 217 | 217 |
| 218 T* RemoveLast() { | 218 T* RemoveLast() { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 243 void Clear() { | 243 void Clear() { |
| 244 list_ = NULL; | 244 list_ = NULL; |
| 245 last_ = NULL; | 245 last_ = NULL; |
| 246 } | 246 } |
| 247 | 247 |
| 248 int length() { | 248 int length() { |
| 249 int length = (list_ == NULL) ? 0 : list_->length(); | 249 int length = (list_ == NULL) ? 0 : list_->length(); |
| 250 return length + ((last_ == NULL) ? 0 : 1); | 250 return length + ((last_ == NULL) ? 0 : 1); |
| 251 } | 251 } |
| 252 | 252 |
| 253 ZoneList<T*>* GetList() { | 253 ZoneList<T*>* GetList(Zone* zone) { |
| 254 if (list_ == NULL) { | 254 if (list_ == NULL) { |
| 255 list_ = new ZoneList<T*>(initial_size); | 255 list_ = new(zone) ZoneList<T*>(initial_size, zone); |
| 256 } | 256 } |
| 257 if (last_ != NULL) { | 257 if (last_ != NULL) { |
| 258 list_->Add(last_); | 258 list_->Add(last_, zone); |
| 259 last_ = NULL; | 259 last_ = NULL; |
| 260 } | 260 } |
| 261 return list_; | 261 return list_; |
| 262 } | 262 } |
| 263 | 263 |
| 264 private: | 264 private: |
| 265 ZoneList<T*>* list_; | 265 ZoneList<T*>* list_; |
| 266 T* last_; | 266 T* last_; |
| 267 }; | 267 }; |
| 268 | 268 |
| 269 | 269 |
| 270 // Accumulates RegExp atoms and assertions into lists of terms and alternatives. | 270 // Accumulates RegExp atoms and assertions into lists of terms and alternatives. |
| 271 class RegExpBuilder: public ZoneObject { | 271 class RegExpBuilder: public ZoneObject { |
| 272 public: | 272 public: |
| 273 explicit RegExpBuilder(Zone* zone); | 273 explicit RegExpBuilder(Zone* zone); |
| 274 void AddCharacter(uc16 character); | 274 void AddCharacter(uc16 character); |
| 275 // "Adds" an empty expression. Does nothing except consume a | 275 // "Adds" an empty expression. Does nothing except consume a |
| 276 // following quantifier | 276 // following quantifier |
| 277 void AddEmpty(); | 277 void AddEmpty(); |
| 278 void AddAtom(RegExpTree* tree); | 278 void AddAtom(RegExpTree* tree); |
| 279 void AddAssertion(RegExpTree* tree); | 279 void AddAssertion(RegExpTree* tree); |
| 280 void NewAlternative(); // '|' | 280 void NewAlternative(); // '|' |
| 281 void AddQuantifierToAtom(int min, int max, RegExpQuantifier::Type type); | 281 void AddQuantifierToAtom(int min, int max, RegExpQuantifier::Type type); |
| 282 RegExpTree* ToRegExp(); | 282 RegExpTree* ToRegExp(); |
| 283 | 283 |
| 284 private: | 284 private: |
| 285 void FlushCharacters(); | 285 void FlushCharacters(); |
| 286 void FlushText(); | 286 void FlushText(); |
| 287 void FlushTerms(); | 287 void FlushTerms(); |
| 288 Zone* zone() { return zone_; } | 288 Zone* zone() const { return zone_; } |
| 289 | 289 |
| 290 Zone* zone_; | 290 Zone* zone_; |
| 291 bool pending_empty_; | 291 bool pending_empty_; |
| 292 ZoneList<uc16>* characters_; | 292 ZoneList<uc16>* characters_; |
| 293 BufferedZoneList<RegExpTree, 2> terms_; | 293 BufferedZoneList<RegExpTree, 2> terms_; |
| 294 BufferedZoneList<RegExpTree, 2> text_; | 294 BufferedZoneList<RegExpTree, 2> text_; |
| 295 BufferedZoneList<RegExpTree, 2> alternatives_; | 295 BufferedZoneList<RegExpTree, 2> alternatives_; |
| 296 #ifdef DEBUG | 296 #ifdef DEBUG |
| 297 enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_; | 297 enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_; |
| 298 #define LAST(x) last_added_ = x; | 298 #define LAST(x) last_added_ = x; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 GROUPING | 364 GROUPING |
| 365 }; | 365 }; |
| 366 | 366 |
| 367 class RegExpParserState : public ZoneObject { | 367 class RegExpParserState : public ZoneObject { |
| 368 public: | 368 public: |
| 369 RegExpParserState(RegExpParserState* previous_state, | 369 RegExpParserState(RegExpParserState* previous_state, |
| 370 SubexpressionType group_type, | 370 SubexpressionType group_type, |
| 371 int disjunction_capture_index, | 371 int disjunction_capture_index, |
| 372 Zone* zone) | 372 Zone* zone) |
| 373 : previous_state_(previous_state), | 373 : previous_state_(previous_state), |
| 374 builder_(new RegExpBuilder(zone)), | 374 builder_(new(zone) RegExpBuilder(zone)), |
| 375 group_type_(group_type), | 375 group_type_(group_type), |
| 376 disjunction_capture_index_(disjunction_capture_index) {} | 376 disjunction_capture_index_(disjunction_capture_index) {} |
| 377 // Parser state of containing expression, if any. | 377 // Parser state of containing expression, if any. |
| 378 RegExpParserState* previous_state() { return previous_state_; } | 378 RegExpParserState* previous_state() { return previous_state_; } |
| 379 bool IsSubexpression() { return previous_state_ != NULL; } | 379 bool IsSubexpression() { return previous_state_ != NULL; } |
| 380 // RegExpBuilder building this regexp's AST. | 380 // RegExpBuilder building this regexp's AST. |
| 381 RegExpBuilder* builder() { return builder_; } | 381 RegExpBuilder* builder() { return builder_; } |
| 382 // Type of regexp being parsed (parenthesized group or entire regexp). | 382 // Type of regexp being parsed (parenthesized group or entire regexp). |
| 383 SubexpressionType group_type() { return group_type_; } | 383 SubexpressionType group_type() { return group_type_; } |
| 384 // Index in captures array of first capture in this sub-expression, if any. | 384 // Index in captures array of first capture in this sub-expression, if any. |
| 385 // Also the capture index of this sub-expression itself, if group_type | 385 // Also the capture index of this sub-expression itself, if group_type |
| 386 // is CAPTURE. | 386 // is CAPTURE. |
| 387 int capture_index() { return disjunction_capture_index_; } | 387 int capture_index() { return disjunction_capture_index_; } |
| 388 | 388 |
| 389 private: | 389 private: |
| 390 // Linked list implementation of stack of states. | 390 // Linked list implementation of stack of states. |
| 391 RegExpParserState* previous_state_; | 391 RegExpParserState* previous_state_; |
| 392 // Builder for the stored disjunction. | 392 // Builder for the stored disjunction. |
| 393 RegExpBuilder* builder_; | 393 RegExpBuilder* builder_; |
| 394 // Stored disjunction type (capture, look-ahead or grouping), if any. | 394 // Stored disjunction type (capture, look-ahead or grouping), if any. |
| 395 SubexpressionType group_type_; | 395 SubexpressionType group_type_; |
| 396 // Stored disjunction's capture index (if any). | 396 // Stored disjunction's capture index (if any). |
| 397 int disjunction_capture_index_; | 397 int disjunction_capture_index_; |
| 398 }; | 398 }; |
| 399 | 399 |
| 400 Isolate* isolate() { return isolate_; } | 400 Isolate* isolate() { return isolate_; } |
| 401 Zone* zone() { return isolate_->zone(); } | 401 Zone* zone() const { return isolate_->zone(); } |
| 402 | 402 |
| 403 uc32 current() { return current_; } | 403 uc32 current() { return current_; } |
| 404 bool has_more() { return has_more_; } | 404 bool has_more() { return has_more_; } |
| 405 bool has_next() { return next_pos_ < in()->length(); } | 405 bool has_next() { return next_pos_ < in()->length(); } |
| 406 uc32 Next(); | 406 uc32 Next(); |
| 407 FlatStringReader* in() { return in_; } | 407 FlatStringReader* in() { return in_; } |
| 408 void ScanForCaptures(); | 408 void ScanForCaptures(); |
| 409 | 409 |
| 410 Isolate* isolate_; | 410 Isolate* isolate_; |
| 411 Handle<String>* error_; | 411 Handle<String>* error_; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 }; | 541 }; |
| 542 | 542 |
| 543 | 543 |
| 544 | 544 |
| 545 | 545 |
| 546 FunctionLiteral* ParseLazy(CompilationInfo* info, | 546 FunctionLiteral* ParseLazy(CompilationInfo* info, |
| 547 Utf16CharacterStream* source, | 547 Utf16CharacterStream* source, |
| 548 ZoneScope* zone_scope); | 548 ZoneScope* zone_scope); |
| 549 | 549 |
| 550 Isolate* isolate() { return isolate_; } | 550 Isolate* isolate() { return isolate_; } |
| 551 Zone* zone() { return zone_; } | 551 Zone* zone() const { return zone_; } |
| 552 | 552 |
| 553 // Called by ParseProgram after setting up the scanner. | 553 // Called by ParseProgram after setting up the scanner. |
| 554 FunctionLiteral* DoParseProgram(CompilationInfo* info, | 554 FunctionLiteral* DoParseProgram(CompilationInfo* info, |
| 555 Handle<String> source, | 555 Handle<String> source, |
| 556 ZoneScope* zone_scope); | 556 ZoneScope* zone_scope); |
| 557 | 557 |
| 558 // Report syntax error | 558 // Report syntax error |
| 559 void ReportUnexpectedToken(Token::Value token); | 559 void ReportUnexpectedToken(Token::Value token); |
| 560 void ReportInvalidPreparseData(Handle<String> name, bool* ok); | 560 void ReportInvalidPreparseData(Handle<String> name, bool* ok); |
| 561 void ReportMessage(const char* message, Vector<const char*> args); | 561 void ReportMessage(const char* message, Vector<const char*> args); |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 private: | 868 private: |
| 869 static const int kTypeSlot = 0; | 869 static const int kTypeSlot = 0; |
| 870 static const int kElementsSlot = 1; | 870 static const int kElementsSlot = 1; |
| 871 | 871 |
| 872 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); | 872 DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue); |
| 873 }; | 873 }; |
| 874 | 874 |
| 875 } } // namespace v8::internal | 875 } } // namespace v8::internal |
| 876 | 876 |
| 877 #endif // V8_PARSER_H_ | 877 #endif // V8_PARSER_H_ |
| OLD | NEW |