1 /* This file is part of the Sub::Op Perl module.
2 * See http://search.cpan.org/dist/Sub-Op/ */
4 #define PERL_NO_GET_CONTEXT
9 #define __PACKAGE__ "Sub::Op::LexicalSub"
10 #define __PACKAGE_LEN__ (sizeof(__PACKAGE__)-1)
14 STATIC PADOFFSET sols_find_sv_in_curpad(pTHX_ SV *sv) {
15 #define sols_find_sv_in_curpad(S) sols_find_sv_in_curpad(aTHX_ (S))
17 AV *padlist = CvPADLIST(PL_compcv);
18 AV *comppad = (AV *) AvARRAY(padlist)[1];
19 SV **curpad = AvARRAY(comppad);
21 for (ix = AvFILLp(comppad); ix > 0; --ix) {
29 STATIC OP *sols_call(pTHX_ OP *o, void *ud_) {
30 OP *gvop, *last_arg, *rv2cv;
34 gvop = sub_op_study(o, &last_arg, &rv2cv);
39 CvDEPTH(CvOUTSIDE(cv))++;
40 anon = newSVOP(OP_ANONCODE, 0, (SV *) Perl_cv_clone(aTHX_ (CV *) cv));
41 CvDEPTH(CvOUTSIDE(cv))--;
43 last_arg->op_sibling = newUNOP(OP_REFGEN, 0, anon);
47 SV *gv = (SV *) CvGV(cv);
50 PAD_SVl(cPADOPx(gvop)->op_padix) = gv;
52 cSVOPx(gvop)->op_sv = gv;
60 /* --- XS ------------------------------------------------------------------ */
62 MODULE = Sub::Op::LexicalSub PACKAGE = Sub::Op::LexicalSub
67 _init(SV *name, SV *cb)
74 if (SvTYPE(cb) >= SVt_PVCV) {
76 c.name = SvPV_const(name, c.namelen);
77 if (SvPOK(cb)) { /* Sub is prototyped */
78 c.proto = SvPV_const(cb, c.protolen);
81 c.ud = SvREFCNT_inc(cb);
82 sub_op_register(aTHX_ &c, 0);