OLD | NEW |
1 // Copyright 2008-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2008-2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 // Backtrack code (branch target for conditional backtracks). | 745 // Backtrack code (branch target for conditional backtracks). |
746 if (backtrack_label_.is_linked()) { | 746 if (backtrack_label_.is_linked()) { |
747 __ bind(&backtrack_label_); | 747 __ bind(&backtrack_label_); |
748 Backtrack(); | 748 Backtrack(); |
749 } | 749 } |
750 | 750 |
751 Label exit_with_exception; | 751 Label exit_with_exception; |
752 | 752 |
753 // Preempt-code | 753 // Preempt-code |
754 if (check_preempt_label_.is_linked()) { | 754 if (check_preempt_label_.is_linked()) { |
755 __ bind(&check_preempt_label_); | 755 SafeCallTarget(&check_preempt_label_); |
756 | 756 |
757 __ push(backtrack_stackpointer()); | 757 __ push(backtrack_stackpointer()); |
758 __ push(edi); | 758 __ push(edi); |
759 | 759 |
760 CallCheckStackGuardState(ebx); | 760 CallCheckStackGuardState(ebx); |
761 __ or_(eax, Operand(eax)); | 761 __ or_(eax, Operand(eax)); |
762 // If returning non-zero, we should end execution with the given | 762 // If returning non-zero, we should end execution with the given |
763 // result as return value. | 763 // result as return value. |
764 __ j(not_zero, &exit_label_); | 764 __ j(not_zero, &exit_label_); |
765 | 765 |
766 __ pop(edi); | 766 __ pop(edi); |
767 __ pop(backtrack_stackpointer()); | 767 __ pop(backtrack_stackpointer()); |
768 // String might have moved: Reload esi from frame. | 768 // String might have moved: Reload esi from frame. |
769 __ mov(esi, Operand(ebp, kInputEnd)); | 769 __ mov(esi, Operand(ebp, kInputEnd)); |
770 SafeReturn(); | 770 SafeReturn(); |
771 } | 771 } |
772 | 772 |
773 // Backtrack stack overflow code. | 773 // Backtrack stack overflow code. |
774 if (stack_overflow_label_.is_linked()) { | 774 if (stack_overflow_label_.is_linked()) { |
775 __ bind(&stack_overflow_label_); | 775 SafeCallTarget(&stack_overflow_label_); |
776 // Reached if the backtrack-stack limit has been hit. | 776 // Reached if the backtrack-stack limit has been hit. |
777 | 777 |
778 Label grow_failed; | 778 Label grow_failed; |
779 // Save registers before calling C function | 779 // Save registers before calling C function |
780 __ push(esi); | 780 __ push(esi); |
781 __ push(edi); | 781 __ push(edi); |
782 | 782 |
783 // Call GrowStack(backtrack_stackpointer()) | 783 // Call GrowStack(backtrack_stackpointer()) |
784 int num_arguments = 2; | 784 int num_arguments = 2; |
785 FrameAlign(num_arguments, ebx); | 785 FrameAlign(num_arguments, ebx); |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 } | 1242 } |
1243 if (to == NULL) { | 1243 if (to == NULL) { |
1244 __ j(condition, &backtrack_label_, hint); | 1244 __ j(condition, &backtrack_label_, hint); |
1245 return; | 1245 return; |
1246 } | 1246 } |
1247 __ j(condition, to, hint); | 1247 __ j(condition, to, hint); |
1248 } | 1248 } |
1249 | 1249 |
1250 | 1250 |
1251 void RegExpMacroAssemblerIA32::SafeCall(Label* to) { | 1251 void RegExpMacroAssemblerIA32::SafeCall(Label* to) { |
1252 Label return_to; | 1252 __ call(to); |
1253 __ push(Immediate::CodeRelativeOffset(&return_to)); | |
1254 __ jmp(to); | |
1255 __ bind(&return_to); | |
1256 } | 1253 } |
1257 | 1254 |
1258 | 1255 |
1259 void RegExpMacroAssemblerIA32::SafeReturn() { | 1256 void RegExpMacroAssemblerIA32::SafeReturn() { |
1260 __ pop(ebx); | 1257 __ add(Operand(esp,0), Immediate(masm_->CodeObject())); |
1261 __ add(Operand(ebx), Immediate(masm_->CodeObject())); | 1258 __ ret(0); |
1262 __ jmp(Operand(ebx)); | |
1263 } | 1259 } |
1264 | 1260 |
1265 | 1261 |
| 1262 void RegExpMacroAssemblerIA32::SafeCallTarget(Label* name) { |
| 1263 __ bind(name); |
| 1264 __ sub(Operand(esp, 0), Immediate(masm_->CodeObject())); |
| 1265 } |
| 1266 |
| 1267 |
1266 void RegExpMacroAssemblerIA32::Push(Register source) { | 1268 void RegExpMacroAssemblerIA32::Push(Register source) { |
1267 ASSERT(!source.is(backtrack_stackpointer())); | 1269 ASSERT(!source.is(backtrack_stackpointer())); |
1268 // Notice: This updates flags, unlike normal Push. | 1270 // Notice: This updates flags, unlike normal Push. |
1269 __ sub(Operand(backtrack_stackpointer()), Immediate(kPointerSize)); | 1271 __ sub(Operand(backtrack_stackpointer()), Immediate(kPointerSize)); |
1270 __ mov(Operand(backtrack_stackpointer(), 0), source); | 1272 __ mov(Operand(backtrack_stackpointer(), 0), source); |
1271 } | 1273 } |
1272 | 1274 |
1273 | 1275 |
1274 void RegExpMacroAssemblerIA32::Push(Immediate value) { | 1276 void RegExpMacroAssemblerIA32::Push(Immediate value) { |
1275 // Notice: This updates flags, unlike normal Push. | 1277 // Notice: This updates flags, unlike normal Push. |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 | 1374 |
1373 | 1375 |
1374 void RegExpMacroAssemblerIA32::LoadConstantBufferAddress(Register reg, | 1376 void RegExpMacroAssemblerIA32::LoadConstantBufferAddress(Register reg, |
1375 ArraySlice* buffer) { | 1377 ArraySlice* buffer) { |
1376 __ mov(reg, buffer->array()); | 1378 __ mov(reg, buffer->array()); |
1377 __ add(Operand(reg), Immediate(buffer->base_offset())); | 1379 __ add(Operand(reg), Immediate(buffer->base_offset())); |
1378 } | 1380 } |
1379 | 1381 |
1380 #undef __ | 1382 #undef __ |
1381 }} // namespace v8::internal | 1383 }} // namespace v8::internal |
OLD | NEW |