File: newMYCONSTSUB.c.inc

package info (click to toggle)
libobject-pad-perl 0.823-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 944 kB
  • sloc: ansic: 3,404; perl: 3,372; pascal: 28; makefile: 3
file content (33 lines) | stat: -rw-r--r-- 1,091 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* 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);
}