Devel-MAT

 view release on metacpan or  search on metacpan

lib/Devel/MAT.xs  view on Meta::CPAN

  /* decr usage count */
  SV *count = HeVAL(ent);
  if(SvUV(count) > 1) {
    sv_setuv(count, SvUV(count) - 1);
    return;
  }

  hv_delete(strings, s, 0, G_DISCARD);
}

MODULE = Devel::MAT                PACKAGE = Devel::MAT::SV

void
_set_core_fields(self, type, df, addr, refcnt, size, blessed_at)
  HV   *self
  int   type
  SV   *df
  long  addr
  long  refcnt
  long  size
  long  blessed_at
CODE:
  {
    void *ptr;
    struct pmat_sv *sv;
    switch(type) {
      case 1: /* PMAT_SVtGLOB */
        Newx(ptr, 1, struct pmat_sv_glob); break;
      case 2: /* PMAT_SVtSCALAR */
      case 13: /* PMAT_SVtUNDEF */
      case 14: /* PMAT_SVtYES */
      case 15: /* PMAT_SVtNO */
        Newx(ptr, 1, struct pmat_sv_scalar); break;
      case 3: /* PMAT_SVtREF */
        Newx(ptr, 1, struct pmat_sv_ref); break;
      case 4: /* PMAT_SVtARRAY */
        Newx(ptr, 1, struct pmat_sv_array); break;
      case 5: /* PMAT_SVtHASH */
      case 6: /* PMAT_SVtSTASH */
      case 17: /* PMAT_SVtCLASS */
        Newx(ptr, 1, struct pmat_sv_hash); break;
      case 7: /* PMAT_SVtCODE */
        Newx(ptr, 1, struct pmat_sv_code); break;
      case 16: /* PMAT_SVtOBJECT */
        Newx(ptr, 1, struct pmat_sv_object); break;
      case 0x7F: /* PMAT_SVtSTRUCT */
        Newx(ptr, 1, struct pmat_sv_struct); break;
      default:
        Newx(ptr, 1, struct pmat_sv); break;
    }

    sv = ptr;

    sv->df         = newSVsv(df);
    sv->addr       = addr;
    sv->refcnt     = refcnt;
    sv->size       = size;
    sv->blessed_at = blessed_at;
    sv->glob_at    = 0;

    sv_rvweaken(sv->df);

    sv_magicext((SV *)self, NULL, PERL_MAGIC_ext, &vtbl, (char *)sv, 0);
  }

void DESTROY(self)
  HV   *self
CODE:
  {
    struct pmat_sv *sv = get_pmat_sv(self);
    free_pmat_sv(sv);
  }

void
_set_glob_at(self, glob_at)
  HV   *self
  long  glob_at
CODE:
  {
    struct pmat_sv *sv = get_pmat_sv(self);
    sv->glob_at = glob_at;
  }

SV *df(self)
  HV   *self
CODE:
  {
    struct pmat_sv *sv = get_pmat_sv(self);
    RETVAL = SvREFCNT_inc(sv->df); /* return it directly */
  }
OUTPUT:
  RETVAL

long addr(self)
  HV   *self
ALIAS:
  addr       = 0
  refcnt     = 1
  size       = 2
  blessed_at = 3
  glob_at    = 4
CODE:
  {
    struct pmat_sv *sv = get_pmat_sv(self);
    if(sv)
      switch(ix) {
        case 0: RETVAL = sv->addr;       break;
        case 1: RETVAL = sv->refcnt;     break;
        case 2: RETVAL = sv->size;       break;
        case 3: RETVAL = sv->blessed_at; break;
        case 4: RETVAL = sv->glob_at;    break;
      }
  }
OUTPUT:
  RETVAL

MODULE = Devel::MAT                PACKAGE = Devel::MAT::SV::GLOB

void
_set_glob_fields(self, stash_at, scalar_at, array_at, hash_at, code_at, egv_at, io_at, form_at, name_hek, line, file, name)
  HV   *self



( run in 0.838 second using v1.01-cache-2.11-cpan-7f9471e7e0a )