Index: test/cctest/test-regexp.cc |
=================================================================== |
--- test/cctest/test-regexp.cc (revision 738) |
+++ test/cctest/test-regexp.cc (working copy) |
@@ -37,6 +37,8 @@ |
#include "ast.h" |
#include "jsregexp-inl.h" |
#include "assembler-re2k.h" |
+#include "regexp-macro-assembler.h" |
+#include "regexp-macro-assembler-re2k.h" |
#include "interpreter-re2k.h" |
@@ -343,7 +345,7 @@ |
RegExpEngine::DotPrint(input, node); |
exit(0); |
} |
-#endif // DEBUG |
+#endif // DEBUG |
} |
@@ -490,20 +492,22 @@ |
#define __ assembler. |
Label advance; |
Label look_for_foo; |
+ Label fail; |
__ GoTo(&look_for_foo); |
__ Bind(&advance); |
- __ AdvanceCP(); |
+ __ AdvanceCP(1); |
__ Bind(&look_for_foo); |
- __ FailIfWithin(3); |
- __ LoadCurrentChar(0); |
+ __ LoadCurrentChar(0, &fail); |
__ CheckChar('f', &advance); |
- __ LoadCurrentChar(1); |
+ __ LoadCurrentChar(1, &fail); |
__ CheckChar('o', &advance); |
- __ LoadCurrentChar(2); |
+ __ LoadCurrentChar(2, &fail); |
__ CheckChar('o', &advance); |
__ SetRegisterToCurrentPosition(0); |
__ SetRegisterToCurrentPosition(1, 2); |
__ Succeed(); |
+ __ Bind(&fail); |
+ __ Fail(); |
v8::HandleScope scope; |
Handle<ByteArray> array = Factory::NewByteArray(assembler.length()); |
@@ -512,15 +516,15 @@ |
Handle<String> f1 = |
Factory::NewStringFromAscii(CStrVector("Now is the time")); |
- CHECK(!Re2kInterpreter::Match(*array, *f1, captures, 0)); |
+ CHECK(!Re2kInterpreter::Match(array, f1, captures, 0)); |
Handle<String> f2 = Factory::NewStringFromAscii(CStrVector("foo bar baz")); |
- CHECK(Re2kInterpreter::Match(*array, *f2, captures, 0)); |
+ 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(Re2kInterpreter::Match(array, f3, captures, 0)); |
CHECK_EQ(3, captures[0]); |
CHECK_EQ(5, captures[1]); |
} |
@@ -546,19 +550,18 @@ |
__ GoTo(&dot_match); |
// .* |
__ Bind(&more_dots); |
- __ AdvanceCP(); |
+ __ AdvanceCP(1); |
__ Bind(&dot_match); |
__ PushCurrentPosition(); |
__ PushBacktrack(&unwind_dot); |
- __ LoadCurrentChar(); |
- __ CheckNotEnd(&foo); |
+ __ LoadCurrentChar(0, &foo); |
__ CheckChar('\n', &more_dots); |
// foo |
__ Bind(&foo); |
__ CheckChar('f', &foo_failed); |
- __ LoadCurrentChar(1); |
+ __ LoadCurrentChar(1, &foo_failed); |
__ CheckChar('o', &foo_failed); |
- __ LoadCurrentChar(2); |
+ __ LoadCurrentChar(2, &foo_failed); |
__ CheckChar('o', &foo_failed); |
__ SetRegisterToCurrentPosition(1, 2); |
__ Succeed(); |
@@ -570,7 +573,7 @@ |
__ Bind(&unwind_dot); |
__ PopCurrentPosition(); |
- __ LoadCurrentChar(); |
+ __ LoadCurrentChar(0, &foo_failed); |
__ GoTo(&foo); |
__ Bind(&failure); |
@@ -585,30 +588,91 @@ |
Handle<String> f1 = |
Factory::NewStringFromAscii(CStrVector("Now is the time")); |
- CHECK(!Re2kInterpreter::Match(*array, *f1, captures, 0)); |
+ CHECK(!Re2kInterpreter::Match(array, f1, captures, 0)); |
Handle<String> f2 = Factory::NewStringFromAscii(CStrVector("foo bar baz")); |
- CHECK(Re2kInterpreter::Match(*array, *f2, captures, 0)); |
+ 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(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(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)); |
+ CHECK(!Re2kInterpreter::Match(array, f5, captures, 0)); |
} |
+TEST(MacroAssembler) { |
+ V8::Initialize(NULL); |
+ byte codes[1024]; |
+ Re2kAssembler assembler(Vector<byte>(codes, 1024)); |
+ RegExpMacroAssemblerRe2k m(&assembler); |
+ // ^f(o)o. |
+ Label fail, fail2, start; |
+ uc16 foo_chars[3]; |
+ foo_chars[0] = 'f'; |
+ foo_chars[1] = 'o'; |
+ foo_chars[2] = 'o'; |
+ Vector<const uc16> foo(foo_chars, 3); |
+ m.SetRegister(4, 42); |
+ m.PushRegister(4); |
+ m.AdvanceRegister(4, 42); |
+ m.GoTo(&start); |
+ m.Fail(); |
+ m.Bind(&start); |
+ m.PushBacktrack(&fail2); |
+ m.CheckCharacters(foo, 0, &fail); |
+ m.WriteCurrentPositionToRegister(0); |
+ m.PushCurrentPosition(); |
+ m.AdvanceCurrentPosition(3); |
+ m.WriteCurrentPositionToRegister(1); |
+ m.PopCurrentPosition(); |
+ m.AdvanceCurrentPosition(1); |
+ m.WriteCurrentPositionToRegister(2); |
+ m.AdvanceCurrentPosition(1); |
+ m.WriteCurrentPositionToRegister(3); |
+ m.Succeed(); |
+ |
+ m.Bind(&fail); |
+ m.Backtrack(); |
+ m.Succeed(); |
+ |
+ m.Bind(&fail2); |
+ m.PopRegister(0); |
+ m.Fail(); |
+ |
+ v8::HandleScope scope; |
+ |
+ Handle<ByteArray> array = Factory::NewByteArray(assembler.length()); |
+ assembler.Copy(array->GetDataStartAddress()); |
+ int captures[5]; |
+ |
+ Handle<String> f1 = |
+ Factory::NewStringFromAscii(CStrVector("foobar")); |
+ CHECK(Re2kInterpreter::Match(array, f1, captures, 0)); |
+ CHECK_EQ(0, captures[0]); |
+ CHECK_EQ(3, captures[1]); |
+ CHECK_EQ(1, captures[2]); |
+ CHECK_EQ(2, captures[3]); |
+ CHECK_EQ(84, captures[4]); |
+ |
+ Handle<String> f2 = |
+ Factory::NewStringFromAscii(CStrVector("barfoo")); |
+ CHECK(!Re2kInterpreter::Match(array, f2, captures, 0)); |
+ CHECK_EQ(42, captures[0]); |
+} |
+ |
+ |
TEST(AddInverseToTable) { |
static const int kLimit = 1000; |
static const int kRangeCount = 16; |