Author: [EMAIL PROTECTED]
Date: Fri Nov  7 00:23:13 2008
New Revision: 707

Modified:
    branches/experimental/regexp2000/src/assembler-re2k.cc
    branches/experimental/regexp2000/src/assembler-re2k.h
    branches/experimental/regexp2000/src/bytecodes-re2k.h
    branches/experimental/regexp2000/src/interpreter-re2k.cc
    branches/experimental/regexp2000/src/interpreter-re2k.h
    branches/experimental/regexp2000/src/regexp-codegen.h
    branches/experimental/regexp2000/test/cctest/test-regexp.cc

Log:
Fix lint issues.
Add some new bytecodes that we wil be needing (no tests yet).
Review URL: http://codereview.chromium.org/9457

Modified: branches/experimental/regexp2000/src/assembler-re2k.cc
==============================================================================
--- branches/experimental/regexp2000/src/assembler-re2k.cc      (original)
+++ branches/experimental/regexp2000/src/assembler-re2k.cc      Fri Nov  7  
00:23:13 2008
@@ -64,17 +64,17 @@
  }


-void Re2kAssembler::PushCapture(int index) {
+void Re2kAssembler::PushRegister(int index) {
    ASSERT(index >= 0);
-  Emit(BC_PUSH_CAPTURE);
+  Emit(BC_PUSH_REGISTER);
    Emit(index);
  }


-void Re2kAssembler::SetCapture(int index, int cp_offset) {
+void Re2kAssembler::SetRegister(int index, int cp_offset) {
    ASSERT(cp_offset >= 0);
    ASSERT(index >= 0);
-  Emit(BC_SET_CAPTURE);
+  Emit(BC_SET_REGISTER);
    Emit(index);
    Emit32(cp_offset);
  }
@@ -90,8 +90,8 @@
  }


-void Re2kAssembler::PopCapture(int index) {
-  Emit(BC_POP_CAPTURE);
+void Re2kAssembler::PopRegister(int index) {
+  Emit(BC_POP_REGISTER);
    Emit(index);
  }

@@ -174,7 +174,9 @@
  }


-void Re2kAssembler::CheckBackref(int capture_index, Label* on_mismatch,  
int cp_offset) {
+void Re2kAssembler::CheckBackref(int capture_index,
+                                 Label* on_mismatch,
+                                 int cp_offset) {
    Emit(BC_CHECK_BACKREF);
    Emit32(cp_offset);
    Emit(capture_index);
@@ -182,11 +184,66 @@
  }


-void Re2kAssembler::CheckNotBackref(int capture_index, Label* on_match,  
int cp_offset) {
+void Re2kAssembler::CheckNotBackref(int capture_index,
+                                    Label* on_match,
+                                    int cp_offset) {
    Emit(BC_CHECK_NOT_BACKREF);
    Emit32(cp_offset);
    Emit(capture_index);
    EmitOrLink(on_match);
+}
+
+
+void Re2kAssembler::CheckRegister(int byte_code,
+                                  int reg_index,
+                                  uint16_t vs,
+                                  Label* on_true) {
+  Emit(byte_code);
+  Emit(reg_index);
+  Emit16(vs);
+  EmitOrLink(on_true);
+}
+
+
+void Re2kAssembler::CheckRegisterEq(int reg_index,
+                                    uint16_t vs,
+                                    Label* on_equal) {
+  CheckRegister(BC_CHECK_REGISTER_EQ, reg_index, vs, on_equal);
+}
+
+
+void Re2kAssembler::CheckRegisterLe(int reg_index,
+                                    uint16_t vs,
+                                    Label* on_less_than_equal) {
+  CheckRegister(BC_CHECK_REGISTER_LE, reg_index, vs, on_less_than_equal);
+}
+
+
+void Re2kAssembler::CheckRegisterLt(int reg_index,
+                                    uint16_t vs,
+                                    Label* on_less_than) {
+  CheckRegister(BC_CHECK_REGISTER_LT, reg_index, vs, on_less_than);
+}
+
+
+void Re2kAssembler::CheckRegisterGe(int reg_index,
+                                    uint16_t vs,
+                                    Label* on_greater_than_equal) {
+  CheckRegister(BC_CHECK_REGISTER_GE, reg_index, vs,  
on_greater_than_equal);
+}
+
+
+void Re2kAssembler::CheckRegisterGt(int reg_index,
+                                    uint16_t vs,
+                                    Label* on_greater_than) {
+  CheckRegister(BC_CHECK_REGISTER_GT, reg_index, vs, on_greater_than);
+}
+
+
+void Re2kAssembler::CheckRegisterNe(int reg_index,
+                                    uint16_t vs,
+                                    Label* on_not_equal) {
+  CheckRegister(BC_CHECK_REGISTER_NE, reg_index, vs, on_not_equal);
  }



Modified: branches/experimental/regexp2000/src/assembler-re2k.h
==============================================================================
--- branches/experimental/regexp2000/src/assembler-re2k.h       (original)
+++ branches/experimental/regexp2000/src/assembler-re2k.h       Fri Nov  7  
00:23:13 2008
@@ -23,7 +23,7 @@
    // for code generation and assumes its size to be buffer_size. If the  
buffer
    // is too small, a fatal error occurs. No deallocation of the buffer is  
done
    // upon destruction of the assembler.
-  Re2kAssembler(Vector<byte>);
+  explicit Re2kAssembler(Vector<byte>);
    ~Re2kAssembler();

    // CP = current position in source.
@@ -32,12 +32,12 @@
    // Stack.
    void PushCurrentPosition(int cp_offset = 0);
    void PushBacktrack(Label* l);
-  void PushCapture(int index);
-  void SetCapture(int index, int cp_offset = 0);
+  void PushRegister(int index);
+  void SetRegister(int index, int cp_offset = 0);

    void PopCurrentPosition();
    void PopBacktrack();
-  void PopCapture(int index);
+  void PopRegister(int index);

    void Fail();
    void FailIfWithin(int distance_from_end);
@@ -68,10 +68,20 @@

    // Checks current position (plus optional offset) for a match against a
    // previous capture.  Advances current position by the length of the  
capture
-  // iff it matches.
+  // iff it matches.  The capture is stored in a given register and the
+  // the register after.
    void CheckBackref(int capture_index, Label* on_mismatch, int cp_offset =  
0);
    void CheckNotBackref(int capture_index, Label* on_match, int cp_offset =  
0);

+  // Checks a register for equal, less than or equal, less than, greater  
than
+  // or equal, greater than, not equal.
+  void CheckRegisterEq(int reg_index, uint16_t vs, Label* on_equal);
+  void CheckRegisterLe(int reg_index, uint16_t vs, Label* on_less_equal);
+  void CheckRegisterLt(int reg_index, uint16_t vs, Label* on_less_than);
+  void CheckRegisterGe(int reg_index, uint16_t vs, Label*  
on_greater_equal);
+  void CheckRegisterGt(int reg_index, uint16_t vs, Label* on_greater_than);
+  void CheckRegisterNe(int reg_index, uint16_t vs, Label* on_not_equal);
+
    // Code and bitmap emission.
    inline void Emit32(uint32_t x);
    inline void Emit16(uint32_t x);
@@ -87,6 +97,10 @@
    // The buffer into which code and relocation info are generated.
    Vector<byte> buffer_;

+  inline void CheckRegister(int byte_code,
+                            int reg_index,
+                            uint16_t vs,
+                            Label* on_true);
    // Code generation.
    int pc_;  // The program counter; moves forward.


Modified: branches/experimental/regexp2000/src/bytecodes-re2k.h
==============================================================================
--- branches/experimental/regexp2000/src/bytecodes-re2k.h       (original)
+++ branches/experimental/regexp2000/src/bytecodes-re2k.h       Fri Nov  7  
00:23:13 2008
@@ -32,35 +32,39 @@
  namespace v8 { namespace internal {

  #define BYTECODE_ITERATOR(V)    \
-V(BREAK,                   0, 1) /* break  
offset32                          */ \
-V(PUSH_CP,                 1, 5) /* push_cp  
offset32                        */ \
-V(PUSH_BT,                 2, 5) /* push_bt  
address32                       */ \
-V(PUSH_CAPTURE,            3, 2) /* push_capture  
capture_index              */ \
-V(SET_CAPTURE,             4, 6) /* set_capture capture_index  
offset32      */ \
-V(POP_CP,                  5, 1) /*  
pop_cp                                  */ \
-V(POP_BT,                  6, 1) /*  
pop_bt                                  */ \
-V(POP_CAPTURE,             7, 2) /* pop_capture  
capture_index               */ \
-V(FAIL,                    8, 1) /*  
fail                                    */ \
-V(FAIL_IF_WITHIN,          9, 5) /* fail  
distance32                         */ \
-V(SUCCEED,                10, 1) /*  
succeed                                 */ \
-V(ADVANCE_CP,             11, 5) /* advance_cp  
offset32                     */ \
-V(GOTO,                   12, 5) /* goto  
address32                          */ \
-V(LOAD_CURRENT_CHAR,      13, 5) /* load  
offset32                           */ \
-V(CHECK_CHAR,             14, 7) /* check_char uc16  
address32               */ \
-V(CHECK_NOT_CHAR,         15, 7) /* check_not_char uc16  
address32           */ \
-V(CHECK_RANGE,            16, 9) /* check_range uc16 uc16  
address32         */ \
-V(CHECK_NOT_RANGE,        17, 9) /* check_not_range uc16 uc16  
address32     */ \
-V(CHECK_BACKREF,          18, 9) /* check_backref offset32 capture_idx  
ad...*/ \
-V(CHECK_NOT_BACKREF,      19, 9) /* check_not_backref offset32  
capture_id...*/ \
-V(CHECK_BITMAP,           20,13) /* check_bitmap uc16 uc16  
addr32           */ \
-V(CHECK_NOT_BITMAP,       21,13) /* check_not_bitmap uc16 uc16  
addr32       */
+V(BREAK,              0, 1) /*  
break                                        */ \
+V(PUSH_CP,            1, 5) /* push_cp  
offset32                             */ \
+V(PUSH_BT,            2, 5) /* push_bt  
addr32                               */ \
+V(PUSH_REGISTER,      3, 2) /* push_register  
register_index                 */ \
+V(SET_REGISTER,       4, 6) /* set_register register_index  
offset32         */ \
+V(POP_CP,             5, 1) /*  
pop_cp                                       */ \
+V(POP_BT,             6, 1) /*  
pop_bt                                       */ \
+V(POP_REGISTER,       7, 2) /* pop_register  
register_index                  */ \
+V(FAIL,               8, 1) /*  
fail                                         */ \
+V(FAIL_IF_WITHIN,     9, 5) /* fail  
distance32                              */ \
+V(SUCCEED,           10, 1) /*  
succeed                                      */ \
+V(ADVANCE_CP,        11, 5) /* advance_cp  
offset32                          */ \
+V(GOTO,              12, 5) /* goto  
addr32                                  */ \
+V(LOAD_CURRENT_CHAR, 13, 5) /* load  
offset32                                */ \
+V(CHECK_CHAR,        14, 7) /* check_char uc16  
addr32                       */ \
+V(CHECK_NOT_CHAR,    15, 7) /* check_not_char uc16  
addr32                   */ \
+V(CHECK_RANGE,       16, 9) /* check_range uc16 uc16  
addr32                 */ \
+V(CHECK_NOT_RANGE,   17, 9) /* check_not_range uc16 uc16  
addr32             */ \
+V(CHECK_BACKREF,     18, 9) /* check_backref offset32 capture_idx  
addr32    */ \
+V(CHECK_NOT_BACKREF, 19, 9) /* check_not_backref offset32 capture_idx  
addr32*/ \
+V(CHECK_BITMAP,      20, 13) /* check_bitmap uc16 uc16  
addr32               */ \
+V(CHECK_NOT_BITMAP,  21, 13) /* check_not_bitmap uc16 uc16  
addr32           */ \
+V(CHECK_REGISTER_EQ, 22, 8) /* check_reg_eq register_index value16  
addr32   */ \
+V(CHECK_REGISTER_LE, 23, 8) /* check_reg_le register_index value16  
addr32   */ \
+V(CHECK_REGISTER_LT, 24, 8) /* check_reg_lt register_index value16  
addr32   */ \
+V(CHECK_REGISTER_GE, 25, 8) /* check_reg_ge register_index value16  
addr32   */ \
+V(CHECK_REGISTER_GT, 26, 8) /* check_reg_gt register_index value16  
addr32   */ \
+V(CHECK_REGISTER_NE, 27, 8) /* check_reg_ne register_index value16  
addr32   */

  #define DECLARE_BYTECODES(name, code, length) \
    static const int BC_##name = code;
  BYTECODE_ITERATOR(DECLARE_BYTECODES)
  #undef DECLARE_BYTECODES
-
-
  } }

  #endif  // V8_BYTECODES_IA32_H_

Modified: branches/experimental/regexp2000/src/interpreter-re2k.cc
==============================================================================
--- branches/experimental/regexp2000/src/interpreter-re2k.cc    (original)
+++ branches/experimental/regexp2000/src/interpreter-re2k.cc    Fri Nov  7  
00:23:13 2008
@@ -39,7 +39,10 @@


  template <typename Char>
-static bool RawMatch(const byte* code_base, Vector<const Char> subject,  
int* captures, int current) {
+static bool RawMatch(const byte* code_base,
+                     Vector<const Char> subject,
+                     int* registers,
+                     int current) {
    const byte* pc = code_base;
    int backtrack_stack[1000];
    int backtrack_stack_space = 1000;
@@ -64,15 +67,15 @@
          *backtrack_sp++ = Load32(pc + 1);
          pc += 5;
          break;
-      case BC_PUSH_CAPTURE:
+      case BC_PUSH_REGISTER:
          if (--backtrack_stack_space < 0) {
            return false;  // No match on backtrack stack overflow.
          }
-        *backtrack_sp++ = captures[pc[1]];
+        *backtrack_sp++ = registers[pc[1]];
          pc += 2;
          break;
-      case BC_SET_CAPTURE:
-        captures[pc[1]] = current + Load32(pc + 2);
+      case BC_SET_REGISTER:
+        registers[pc[1]] = current + Load32(pc + 2);
          pc += 6;
          break;
        case BC_POP_CP:
@@ -86,10 +89,10 @@
          --backtrack_sp;
          pc = code_base + *backtrack_sp;
          break;
-      case BC_POP_CAPTURE:
+      case BC_POP_REGISTER:
          backtrack_stack_space++;
          --backtrack_sp;
-        captures[pc[1]] = *backtrack_sp;
+        registers[pc[1]] = *backtrack_sp;
          pc += 2;
          break;
        case BC_FAIL:
@@ -157,6 +160,48 @@
          }
          break;
        }
+      case BC_CHECK_REGISTER_EQ:
+        if (registers[pc[1]] == Load16(pc + 2)) {
+          pc = code_base + Load32(pc + 4);
+        } else {
+          pc += 8;
+        }
+        break;
+      case BC_CHECK_REGISTER_LE:
+        if (registers[pc[1]] <= Load16(pc + 2)) {
+          pc = code_base + Load32(pc + 4);
+        } else {
+          pc += 8;
+        }
+        break;
+      case BC_CHECK_REGISTER_LT:
+        if (registers[pc[1]] < Load16(pc + 2)) {
+          pc = code_base + Load32(pc + 4);
+        } else {
+          pc += 8;
+        }
+        break;
+      case BC_CHECK_REGISTER_GE:
+        if (registers[pc[1]] >= Load16(pc + 2)) {
+          pc = code_base + Load32(pc + 4);
+        } else {
+          pc += 8;
+        }
+        break;
+      case BC_CHECK_REGISTER_GT:
+        if (registers[pc[1]] > Load16(pc + 2)) {
+          pc = code_base + Load32(pc + 4);
+        } else {
+          pc += 8;
+        }
+        break;
+      case BC_CHECK_REGISTER_NE:
+        if (registers[pc[1]] != Load16(pc + 2)) {
+          pc = code_base + Load32(pc + 4);
+        } else {
+          pc += 8;
+        }
+        break;
        case BC_CHECK_BACKREF:
        case BC_CHECK_NOT_BACKREF:
        case BC_CHECK_BITMAP:
@@ -169,14 +214,23 @@
  }


-bool Re2kInterpreter::Match(ByteArray* code_array, String* subject, int*  
captures, int start_position) {
+bool Re2kInterpreter::Match(ByteArray* code_array,
+                            String* subject,
+                            int* registers,
+                            int start_position) {
    const byte* code_base = code_array->GetDataStartAddress();
    StringShape shape(subject);
    ASSERT(subject->IsFlat(shape));
    if (shape.IsAsciiRepresentation()) {
-    return RawMatch(code_base, subject->ToAsciiVector(), captures,  
start_position);
+    return RawMatch(code_base,
+                    subject->ToAsciiVector(),
+                    registers,
+                    start_position);
    } else {
-    return RawMatch(code_base, subject->ToUC16Vector(), captures,  
start_position);
+    return RawMatch(code_base,
+                    subject->ToUC16Vector(),
+                    registers,
+                    start_position);
    }
  }


Modified: branches/experimental/regexp2000/src/interpreter-re2k.h
==============================================================================
--- branches/experimental/regexp2000/src/interpreter-re2k.h     (original)
+++ branches/experimental/regexp2000/src/interpreter-re2k.h     Fri Nov  7  
00:23:13 2008
@@ -35,7 +35,10 @@

  class Re2kInterpreter {
   public:
-  static bool Match(ByteArray* code, String* subject, int* captures, int  
start_position);
+  static bool Match(ByteArray* code,
+                    String* subject,
+                    int* captures,
+                    int start_position);
  };



Modified: branches/experimental/regexp2000/src/regexp-codegen.h
==============================================================================
--- branches/experimental/regexp2000/src/regexp-codegen.h       (original)
+++ branches/experimental/regexp2000/src/regexp-codegen.h       Fri Nov  7  
00:23:13 2008
@@ -93,7 +93,7 @@
    // Check the current character for a match with a character class.  Take
    // one of the actions depending on whether there is a match.
    virtual void CheckCharacters(
-      Vector<uc16> string,
+      Vector<uc16> str,
        int fail_action,
        int offset,
        Label* state = NULL) = 0;        // Used by kGotoLabel on failure.

Modified: branches/experimental/regexp2000/test/cctest/test-regexp.cc
==============================================================================
--- branches/experimental/regexp2000/test/cctest/test-regexp.cc (original)
+++ branches/experimental/regexp2000/test/cctest/test-regexp.cc Fri Nov  7  
00:23:13 2008
@@ -495,8 +495,8 @@
    __ CheckChar('o', &advance);
    __ LoadCurrentChar(2);
    __ CheckChar('o', &advance);
-  __ SetCapture(0);
-  __ SetCapture(1, 2);
+  __ SetRegister(0);
+  __ SetRegister(1, 2);
    __ Succeed();

    v8::HandleScope scope;
@@ -504,7 +504,8 @@
    assembler.Copy(array->GetDataStartAddress());
    int captures[2];

-  Handle<String> f1 = Factory::NewStringFromAscii(CStrVector("Now is the  
time"));
+  Handle<String> f1 =
+      Factory::NewStringFromAscii(CStrVector("Now is the time"));
    CHECK(!Re2kInterpreter::Match(*array, *f1, captures, 0));

    Handle<String> f2 = Factory::NewStringFromAscii(CStrVector("foo bar  
baz"));

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to