… | |
… | |
588 | dTHX; |
588 | dTHX; |
589 | |
589 | |
590 | transfer_tail (); |
590 | transfer_tail (); |
591 | |
591 | |
592 | PL_top_env = &PL_start_env; |
592 | PL_top_env = &PL_start_env; |
593 | PL_restartop = PL_op->op_next; |
593 | PL_restartop = PL_op; |
594 | /* somebody will hit me for both perl_run and PL_restart_top */ |
594 | /* somebody will hit me for both perl_run and PL_restart_top */ |
595 | perl_run (aTHX_ PERL_GET_CONTEXT); |
595 | perl_run (aTHX_ PERL_GET_CONTEXT); |
596 | |
596 | |
597 | abort (); |
597 | abort (); |
598 | } |
598 | } |
… | |
… | |
650 | Safefree (stack); |
650 | Safefree (stack); |
651 | } |
651 | } |
652 | |
652 | |
653 | static coro_stack *stack_first; |
653 | static coro_stack *stack_first; |
654 | |
654 | |
655 | static void |
655 | static coro_stack * |
656 | stack_get (struct coro *coro) |
656 | stack_get () |
657 | { |
657 | { |
|
|
658 | coro_stack *stack; |
|
|
659 | |
658 | if (stack_first) |
660 | if (stack_first) |
659 | { |
661 | { |
660 | coro->stack = stack_first; |
662 | stack = stack_first; |
661 | stack_first = stack_first->next; |
663 | stack_first = stack->next; |
662 | } |
664 | } |
663 | else |
665 | else |
|
|
666 | { |
664 | coro->stack = stack_new (); |
667 | stack = stack_new (); |
|
|
668 | PL_op = PL_op->op_next; |
|
|
669 | } |
|
|
670 | |
|
|
671 | return stack; |
665 | } |
672 | } |
666 | |
673 | |
667 | static void |
674 | static void |
668 | stack_put (coro_stack *stack) |
675 | stack_put (coro_stack *stack) |
669 | { |
676 | { |
… | |
… | |
686 | if (prev != next) |
693 | if (prev != next) |
687 | { |
694 | { |
688 | coro_stack *prev_stack = prev->stack; |
695 | coro_stack *prev_stack = prev->stack; |
689 | |
696 | |
690 | /* possibly "free" the stack */ |
697 | /* possibly "free" the stack */ |
691 | if (prev_stack->idle_sp == stacklevel) |
698 | if (0 && prev_stack->idle_sp == stacklevel) |
692 | { |
699 | { |
693 | stack_put (prev_stack); |
700 | stack_put (prev_stack); |
694 | prev->stack = 0; |
701 | prev->stack = 0; |
695 | } |
702 | } |
696 | |
703 | |
… | |
… | |
710 | /* need to change stack from main_stack to real one */ |
717 | /* need to change stack from main_stack to real one */ |
711 | next->stack = 0; |
718 | next->stack = 0; |
712 | } |
719 | } |
713 | |
720 | |
714 | if (!next->stack) |
721 | if (!next->stack) |
715 | stack_get (next); |
722 | next->stack = stack_get (); |
716 | |
723 | |
717 | if (prev_stack != next->stack) |
724 | if (prev_stack != next->stack) |
718 | coro_transfer (&prev_stack->cctx, &next->stack->cctx); |
725 | coro_transfer (&prev_stack->cctx, &next->stack->cctx); |
719 | } |
726 | } |
720 | |
727 | |