| 2597 | } |
| 2598 | |
| 2599 | static int |
| 2600 | npy_atry_collapse(char *arr, npy_intp *tosort, run *stack, npy_intp *stack_ptr, |
| 2601 | buffer_intp *buffer, size_t len, PyArray_CompareFunc *cmp, |
| 2602 | PyArrayObject *py_arr) |
| 2603 | { |
| 2604 | int ret; |
| 2605 | npy_intp A, B, C, top; |
| 2606 | top = *stack_ptr; |
| 2607 | |
| 2608 | while (1 < top) { |
| 2609 | B = stack[top - 2].l; |
| 2610 | C = stack[top - 1].l; |
| 2611 | |
| 2612 | if ((2 < top && stack[top - 3].l <= B + C) || |
| 2613 | (3 < top && stack[top - 4].l <= stack[top - 3].l + B)) { |
| 2614 | A = stack[top - 3].l; |
| 2615 | |
| 2616 | if (A <= C) { |
| 2617 | ret = npy_amerge_at(arr, tosort, stack, top - 3, buffer, len, |
| 2618 | cmp, py_arr); |
| 2619 | |
| 2620 | if (NPY_UNLIKELY(ret < 0)) { |
| 2621 | return ret; |
| 2622 | } |
| 2623 | |
| 2624 | stack[top - 3].l += B; |
| 2625 | stack[top - 2] = stack[top - 1]; |
| 2626 | --top; |
| 2627 | } |
| 2628 | else { |
| 2629 | ret = npy_amerge_at(arr, tosort, stack, top - 2, buffer, len, |
| 2630 | cmp, py_arr); |
| 2631 | |
| 2632 | if (NPY_UNLIKELY(ret < 0)) { |
| 2633 | return ret; |
| 2634 | } |
| 2635 | |
| 2636 | stack[top - 2].l += C; |
| 2637 | --top; |
| 2638 | } |
| 2639 | } |
| 2640 | else if (1 < top && B <= C) { |
| 2641 | ret = npy_amerge_at(arr, tosort, stack, top - 2, buffer, len, cmp, |
| 2642 | py_arr); |
| 2643 | |
| 2644 | if (NPY_UNLIKELY(ret < 0)) { |
| 2645 | return ret; |
| 2646 | } |
| 2647 | |
| 2648 | stack[top - 2].l += C; |
| 2649 | --top; |
| 2650 | } |
| 2651 | else { |
| 2652 | break; |
| 2653 | } |
| 2654 | } |
| 2655 | |
| 2656 | *stack_ptr = top; |
no test coverage detected