Commit 94ce4d30 authored by erik.corry@gmail.com's avatar erik.corry@gmail.com

Add an operation that checks whether we are at the start of the string.

Review URL: http://codereview.chromium.org/10998

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@866 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 49d05495
...@@ -64,7 +64,8 @@ V(LOOKUP_MAP2, 28, 99) /* l_map2 start16 half_nibble_map_addr32* */ \ ...@@ -64,7 +64,8 @@ V(LOOKUP_MAP2, 28, 99) /* l_map2 start16 half_nibble_map_addr32* */ \
V(LOOKUP_MAP8, 29, 99) /* l_map8 start16 byte_map addr32* */ \ V(LOOKUP_MAP8, 29, 99) /* l_map8 start16 byte_map addr32* */ \
V(LOOKUP_HI_MAP8, 30, 99) /* l_himap8 start8 byte_map_addr32 addr32* */ \ V(LOOKUP_HI_MAP8, 30, 99) /* l_himap8 start8 byte_map_addr32 addr32* */ \
V(CHECK_REGISTER_LT, 31, 8) /* check_reg_lt register_index value16 addr32 */ \ V(CHECK_REGISTER_LT, 31, 8) /* check_reg_lt register_index value16 addr32 */ \
V(CHECK_REGISTER_GE, 32, 8) /* check_reg_ge register_index value16 addr32 */ V(CHECK_REGISTER_GE, 32, 8) /* check_reg_ge register_index value16 addr32 */ \
V(CHECK_NOT_AT_START, 33, 5) /* check_not_at_start addr32 */
#define DECLARE_BYTECODES(name, code, length) \ #define DECLARE_BYTECODES(name, code, length) \
static const int BC_##name = code; static const int BC_##name = code;
......
...@@ -365,6 +365,13 @@ static bool RawMatch(const byte* code_base, ...@@ -365,6 +365,13 @@ static bool RawMatch(const byte* code_base,
} }
break; break;
} }
BYTECODE(CHECK_NOT_AT_START)
if (current == 0) {
pc += BC_CHECK_NOT_AT_START_LENGTH;
} else {
pc = code_base + Load32(pc + 1);
}
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
......
...@@ -162,6 +162,11 @@ void RegExpMacroAssemblerIA32::CheckCharacterGT(uc16 limit, Label* on_greater) { ...@@ -162,6 +162,11 @@ void RegExpMacroAssemblerIA32::CheckCharacterGT(uc16 limit, Label* on_greater) {
} }
void RegExpMacroAssemblerIA32::CheckNotAtStart(Label* on_not_at_start) {
UNIMPLEMENTED();
}
void RegExpMacroAssemblerIA32::CheckCharacterLT(uc16 limit, Label* on_less) { void RegExpMacroAssemblerIA32::CheckCharacterLT(uc16 limit, Label* on_less) {
__ cmp(edx, limit); __ cmp(edx, limit);
BranchOrBacktrack(less, on_less); BranchOrBacktrack(less, on_less);
......
...@@ -49,6 +49,7 @@ class RegExpMacroAssemblerIA32: public RegExpMacroAssembler { ...@@ -49,6 +49,7 @@ class RegExpMacroAssemblerIA32: public RegExpMacroAssembler {
int cp_offset, int cp_offset,
Label* on_failure); Label* on_failure);
virtual void CheckCurrentPosition(int register_index, Label* on_equal); virtual void CheckCurrentPosition(int register_index, Label* on_equal);
virtual void CheckNotAtStart(Label* on_not_at_start);
virtual void CheckNotBackReference(int start_reg, Label* on_no_match); virtual void CheckNotBackReference(int start_reg, Label* on_no_match);
virtual void CheckNotBackReferenceIgnoreCase(int start_reg, virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
Label* on_no_match); Label* on_no_match);
......
...@@ -226,6 +226,12 @@ void RegExpMacroAssemblerIrregexp::CheckCharacter(uc16 c, Label* on_equal) { ...@@ -226,6 +226,12 @@ void RegExpMacroAssemblerIrregexp::CheckCharacter(uc16 c, Label* on_equal) {
} }
void RegExpMacroAssemblerIrregexp::CheckNotAtStart(Label* on_not_at_start) {
Emit(BC_CHECK_NOT_AT_START);
EmitOrLink(on_not_at_start);
}
void RegExpMacroAssemblerIrregexp::CheckNotCharacter(uc16 c, void RegExpMacroAssemblerIrregexp::CheckNotCharacter(uc16 c,
Label* on_not_equal) { Label* on_not_equal) {
Emit(BC_CHECK_NOT_CHAR); Emit(BC_CHECK_NOT_CHAR);
......
...@@ -70,6 +70,7 @@ class RegExpMacroAssemblerIrregexp: public RegExpMacroAssembler { ...@@ -70,6 +70,7 @@ class RegExpMacroAssemblerIrregexp: public RegExpMacroAssembler {
virtual void CheckCharacterLT(uc16 limit, Label* on_less); virtual void CheckCharacterLT(uc16 limit, Label* on_less);
virtual void CheckCharacterGT(uc16 limit, Label* on_greater); virtual void CheckCharacterGT(uc16 limit, Label* on_greater);
virtual void CheckCharacter(uc16 c, Label* on_equal); virtual void CheckCharacter(uc16 c, Label* on_equal);
virtual void CheckNotAtStart(Label* on_not_at_start);
virtual void CheckNotCharacter(uc16 c, Label* on_not_equal); virtual void CheckNotCharacter(uc16 c, Label* on_not_equal);
virtual void CheckNotCharacterAfterOr(uc16 c, uc16 mask, Label* on_not_equal); virtual void CheckNotCharacterAfterOr(uc16 c, uc16 mask, Label* on_not_equal);
virtual void CheckNotCharacterAfterMinusOr(uc16 c, virtual void CheckNotCharacterAfterMinusOr(uc16 c,
......
...@@ -75,6 +75,7 @@ class RegExpMacroAssembler { ...@@ -75,6 +75,7 @@ class RegExpMacroAssembler {
virtual void CheckCurrentPosition( virtual void CheckCurrentPosition(
int register_index, int register_index,
Label* on_equal) = 0; Label* on_equal) = 0;
virtual void CheckNotAtStart(Label* on_not_at_start) = 0;
virtual void CheckNotBackReference(int start_reg, Label* on_no_match) = 0; virtual void CheckNotBackReference(int start_reg, Label* on_no_match) = 0;
virtual void CheckNotBackReferenceIgnoreCase(int start_reg, virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
Label* on_no_match) = 0; Label* on_no_match) = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment