Index: src/regexp-macro-assembler-re2k.cc |
=================================================================== |
--- src/regexp-macro-assembler-re2k.cc (revision 738) |
+++ src/regexp-macro-assembler-re2k.cc (working copy) |
@@ -28,7 +28,230 @@ |
#include "v8.h" |
#include "ast.h" |
#include "bytecodes-re2k.h" |
+#include "assembler-re2k.h" |
+#include "assembler-re2k-inl.h" |
#include "regexp-macro-assembler.h" |
#include "regexp-macro-assembler-re2k.h" |
+namespace v8 { namespace internal { |
+ |
+ |
+RegExpMacroAssemblerRe2k::~RegExpMacroAssemblerRe2k() { |
+} |
+ |
+ |
+RegExpMacroAssemblerRe2k::Re2kImplementation |
+RegExpMacroAssemblerRe2k::Implementation() { |
+ return kBytecodeImplementation; |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::Bind(Label* l) { |
+ assembler_->Bind(l); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::EmitOrLink(Label* l) { |
+ assembler_->EmitOrLink(l); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::PopRegister(int register_index) { |
+ assembler_->PopRegister(register_index); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::PushRegister(int register_index) { |
+ assembler_->PushRegister(register_index); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::WriteCurrentPositionToRegister( |
+ int register_index) { |
+ assembler_->SetRegisterToCurrentPosition(register_index); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::SetRegister(int register_index, int to) { |
+ assembler_->SetRegister(register_index, to); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::AdvanceRegister(int register_index, int by) { |
+ assembler_->AdvanceRegister(register_index, by); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::PopCurrentPosition() { |
+ assembler_->PopCurrentPosition(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::PushCurrentPosition() { |
+ assembler_->PushCurrentPosition(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::Backtrack() { |
+ assembler_->PopBacktrack(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::GoTo(Label* l) { |
+ assembler_->GoTo(l); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::PushBacktrack(Label* l) { |
+ assembler_->PushBacktrack(l); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::Succeed() { |
+ assembler_->Succeed(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::Fail() { |
+ assembler_->Fail(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::AdvanceCurrentPosition(int by) { |
+ assembler_->AdvanceCP(by); |
+} |
+ |
+ |
+static void TwoWayCharacterClass( |
+ Re2kAssembler* assembler, |
+ RegExpCharacterClass* char_class, |
+ Label* on_match, |
+ Label* on_mismatch) { |
+ ZoneList<CharacterRange>* ranges = char_class->ranges(); |
+ int range_count = ranges->length(); |
+ if (!char_class->is_negated()) { |
+ for (int i = 0; i < range_count; i++) { |
+ CharacterRange& range = ranges->at(i); |
+ assembler->CheckRange(range.from(), range.to(), on_match); |
+ } |
+ if (on_mismatch == NULL) { |
+ assembler->PopBacktrack(); |
+ } else { |
+ assembler->GoTo(on_mismatch); |
+ } |
+ } else { // range is negated. |
+ if (range_count == 0) { |
+ assembler->GoTo(on_match); |
+ } else { |
+ CharacterRange& previous = ranges->at(0); |
+ if (previous.from() > 0) { |
+ assembler->CheckRange(0, previous.from() - 1, on_match); |
+ } |
+ for (int i = 1; i < range_count; i++) { |
+ CharacterRange& range = ranges->at(i); |
+ if (previous.to() < range.from() - 1) { |
+ assembler->CheckRange(previous.to() + 1, range.from() - 1, on_match); |
+ } |
+ previous = range; |
+ } |
+ if (previous.to() < 65535) { |
+ assembler->CheckRange(previous.to() + 1, 65535, on_match); |
+ } |
+ } |
+ } |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::CheckCurrentPosition( |
+ int register_index, |
+ Label* on_equal) { |
+ // TODO(erikcorry): Implement. |
+ UNREACHABLE(); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::CheckCharacterClass( |
+ RegExpCharacterClass* char_class, |
+ int cp_offset, |
+ Label* on_failure) { |
+ assembler_->LoadCurrentChar(cp_offset, on_failure); |
+ if (!char_class->is_negated() && |
+ char_class->ranges()->length() == 1 && |
+ on_failure != NULL) { |
+ // This is the simple case where the char class has one range and we want to |
+ // fall through if it matches. |
+ CharacterRange& range = char_class->ranges()->at(0); |
+ assembler_->CheckNotRange(range.from(), range.to(), on_failure); |
+ } else { |
+ Label on_success; |
+ TwoWayCharacterClass(assembler_, char_class, &on_success, on_failure); |
+ assembler_->Bind(&on_success); |
+ } |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::CheckBitmap(uc16 start, |
+ Label* bitmap, |
+ Label* on_zero) { |
+ assembler_->LookupMap1(start, bitmap, on_zero); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::DispatchHalfNibbleMap( |
+ uc16 start, |
+ Label* half_nibble_map, |
+ const Vector<Label*>& table) { |
+ assembler_->LookupMap2(start, half_nibble_map, table); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::DispatchByteMap(uc16 start, |
+ Label* byte_map, |
+ const Vector<Label*>& table) { |
+ assembler_->LookupMap8(start, byte_map, table); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::DispatchHighByteMap( |
+ byte start, |
+ Label* byte_map, |
+ const Vector<Label*>& table) { |
+ assembler_->LookupHighMap8(start, byte_map, table); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::CheckCharacters( |
+ Vector<const uc16> str, |
+ int cp_offset, |
+ Label* on_failure) { |
+ for (int i = str.length() - 1; i >= 0; i--) { |
+ assembler_->LoadCurrentChar(cp_offset + i, on_failure); |
+ assembler_->CheckChar(str[i], on_failure); |
+ } |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::IfRegisterLT(int register_index, |
+ int comparand, |
+ Label* if_less_than) { |
+ ASSERT(comparand >= 0 && comparand <= 65535); |
+ assembler_->CheckRegisterLT(register_index, comparand, if_less_than); |
+} |
+ |
+ |
+void RegExpMacroAssemblerRe2k::IfRegisterGE(int register_index, |
+ int comparand, |
+ Label* if_greater_or_equal) { |
+ ASSERT(comparand >= 0 && comparand <= 65535); |
+ assembler_->CheckRegisterGE(register_index, comparand, if_greater_or_equal); |
+} |
+ |
+ |
+Handle<Object> RegExpMacroAssemblerRe2k::GetCode() { |
+ Handle<ByteArray> array = Factory::NewByteArray(assembler_->length()); |
+ assembler_->Copy(array->GetDataStartAddress()); |
+ return array; |
+} |
+ |
+} } // namespace v8::internal |