/* 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);
}