X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Upper.xs;h=6a0b35e77bfb733c038838f378c8001b7e7c88eb;hb=7c5f28e56c17629e34fa0b2e6e4626e040f9c21d;hp=f55b18cd04f8580ce68e7fa201b7c876dccf9404;hpb=6dcecbd373fc489246bf75ad4472312d92216551;p=perl%2Fmodules%2FScope-Upper.git diff --git a/Upper.xs b/Upper.xs index f55b18c..6a0b35e 100644 --- a/Upper.xs +++ b/Upper.xs @@ -729,6 +729,40 @@ done: ST(0) = sv_2mortal(newSViv(level)); XSRETURN(1); +void +want_at(...) +PROTOTYPE: ;$ +PREINIT: + I32 cxix = cxstack_ix, level = 0; +PPCODE: + if (items) { + SV *lsv = ST(0); + if (SvOK(lsv)) + level = SvIV(lsv); + if (level < 0) + level = 0; + else if (level > cxix) + level = cxix; + } + cxix -= level; + while (cxix > 0) { + PERL_CONTEXT *cx = cxstack + cxix--; + switch (CxTYPE(cx)) { + case CXt_SUB: + case CXt_EVAL: + case CXt_FORMAT: { + I32 gimme = cx->blk_gimme; + switch (gimme) { + case G_VOID: XSRETURN_UNDEF; break; + case G_SCALAR: XSRETURN_NO; break; + case G_ARRAY: XSRETURN_YES; break; + } + break; + } + } + } + XSRETURN_UNDEF; + void reap(SV *hook, ...) PROTOTYPE: &;$