Instead of jumping over a conditional backtrack, jump to a single instance somewhere else.
git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1007 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
2c3b392c8c
commit
d7290b6b6e
@ -93,6 +93,7 @@ RegExpMacroAssemblerIA32::RegExpMacroAssemblerIA32(
|
|||||||
entry_label_(),
|
entry_label_(),
|
||||||
start_label_(),
|
start_label_(),
|
||||||
success_label_(),
|
success_label_(),
|
||||||
|
backtrack_label_(),
|
||||||
exit_label_(),
|
exit_label_(),
|
||||||
self_(Heap::undefined_value()) {
|
self_(Heap::undefined_value()) {
|
||||||
__ jmp(&entry_label_); // We'll write the entry code later.
|
__ jmp(&entry_label_); // We'll write the entry code later.
|
||||||
@ -106,6 +107,7 @@ RegExpMacroAssemblerIA32::~RegExpMacroAssemblerIA32() {
|
|||||||
entry_label_.Unuse();
|
entry_label_.Unuse();
|
||||||
start_label_.Unuse();
|
start_label_.Unuse();
|
||||||
success_label_.Unuse();
|
success_label_.Unuse();
|
||||||
|
backtrack_label_.Unuse();
|
||||||
exit_label_.Unuse();
|
exit_label_.Unuse();
|
||||||
check_preempt_label_.Unuse();
|
check_preempt_label_.Unuse();
|
||||||
}
|
}
|
||||||
@ -564,6 +566,12 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) {
|
|||||||
__ pop(esi);
|
__ pop(esi);
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
|
|
||||||
|
// Backtrack code (branch target for conditional backtracks).
|
||||||
|
if (backtrack_label_.is_linked()) {
|
||||||
|
__ bind(&backtrack_label_);
|
||||||
|
Backtrack();
|
||||||
|
}
|
||||||
|
|
||||||
// Preempt-code
|
// Preempt-code
|
||||||
if (check_preempt_label_.is_linked()) {
|
if (check_preempt_label_.is_linked()) {
|
||||||
__ bind(&check_preempt_label_);
|
__ bind(&check_preempt_label_);
|
||||||
@ -818,10 +826,7 @@ void RegExpMacroAssemblerIA32::BranchOrBacktrack(Condition condition,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (to == NULL) {
|
if (to == NULL) {
|
||||||
Label skip;
|
__ j(condition, &backtrack_label_);
|
||||||
__ j(NegateCondition(condition), &skip);
|
|
||||||
Backtrack();
|
|
||||||
__ bind(&skip);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
__ j(condition, to);
|
__ j(condition, to);
|
||||||
|
@ -201,6 +201,7 @@ class RegExpMacroAssemblerIA32: public RegExpMacroAssembler {
|
|||||||
Label entry_label_;
|
Label entry_label_;
|
||||||
Label start_label_;
|
Label start_label_;
|
||||||
Label success_label_;
|
Label success_label_;
|
||||||
|
Label backtrack_label_;
|
||||||
Label exit_label_;
|
Label exit_label_;
|
||||||
Label check_preempt_label_;
|
Label check_preempt_label_;
|
||||||
// Handle used to represent the generated code object itself.
|
// Handle used to represent the generated code object itself.
|
||||||
|
Loading…
Reference in New Issue
Block a user