Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: src/jsregexp.h

Issue 10534006: Remove TLS access for current Zone. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address review. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/json-parser.h ('k') | src/jsregexp.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 238
239 239
240 // Represents code units in the range from from_ to to_, both ends are 240 // Represents code units in the range from from_ to to_, both ends are
241 // inclusive. 241 // inclusive.
242 class CharacterRange { 242 class CharacterRange {
243 public: 243 public:
244 CharacterRange() : from_(0), to_(0) { } 244 CharacterRange() : from_(0), to_(0) { }
245 // For compatibility with the CHECK_OK macro 245 // For compatibility with the CHECK_OK macro
246 CharacterRange(void* null) { ASSERT_EQ(NULL, null); } //NOLINT 246 CharacterRange(void* null) { ASSERT_EQ(NULL, null); } //NOLINT
247 CharacterRange(uc16 from, uc16 to) : from_(from), to_(to) { } 247 CharacterRange(uc16 from, uc16 to) : from_(from), to_(to) { }
248 static void AddClassEscape(uc16 type, ZoneList<CharacterRange>* ranges); 248 static void AddClassEscape(uc16 type, ZoneList<CharacterRange>* ranges,
249 Zone* zone);
249 static Vector<const int> GetWordBounds(); 250 static Vector<const int> GetWordBounds();
250 static inline CharacterRange Singleton(uc16 value) { 251 static inline CharacterRange Singleton(uc16 value) {
251 return CharacterRange(value, value); 252 return CharacterRange(value, value);
252 } 253 }
253 static inline CharacterRange Range(uc16 from, uc16 to) { 254 static inline CharacterRange Range(uc16 from, uc16 to) {
254 ASSERT(from <= to); 255 ASSERT(from <= to);
255 return CharacterRange(from, to); 256 return CharacterRange(from, to);
256 } 257 }
257 static inline CharacterRange Everything() { 258 static inline CharacterRange Everything() {
258 return CharacterRange(0, 0xFFFF); 259 return CharacterRange(0, 0xFFFF);
259 } 260 }
260 bool Contains(uc16 i) { return from_ <= i && i <= to_; } 261 bool Contains(uc16 i) { return from_ <= i && i <= to_; }
261 uc16 from() const { return from_; } 262 uc16 from() const { return from_; }
262 void set_from(uc16 value) { from_ = value; } 263 void set_from(uc16 value) { from_ = value; }
263 uc16 to() const { return to_; } 264 uc16 to() const { return to_; }
264 void set_to(uc16 value) { to_ = value; } 265 void set_to(uc16 value) { to_ = value; }
265 bool is_valid() { return from_ <= to_; } 266 bool is_valid() { return from_ <= to_; }
266 bool IsEverything(uc16 max) { return from_ == 0 && to_ >= max; } 267 bool IsEverything(uc16 max) { return from_ == 0 && to_ >= max; }
267 bool IsSingleton() { return (from_ == to_); } 268 bool IsSingleton() { return (from_ == to_); }
268 void AddCaseEquivalents(ZoneList<CharacterRange>* ranges, bool is_ascii); 269 void AddCaseEquivalents(ZoneList<CharacterRange>* ranges, bool is_ascii,
270 Zone* zone);
269 static void Split(ZoneList<CharacterRange>* base, 271 static void Split(ZoneList<CharacterRange>* base,
270 Vector<const int> overlay, 272 Vector<const int> overlay,
271 ZoneList<CharacterRange>** included, 273 ZoneList<CharacterRange>** included,
272 ZoneList<CharacterRange>** excluded); 274 ZoneList<CharacterRange>** excluded,
275 Zone* zone);
273 // Whether a range list is in canonical form: Ranges ordered by from value, 276 // Whether a range list is in canonical form: Ranges ordered by from value,
274 // and ranges non-overlapping and non-adjacent. 277 // and ranges non-overlapping and non-adjacent.
275 static bool IsCanonical(ZoneList<CharacterRange>* ranges); 278 static bool IsCanonical(ZoneList<CharacterRange>* ranges);
276 // Convert range list to canonical form. The characters covered by the ranges 279 // Convert range list to canonical form. The characters covered by the ranges
277 // will still be the same, but no character is in more than one range, and 280 // will still be the same, but no character is in more than one range, and
278 // adjacent ranges are merged. The resulting list may be shorter than the 281 // adjacent ranges are merged. The resulting list may be shorter than the
279 // original, but cannot be longer. 282 // original, but cannot be longer.
280 static void Canonicalize(ZoneList<CharacterRange>* ranges); 283 static void Canonicalize(ZoneList<CharacterRange>* ranges);
281 // Negate the contents of a character range in canonical form. 284 // Negate the contents of a character range in canonical form.
282 static void Negate(ZoneList<CharacterRange>* src, 285 static void Negate(ZoneList<CharacterRange>* src,
283 ZoneList<CharacterRange>* dst); 286 ZoneList<CharacterRange>* dst,
287 Zone* zone);
284 static const int kStartMarker = (1 << 24); 288 static const int kStartMarker = (1 << 24);
285 static const int kPayloadMask = (1 << 24) - 1; 289 static const int kPayloadMask = (1 << 24) - 1;
286 290
287 private: 291 private:
288 uc16 from_; 292 uc16 from_;
289 uc16 to_; 293 uc16 to_;
290 }; 294 };
291 295
292 296
293 // A set of unsigned integers that behaves especially well on small 297 // A set of unsigned integers that behaves especially well on small
294 // integers (< 32). May do zone-allocation. 298 // integers (< 32). May do zone-allocation.
295 class OutSet: public ZoneObject { 299 class OutSet: public ZoneObject {
296 public: 300 public:
297 OutSet() : first_(0), remaining_(NULL), successors_(NULL) { } 301 OutSet() : first_(0), remaining_(NULL), successors_(NULL) { }
298 OutSet* Extend(unsigned value); 302 OutSet* Extend(unsigned value, Zone* zone);
299 bool Get(unsigned value); 303 bool Get(unsigned value);
300 static const unsigned kFirstLimit = 32; 304 static const unsigned kFirstLimit = 32;
301 305
302 private: 306 private:
303 // Destructively set a value in this set. In most cases you want 307 // Destructively set a value in this set. In most cases you want
304 // to use Extend instead to ensure that only one instance exists 308 // to use Extend instead to ensure that only one instance exists
305 // that contains the same values. 309 // that contains the same values.
306 void Set(unsigned value); 310 void Set(unsigned value, Zone* zone);
307 311
308 // The successors are a list of sets that contain the same values 312 // The successors are a list of sets that contain the same values
309 // as this set and the one more value that is not present in this 313 // as this set and the one more value that is not present in this
310 // set. 314 // set.
311 ZoneList<OutSet*>* successors() { return successors_; } 315 ZoneList<OutSet*>* successors(Zone* zone) { return successors_; }
312 316
313 OutSet(uint32_t first, ZoneList<unsigned>* remaining) 317 OutSet(uint32_t first, ZoneList<unsigned>* remaining)
314 : first_(first), remaining_(remaining), successors_(NULL) { } 318 : first_(first), remaining_(remaining), successors_(NULL) { }
315 uint32_t first_; 319 uint32_t first_;
316 ZoneList<unsigned>* remaining_; 320 ZoneList<unsigned>* remaining_;
317 ZoneList<OutSet*>* successors_; 321 ZoneList<OutSet*>* successors_;
318 friend class Trace; 322 friend class Trace;
319 }; 323 };
320 324
321 325
322 // A mapping from integers, specified as ranges, to a set of integers. 326 // A mapping from integers, specified as ranges, to a set of integers.
323 // Used for mapping character ranges to choices. 327 // Used for mapping character ranges to choices.
324 class DispatchTable : public ZoneObject { 328 class DispatchTable : public ZoneObject {
325 public: 329 public:
330 explicit DispatchTable(Zone* zone) : tree_(zone) { }
331
326 class Entry { 332 class Entry {
327 public: 333 public:
328 Entry() : from_(0), to_(0), out_set_(NULL) { } 334 Entry() : from_(0), to_(0), out_set_(NULL) { }
329 Entry(uc16 from, uc16 to, OutSet* out_set) 335 Entry(uc16 from, uc16 to, OutSet* out_set)
330 : from_(from), to_(to), out_set_(out_set) { } 336 : from_(from), to_(to), out_set_(out_set) { }
331 uc16 from() { return from_; } 337 uc16 from() { return from_; }
332 uc16 to() { return to_; } 338 uc16 to() { return to_; }
333 void set_to(uc16 value) { to_ = value; } 339 void set_to(uc16 value) { to_ = value; }
334 void AddValue(int value) { out_set_ = out_set_->Extend(value); } 340 void AddValue(int value, Zone* zone) {
341 out_set_ = out_set_->Extend(value, zone);
342 }
335 OutSet* out_set() { return out_set_; } 343 OutSet* out_set() { return out_set_; }
336 private: 344 private:
337 uc16 from_; 345 uc16 from_;
338 uc16 to_; 346 uc16 to_;
339 OutSet* out_set_; 347 OutSet* out_set_;
340 }; 348 };
341 349
342 class Config { 350 class Config {
343 public: 351 public:
344 typedef uc16 Key; 352 typedef uc16 Key;
345 typedef Entry Value; 353 typedef Entry Value;
346 static const uc16 kNoKey; 354 static const uc16 kNoKey;
347 static const Entry NoValue() { return Value(); } 355 static const Entry NoValue() { return Value(); }
348 static inline int Compare(uc16 a, uc16 b) { 356 static inline int Compare(uc16 a, uc16 b) {
349 if (a == b) 357 if (a == b)
350 return 0; 358 return 0;
351 else if (a < b) 359 else if (a < b)
352 return -1; 360 return -1;
353 else 361 else
354 return 1; 362 return 1;
355 } 363 }
356 }; 364 };
357 365
358 void AddRange(CharacterRange range, int value); 366 void AddRange(CharacterRange range, int value, Zone* zone);
359 OutSet* Get(uc16 value); 367 OutSet* Get(uc16 value);
360 void Dump(); 368 void Dump();
361 369
362 template <typename Callback> 370 template <typename Callback>
363 void ForEach(Callback* callback) { return tree()->ForEach(callback); } 371 void ForEach(Callback* callback) {
372 return tree()->ForEach(callback);
373 }
364 374
365 private: 375 private:
366 // There can't be a static empty set since it allocates its 376 // There can't be a static empty set since it allocates its
367 // successors in a zone and caches them. 377 // successors in a zone and caches them.
368 OutSet* empty() { return &empty_; } 378 OutSet* empty() { return &empty_; }
369 OutSet empty_; 379 OutSet empty_;
370 ZoneSplayTree<Config>* tree() { return &tree_; } 380 ZoneSplayTree<Config>* tree() { return &tree_; }
371 ZoneSplayTree<Config> tree_; 381 ZoneSplayTree<Config> tree_;
372 }; 382 };
373 383
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
628 // trace and generating generic code for a node that can be reused by flushing 638 // trace and generating generic code for a node that can be reused by flushing
629 // the deferred actions in the current trace and generating a goto. 639 // the deferred actions in the current trace and generating a goto.
630 static const int kMaxCopiesCodeGenerated = 10; 640 static const int kMaxCopiesCodeGenerated = 10;
631 641
632 NodeInfo* info() { return &info_; } 642 NodeInfo* info() { return &info_; }
633 643
634 BoyerMooreLookahead* bm_info(bool not_at_start) { 644 BoyerMooreLookahead* bm_info(bool not_at_start) {
635 return bm_info_[not_at_start ? 1 : 0]; 645 return bm_info_[not_at_start ? 1 : 0];
636 } 646 }
637 647
638 Zone* zone() { return zone_; } 648 Zone* zone() const { return zone_; }
639 649
640 protected: 650 protected:
641 enum LimitResult { DONE, CONTINUE }; 651 enum LimitResult { DONE, CONTINUE };
642 RegExpNode* replacement_; 652 RegExpNode* replacement_;
643 653
644 LimitResult LimitVersions(RegExpCompiler* compiler, Trace* trace); 654 LimitResult LimitVersions(RegExpCompiler* compiler, Trace* trace);
645 655
646 void set_bm_info(bool not_at_start, BoyerMooreLookahead* bm) { 656 void set_bm_info(bool not_at_start, BoyerMooreLookahead* bm) {
647 bm_info_[not_at_start ? 1 : 0] = bm; 657 bm_info_[not_at_start ? 1 : 0] = bm;
648 } 658 }
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 814
805 class TextNode: public SeqRegExpNode { 815 class TextNode: public SeqRegExpNode {
806 public: 816 public:
807 TextNode(ZoneList<TextElement>* elms, 817 TextNode(ZoneList<TextElement>* elms,
808 RegExpNode* on_success) 818 RegExpNode* on_success)
809 : SeqRegExpNode(on_success), 819 : SeqRegExpNode(on_success),
810 elms_(elms) { } 820 elms_(elms) { }
811 TextNode(RegExpCharacterClass* that, 821 TextNode(RegExpCharacterClass* that,
812 RegExpNode* on_success) 822 RegExpNode* on_success)
813 : SeqRegExpNode(on_success), 823 : SeqRegExpNode(on_success),
814 elms_(new ZoneList<TextElement>(1, zone())) { 824 elms_(new(zone()) ZoneList<TextElement>(1, zone())) {
815 elms_->Add(TextElement::CharClass(that), zone()); 825 elms_->Add(TextElement::CharClass(that), zone());
816 } 826 }
817 virtual void Accept(NodeVisitor* visitor); 827 virtual void Accept(NodeVisitor* visitor);
818 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 828 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
819 virtual int EatsAtLeast(int still_to_find, 829 virtual int EatsAtLeast(int still_to_find,
820 int recursion_depth, 830 int recursion_depth,
821 bool not_at_start); 831 bool not_at_start);
822 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 832 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
823 RegExpCompiler* compiler, 833 RegExpCompiler* compiler,
824 int characters_filled_in, 834 int characters_filled_in,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 class AssertionNode: public SeqRegExpNode { 871 class AssertionNode: public SeqRegExpNode {
862 public: 872 public:
863 enum AssertionNodeType { 873 enum AssertionNodeType {
864 AT_END, 874 AT_END,
865 AT_START, 875 AT_START,
866 AT_BOUNDARY, 876 AT_BOUNDARY,
867 AT_NON_BOUNDARY, 877 AT_NON_BOUNDARY,
868 AFTER_NEWLINE 878 AFTER_NEWLINE
869 }; 879 };
870 static AssertionNode* AtEnd(RegExpNode* on_success) { 880 static AssertionNode* AtEnd(RegExpNode* on_success) {
871 return new AssertionNode(AT_END, on_success); 881 return new(on_success->zone()) AssertionNode(AT_END, on_success);
872 } 882 }
873 static AssertionNode* AtStart(RegExpNode* on_success) { 883 static AssertionNode* AtStart(RegExpNode* on_success) {
874 return new AssertionNode(AT_START, on_success); 884 return new(on_success->zone()) AssertionNode(AT_START, on_success);
875 } 885 }
876 static AssertionNode* AtBoundary(RegExpNode* on_success) { 886 static AssertionNode* AtBoundary(RegExpNode* on_success) {
877 return new AssertionNode(AT_BOUNDARY, on_success); 887 return new(on_success->zone()) AssertionNode(AT_BOUNDARY, on_success);
878 } 888 }
879 static AssertionNode* AtNonBoundary(RegExpNode* on_success) { 889 static AssertionNode* AtNonBoundary(RegExpNode* on_success) {
880 return new AssertionNode(AT_NON_BOUNDARY, on_success); 890 return new(on_success->zone()) AssertionNode(AT_NON_BOUNDARY, on_success);
881 } 891 }
882 static AssertionNode* AfterNewline(RegExpNode* on_success) { 892 static AssertionNode* AfterNewline(RegExpNode* on_success) {
883 return new AssertionNode(AFTER_NEWLINE, on_success); 893 return new(on_success->zone()) AssertionNode(AFTER_NEWLINE, on_success);
884 } 894 }
885 virtual void Accept(NodeVisitor* visitor); 895 virtual void Accept(NodeVisitor* visitor);
886 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 896 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
887 virtual int EatsAtLeast(int still_to_find, 897 virtual int EatsAtLeast(int still_to_find,
888 int recursion_depth, 898 int recursion_depth,
889 bool not_at_start); 899 bool not_at_start);
890 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 900 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
891 RegExpCompiler* compiler, 901 RegExpCompiler* compiler,
892 int filled_in, 902 int filled_in,
893 bool not_at_start); 903 bool not_at_start);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 private: 1021 private:
1012 int reg_; 1022 int reg_;
1013 Relation op_; 1023 Relation op_;
1014 int value_; 1024 int value_;
1015 }; 1025 };
1016 1026
1017 1027
1018 class GuardedAlternative { 1028 class GuardedAlternative {
1019 public: 1029 public:
1020 explicit GuardedAlternative(RegExpNode* node) : node_(node), guards_(NULL) { } 1030 explicit GuardedAlternative(RegExpNode* node) : node_(node), guards_(NULL) { }
1021 void AddGuard(Guard* guard); 1031 void AddGuard(Guard* guard, Zone* zone);
1022 RegExpNode* node() { return node_; } 1032 RegExpNode* node() { return node_; }
1023 void set_node(RegExpNode* node) { node_ = node; } 1033 void set_node(RegExpNode* node) { node_ = node; }
1024 ZoneList<Guard*>* guards() { return guards_; } 1034 ZoneList<Guard*>* guards() { return guards_; }
1025 1035
1026 private: 1036 private:
1027 RegExpNode* node_; 1037 RegExpNode* node_;
1028 ZoneList<Guard*>* guards_; 1038 ZoneList<Guard*>* guards_;
1029 }; 1039 };
1030 1040
1031 1041
1032 class AlternativeGeneration; 1042 class AlternativeGeneration;
1033 1043
1034 1044
1035 class ChoiceNode: public RegExpNode { 1045 class ChoiceNode: public RegExpNode {
1036 public: 1046 public:
1037 explicit ChoiceNode(int expected_size, Zone* zone) 1047 explicit ChoiceNode(int expected_size, Zone* zone)
1038 : RegExpNode(zone), 1048 : RegExpNode(zone),
1039 alternatives_(new ZoneList<GuardedAlternative>(expected_size, zone)), 1049 alternatives_(new(zone)
1050 ZoneList<GuardedAlternative>(expected_size, zone)),
1040 table_(NULL), 1051 table_(NULL),
1041 not_at_start_(false), 1052 not_at_start_(false),
1042 being_calculated_(false) { } 1053 being_calculated_(false) { }
1043 virtual void Accept(NodeVisitor* visitor); 1054 virtual void Accept(NodeVisitor* visitor);
1044 void AddAlternative(GuardedAlternative node) { 1055 void AddAlternative(GuardedAlternative node) {
1045 alternatives()->Add(node, zone()); 1056 alternatives()->Add(node, zone());
1046 } 1057 }
1047 ZoneList<GuardedAlternative>* alternatives() { return alternatives_; } 1058 ZoneList<GuardedAlternative>* alternatives() { return alternatives_; }
1048 DispatchTable* GetTable(bool ignore_case); 1059 DispatchTable* GetTable(bool ignore_case);
1049 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 1060 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1213 1224
1214 ContainedInLattice AddRange(ContainedInLattice a, 1225 ContainedInLattice AddRange(ContainedInLattice a,
1215 const int* ranges, 1226 const int* ranges,
1216 int ranges_size, 1227 int ranges_size,
1217 Interval new_range); 1228 Interval new_range);
1218 1229
1219 1230
1220 class BoyerMoorePositionInfo : public ZoneObject { 1231 class BoyerMoorePositionInfo : public ZoneObject {
1221 public: 1232 public:
1222 explicit BoyerMoorePositionInfo(Zone* zone) 1233 explicit BoyerMoorePositionInfo(Zone* zone)
1223 : map_(new ZoneList<bool>(kMapSize, zone)), 1234 : map_(new(zone) ZoneList<bool>(kMapSize, zone)),
1224 map_count_(0), 1235 map_count_(0),
1225 w_(kNotYet), 1236 w_(kNotYet),
1226 s_(kNotYet), 1237 s_(kNotYet),
1227 d_(kNotYet), 1238 d_(kNotYet),
1228 surrogate_(kNotYet) { 1239 surrogate_(kNotYet) {
1229 for (int i = 0; i < kMapSize; i++) { 1240 for (int i = 0; i < kMapSize; i++) {
1230 map_->Add(false, zone); 1241 map_->Add(false, zone);
1231 } 1242 }
1232 } 1243 }
1233 1244
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 void set_characters_preloaded(int count) { characters_preloaded_ = count; } 1462 void set_characters_preloaded(int count) { characters_preloaded_ = count; }
1452 void set_bound_checked_up_to(int to) { bound_checked_up_to_ = to; } 1463 void set_bound_checked_up_to(int to) { bound_checked_up_to_ = to; }
1453 void set_flush_budget(int to) { flush_budget_ = to; } 1464 void set_flush_budget(int to) { flush_budget_ = to; }
1454 void set_quick_check_performed(QuickCheckDetails* d) { 1465 void set_quick_check_performed(QuickCheckDetails* d) {
1455 quick_check_performed_ = *d; 1466 quick_check_performed_ = *d;
1456 } 1467 }
1457 void InvalidateCurrentCharacter(); 1468 void InvalidateCurrentCharacter();
1458 void AdvanceCurrentPositionInTrace(int by, RegExpCompiler* compiler); 1469 void AdvanceCurrentPositionInTrace(int by, RegExpCompiler* compiler);
1459 1470
1460 private: 1471 private:
1461 int FindAffectedRegisters(OutSet* affected_registers); 1472 int FindAffectedRegisters(OutSet* affected_registers, Zone* zone);
1462 void PerformDeferredActions(RegExpMacroAssembler* macro, 1473 void PerformDeferredActions(RegExpMacroAssembler* macro,
1463 int max_register, 1474 int max_register,
1464 OutSet& affected_registers, 1475 OutSet& affected_registers,
1465 OutSet* registers_to_pop, 1476 OutSet* registers_to_pop,
1466 OutSet* registers_to_clear); 1477 OutSet* registers_to_clear,
1478 Zone* zone);
1467 void RestoreAffectedRegisters(RegExpMacroAssembler* macro, 1479 void RestoreAffectedRegisters(RegExpMacroAssembler* macro,
1468 int max_register, 1480 int max_register,
1469 OutSet& registers_to_pop, 1481 OutSet& registers_to_pop,
1470 OutSet& registers_to_clear); 1482 OutSet& registers_to_clear);
1471 int cp_offset_; 1483 int cp_offset_;
1472 DeferredAction* actions_; 1484 DeferredAction* actions_;
1473 Label* backtrack_; 1485 Label* backtrack_;
1474 RegExpNode* stop_node_; 1486 RegExpNode* stop_node_;
1475 Label* loop_label_; 1487 Label* loop_label_;
1476 int characters_preloaded_; 1488 int characters_preloaded_;
(...skipping 12 matching lines...) Expand all
1489 FOR_EACH_NODE_TYPE(DECLARE_VISIT) 1501 FOR_EACH_NODE_TYPE(DECLARE_VISIT)
1490 #undef DECLARE_VISIT 1502 #undef DECLARE_VISIT
1491 virtual void VisitLoopChoice(LoopChoiceNode* that) { VisitChoice(that); } 1503 virtual void VisitLoopChoice(LoopChoiceNode* that) { VisitChoice(that); }
1492 }; 1504 };
1493 1505
1494 1506
1495 // Node visitor used to add the start set of the alternatives to the 1507 // Node visitor used to add the start set of the alternatives to the
1496 // dispatch table of a choice node. 1508 // dispatch table of a choice node.
1497 class DispatchTableConstructor: public NodeVisitor { 1509 class DispatchTableConstructor: public NodeVisitor {
1498 public: 1510 public:
1499 DispatchTableConstructor(DispatchTable* table, bool ignore_case) 1511 DispatchTableConstructor(DispatchTable* table, bool ignore_case,
1512 Zone* zone)
1500 : table_(table), 1513 : table_(table),
1501 choice_index_(-1), 1514 choice_index_(-1),
1502 ignore_case_(ignore_case) { } 1515 ignore_case_(ignore_case),
1516 zone_(zone) { }
1503 1517
1504 void BuildTable(ChoiceNode* node); 1518 void BuildTable(ChoiceNode* node);
1505 1519
1506 void AddRange(CharacterRange range) { 1520 void AddRange(CharacterRange range) {
1507 table()->AddRange(range, choice_index_); 1521 table()->AddRange(range, choice_index_, zone_);
1508 } 1522 }
1509 1523
1510 void AddInverse(ZoneList<CharacterRange>* ranges); 1524 void AddInverse(ZoneList<CharacterRange>* ranges);
1511 1525
1512 #define DECLARE_VISIT(Type) \ 1526 #define DECLARE_VISIT(Type) \
1513 virtual void Visit##Type(Type##Node* that); 1527 virtual void Visit##Type(Type##Node* that);
1514 FOR_EACH_NODE_TYPE(DECLARE_VISIT) 1528 FOR_EACH_NODE_TYPE(DECLARE_VISIT)
1515 #undef DECLARE_VISIT 1529 #undef DECLARE_VISIT
1516 1530
1517 DispatchTable* table() { return table_; } 1531 DispatchTable* table() { return table_; }
1518 void set_choice_index(int value) { choice_index_ = value; } 1532 void set_choice_index(int value) { choice_index_ = value; }
1519 1533
1520 protected: 1534 protected:
1521 DispatchTable* table_; 1535 DispatchTable* table_;
1522 int choice_index_; 1536 int choice_index_;
1523 bool ignore_case_; 1537 bool ignore_case_;
1538 Zone* zone_;
1524 }; 1539 };
1525 1540
1526 1541
1527 // Assertion propagation moves information about assertions such as 1542 // Assertion propagation moves information about assertions such as
1528 // \b to the affected nodes. For instance, in /.\b./ information must 1543 // \b to the affected nodes. For instance, in /.\b./ information must
1529 // be propagated to the first '.' that whatever follows needs to know 1544 // be propagated to the first '.' that whatever follows needs to know
1530 // if it matched a word or a non-word, and to the second '.' that it 1545 // if it matched a word or a non-word, and to the second '.' that it
1531 // has to check if it succeeds a word or non-word. In this case the 1546 // has to check if it succeeds a word or non-word. In this case the
1532 // result will be something like: 1547 // result will be something like:
1533 // 1548 //
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1642 int* vector_; 1657 int* vector_;
1643 int offsets_vector_length_; 1658 int offsets_vector_length_;
1644 1659
1645 friend class ExternalReference; 1660 friend class ExternalReference;
1646 }; 1661 };
1647 1662
1648 1663
1649 } } // namespace v8::internal 1664 } } // namespace v8::internal
1650 1665
1651 #endif // V8_JSREGEXP_H_ 1666 #endif // V8_JSREGEXP_H_
OLDNEW
« no previous file with comments | « src/json-parser.h ('k') | src/jsregexp.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698