Add an operation that checks whether we are at the start of the string.
authorerik.corry@gmail.com <erik.corry@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 28 Nov 2008 11:48:22 +0000 (11:48 +0000)
committererik.corry@gmail.com <erik.corry@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 28 Nov 2008 11:48:22 +0000 (11:48 +0000)
Review URL: http://codereview.chromium.org/10998

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@866 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/bytecodes-irregexp.h
src/interpreter-irregexp.cc
src/regexp-macro-assembler-ia32.cc
src/regexp-macro-assembler-ia32.h
src/regexp-macro-assembler-irregexp.cc
src/regexp-macro-assembler-irregexp.h
src/regexp-macro-assembler.h

index 1f3c742..33a2f24 100644 (file)
@@ -64,7 +64,8 @@ V(LOOKUP_MAP2,       28, 99) /* l_map2 start16 half_nibble_map_addr32*      */ \
 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;
index 0acbfeb..d5d1a89 100644 (file)
@@ -365,6 +365,13 @@ static bool RawMatch(const byte* code_base,
         }
         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;
index 0f39275..cc0a500 100644 (file)
@@ -162,6 +162,11 @@ void RegExpMacroAssemblerIA32::CheckCharacterGT(uc16 limit, Label* on_greater) {
 }
 
 
+void RegExpMacroAssemblerIA32::CheckNotAtStart(Label* on_not_at_start) {
+  UNIMPLEMENTED();
+}
+
+
 void RegExpMacroAssemblerIA32::CheckCharacterLT(uc16 limit, Label* on_less) {
   __ cmp(edx, limit);
   BranchOrBacktrack(less, on_less);
index 4e317ec..de653d5 100644 (file)
@@ -49,6 +49,7 @@ class RegExpMacroAssemblerIA32: public RegExpMacroAssembler {
                                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);
index 91923ca..b821788 100644 (file)
@@ -226,6 +226,12 @@ void RegExpMacroAssemblerIrregexp::CheckCharacter(uc16 c, Label* on_equal) {
 }
 
 
+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);
index 8b572a9..77d18e1 100644 (file)
@@ -70,6 +70,7 @@ class RegExpMacroAssemblerIrregexp: public RegExpMacroAssembler {
   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,
index a0c4b20..8cbd274 100644 (file)
@@ -75,6 +75,7 @@ class RegExpMacroAssembler {
   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;