| Index: src/regexp/jsregexp.h
|
| diff --git a/src/regexp/jsregexp.h b/src/regexp/jsregexp.h
|
| index 0ad4b79c873f8982c221b214b1c0f21a93e3a623..f4051fdf43d58e942cce6ba8ae0b340952539b7f 100644
|
| --- a/src/regexp/jsregexp.h
|
| +++ b/src/regexp/jsregexp.h
|
| @@ -265,28 +265,28 @@ class DispatchTable : public ZoneObject {
|
| class Entry {
|
| public:
|
| Entry() : from_(0), to_(0), out_set_(NULL) { }
|
| - Entry(uc16 from, uc16 to, OutSet* out_set)
|
| - : from_(from), to_(to), out_set_(out_set) { }
|
| - uc16 from() { return from_; }
|
| - uc16 to() { return to_; }
|
| - void set_to(uc16 value) { to_ = value; }
|
| + Entry(uc32 from, uc32 to, OutSet* out_set)
|
| + : from_(from), to_(to), out_set_(out_set) {}
|
| + uc32 from() { return from_; }
|
| + uc32 to() { return to_; }
|
| + void set_to(uc32 value) { to_ = value; }
|
| void AddValue(int value, Zone* zone) {
|
| out_set_ = out_set_->Extend(value, zone);
|
| }
|
| OutSet* out_set() { return out_set_; }
|
| private:
|
| - uc16 from_;
|
| - uc16 to_;
|
| + uc32 from_;
|
| + uc32 to_;
|
| OutSet* out_set_;
|
| };
|
|
|
| class Config {
|
| public:
|
| - typedef uc16 Key;
|
| + typedef uc32 Key;
|
| typedef Entry Value;
|
| - static const uc16 kNoKey;
|
| + static const uc32 kNoKey;
|
| static const Entry NoValue() { return Value(); }
|
| - static inline int Compare(uc16 a, uc16 b) {
|
| + static inline int Compare(uc32 a, uc32 b) {
|
| if (a == b)
|
| return 0;
|
| else if (a < b)
|
| @@ -297,7 +297,7 @@ class DispatchTable : public ZoneObject {
|
| };
|
|
|
| void AddRange(CharacterRange range, int value, Zone* zone);
|
| - OutSet* Get(uc16 value);
|
| + OutSet* Get(uc32 value);
|
| void Dump();
|
|
|
| template <typename Callback>
|
| @@ -315,6 +315,34 @@ class DispatchTable : public ZoneObject {
|
| };
|
|
|
|
|
| +// Categorizes character ranges into BMP, non-BMP, lead, and trail surrogates.
|
| +class UnicodeRangeSplitter {
|
| + public:
|
| + UnicodeRangeSplitter(Zone* zone, ZoneList<CharacterRange>* base);
|
| + void Call(uc32 from, DispatchTable::Entry entry);
|
| +
|
| + ZoneList<CharacterRange>* bmp() { return bmp_; }
|
| + ZoneList<CharacterRange>* lead_surrogates() { return lead_surrogates_; }
|
| + ZoneList<CharacterRange>* trail_surrogates() { return trail_surrogates_; }
|
| + ZoneList<CharacterRange>* non_bmp() const { return non_bmp_; }
|
| +
|
| + private:
|
| + static const int kBase = 0;
|
| + // Separate ranges into
|
| + static const int kBmpCodePoints = 1;
|
| + static const int kLeadSurrogates = 2;
|
| + static const int kTrailSurrogates = 3;
|
| + static const int kNonBmpCodePoints = 4;
|
| +
|
| + Zone* zone_;
|
| + DispatchTable table_;
|
| + ZoneList<CharacterRange>* bmp_;
|
| + ZoneList<CharacterRange>* lead_surrogates_;
|
| + ZoneList<CharacterRange>* trail_surrogates_;
|
| + ZoneList<CharacterRange>* non_bmp_;
|
| +};
|
| +
|
| +
|
| #define FOR_EACH_NODE_TYPE(VISIT) \
|
| VISIT(End) \
|
| VISIT(Action) \
|
| @@ -690,6 +718,17 @@ class TextNode: public SeqRegExpNode {
|
| read_backward_(read_backward) {
|
| elms_->Add(TextElement::CharClass(that), zone());
|
| }
|
| + // Create TextNode for a single character class for the given ranges.
|
| + static TextNode* CreateForCharacterRanges(Zone* zone,
|
| + ZoneList<CharacterRange>* ranges,
|
| + bool read_backward,
|
| + RegExpNode* on_success);
|
| + // Create TextNode for a surrogate pair with a range given for the
|
| + // lead and the trail surrogate each.
|
| + static TextNode* CreateForSurrogatePair(Zone* zone, CharacterRange lead,
|
| + CharacterRange trail,
|
| + bool read_backward,
|
| + RegExpNode* on_success);
|
| virtual void Accept(NodeVisitor* visitor);
|
| virtual void Emit(RegExpCompiler* compiler, Trace* trace);
|
| virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
|
| @@ -813,8 +852,7 @@ class BackReferenceNode: public SeqRegExpNode {
|
| class EndNode: public RegExpNode {
|
| public:
|
| enum Action { ACCEPT, BACKTRACK, NEGATIVE_SUBMATCH_SUCCESS };
|
| - explicit EndNode(Action action, Zone* zone)
|
| - : RegExpNode(zone), action_(action) { }
|
| + EndNode(Action action, Zone* zone) : RegExpNode(zone), action_(action) {}
|
| virtual void Accept(NodeVisitor* visitor);
|
| virtual void Emit(RegExpCompiler* compiler, Trace* trace);
|
| virtual int EatsAtLeast(int still_to_find,
|
| @@ -1505,8 +1543,8 @@ class RegExpEngine: public AllStatic {
|
| };
|
|
|
| static CompilationResult Compile(Isolate* isolate, Zone* zone,
|
| - RegExpCompileData* input, bool ignore_case,
|
| - bool global, bool multiline, bool sticky,
|
| + RegExpCompileData* input,
|
| + JSRegExp::Flags flags,
|
| Handle<String> pattern,
|
| Handle<String> sample_subject,
|
| bool is_one_byte);
|
|
|