diff options
Diffstat (limited to 'deps/v8/src/regexp/regexp-macro-assembler.h')
-rw-r--r-- | deps/v8/src/regexp/regexp-macro-assembler.h | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/deps/v8/src/regexp/regexp-macro-assembler.h b/deps/v8/src/regexp/regexp-macro-assembler.h index 20599334cd..6f79a16540 100644 --- a/deps/v8/src/regexp/regexp-macro-assembler.h +++ b/deps/v8/src/regexp/regexp-macro-assembler.h @@ -11,6 +11,13 @@ namespace v8 { namespace internal { +static const uc32 kLeadSurrogateStart = 0xd800; +static const uc32 kLeadSurrogateEnd = 0xdbff; +static const uc32 kTrailSurrogateStart = 0xdc00; +static const uc32 kTrailSurrogateEnd = 0xdfff; +static const uc32 kNonBmpStart = 0x10000; +static const uc32 kNonBmpEnd = 0x10ffff; + struct DisjunctDecisionRow { RegExpCharacterClass cc; Label* on_match; @@ -76,7 +83,7 @@ class RegExpMacroAssembler { virtual void CheckNotBackReference(int start_reg, bool read_backward, Label* on_no_match) = 0; virtual void CheckNotBackReferenceIgnoreCase(int start_reg, - bool read_backward, + bool read_backward, bool unicode, Label* on_no_match) = 0; // Check the current character for a match with a literal character. If we // fail to match then goto the on_failure label. End of input always @@ -146,25 +153,40 @@ class RegExpMacroAssembler { virtual void ClearRegisters(int reg_from, int reg_to) = 0; virtual void WriteStackPointerToRegister(int reg) = 0; + // Compares two-byte strings case insensitively. + // Called from generated RegExp code. + static int CaseInsensitiveCompareUC16(Address byte_offset1, + Address byte_offset2, + size_t byte_length, Isolate* isolate); + + // Check that we are not in the middle of a surrogate pair. + void CheckNotInSurrogatePair(int cp_offset, Label* on_failure); + // Controls the generation of large inlined constants in the code. void set_slow_safe(bool ssc) { slow_safe_compiler_ = ssc; } bool slow_safe() { return slow_safe_compiler_; } - enum GlobalMode { NOT_GLOBAL, GLOBAL, GLOBAL_NO_ZERO_LENGTH_CHECK }; + enum GlobalMode { + NOT_GLOBAL, + GLOBAL_NO_ZERO_LENGTH_CHECK, + GLOBAL, + GLOBAL_UNICODE + }; // Set whether the regular expression has the global flag. Exiting due to // a failure in a global regexp may still mean success overall. inline void set_global_mode(GlobalMode mode) { global_mode_ = mode; } inline bool global() { return global_mode_ != NOT_GLOBAL; } inline bool global_with_zero_length_check() { - return global_mode_ == GLOBAL; + return global_mode_ == GLOBAL || global_mode_ == GLOBAL_UNICODE; } + inline bool global_unicode() { return global_mode_ == GLOBAL_UNICODE; } Isolate* isolate() const { return isolate_; } Zone* zone() const { return zone_; } private: bool slow_safe_compiler_; - bool global_mode_; + GlobalMode global_mode_; Isolate* isolate_; Zone* zone_; }; @@ -199,13 +221,6 @@ class NativeRegExpMacroAssembler: public RegExpMacroAssembler { int previous_index, Isolate* isolate); - // Compares two-byte strings case insensitively. - // Called from generated RegExp code. - static int CaseInsensitiveCompareUC16(Address byte_offset1, - Address byte_offset2, - size_t byte_length, - Isolate* isolate); - // Called from RegExp if the backtrack stack limit is hit. // Tries to expand the stack. Returns the new stack-pointer if // successful, and updates the stack_top address, or returns 0 if unable |