Irregexp-ia32 internal call strategy changed.
Review URL: http://codereview.chromium.org/164053 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2635 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
7bd88e829f
commit
5ae761cc15
@ -752,7 +752,7 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) {
|
||||
|
||||
// Preempt-code
|
||||
if (check_preempt_label_.is_linked()) {
|
||||
__ bind(&check_preempt_label_);
|
||||
SafeCallTarget(&check_preempt_label_);
|
||||
|
||||
__ push(backtrack_stackpointer());
|
||||
__ push(edi);
|
||||
@ -772,7 +772,7 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) {
|
||||
|
||||
// Backtrack stack overflow code.
|
||||
if (stack_overflow_label_.is_linked()) {
|
||||
__ bind(&stack_overflow_label_);
|
||||
SafeCallTarget(&stack_overflow_label_);
|
||||
// Reached if the backtrack-stack limit has been hit.
|
||||
|
||||
Label grow_failed;
|
||||
@ -1249,17 +1249,19 @@ void RegExpMacroAssemblerIA32::BranchOrBacktrack(Condition condition,
|
||||
|
||||
|
||||
void RegExpMacroAssemblerIA32::SafeCall(Label* to) {
|
||||
Label return_to;
|
||||
__ push(Immediate::CodeRelativeOffset(&return_to));
|
||||
__ jmp(to);
|
||||
__ bind(&return_to);
|
||||
__ call(to);
|
||||
}
|
||||
|
||||
|
||||
void RegExpMacroAssemblerIA32::SafeReturn() {
|
||||
__ pop(ebx);
|
||||
__ add(Operand(ebx), Immediate(masm_->CodeObject()));
|
||||
__ jmp(Operand(ebx));
|
||||
__ add(Operand(esp,0), Immediate(masm_->CodeObject()));
|
||||
__ ret(0);
|
||||
}
|
||||
|
||||
|
||||
void RegExpMacroAssemblerIA32::SafeCallTarget(Label* name) {
|
||||
__ bind(name);
|
||||
__ sub(Operand(esp, 0), Immediate(masm_->CodeObject()));
|
||||
}
|
||||
|
||||
|
||||
|
@ -227,6 +227,7 @@ class RegExpMacroAssemblerIA32: public RegExpMacroAssembler {
|
||||
// is GC-safe (i.e., doesn't leave absolute code addresses on the stack)
|
||||
inline void SafeCall(Label* to);
|
||||
inline void SafeReturn();
|
||||
inline void SafeCallTarget(Label* name);
|
||||
|
||||
// Pushes the value of a register on the backtrack stack. Decrements the
|
||||
// stack pointer (ecx) by a word size and stores the register's value there.
|
||||
|
Loading…
Reference in New Issue
Block a user