|
|
1 | #define CORO_CLONE 1 //D |
|
|
2 | |
1 | #include "libcoro/coro.c" |
3 | #include "libcoro/coro.c" |
2 | |
4 | |
3 | #define PERL_NO_GET_CONTEXT |
5 | #define PERL_NO_GET_CONTEXT |
4 | #define PERL_EXT |
6 | #define PERL_EXT |
5 | |
7 | |
… | |
… | |
101 | # define CvISXSUB_on(cv) (void)cv |
103 | # define CvISXSUB_on(cv) (void)cv |
102 | #endif |
104 | #endif |
103 | #ifndef CvISXSUB |
105 | #ifndef CvISXSUB |
104 | # define CvISXSUB(cv) (CvXSUB (cv) ? TRUE : FALSE) |
106 | # define CvISXSUB(cv) (CvXSUB (cv) ? TRUE : FALSE) |
105 | #endif |
107 | #endif |
|
|
108 | #ifndef Newx |
|
|
109 | # define Newx(ptr,nitems,type) New (0,ptr,nitems,type) |
|
|
110 | #endif |
106 | |
111 | |
107 | /* 5.8.7 */ |
112 | /* 5.8.7 */ |
108 | #ifndef SvRV_set |
113 | #ifndef SvRV_set |
109 | # define SvRV_set(s,v) SvRV(s) = (v) |
114 | # define SvRV_set(s,v) SvRV(s) = (v) |
110 | #endif |
115 | #endif |
… | |
… | |
347 | GV *gvp; |
352 | GV *gvp; |
348 | return sv_2cv (sv, &st, &gvp, 0); |
353 | return sv_2cv (sv, &st, &gvp, 0); |
349 | } |
354 | } |
350 | |
355 | |
351 | static AV * |
356 | static AV * |
352 | coro_clone_padlist (pTHX_ CV *cv) |
357 | coro_derive_padlist (pTHX_ CV *cv) |
353 | { |
358 | { |
354 | AV *padlist = CvPADLIST (cv); |
359 | AV *padlist = CvPADLIST (cv); |
355 | AV *newpadlist, *newpad; |
360 | AV *newpadlist, *newpad; |
356 | |
361 | |
357 | newpadlist = newAV (); |
362 | newpadlist = newAV (); |
… | |
… | |
477 | CV *cp = Perl_cv_clone (aTHX_ cv); |
482 | CV *cp = Perl_cv_clone (aTHX_ cv); |
478 | CvPADLIST (cv) = CvPADLIST (cp); |
483 | CvPADLIST (cv) = CvPADLIST (cp); |
479 | CvPADLIST (cp) = 0; |
484 | CvPADLIST (cp) = 0; |
480 | SvREFCNT_dec (cp); |
485 | SvREFCNT_dec (cp); |
481 | #else |
486 | #else |
482 | CvPADLIST (cv) = coro_clone_padlist (aTHX_ cv); |
487 | CvPADLIST (cv) = coro_derive_padlist (aTHX_ cv); |
483 | #endif |
488 | #endif |
484 | } |
489 | } |
485 | } |
490 | } |
486 | |
491 | |
487 | static void |
492 | static void |
… | |
… | |
2724 | XSRETURN_EMPTY; |
2729 | XSRETURN_EMPTY; |
2725 | } |
2730 | } |
2726 | |
2731 | |
2727 | /*****************************************************************************/ |
2732 | /*****************************************************************************/ |
2728 | |
2733 | |
|
|
2734 | #if CORO_CLONE |
|
|
2735 | # include "clone.c" |
|
|
2736 | #endif |
|
|
2737 | |
2729 | MODULE = Coro::State PACKAGE = Coro::State PREFIX = api_ |
2738 | MODULE = Coro::State PACKAGE = Coro::State PREFIX = api_ |
2730 | |
2739 | |
2731 | PROTOTYPES: DISABLE |
2740 | PROTOTYPES: DISABLE |
2732 | |
2741 | |
2733 | BOOT: |
2742 | BOOT: |
… | |
… | |
2871 | void |
2880 | void |
2872 | _exit (int code) |
2881 | _exit (int code) |
2873 | PROTOTYPE: $ |
2882 | PROTOTYPE: $ |
2874 | CODE: |
2883 | CODE: |
2875 | _exit (code); |
2884 | _exit (code); |
|
|
2885 | |
|
|
2886 | #if CORO_CLONE |
|
|
2887 | |
|
|
2888 | SV * |
|
|
2889 | clone (Coro::State coro) |
|
|
2890 | CODE: |
|
|
2891 | { |
|
|
2892 | struct coro *ncoro = coro_clone (coro); |
|
|
2893 | MAGIC *mg; |
|
|
2894 | /* TODO: too much duplication */ |
|
|
2895 | ncoro->hv = newHV (); |
|
|
2896 | mg = sv_magicext ((SV *)ncoro->hv, 0, CORO_MAGIC_type_state, &coro_state_vtbl, (char *)ncoro, 0); |
|
|
2897 | mg->mg_flags |= MGf_DUP; |
|
|
2898 | RETVAL = sv_bless (newRV_noinc ((SV *)ncoro->hv), SvSTASH (coro->hv)); |
|
|
2899 | } |
|
|
2900 | OUTPUT: |
|
|
2901 | RETVAL |
|
|
2902 | |
|
|
2903 | #endif |
2876 | |
2904 | |
2877 | int |
2905 | int |
2878 | cctx_stacksize (int new_stacksize = 0) |
2906 | cctx_stacksize (int new_stacksize = 0) |
2879 | PROTOTYPE: ;$ |
2907 | PROTOTYPE: ;$ |
2880 | CODE: |
2908 | CODE: |