Index: src/regexp-macro-assembler-irregexp.cc |
=================================================================== |
--- src/regexp-macro-assembler-irregexp.cc (revision 927) |
+++ src/regexp-macro-assembler-irregexp.cc (working copy) |
@@ -68,6 +68,7 @@ |
void RegExpMacroAssemblerIrregexp::EmitOrLink(Label* l) { |
+ if (l == NULL) l = &backtrack_; |
if (l->is_bound()) { |
Emit32(l->pos()); |
} else { |
@@ -95,11 +96,11 @@ |
void RegExpMacroAssemblerIrregexp::WriteCurrentPositionToRegister( |
- int register_index) { |
+ int register_index, int cp_offset) { |
ASSERT(register_index >= 0); |
Emit(BC_SET_REGISTER_TO_CP); |
Emit(register_index); |
- Emit32(0); // Current position offset. |
+ Emit32(cp_offset); // Current position offset. |
} |
@@ -187,11 +188,10 @@ |
} |
-void RegExpMacroAssemblerIrregexp::CheckCurrentPosition( |
- int register_index, |
- Label* on_equal) { |
- // TODO(erikcorry): Implement. |
- UNIMPLEMENTED(); |
+void RegExpMacroAssemblerIrregexp::CheckGreedyLoop( |
+ Label* on_tos_equals_current_position) { |
+ Emit(BC_CHECK_GREEDY); |
+ EmitOrLink(on_tos_equals_current_position); |
} |
@@ -203,6 +203,13 @@ |
} |
+void RegExpMacroAssemblerIrregexp::LoadCurrentCharacterUnchecked( |
+ int cp_offset) { |
+ Emit(BC_LOAD_CURRENT_CHAR_UNCHECKED); |
+ Emit32(cp_offset); |
+} |
+ |
+ |
void RegExpMacroAssemblerIrregexp::CheckCharacterLT(uc16 limit, |
Label* on_less) { |
Emit(BC_CHECK_LT); |
@@ -263,7 +270,7 @@ |
void RegExpMacroAssemblerIrregexp::CheckNotBackReference(int start_reg, |
- Label* on_not_equal) { |
+ Label* on_not_equal) { |
Emit(BC_CHECK_NOT_BACK_REF); |
Emit(start_reg); |
EmitOrLink(on_not_equal); |
@@ -323,11 +330,19 @@ |
void RegExpMacroAssemblerIrregexp::CheckCharacters( |
Vector<const uc16> str, |
int cp_offset, |
- Label* on_failure) { |
+ Label* on_failure, |
+ bool check_end_of_string) { |
+ // It is vital that this loop is backwards due to the unchecked character |
+ // load below. |
for (int i = str.length() - 1; i >= 0; i--) { |
- Emit(BC_LOAD_CURRENT_CHAR); |
- Emit32(cp_offset + i); |
- EmitOrLink(on_failure); |
+ if (check_end_of_string && i == str.length() - 1) { |
+ Emit(BC_LOAD_CURRENT_CHAR); |
+ Emit32(cp_offset + i); |
+ EmitOrLink(on_failure); |
+ } else { |
+ Emit(BC_LOAD_CURRENT_CHAR_UNCHECKED); |
+ Emit32(cp_offset + i); |
+ } |
Emit(BC_CHECK_NOT_CHAR); |
Emit16(str[i]); |
EmitOrLink(on_failure); |
@@ -357,7 +372,9 @@ |
} |
-Handle<Object> RegExpMacroAssemblerIrregexp::GetCode() { |
+Handle<Object> RegExpMacroAssemblerIrregexp::GetCode(Handle<String> source) { |
+ Bind(&backtrack_); |
+ Emit(BC_POP_BT); |
Handle<ByteArray> array = Factory::NewByteArray(length()); |
Copy(array->GetDataStartAddress()); |
return array; |