Index: src/regexp-macro-assembler-irregexp.cc |
=================================================================== |
--- src/regexp-macro-assembler-irregexp.cc (revision 862) |
+++ src/regexp-macro-assembler-irregexp.cc (working copy) |
@@ -28,15 +28,21 @@ |
#include "v8.h" |
#include "ast.h" |
#include "bytecodes-irregexp.h" |
-#include "assembler-irregexp.h" |
-#include "assembler-irregexp-inl.h" |
#include "regexp-macro-assembler.h" |
#include "regexp-macro-assembler-irregexp.h" |
+#include "regexp-macro-assembler-irregexp-inl.h" |
namespace v8 { namespace internal { |
+RegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Vector<byte> buffer) |
+ : buffer_(buffer), |
+ pc_(0), |
+ own_buffer_(false) { |
+} |
+ |
+ |
RegExpMacroAssemblerIrregexp::~RegExpMacroAssemblerIrregexp() { |
} |
@@ -48,96 +54,136 @@ |
void RegExpMacroAssemblerIrregexp::Bind(Label* l) { |
- assembler_->Bind(l); |
+ ASSERT(!l->is_bound()); |
+ if (l->is_linked()) { |
+ int pos = l->pos(); |
+ while (pos != 0) { |
+ int fixup = pos; |
+ pos = Load32(buffer_.start() + fixup); |
+ Store32(buffer_.start() + fixup, pc_); |
+ } |
+ } |
+ l->bind_to(pc_); |
} |
void RegExpMacroAssemblerIrregexp::EmitOrLink(Label* l) { |
- assembler_->EmitOrLink(l); |
+ if (l->is_bound()) { |
+ Emit32(l->pos()); |
+ } else { |
+ int pos = 0; |
+ if (l->is_linked()) { |
+ pos = l->pos(); |
+ } |
+ l->link_to(pc_); |
+ Emit32(pos); |
+ } |
} |
void RegExpMacroAssemblerIrregexp::PopRegister(int register_index) { |
- assembler_->PopRegister(register_index); |
+ Emit(BC_POP_REGISTER); |
+ Emit(register_index); |
} |
void RegExpMacroAssemblerIrregexp::PushRegister(int register_index) { |
- assembler_->PushRegister(register_index); |
+ ASSERT(register_index >= 0); |
+ Emit(BC_PUSH_REGISTER); |
+ Emit(register_index); |
} |
void RegExpMacroAssemblerIrregexp::WriteCurrentPositionToRegister( |
int register_index) { |
- assembler_->WriteCurrentPositionToRegister(register_index); |
+ ASSERT(register_index >= 0); |
+ Emit(BC_SET_REGISTER_TO_CP); |
+ Emit(register_index); |
+ Emit32(0); // Current position offset. |
} |
void RegExpMacroAssemblerIrregexp::ReadCurrentPositionFromRegister( |
int register_index) { |
- assembler_->ReadCurrentPositionFromRegister(register_index); |
+ ASSERT(register_index >= 0); |
+ Emit(BC_SET_CP_TO_REGISTER); |
+ Emit(register_index); |
} |
void RegExpMacroAssemblerIrregexp::WriteStackPointerToRegister( |
int register_index) { |
- assembler_->WriteStackPointerToRegister(register_index); |
+ ASSERT(register_index >= 0); |
+ Emit(BC_SET_REGISTER_TO_SP); |
+ Emit(register_index); |
} |
void RegExpMacroAssemblerIrregexp::ReadStackPointerFromRegister( |
int register_index) { |
- assembler_->ReadStackPointerFromRegister(register_index); |
+ ASSERT(register_index >= 0); |
+ Emit(BC_SET_SP_TO_REGISTER); |
+ Emit(register_index); |
} |
void RegExpMacroAssemblerIrregexp::SetRegister(int register_index, int to) { |
- assembler_->SetRegister(register_index, to); |
+ ASSERT(register_index >= 0); |
+ Emit(BC_SET_REGISTER); |
+ Emit(register_index); |
+ Emit32(to); |
} |
void RegExpMacroAssemblerIrregexp::AdvanceRegister(int register_index, int by) { |
- assembler_->AdvanceRegister(register_index, by); |
+ ASSERT(register_index >= 0); |
+ Emit(BC_ADVANCE_REGISTER); |
+ Emit(register_index); |
+ Emit32(by); |
} |
void RegExpMacroAssemblerIrregexp::PopCurrentPosition() { |
- assembler_->PopCurrentPosition(); |
+ Emit(BC_POP_CP); |
} |
void RegExpMacroAssemblerIrregexp::PushCurrentPosition() { |
- assembler_->PushCurrentPosition(); |
+ Emit(BC_PUSH_CP); |
+ Emit32(0); // Current position offset. |
} |
void RegExpMacroAssemblerIrregexp::Backtrack() { |
- assembler_->PopBacktrack(); |
+ Emit(BC_POP_BT); |
} |
void RegExpMacroAssemblerIrregexp::GoTo(Label* l) { |
- assembler_->GoTo(l); |
+ Emit(BC_GOTO); |
+ EmitOrLink(l); |
} |
void RegExpMacroAssemblerIrregexp::PushBacktrack(Label* l) { |
- assembler_->PushBacktrack(l); |
+ Emit(BC_PUSH_BT); |
+ EmitOrLink(l); |
} |
void RegExpMacroAssemblerIrregexp::Succeed() { |
- assembler_->Succeed(); |
+ Emit(BC_SUCCEED); |
} |
void RegExpMacroAssemblerIrregexp::Fail() { |
- assembler_->Fail(); |
+ Emit(BC_FAIL); |
} |
void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(int by) { |
- assembler_->AdvanceCP(by); |
+ Emit(BC_ADVANCE_CP); |
+ Emit32(by); |
} |
@@ -145,43 +191,57 @@ |
int register_index, |
Label* on_equal) { |
// TODO(erikcorry): Implement. |
- UNREACHABLE(); |
+ UNIMPLEMENTED(); |
} |
void RegExpMacroAssemblerIrregexp::LoadCurrentCharacter(int cp_offset, |
Label* on_failure) { |
- assembler_->LoadCurrentChar(cp_offset, on_failure); |
+ Emit(BC_LOAD_CURRENT_CHAR); |
+ Emit32(cp_offset); |
+ EmitOrLink(on_failure); |
} |
void RegExpMacroAssemblerIrregexp::CheckCharacterLT(uc16 limit, |
Label* on_less) { |
- assembler_->CheckCharacterLT(limit, on_less); |
+ Emit(BC_CHECK_LT); |
+ Emit16(limit); |
+ EmitOrLink(on_less); |
} |
void RegExpMacroAssemblerIrregexp::CheckCharacterGT(uc16 limit, |
Label* on_greater) { |
- assembler_->CheckCharacterGT(limit, on_greater); |
+ Emit(BC_CHECK_GT); |
+ Emit16(limit); |
+ EmitOrLink(on_greater); |
} |
void RegExpMacroAssemblerIrregexp::CheckCharacter(uc16 c, Label* on_equal) { |
- assembler_->CheckCharacter(c, on_equal); |
+ Emit(BC_CHECK_CHAR); |
+ Emit16(c); |
+ EmitOrLink(on_equal); |
} |
void RegExpMacroAssemblerIrregexp::CheckNotCharacter(uc16 c, |
Label* on_not_equal) { |
- assembler_->CheckNotCharacter(c, on_not_equal); |
+ Emit(BC_CHECK_NOT_CHAR); |
+ Emit16(c); |
+ EmitOrLink(on_not_equal); |
} |
-void RegExpMacroAssemblerIrregexp::CheckNotCharacterAfterOr(uc16 c, |
- uc16 mask, |
- Label* on_not_equal) { |
- assembler_->OrThenCheckNotCharacter(c, mask, on_not_equal); |
+void RegExpMacroAssemblerIrregexp::CheckNotCharacterAfterOr( |
+ uc16 c, |
+ uc16 mask, |
+ Label* on_not_equal) { |
+ Emit(BC_OR_CHECK_NOT_CHAR); |
+ Emit16(c); |
+ Emit16(mask); |
+ EmitOrLink(on_not_equal); |
} |
@@ -189,34 +249,44 @@ |
uc16 c, |
uc16 mask, |
Label* on_not_equal) { |
- assembler_->MinusOrThenCheckNotCharacter(c, mask, on_not_equal); |
+ Emit(BC_MINUS_OR_CHECK_NOT_CHAR); |
+ Emit16(c); |
+ Emit16(mask); |
+ EmitOrLink(on_not_equal); |
} |
void RegExpMacroAssemblerIrregexp::CheckNotBackReference(int start_reg, |
Label* on_not_equal) { |
- assembler_->CheckNotBackReference(start_reg, on_not_equal); |
+ Emit(BC_CHECK_NOT_BACK_REF); |
+ Emit(start_reg); |
+ EmitOrLink(on_not_equal); |
} |
void RegExpMacroAssemblerIrregexp::CheckNotBackReferenceIgnoreCase( |
int start_reg, |
Label* on_not_equal) { |
- assembler_->CheckNotBackReferenceNoCase(start_reg, on_not_equal); |
+ Emit(BC_CHECK_NOT_BACK_REF_NO_CASE); |
+ Emit(start_reg); |
+ EmitOrLink(on_not_equal); |
} |
void RegExpMacroAssemblerIrregexp::CheckNotRegistersEqual(int reg1, |
int reg2, |
Label* on_not_equal) { |
- assembler_->CheckNotRegistersEqual(reg1, reg2, on_not_equal); |
+ Emit(BC_CHECK_NOT_REGS_EQUAL); |
+ Emit(reg1); |
+ Emit(reg2); |
+ EmitOrLink(on_not_equal); |
} |
void RegExpMacroAssemblerIrregexp::CheckBitmap(uc16 start, |
Label* bitmap, |
Label* on_zero) { |
- assembler_->LookupMap1(start, bitmap, on_zero); |
+ UNIMPLEMENTED(); |
} |
@@ -224,7 +294,7 @@ |
uc16 start, |
Label* half_nibble_map, |
const Vector<Label*>& table) { |
- assembler_->LookupMap2(start, half_nibble_map, table); |
+ UNIMPLEMENTED(); |
} |
@@ -232,7 +302,7 @@ |
uc16 start, |
Label* byte_map, |
const Vector<Label*>& table) { |
- assembler_->LookupMap8(start, byte_map, table); |
+ UNIMPLEMENTED(); |
} |
@@ -240,7 +310,7 @@ |
byte start, |
Label* byte_map, |
const Vector<Label*>& table) { |
- assembler_->LookupHighMap8(start, byte_map, table); |
+ UNIMPLEMENTED(); |
} |
@@ -249,32 +319,65 @@ |
int cp_offset, |
Label* on_failure) { |
for (int i = str.length() - 1; i >= 0; i--) { |
- assembler_->LoadCurrentChar(cp_offset + i, on_failure); |
- assembler_->CheckNotCharacter(str[i], on_failure); |
+ Emit(BC_LOAD_CURRENT_CHAR); |
+ Emit32(cp_offset + i); |
+ EmitOrLink(on_failure); |
+ Emit(BC_CHECK_NOT_CHAR); |
+ Emit16(str[i]); |
+ EmitOrLink(on_failure); |
} |
} |
void RegExpMacroAssemblerIrregexp::IfRegisterLT(int register_index, |
int comparand, |
- Label* if_less_than) { |
+ Label* on_less_than) { |
ASSERT(comparand >= 0 && comparand <= 65535); |
- assembler_->CheckRegisterLT(register_index, comparand, if_less_than); |
+ Emit(BC_CHECK_REGISTER_LT); |
+ Emit(register_index); |
+ Emit16(comparand); |
+ EmitOrLink(on_less_than); |
} |
void RegExpMacroAssemblerIrregexp::IfRegisterGE(int register_index, |
int comparand, |
- Label* if_greater_or_equal) { |
+ Label* on_greater_or_equal) { |
ASSERT(comparand >= 0 && comparand <= 65535); |
- assembler_->CheckRegisterGE(register_index, comparand, if_greater_or_equal); |
+ Emit(BC_CHECK_REGISTER_GE); |
+ Emit(register_index); |
+ Emit16(comparand); |
+ EmitOrLink(on_greater_or_equal); |
} |
Handle<Object> RegExpMacroAssemblerIrregexp::GetCode() { |
- Handle<ByteArray> array = Factory::NewByteArray(assembler_->length()); |
- assembler_->Copy(array->GetDataStartAddress()); |
+ Handle<ByteArray> array = Factory::NewByteArray(length()); |
+ Copy(array->GetDataStartAddress()); |
return array; |
} |
+ |
+int RegExpMacroAssemblerIrregexp::length() { |
+ return pc_; |
+} |
+ |
+ |
+void RegExpMacroAssemblerIrregexp::Copy(Address a) { |
+ memcpy(a, buffer_.start(), length()); |
+} |
+ |
+ |
+void RegExpMacroAssemblerIrregexp::Expand() { |
+ bool old_buffer_was_our_own = own_buffer_; |
+ Vector<byte> old_buffer = buffer_; |
+ buffer_ = Vector<byte>::New(old_buffer.length() * 2); |
+ own_buffer_ = true; |
+ memcpy(buffer_.start(), old_buffer.start(), old_buffer.length()); |
+ if (old_buffer_was_our_own) { |
+ old_buffer.Dispose(); |
+ } |
+} |
+ |
+ |
} } // namespace v8::internal |