OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 return CharacterRange(0, 0xFFFF); | 193 return CharacterRange(0, 0xFFFF); |
194 } | 194 } |
195 bool Contains(uc16 i) { return from_ <= i && i <= to_; } | 195 bool Contains(uc16 i) { return from_ <= i && i <= to_; } |
196 uc16 from() const { return from_; } | 196 uc16 from() const { return from_; } |
197 void set_from(uc16 value) { from_ = value; } | 197 void set_from(uc16 value) { from_ = value; } |
198 uc16 to() const { return to_; } | 198 uc16 to() const { return to_; } |
199 void set_to(uc16 value) { to_ = value; } | 199 void set_to(uc16 value) { to_ = value; } |
200 bool is_valid() { return from_ <= to_; } | 200 bool is_valid() { return from_ <= to_; } |
201 bool IsEverything(uc16 max) { return from_ == 0 && to_ >= max; } | 201 bool IsEverything(uc16 max) { return from_ == 0 && to_ >= max; } |
202 bool IsSingleton() { return (from_ == to_); } | 202 bool IsSingleton() { return (from_ == to_); } |
203 void AddCaseEquivalents(ZoneList<CharacterRange>* ranges); | 203 void AddCaseEquivalents(ZoneList<CharacterRange>* ranges, bool is_ascii); |
204 static void Split(ZoneList<CharacterRange>* base, | 204 static void Split(ZoneList<CharacterRange>* base, |
205 Vector<const uc16> overlay, | 205 Vector<const uc16> overlay, |
206 ZoneList<CharacterRange>** included, | 206 ZoneList<CharacterRange>** included, |
207 ZoneList<CharacterRange>** excluded); | 207 ZoneList<CharacterRange>** excluded); |
208 | 208 |
209 static const int kRangeCanonicalizeMax = 0x346; | 209 static const int kRangeCanonicalizeMax = 0x346; |
210 static const int kStartMarker = (1 << 24); | 210 static const int kStartMarker = (1 << 24); |
211 static const int kPayloadMask = (1 << 24) - 1; | 211 static const int kPayloadMask = (1 << 24) - 1; |
212 | 212 |
213 private: | 213 private: |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 elms_->Add(TextElement::CharClass(that)); | 696 elms_->Add(TextElement::CharClass(that)); |
697 } | 697 } |
698 virtual void Accept(NodeVisitor* visitor); | 698 virtual void Accept(NodeVisitor* visitor); |
699 virtual void Emit(RegExpCompiler* compiler, Trace* trace); | 699 virtual void Emit(RegExpCompiler* compiler, Trace* trace); |
700 virtual int EatsAtLeast(int still_to_find, int recursion_depth); | 700 virtual int EatsAtLeast(int still_to_find, int recursion_depth); |
701 virtual void GetQuickCheckDetails(QuickCheckDetails* details, | 701 virtual void GetQuickCheckDetails(QuickCheckDetails* details, |
702 RegExpCompiler* compiler, | 702 RegExpCompiler* compiler, |
703 int characters_filled_in, | 703 int characters_filled_in, |
704 bool not_at_start); | 704 bool not_at_start); |
705 ZoneList<TextElement>* elements() { return elms_; } | 705 ZoneList<TextElement>* elements() { return elms_; } |
706 void MakeCaseIndependent(); | 706 void MakeCaseIndependent(bool is_ascii); |
707 virtual int GreedyLoopTextLength(); | 707 virtual int GreedyLoopTextLength(); |
708 virtual TextNode* Clone() { | 708 virtual TextNode* Clone() { |
709 TextNode* result = new TextNode(*this); | 709 TextNode* result = new TextNode(*this); |
710 result->CalculateOffsets(); | 710 result->CalculateOffsets(); |
711 return result; | 711 return result; |
712 } | 712 } |
713 void CalculateOffsets(); | 713 void CalculateOffsets(); |
714 | 714 |
715 private: | 715 private: |
716 enum TextEmitPassType { | 716 enum TextEmitPassType { |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 // has to check if it succeeds a word or non-word. In this case the | 1205 // has to check if it succeeds a word or non-word. In this case the |
1206 // result will be something like: | 1206 // result will be something like: |
1207 // | 1207 // |
1208 // +-------+ +------------+ | 1208 // +-------+ +------------+ |
1209 // | . | | . | | 1209 // | . | | . | |
1210 // +-------+ ---> +------------+ | 1210 // +-------+ ---> +------------+ |
1211 // | word? | | check word | | 1211 // | word? | | check word | |
1212 // +-------+ +------------+ | 1212 // +-------+ +------------+ |
1213 class Analysis: public NodeVisitor { | 1213 class Analysis: public NodeVisitor { |
1214 public: | 1214 public: |
1215 explicit Analysis(bool ignore_case) | 1215 Analysis(bool ignore_case, bool is_ascii) |
1216 : ignore_case_(ignore_case), error_message_(NULL) { } | 1216 : ignore_case_(ignore_case), |
| 1217 is_ascii_(is_ascii), |
| 1218 error_message_(NULL) { } |
1217 void EnsureAnalyzed(RegExpNode* node); | 1219 void EnsureAnalyzed(RegExpNode* node); |
1218 | 1220 |
1219 #define DECLARE_VISIT(Type) \ | 1221 #define DECLARE_VISIT(Type) \ |
1220 virtual void Visit##Type(Type##Node* that); | 1222 virtual void Visit##Type(Type##Node* that); |
1221 FOR_EACH_NODE_TYPE(DECLARE_VISIT) | 1223 FOR_EACH_NODE_TYPE(DECLARE_VISIT) |
1222 #undef DECLARE_VISIT | 1224 #undef DECLARE_VISIT |
1223 virtual void VisitLoopChoice(LoopChoiceNode* that); | 1225 virtual void VisitLoopChoice(LoopChoiceNode* that); |
1224 | 1226 |
1225 bool has_failed() { return error_message_ != NULL; } | 1227 bool has_failed() { return error_message_ != NULL; } |
1226 const char* error_message() { | 1228 const char* error_message() { |
1227 ASSERT(error_message_ != NULL); | 1229 ASSERT(error_message_ != NULL); |
1228 return error_message_; | 1230 return error_message_; |
1229 } | 1231 } |
1230 void fail(const char* error_message) { | 1232 void fail(const char* error_message) { |
1231 error_message_ = error_message; | 1233 error_message_ = error_message; |
1232 } | 1234 } |
1233 private: | 1235 private: |
1234 bool ignore_case_; | 1236 bool ignore_case_; |
| 1237 bool is_ascii_; |
1235 const char* error_message_; | 1238 const char* error_message_; |
1236 | 1239 |
1237 DISALLOW_IMPLICIT_CONSTRUCTORS(Analysis); | 1240 DISALLOW_IMPLICIT_CONSTRUCTORS(Analysis); |
1238 }; | 1241 }; |
1239 | 1242 |
1240 | 1243 |
1241 struct RegExpCompileData { | 1244 struct RegExpCompileData { |
1242 RegExpCompileData() | 1245 RegExpCompileData() |
1243 : tree(NULL), | 1246 : tree(NULL), |
1244 node(NULL), | 1247 node(NULL), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 Handle<String> pattern, | 1279 Handle<String> pattern, |
1277 bool is_ascii); | 1280 bool is_ascii); |
1278 | 1281 |
1279 static void DotPrint(const char* label, RegExpNode* node, bool ignore_case); | 1282 static void DotPrint(const char* label, RegExpNode* node, bool ignore_case); |
1280 }; | 1283 }; |
1281 | 1284 |
1282 | 1285 |
1283 } } // namespace v8::internal | 1286 } } // namespace v8::internal |
1284 | 1287 |
1285 #endif // V8_JSREGEXP_H_ | 1288 #endif // V8_JSREGEXP_H_ |
OLD | NEW |