Author: [EMAIL PROTECTED]
Date: Fri Nov  7 04:00:59 2008
New Revision: 711

Added:
    branches/experimental/regexp2000/src/regexp-macro-assembler-re2k.cc    
(contents, props changed)
       - copied, changed from r706,  
/branches/experimental/regexp2000/src/regexp-codegen-re2k.cc
    branches/experimental/regexp2000/src/regexp-macro-assembler-re2k.h
    branches/experimental/regexp2000/src/regexp-macro-assembler.h    
(contents, props changed)
       - copied, changed from r707,  
/branches/experimental/regexp2000/src/regexp-codegen.h
Removed:
    branches/experimental/regexp2000/src/regexp-codegen-re2k.cc
    branches/experimental/regexp2000/src/regexp-codegen.h
Modified:
    branches/experimental/regexp2000/src/SConscript
    branches/experimental/regexp2000/src/assembler-re2k-inl.h
    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/flag-definitions.h
    branches/experimental/regexp2000/src/interpreter-re2k.cc
    branches/experimental/regexp2000/test/cctest/test-regexp.cc

Log:
Rename codegen to macro-assembler.
Remove unneeded byte codes accidentally not removed after feedback from  
last review
More tests.
New instructions to check for end of input.
Rename captures array to registers array.
Review URL: http://codereview.chromium.org/9690

Modified: branches/experimental/regexp2000/src/SConscript
==============================================================================
--- branches/experimental/regexp2000/src/SConscript     (original)
+++ branches/experimental/regexp2000/src/SConscript     Fri Nov  7 04:00:59 2008
@@ -43,8 +43,8 @@
      'factory.cc', 'flags.cc', 'frames.cc', 'global-handles.cc', 'handles.cc',
      'hashmap.cc', 'heap.cc', 'ic.cc', 'interpreter-re2k.cc', 'jsregexp.cc',
      'log.cc', 'mark-compact.cc', 'messages.cc', 'objects.cc', 'parser.cc',
-    'property.cc', 'regexp-codegen-re2k.cc', 'rewriter.cc', 'runtime.cc',
-    'scanner.cc', 'scopeinfo.cc', 'scopes.cc', 'serialize.cc',
+    'property.cc', 'regexp-macro-assembler-re2k.cc', 'rewriter.cc',
+    'runtime.cc', 'scanner.cc', 'scopeinfo.cc', 'scopes.cc', 'serialize.cc',
      'snapshot-common.cc', 'spaces.cc', 'string-stream.cc', 'stub-cache.cc',
      'token.cc', 'top.cc', 'unicode.cc', 'usage-analyzer.cc', 'utils.cc',
      'v8-counters.cc', 'v8.cc', 'v8threads.cc', 'variables.cc', 'zone.cc'

Modified: branches/experimental/regexp2000/src/assembler-re2k-inl.h
==============================================================================
--- branches/experimental/regexp2000/src/assembler-re2k-inl.h   (original)
+++ branches/experimental/regexp2000/src/assembler-re2k-inl.h   Fri Nov  7  
04:00:59 2008
@@ -31,7 +31,6 @@
  #include "v8.h"
  #include "ast.h"
  #include "bytecodes-re2k.h"
-#include "regexp-codegen.h"
  #include "assembler-re2k.h"


@@ -65,7 +64,6 @@
        }
        l->link_to(pc_);
        Emit32(pos);
-      pc_ += 4;
      }
    }


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  
04:00:59 2008
@@ -31,7 +31,6 @@
  #include "v8.h"
  #include "ast.h"
  #include "bytecodes-re2k.h"
-#include "regexp-codegen.h"
  #include "assembler-re2k.h"

  #include "assembler-re2k-inl.h"
@@ -71,15 +70,23 @@
  }


-void Re2kAssembler::SetRegister(int index, int cp_offset) {
+void Re2kAssembler::SetRegisterToCurrentPosition(int index, int cp_offset)  
{
    ASSERT(cp_offset >= 0);
    ASSERT(index >= 0);
-  Emit(BC_SET_REGISTER);
+  Emit(BC_SET_REGISTER_TO_CP);
    Emit(index);
    Emit32(cp_offset);
  }


+void Re2kAssembler::SetRegister(int index, int value) {
+  ASSERT(index >= 0);
+  Emit(BC_SET_REGISTER);
+  Emit(index);
+  Emit32(value);
+}
+
+
  void Re2kAssembler::PopCurrentPosition() {
    Emit(BC_POP_CP);
  }
@@ -101,6 +108,11 @@
  }


