diff --git a/src/bytecodes-irregexp.h b/src/bytecodes-irregexp.h index a93b9b6566..94f37a8db5 100644 --- a/src/bytecodes-irregexp.h +++ b/src/bytecodes-irregexp.h @@ -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: @@ -86,7 +86,8 @@ V(CHECK_REGISTER_GE, 42, 12) /* bc8 reg_idx24 value32 addr32 */ \ V(CHECK_REGISTER_EQ_POS, 43, 8) /* bc8 reg_idx24 addr32 */ \ V(CHECK_AT_START, 44, 8) /* bc8 pad24 addr32 */ \ V(CHECK_NOT_AT_START, 45, 8) /* bc8 pad24 addr32 */ \ -V(CHECK_GREEDY, 46, 8) /* bc8 pad24 addr32 */ +V(CHECK_GREEDY, 46, 8) /* bc8 pad24 addr32 */ \ +V(ADVANCE_CP_AND_GOTO, 47, 8) /* bc8 offset24 addr32 */ #define DECLARE_BYTECODES(name, code, length) \ static const int BC_##name = code; diff --git a/src/interpreter-irregexp.cc b/src/interpreter-irregexp.cc index c6ccda152b..d6ab18fe33 100644 --- a/src/interpreter-irregexp.cc +++ b/src/interpreter-irregexp.cc @@ -238,6 +238,10 @@ static bool RawMatch(const byte* code_base, BYTECODE(GOTO) pc = code_base + Load32Aligned(pc + 4); break; + BYTECODE(ADVANCE_CP_AND_GOTO) + current += insn >> BYTECODE_SHIFT; + pc = code_base + Load32Aligned(pc + 4); + break; BYTECODE(CHECK_GREEDY) if (current == backtrack_sp[-1]) { backtrack_sp--; diff --git a/src/jsregexp.cc b/src/jsregexp.cc index a583959ee1..4883a408cb 100644 --- a/src/jsregexp.cc +++ b/src/jsregexp.cc @@ -1,4 +1,4 @@ -// Copyright 2006-2008 the V8 project authors. All rights reserved. +// Copyright 2006-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: diff --git a/src/regexp-macro-assembler-irregexp-inl.h b/src/regexp-macro-assembler-irregexp-inl.h index 24f32c5370..378529108d 100644 --- a/src/regexp-macro-assembler-irregexp-inl.h +++ b/src/regexp-macro-assembler-irregexp-inl.h @@ -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: diff --git a/src/regexp-macro-assembler-irregexp.cc b/src/regexp-macro-assembler-irregexp.cc index 155b197e35..436db35d8b 100644 --- a/src/regexp-macro-assembler-irregexp.cc +++ b/src/regexp-macro-assembler-irregexp.cc @@ -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 @@ namespace v8 { namespace internal { RegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Vector buffer) : buffer_(buffer), pc_(0), - own_buffer_(false) { + own_buffer_(false), + advance_current_end_(kInvalidPC) { } @@ -55,6 +56,7 @@ RegExpMacroAssemblerIrregexp::Implementation() { 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::Backtrack() { 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::Fail() { 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_; } diff --git a/src/regexp-macro-assembler-irregexp.h b/src/regexp-macro-assembler-irregexp.h index 0d5999fcb5..9ed82e396b 100644 --- a/src/regexp-macro-assembler-irregexp.h +++ b/src/regexp-macro-assembler-irregexp.h @@ -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: @@ -133,6 +133,12 @@ class RegExpMacroAssemblerIrregexp: public RegExpMacroAssembler { bool own_buffer_; Label backtrack_; + int advance_current_start_; + int advance_current_offset_; + int advance_current_end_; + + static const int kInvalidPC = -1; + DISALLOW_IMPLICIT_CONSTRUCTORS(RegExpMacroAssemblerIrregexp); };