OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 1578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1589 __ cmp(eax, 1); | 1589 __ cmp(eax, 1); |
1590 // We expect exactly one result since we force the called regexp to behave | 1590 // We expect exactly one result since we force the called regexp to behave |
1591 // as non-global. | 1591 // as non-global. |
1592 __ j(equal, &success); | 1592 __ j(equal, &success); |
1593 Label failure; | 1593 Label failure; |
1594 __ cmp(eax, NativeRegExpMacroAssembler::FAILURE); | 1594 __ cmp(eax, NativeRegExpMacroAssembler::FAILURE); |
1595 __ j(equal, &failure); | 1595 __ j(equal, &failure); |
1596 __ cmp(eax, NativeRegExpMacroAssembler::EXCEPTION); | 1596 __ cmp(eax, NativeRegExpMacroAssembler::EXCEPTION); |
1597 // If not exception it can only be retry. Handle that in the runtime system. | 1597 // If not exception it can only be retry. Handle that in the runtime system. |
1598 __ j(not_equal, &runtime); | 1598 __ j(not_equal, &runtime); |
1599 | 1599 // Result must now be exception. If there is no pending exception already a |
1600 // Result must now be exception. | 1600 // stack overflow (on the backtrack stack) was detected in RegExp code but |
| 1601 // haven't created the exception yet. Handle that in the runtime system. |
| 1602 // TODO(592): Rerunning the RegExp to get the stack overflow exception. |
1601 ExternalReference pending_exception(Isolate::kPendingExceptionAddress, | 1603 ExternalReference pending_exception(Isolate::kPendingExceptionAddress, |
1602 isolate()); | 1604 isolate()); |
1603 __ mov(edx, Immediate(isolate()->factory()->the_hole_value())); | 1605 __ mov(edx, Immediate(isolate()->factory()->the_hole_value())); |
1604 __ mov(eax, Operand::StaticVariable(pending_exception)); | 1606 __ mov(eax, Operand::StaticVariable(pending_exception)); |
| 1607 __ cmp(edx, eax); |
| 1608 __ j(equal, &runtime); |
| 1609 // For exception, throw the exception again. |
1605 | 1610 |
1606 // Clear pending exception. | 1611 // Clear the pending exception variable. |
1607 __ mov(Operand::StaticVariable(pending_exception), edx); | 1612 __ mov(Operand::StaticVariable(pending_exception), edx); |
1608 | 1613 |
1609 // Special handling of termination exceptions which are uncatchable | 1614 // Special handling of termination exceptions which are uncatchable |
1610 // by javascript code. | 1615 // by javascript code. |
1611 __ cmp(eax, factory->termination_exception()); | 1616 __ cmp(eax, factory->termination_exception()); |
1612 Label throw_termination_exception; | 1617 Label throw_termination_exception; |
1613 __ j(equal, &throw_termination_exception, Label::kNear); | 1618 __ j(equal, &throw_termination_exception, Label::kNear); |
1614 | 1619 |
1615 // Handle normal exception by following handler chain. | 1620 // Handle normal exception by following handler chain. |
1616 __ Throw(eax); | 1621 __ Throw(eax); |
(...skipping 3366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4983 Operand(ebp, 7 * kPointerSize), | 4988 Operand(ebp, 7 * kPointerSize), |
4984 NULL); | 4989 NULL); |
4985 } | 4990 } |
4986 | 4991 |
4987 | 4992 |
4988 #undef __ | 4993 #undef __ |
4989 | 4994 |
4990 } } // namespace v8::internal | 4995 } } // namespace v8::internal |
4991 | 4996 |
4992 #endif // V8_TARGET_ARCH_IA32 | 4997 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |