… | |
… | |
2 | #define USE_NO_MINGW_SETJMP_TWO_ARGS |
2 | #define USE_NO_MINGW_SETJMP_TWO_ARGS |
3 | |
3 | |
4 | #define NDEBUG 1 /* perl usually disables NDEBUG later */ |
4 | #define NDEBUG 1 /* perl usually disables NDEBUG later */ |
5 | |
5 | |
6 | #include "libcoro/coro.c" |
6 | #include "libcoro/coro.c" |
|
|
7 | |
|
|
8 | #if CORO_UCONTEXT |
|
|
9 | #define CORO_BACKEND "ucontext" |
|
|
10 | #elif CORO_SJLJ |
|
|
11 | #define CORO_BACKEND "sjlj" |
|
|
12 | #elif CORO_LINUX |
|
|
13 | #define CORO_BACKEND "linux" |
|
|
14 | #elif CORO_LOSER |
|
|
15 | #define CORO_BACKEND "loser" |
|
|
16 | #elif CORO_FIBER |
|
|
17 | #define CORO_BACKEND "fiber" |
|
|
18 | #elif CORO_IRIX |
|
|
19 | #define CORO_BACKEND "irix" |
|
|
20 | #elif CORO_ASM |
|
|
21 | #define CORO_BACKEND "asm" |
|
|
22 | #elif CORO_PTHREAD |
|
|
23 | #define CORO_BACKEND "pthread" |
|
|
24 | #else |
|
|
25 | #define CORO_BACKEND "unknown" |
|
|
26 | #endif |
7 | |
27 | |
8 | #define PERL_NO_GET_CONTEXT |
28 | #define PERL_NO_GET_CONTEXT |
9 | #define PERL_EXT |
29 | #define PERL_EXT |
10 | |
30 | |
11 | #include "EXTERN.h" |
31 | #include "EXTERN.h" |
… | |
… | |
1222 | myop.op_next = Nullop; |
1242 | myop.op_next = Nullop; |
1223 | myop.op_type = OP_ENTERSUB; |
1243 | myop.op_type = OP_ENTERSUB; |
1224 | myop.op_flags = OPf_WANT_VOID; |
1244 | myop.op_flags = OPf_WANT_VOID; |
1225 | |
1245 | |
1226 | PUSHMARK (SP); |
1246 | PUSHMARK (SP); |
1227 | PUSHs ((SV *)coro->startcv); |
1247 | XPUSHs ((SV *)coro->startcv); |
1228 | PUTBACK; |
1248 | PUTBACK; |
1229 | PL_op = (OP *)&myop; |
1249 | PL_op = (OP *)&myop; |
1230 | PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); |
1250 | PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); |
1231 | } |
1251 | } |
1232 | |
1252 | |
… | |
… | |
1380 | av_push (av, SvREFCNT_inc_NN (*bot++)); |
1400 | av_push (av, SvREFCNT_inc_NN (*bot++)); |
1381 | |
1401 | |
1382 | PL_runops = RUNOPS_DEFAULT; |
1402 | PL_runops = RUNOPS_DEFAULT; |
1383 | ENTER; |
1403 | ENTER; |
1384 | SAVETMPS; |
1404 | SAVETMPS; |
|
|
1405 | PUSHMARK (SP); |
1385 | EXTEND (SP, 3); |
1406 | EXTEND (SP, 3); |
1386 | PUSHMARK (SP); |
|
|
1387 | PUSHs (&PL_sv_no); |
1407 | PUSHs (&PL_sv_no); |
1388 | PUSHs (fullname); |
1408 | PUSHs (fullname); |
1389 | PUSHs (sv_2mortal (newRV_noinc ((SV *)av))); |
1409 | PUSHs (sv_2mortal (newRV_noinc ((SV *)av))); |
1390 | PUTBACK; |
1410 | PUTBACK; |
1391 | cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); |
1411 | cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); |
… | |
… | |
1418 | gv_efullname3 (fullname, gv, 0); |
1438 | gv_efullname3 (fullname, gv, 0); |
1419 | |
1439 | |
1420 | PL_runops = RUNOPS_DEFAULT; |
1440 | PL_runops = RUNOPS_DEFAULT; |
1421 | ENTER; |
1441 | ENTER; |
1422 | SAVETMPS; |
1442 | SAVETMPS; |
|
|
1443 | PUSHMARK (SP); |
1423 | EXTEND (SP, 3); |
1444 | EXTEND (SP, 3); |
1424 | PUSHMARK (SP); |
|
|
1425 | PUSHs (&PL_sv_yes); |
1445 | PUSHs (&PL_sv_yes); |
1426 | PUSHs (fullname); |
1446 | PUSHs (fullname); |
1427 | PUSHs (CxHASARGS (cx) ? sv_2mortal (newRV_inc (SUB_ARGARRAY)) : &PL_sv_undef); |
1447 | PUSHs (CxHASARGS (cx) ? sv_2mortal (newRV_inc (SUB_ARGARRAY)) : &PL_sv_undef); |
1428 | PUTBACK; |
1448 | PUTBACK; |
1429 | cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); |
1449 | cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); |
… | |
… | |
1442 | dSP; |
1462 | dSP; |
1443 | |
1463 | |
1444 | PL_runops = RUNOPS_DEFAULT; |
1464 | PL_runops = RUNOPS_DEFAULT; |
1445 | ENTER; |
1465 | ENTER; |
1446 | SAVETMPS; |
1466 | SAVETMPS; |
1447 | EXTEND (SP, 3); |
|
|
1448 | PL_runops = RUNOPS_DEFAULT; |
|
|
1449 | PUSHMARK (SP); |
1467 | PUSHMARK (SP); |
|
|
1468 | EXTEND (SP, 2); |
1450 | PUSHs (sv_2mortal (newSVpv (OutCopFILE (oldcop), 0))); |
1469 | PUSHs (sv_2mortal (newSVpv (OutCopFILE (oldcop), 0))); |
1451 | PUSHs (sv_2mortal (newSViv (CopLINE (oldcop)))); |
1470 | PUSHs (sv_2mortal (newSViv (CopLINE (oldcop)))); |
1452 | PUTBACK; |
1471 | PUTBACK; |
1453 | cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_line_cb", sizeof ("_trace_line_cb") - 1, 0); |
1472 | cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_line_cb", sizeof ("_trace_line_cb") - 1, 0); |
1454 | if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); |
1473 | if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); |
… | |
… | |
3675 | rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV)); |
3694 | rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV)); |
3676 | rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV)); |
3695 | rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV)); |
3677 | |
3696 | |
3678 | coro_state_stash = gv_stashpv ("Coro::State", TRUE); |
3697 | coro_state_stash = gv_stashpv ("Coro::State", TRUE); |
3679 | |
3698 | |
|
|
3699 | newCONSTSUB (coro_state_stash, "BACKEND", newSVpv (CORO_BACKEND, 0)); /* undocumented */ |
|
|
3700 | |
3680 | newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE)); |
3701 | newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE)); |
3681 | newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB)); |
3702 | newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB)); |
3682 | newCONSTSUB (coro_state_stash, "CC_TRACE_LINE", newSViv (CC_TRACE_LINE)); |
3703 | newCONSTSUB (coro_state_stash, "CC_TRACE_LINE", newSViv (CC_TRACE_LINE)); |
3683 | newCONSTSUB (coro_state_stash, "CC_TRACE_ALL" , newSViv (CC_TRACE_ALL)); |
3704 | newCONSTSUB (coro_state_stash, "CC_TRACE_ALL" , newSViv (CC_TRACE_ALL)); |
3684 | |
3705 | |
… | |
… | |
3808 | call (Coro::State coro, SV *coderef) |
3829 | call (Coro::State coro, SV *coderef) |
3809 | ALIAS: |
3830 | ALIAS: |
3810 | eval = 1 |
3831 | eval = 1 |
3811 | CODE: |
3832 | CODE: |
3812 | { |
3833 | { |
|
|
3834 | struct coro *current = SvSTATE_current; |
|
|
3835 | |
3813 | if (coro->mainstack && ((coro->flags & CF_RUNNING) || coro->slot)) |
3836 | if ((coro == current) || (coro->mainstack && ((coro->flags & CF_RUNNING) || coro->slot))) |
3814 | { |
3837 | { |
3815 | struct coro *current = SvSTATE_current; |
|
|
3816 | struct CoroSLF slf_save; |
3838 | struct CoroSLF slf_save; |
3817 | |
3839 | |
3818 | if (current != coro) |
3840 | if (current != coro) |
3819 | { |
3841 | { |
3820 | PUTBACK; |
3842 | PUTBACK; |