+void Re2kAssembler::Break() {
+  Emit(BC_BREAK);
+}
+
+
  void Re2kAssembler::FailIfWithin(int distance_from_end) {
    Emit(BC_FAIL_IF_WITHIN);
    Emit32(distance_from_end);
@@ -158,6 +170,18 @@
  }


+void Re2kAssembler::CheckEnd(Label* on_not_end) {
+  Emit(BC_CHECK_END);
+  EmitOrLink(on_not_end);
+}
+
+
+void Re2kAssembler::CheckNotEnd(Label* on_end) {
+  Emit(BC_CHECK_NOT_END);
+  EmitOrLink(on_end);
+}
+
+
  void Re2kAssembler::CheckRange(uc16 start, uc16 end, Label* on_mismatch) {
    Emit(BC_CHECK_RANGE);
    Emit16(start);
@@ -205,20 +229,6 @@
  }


-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) {
@@ -230,20 +240,6 @@
                                      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  
04:00:59 2008
@@ -33,7 +33,8 @@
    void PushCurrentPosition(int cp_offset = 0);
    void PushBacktrack(Label* l);
    void PushRegister(int index);
-  void SetRegister(int index, int cp_offset = 0);
+  void SetRegisterToCurrentPosition(int index, int cp_offset = 0);
+  void SetRegister(int index, int value);

    void PopCurrentPosition();
    void PopBacktrack();
@@ -43,6 +44,8 @@
    void FailIfWithin(int distance_from_end);
    void Succeed();

+  void Break();  // This instruction will cause a fatal VM error if hit.
+
    void Bind(Label* l);  // binds an unbound label L to the current code  
position

    void AdvanceCP(int cp_offset = 1);
@@ -56,11 +59,14 @@
    void CheckChar(uc16 c, Label* on_mismatch);
    void CheckNotChar(uc16 c, Label* on_match);

+  // Checks current char register against the magic end-of-input symbol.
+  void CheckEnd(Label* on_not_end);
+  void CheckNotEnd(Label* on_end);
+
    // Checks current char register against a range.
    void CheckRange(uc16 start, uc16 end, Label* on_mismatch);
    void CheckNotRange(uc16 start, uc16 end, Label* on_match);

-
    // Checks that the current char is in the range and that the  
corresponding bit
    // is set in the bitmap.
    void CheckBitmap(uc16 start, uc16 end, const byte* bits, Label*  
on_mismatch);
@@ -75,12 +81,8 @@

    // 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);

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  
04:00:59 2008
@@ -36,30 +36,29 @@
  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   */
+V(SET_REGISTER_TO_CP, 4, 6) /* set_register_to_cp register_index  
offset32   */ \
+V(SET_REGISTER,       5, 6) /* set_register register_index  
value32          */ \
+V(POP_CP,             6, 1) /*  
pop_cp                                       */ \
+V(POP_BT,             7, 1) /*  
pop_bt                                       */ \
+V(POP_REGISTER,       8, 2) /* pop_register  
register_index                  */ \
+V(FAIL,               9, 1) /*  
fail                                         */ \
+V(FAIL_IF_WITHIN,    10, 5) /* fail  
distance32                              */ \
+V(SUCCEED,           11, 1) /*  
succeed                                      */ \
+V(ADVANCE_CP,        12, 5) /* advance_cp  
offset32                          */ \
+V(GOTO,              13, 5) /* goto  
addr32                                  */ \
+V(LOAD_CURRENT_CHAR, 14, 5) /* load  
offset32                                */ \
+V(CHECK_CHAR,        15, 7) /* check_char uc16  
addr32                       */ \
+V(CHECK_NOT_CHAR,    16, 7) /* check_not_char uc16  
addr32                   */ \
+V(CHECK_END,         17, 7) /* check_end  
addr32                             */ \
+V(CHECK_NOT_END,     18, 7) /* check_not_end  
addr32                         */ \
+V(CHECK_RANGE,       19, 9) /* check_range uc16 uc16  
addr32                 */ \
+V(CHECK_NOT_RANGE,   20, 9) /* check_not_range uc16 uc16  
addr32             */ \
+V(CHECK_BACKREF,     21, 9) /* check_backref offset32 capture_idx  
addr32    */ \
+V(CHECK_NOT_BACKREF, 22, 9) /* check_not_backref offset32 capture_idx  
addr32*/ \
+V(CHECK_BITMAP,      23, 13) /* check_bitmap uc16 uc16  
addr32               */ \
+V(CHECK_NOT_BITMAP,  24, 13) /* check_not_bitmap uc16 uc16  
addr32           */ \
+V(CHECK_REGISTER_LT, 25, 8) /* check_reg_lt register_index value16  
addr32   */ \
+V(CHECK_REGISTER_GE, 26, 8) /* check_reg_ge register_index value16  
addr32   */ \

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

Modified: branches/experimental/regexp2000/src/flag-definitions.h
==============================================================================
--- branches/experimental/regexp2000/src/flag-definitions.h     (original)
+++ branches/experimental/regexp2000/src/flag-definitions.h     Fri Nov  7  
04:00:59 2008
@@ -270,6 +270,7 @@
              "(requires heap_stats)")

  DEFINE_bool(trace_regexps, false, "trace regexp execution")
