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