Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1218)

Unified Diff: src/regexp-macro-assembler-re2k.cc

Issue 10830: * We want to be able to find atoms and character classes without advancing th... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/regexp2000/
Patch Set: Created 12 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698