+DEFINE_bool(trace_regexp_bytecodes, false, "trace regexp bytecode  
executon")

  //
  // Logging and profiling only flags

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  
04:00:59 2008
@@ -38,6 +38,20 @@
  namespace v8 { namespace internal {


+#ifdef DEBUG
+# define BYTECODE(name) break;                                            \
+                        case BC_##name:                                   \
+                          if (FLAG_trace_regexp_bytecodes) {              \
+                            PrintF("pc = %d, current = %d, bc = "         \
+                                    #name "\n", pc - code_base, current); \
+                          }
+#else
+# define BYTECODE(name) break;                                            \
+                        case BC_##name:
+#endif
+
+
+
  template <typename Char>
  static bool RawMatch(const byte* code_base,
                       Vector<const Char> subject,
@@ -48,71 +62,69 @@
    int backtrack_stack_space = 1000;
    int* backtrack_sp = backtrack_stack;
    int current_char = -1;
+#ifdef DEBUG
+  if (FLAG_trace_regexp_bytecodes) {
+    PrintF("\n\nStart bytecode interpreter\n\n");
+  }
+#endif
    while (true) {
      switch (*pc) {
-      case BC_BREAK:
+      BYTECODE(BREAK)
          UNREACHABLE();
          return false;
-      case BC_PUSH_CP:
+      BYTECODE(PUSH_CP)
          if (--backtrack_stack_space < 0) {
            return false;  // No match on backtrack stack overflow.
          }
          *backtrack_sp++ = current + Load32(pc + 1);
          pc += 5;
-        break;
-      case BC_PUSH_BT:
+      BYTECODE(PUSH_BT)
          if (--backtrack_stack_space < 0) {
            return false;  // No match on backtrack stack overflow.
          }
          *backtrack_sp++ = Load32(pc + 1);
          pc += 5;
-        break;
-      case BC_PUSH_REGISTER:
+      BYTECODE(PUSH_REGISTER)
          if (--backtrack_stack_space < 0) {
            return false;  // No match on backtrack stack overflow.
          }
          *backtrack_sp++ = registers[pc[1]];
          pc += 2;
-        break;
-      case BC_SET_REGISTER:
+      BYTECODE(SET_REGISTER)
+        registers[pc[1]] = Load32(pc + 2);
+        pc += 6;
+      BYTECODE(SET_REGISTER_TO_CP)
          registers[pc[1]] = current + Load32(pc + 2);
          pc += 6;
-        break;
-      case BC_POP_CP:
+      BYTECODE(POP_CP)
          backtrack_stack_space++;
          --backtrack_sp;
          current = *backtrack_sp;
          pc += 1;
-        break;
-      case BC_POP_BT:
+      BYTECODE(POP_BT)
          backtrack_stack_space++;
          --backtrack_sp;
          pc = code_base + *backtrack_sp;
-        break;
-      case BC_POP_REGISTER:
+      BYTECODE(POP_REGISTER)
          backtrack_stack_space++;
          --backtrack_sp;
          registers[pc[1]] = *backtrack_sp;
          pc += 2;
-        break;
-      case BC_FAIL:
+      BYTECODE(FAIL)
          return false;
-      case BC_FAIL_IF_WITHIN:
+      BYTECODE(FAIL_IF_WITHIN)
          if (current + Load32(pc + 1) >= subject.length()) {
            return false;
          }
          pc += 5;
-        break;
-      case BC_SUCCEED:
+      BYTECODE(SUCCEED)
          return true;
-      case BC_ADVANCE_CP:
+      BYTECODE(ADVANCE_CP)
          current += Load32(pc + 1);
          pc += 5;
-        break;
-      case BC_GOTO:
+      BYTECODE(GOTO)
          pc = code_base + Load32(pc + 1);
-        break;
-      case BC_LOAD_CURRENT_CHAR: {
+      BYTECODE(LOAD_CURRENT_CHAR) {
          int pos = current + Load32(pc + 1);
          if (pos >= subject.length()) {
            current_char = -1;
@@ -120,27 +132,38 @@
            current_char = subject[pos];
          }
          pc += 5;
-        break;
        }
-      case BC_CHECK_CHAR: {
+      BYTECODE(CHECK_CHAR) {
          int c = Load16(pc + 1);
          if (c != current_char) {
            pc = code_base + Load32(pc + 3);
          } else {
            pc += 7;
          }
-        break;
        }
-      case BC_CHECK_NOT_CHAR: {
+      BYTECODE(CHECK_NOT_CHAR) {
          int c = Load16(pc + 1);
-        if (c == current_char || current_char == -1) {
+        if (c == current_char) {
            pc = code_base + Load32(pc + 3);
          } else {
            pc += 7;
          }
-        break;
        }
-      case BC_CHECK_RANGE: {
+      BYTECODE(CHECK_END) {
+        if (current_char != -1) {
+          pc = code_base + Load32(pc + 1);
+        } else {
+          pc += 5;
+        }
+      }
+      BYTECODE(CHECK_NOT_END) {
+        if (current_char == -1) {
+          pc = code_base + Load32(pc + 1);
+        } else {
+          pc += 5;
+        }
+      }
+      BYTECODE(CHECK_RANGE) {
          int start = Load16(pc + 1);
          int end = Load16(pc + 3);
          if (current_char >= start && current_char <= end) {
@@ -148,9 +171,8 @@
          } else {
            pc += 9;
          }
-        break;
        }
-      case BC_CHECK_NOT_RANGE: {
+      BYTECODE(CHECK_NOT_RANGE) {
          int start = Load16(pc + 1);
          int end = Load16(pc + 3);
          if (current_char < start || current_char > end || current_char ==  
-1) {
@@ -158,54 +180,28 @@
          } else {
            pc += 9;
          }
-        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:
+      BYTECODE(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:
+      BYTECODE(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:
-      case BC_CHECK_NOT_BITMAP:
+      BYTECODE(CHECK_BACKREF)
+        UNREACHABLE();
+      BYTECODE(CHECK_NOT_BACKREF)
+        UNREACHABLE();
+      BYTECODE(CHECK_BITMAP)
+        UNREACHABLE();
+      BYTECODE(CHECK_NOT_BITMAP)
+        UNREACHABLE();
+        break;  // Last one doesn't have break in macro.
        default:
          UNREACHABLE();
          break;

Copied: branches/experimental/regexp2000/src/regexp-macro-assembler-re2k.cc  
(from r706, /branches/experimental/regexp2000/src/regexp-codegen-re2k.cc)
==============================================================================
--- /branches/experimental/regexp2000/src/regexp-codegen-re2k.cc        
(original)
+++ branches/experimental/regexp2000/src/regexp-macro-assembler-re2k.cc Fri  
Nov  7 04:00:59 2008
@@ -28,6 +28,7 @@
  #include "v8.h"
  #include "ast.h"
  #include "bytecodes-re2k.h"
-#include "regexp-codegen.h"
+#include "regexp-macro-assembler.h"
+#include "regexp-macro-assembler-re2k.h"



Added: branches/experimental/regexp2000/src/regexp-macro-assembler-re2k.h
==============================================================================
--- (empty file)
+++ branches/experimental/regexp2000/src/regexp-macro-assembler-re2k.h  Fri  
Nov  7 04:00:59 2008
@@ -0,0 +1,35 @@
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef V8_REGEXP_MACRO_ASSEMBLER_RE2K_H_
+#define V8_REGEXP_MACRO_ASSEMBLER_RE2K_H_
+
+namespace v8 { namespace internal {
+
+} }  // namespace v8::internal
+
+#endif  // V8_REGEXP_MACRO_ASSEMBLER_RE2K_H_

Copied: branches/experimental/regexp2000/src/regexp-macro-assembler.h (from  
r707, /branches/experimental/regexp2000/src/regexp-codegen.h)
==============================================================================
--- /branches/experimental/regexp2000/src/regexp-codegen.h      (original)
+++ branches/experimental/regexp2000/src/regexp-macro-assembler.h       Fri Nov 
  
7 04:00:59 2008
@@ -25,8 +25,8 @@
  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-#ifndef V8_REGEXP_CODEGEN_H_
-#define V8_REGEXP_CODEGEN_H_
+#ifndef V8_REGEXP_MACRO_ASSEMBLER_H_
+#define V8_REGEXP_MACRO_ASSEMBLER_H_

  namespace v8 { namespace internal {

@@ -63,16 +63,16 @@


  template <typename SubjectChar>
-class RegexpCodeGenerator {
+class RegexpMacroAssembler {
   public:
-  RegexpCodeGenerator() { }
-  virtual ~RegexpCodeGenerator() { }
+  RegexpMacroAssembler() { }
+  virtual ~RegexpMacroAssembler() { }
    virtual void Bind(Label* label) = 0;
    // Writes the current position in the subject string into the given  
index of
    // the captures array.  The old value is pushed to the stack.
-  virtual void WriteCaptureInfo(int index) = 0;
+  virtual void WriteCurrentPositionToRegister(int index) = 0;
    // Pops the the given index of the capture array from the stack.
-  virtual void PopCaptureInfo(int index) = 0;
+  virtual void PopRegister(int index) = 0;
    // Pushes the current position in the subject string onto the stack for  
later
    // retrieval.
    virtual void PushCurrentPosition() = 0;
@@ -112,4 +112,4 @@

  } }  // namespace v8::internal

-#endif  // V8_REGEXP_CODEGEN_H_
+#endif  // V8_REGEXP_MACRO_ASSEMBLER_H_

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  
04:00:59 2008
@@ -495,8 +495,8 @@
    __ CheckChar('o', &advance);
    __ LoadCurrentChar(2);
    __ CheckChar('o', &advance);
-  __ SetRegister(0);
-  __ SetRegister(1, 2);
+  __ SetRegisterToCurrentPosition(0);
+  __ SetRegisterToCurrentPosition(1, 2);
    __ Succeed();

    v8::HandleScope scope;
@@ -517,4 +517,87 @@
    CHECK(Re2kInterpreter::Match(*array, *f3, captures, 0));
    CHECK_EQ(3, captures[0]);
    CHECK_EQ(5, captures[1]);
+}
+
+
+TEST(Assembler2) {
+  V8::Initialize(NULL);
+  byte codes[1024];
+  Re2kAssembler assembler(Vector<byte>(codes, 1024));
+#define __ assembler.
+  // /^.*foo/
+  Label more_dots;
+  Label unwind_dot;
+  Label failure;
+  Label foo;
+  Label foo_failed;
+  Label dot_match;
+  // ^
+  __ PushCurrentPosition();
+  __ PushRegister(0);
+  __ SetRegisterToCurrentPosition(0);
+  __ PushBacktrack(&failure);
+  __ GoTo(&dot_match);
+  // .*
+  __ Bind(&more_dots);
+  __ AdvanceCP();
+  __ Bind(&dot_match);
+  __ PushCurrentPosition();
+  __ PushBacktrack(&unwind_dot);
+  __ LoadCurrentChar();
+  __ CheckNotEnd(&foo);
+  __ CheckChar('\n', &more_dots);
+  // foo
+  __ Bind(&foo);
+  __ CheckChar('f', &foo_failed);
+  __ LoadCurrentChar(1);
+  __ CheckChar('o', &foo_failed);
+  __ LoadCurrentChar(2);
+  __ CheckChar('o', &foo_failed);
+  __ SetRegisterToCurrentPosition(1, 2);
+  __ Succeed();
+  __ Break();
+
+  __ Bind(&foo_failed);
+  __ PopBacktrack();
+  __ Break();
+
+  __ Bind(&unwind_dot);
+  __ PopCurrentPosition();
+  __ LoadCurrentChar();
+  __ GoTo(&foo);
+
+  __ Bind(&failure);
+  __ PopRegister(0);
+  __ PopCurrentPosition();
+  __ Fail();
+
+  v8::HandleScope scope;
+  Handle<ByteArray> array = Factory::NewByteArray(assembler.length());
+  assembler.Copy(array->GetDataStartAddress());
+  int captures[2];
+
+  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"));
+  CHECK(Re2kInterpreter::Match(*array, *f2, captures, 0));
+  CHECK_EQ(0, captures[0]);
+  CHECK_EQ(2, captures[1]);
+
+  Handle<String> f3 =  
Factory::NewStringFromAscii(CStrVector("tomfoolery"));
+  CHECK(Re2kInterpreter::Match(*array, *f3, captures, 0));
+  CHECK_EQ(0, captures[0]);
+  CHECK_EQ(5, captures[1]);
+
+  Handle<String> f4 =
+      Factory::NewStringFromAscii(CStrVector("football buffoonery"));
+  CHECK(Re2kInterpreter::Match(*array, *f4, captures, 0));
+  CHECK_EQ(0, captures[0]);
+  CHECK_EQ(14, captures[1]);
+
+  Handle<String> f5 =
+      Factory::NewStringFromAscii(CStrVector("walking\nbarefoot"));
+  CHECK(!Re2kInterpreter::Match(*array, *f5, captures, 0));
  }

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

Reply via email to