Author: [EMAIL PROTECTED] Date: Fri Nov 28 03:48:22 2008 New Revision: 866
Modified: branches/bleeding_edge/src/bytecodes-irregexp.h branches/bleeding_edge/src/interpreter-irregexp.cc branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc branches/bleeding_edge/src/regexp-macro-assembler-ia32.h branches/bleeding_edge/src/regexp-macro-assembler-irregexp.cc branches/bleeding_edge/src/regexp-macro-assembler-irregexp.h branches/bleeding_edge/src/regexp-macro-assembler.h Log: Add an operation that checks whether we are at the start of the string. Review URL: http://codereview.chromium.org/10998 Modified: branches/bleeding_edge/src/bytecodes-irregexp.h ============================================================================== --- branches/bleeding_edge/src/bytecodes-irregexp.h (original) +++ branches/bleeding_edge/src/bytecodes-irregexp.h Fri Nov 28 03:48:22 2008 @@ -64,7 +64,8 @@ V(LOOKUP_MAP8, 29, 99) /* l_map8 start16 byte_map addr32* */ \ V(LOOKUP_HI_MAP8, 30, 99) /* l_himap8 start8 byte_map_addr32 addr32* */ \ V(CHECK_REGISTER_LT, 31, 8) /* check_reg_lt register_index value16 addr32 */ \ -V(CHECK_REGISTER_GE, 32, 8) /* check_reg_ge register_index value16 addr32 */ +V(CHECK_REGISTER_GE, 32, 8) /* check_reg_ge register_index value16 addr32 */ \ +V(CHECK_NOT_AT_START, 33, 5) /* check_not_at_start addr32 */ #define DECLARE_BYTECODES(name, code, length) \ static const int BC_##name = code; Modified: branches/bleeding_edge/src/interpreter-irregexp.cc ============================================================================== --- branches/bleeding_edge/src/interpreter-irregexp.cc (original) +++ branches/bleeding_edge/src/interpreter-irregexp.cc Fri Nov 28 03:48:22 2008 @@ -365,6 +365,13 @@ } break; } + BYTECODE(CHECK_NOT_AT_START) + if (current == 0) { + pc += BC_CHECK_NOT_AT_START_LENGTH; + } else { + pc = code_base + Load32(pc + 1); + } + break; default: UNREACHABLE(); break; Modified: branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc ============================================================================== --- branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc (original) +++ branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc Fri Nov 28 03:48:22 2008 @@ -162,6 +162,11 @@ } +void RegExpMacroAssemblerIA32::CheckNotAtStart(Label* on_not_at_start) { + UNIMPLEMENTED(); +} + + void RegExpMacroAssemblerIA32::CheckCharacterLT(uc16 limit, Label* on_less) { __ cmp(edx, limit); BranchOrBacktrack(less, on_less); Modified: branches/bleeding_edge/src/regexp-macro-assembler-ia32.h ============================================================================== --- branches/bleeding_edge/src/regexp-macro-assembler-ia32.h (original) +++ branches/bleeding_edge/src/regexp-macro-assembler-ia32.h Fri Nov 28 03:48:22 2008 @@ -49,6 +49,7 @@ int cp_offset, Label* on_failure); virtual void CheckCurrentPosition(int register_index, Label* on_equal); + virtual void CheckNotAtStart(Label* on_not_at_start); virtual void CheckNotBackReference(int start_reg, Label* on_no_match); virtual void CheckNotBackReferenceIgnoreCase(int start_reg, Label* on_no_match); Modified: branches/bleeding_edge/src/regexp-macro-assembler-irregexp.cc ============================================================================== --- branches/bleeding_edge/src/regexp-macro-assembler-irregexp.cc (original) +++ branches/bleeding_edge/src/regexp-macro-assembler-irregexp.cc Fri Nov 28 03:48:22 2008 @@ -226,6 +226,12 @@ } +void RegExpMacroAssemblerIrregexp::CheckNotAtStart(Label* on_not_at_start) { + Emit(BC_CHECK_NOT_AT_START); + EmitOrLink(on_not_at_start); +} + + void RegExpMacroAssemblerIrregexp::CheckNotCharacter(uc16 c, Label* on_not_equal) { Emit(BC_CHECK_NOT_CHAR); Modified: branches/bleeding_edge/src/regexp-macro-assembler-irregexp.h ============================================================================== --- branches/bleeding_edge/src/regexp-macro-assembler-irregexp.h (original) +++ branches/bleeding_edge/src/regexp-macro-assembler-irregexp.h Fri Nov 28 03:48:22 2008 @@ -70,6 +70,7 @@ virtual void CheckCharacterLT(uc16 limit, Label* on_less); virtual void CheckCharacterGT(uc16 limit, Label* on_greater); virtual void CheckCharacter(uc16 c, Label* on_equal); + virtual void CheckNotAtStart(Label* on_not_at_start); virtual void CheckNotCharacter(uc16 c, Label* on_not_equal); virtual void CheckNotCharacterAfterOr(uc16 c, uc16 mask, Label* on_not_equal); virtual void CheckNotCharacterAfterMinusOr(uc16 c, Modified: branches/bleeding_edge/src/regexp-macro-assembler.h ============================================================================== --- branches/bleeding_edge/src/regexp-macro-assembler.h (original) +++ branches/bleeding_edge/src/regexp-macro-assembler.h Fri Nov 28 03:48:22 2008 @@ -75,6 +75,7 @@ virtual void CheckCurrentPosition( int register_index, Label* on_equal) = 0; + virtual void CheckNotAtStart(Label* on_not_at_start) = 0; virtual void CheckNotBackReference(int start_reg, Label* on_no_match) = 0; virtual void CheckNotBackReferenceIgnoreCase(int start_reg, Label* on_no_match) = 0; --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list v8-dev@googlegroups.com http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---