/* vi: set ft=c : */ #define newMYCONSTSUB(nameop, sv) S_newMYCONSTSUB(aTHX_ nameop, sv) static CV *S_newMYCONSTSUB(pTHX_ OP *nameop, SV *sv) { I32 floor_ix = start_subparse(FALSE, 0); SvREFCNT_inc(PL_compcv); OP *protoop = newSVOP(OP_CONST, 0, newSVpvs("")); OP *body = newSVOP(OP_CONST, 0, SvREFCNT_inc(sv)); CV *cv = newMYSUB(floor_ix, nameop, protoop, NULL, body); CvCONST_on(cv); return cv; } /* TODO: define a _named_pvn() variant that takes char*,STRLEN,U32 */ #define newMYCONSTSUB_named_sv(lexname, sv) S_newMYCONSTSUB_named_sv(aTHX_ lexname, sv) static CV *S_newMYCONSTSUB_named_sv(pTHX_ SV *lexname, SV *sv) { /* Need to allocate pad name in the calling sub, before we start_subparse() */ SV *ampname = newSVpvf("&%" SVf, SVfARG(lexname)); SAVEFREESV(ampname); /* Strictly, nameop should be an OP_PADANY, but since newMYSUB() only cares * about o->op_targ and newPADxVOP() doesn't like OP_PADANY, we'll use an * OP_PADCV instead */ return newMYCONSTSUB( newPADxVOP(OP_PADCV, 0, pad_add_name_sv(ampname, 0, NULL, NULL)), sv); }