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
-~----------~----~----~----~------~----~------~--~---