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_MIPS | 7 #if V8_TARGET_ARCH_MIPS |
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 2652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2663 // last_match_info_elements: Last match info elements (callee saved) | 2663 // last_match_info_elements: Last match info elements (callee saved) |
2664 // Check the result. | 2664 // Check the result. |
2665 Label success; | 2665 Label success; |
2666 __ Branch(&success, eq, v0, Operand(1)); | 2666 __ Branch(&success, eq, v0, Operand(1)); |
2667 // We expect exactly one result since we force the called regexp to behave | 2667 // We expect exactly one result since we force the called regexp to behave |
2668 // as non-global. | 2668 // as non-global. |
2669 Label failure; | 2669 Label failure; |
2670 __ Branch(&failure, eq, v0, Operand(NativeRegExpMacroAssembler::FAILURE)); | 2670 __ Branch(&failure, eq, v0, Operand(NativeRegExpMacroAssembler::FAILURE)); |
2671 // If not exception it can only be retry. Handle that in the runtime system. | 2671 // If not exception it can only be retry. Handle that in the runtime system. |
2672 __ Branch(&runtime, ne, v0, Operand(NativeRegExpMacroAssembler::EXCEPTION)); | 2672 __ Branch(&runtime, ne, v0, Operand(NativeRegExpMacroAssembler::EXCEPTION)); |
2673 | 2673 // Result must now be exception. If there is no pending exception already a |
2674 // Result must now be exception. | 2674 // stack overflow (on the backtrack stack) was detected in RegExp code but |
| 2675 // haven't created the exception yet. Handle that in the runtime system. |
| 2676 // TODO(592): Rerunning the RegExp to get the stack overflow exception. |
2675 __ li(a1, Operand(isolate()->factory()->the_hole_value())); | 2677 __ li(a1, Operand(isolate()->factory()->the_hole_value())); |
2676 __ li(a2, Operand(ExternalReference(Isolate::kPendingExceptionAddress, | 2678 __ li(a2, Operand(ExternalReference(Isolate::kPendingExceptionAddress, |
2677 isolate()))); | 2679 isolate()))); |
2678 __ lw(v0, MemOperand(a2, 0)); | 2680 __ lw(v0, MemOperand(a2, 0)); |
| 2681 __ Branch(&runtime, eq, v0, Operand(a1)); |
| 2682 |
2679 __ sw(a1, MemOperand(a2, 0)); // Clear pending exception. | 2683 __ sw(a1, MemOperand(a2, 0)); // Clear pending exception. |
2680 | 2684 |
2681 // Check if the exception is a termination. If so, throw as uncatchable. | 2685 // Check if the exception is a termination. If so, throw as uncatchable. |
2682 __ LoadRoot(a0, Heap::kTerminationExceptionRootIndex); | 2686 __ LoadRoot(a0, Heap::kTerminationExceptionRootIndex); |
2683 Label termination_exception; | 2687 Label termination_exception; |
2684 __ Branch(&termination_exception, eq, v0, Operand(a0)); | 2688 __ Branch(&termination_exception, eq, v0, Operand(a0)); |
2685 | 2689 |
2686 __ Throw(v0); | 2690 __ Throw(v0); |
2687 | 2691 |
2688 __ bind(&termination_exception); | 2692 __ bind(&termination_exception); |
(...skipping 2606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5295 MemOperand(fp, 6 * kPointerSize), | 5299 MemOperand(fp, 6 * kPointerSize), |
5296 NULL); | 5300 NULL); |
5297 } | 5301 } |
5298 | 5302 |
5299 | 5303 |
5300 #undef __ | 5304 #undef __ |
5301 | 5305 |
5302 } } // namespace v8::internal | 5306 } } // namespace v8::internal |
5303 | 5307 |
5304 #endif // V8_TARGET_ARCH_MIPS | 5308 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |