Index: src/regexp-macro-assembler-irregexp.cc |
=================================================================== |
--- src/regexp-macro-assembler-irregexp.cc (revision 1305) |
+++ src/regexp-macro-assembler-irregexp.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright 2008 the V8 project authors. All rights reserved. |
+// Copyright 2008-2009 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -39,7 +39,8 @@ |
RegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Vector<byte> buffer) |
: buffer_(buffer), |
pc_(0), |
- own_buffer_(false) { |
+ own_buffer_(false), |
+ advance_current_end_(kInvalidPC) { |
} |
@@ -55,6 +56,7 @@ |
void RegExpMacroAssemblerIrregexp::Bind(Label* l) { |
+ advance_current_end_ = kInvalidPC; |
ASSERT(!l->is_bound()); |
if (l->is_linked()) { |
int pos = l->pos(); |
@@ -172,8 +174,17 @@ |
void RegExpMacroAssemblerIrregexp::GoTo(Label* l) { |
- Emit(BC_GOTO, 0); |
- EmitOrLink(l); |
+ if (advance_current_end_ == pc_) { |
+ // Combine advance current and goto. |
+ pc_ = advance_current_start_; |
+ Emit(BC_ADVANCE_CP_AND_GOTO, advance_current_offset_); |
+ EmitOrLink(l); |
+ advance_current_end_ = kInvalidPC; |
+ } else { |
+ // Regular goto. |
+ Emit(BC_GOTO, 0); |
+ EmitOrLink(l); |
+ } |
} |
@@ -196,7 +207,10 @@ |
void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(int by) { |
ASSERT(by >= kMinCPOffset); |
ASSERT(by <= kMaxCPOffset); |
+ advance_current_start_ = pc_; |
+ advance_current_offset_ = by; |
Emit(BC_ADVANCE_CP, by); |
+ advance_current_end_ = pc_; |
} |