Class-XSConstructor

 view release on metacpan or  search on metacpan

XSConstructor.xs  view on Meta::CPAN

    dTHX;
    CV *cv = newXS(name, XS_Class__XSConstructor_reader, (char*)__FILE__);
    if (cv == NULL)
        croak("ARG! Something went really wrong while installing a new XSUB!");

    xscon_reader_t *sig;
    Newxz(sig, 1, xscon_reader_t);
    sig->slot           = savepv(slot);
    sig->has_default    = has_default;
    sig->default_flags  = default_flags;
    sig->default_sv     = SvREFCNT_inc(default_sv);
    sig->check_flags    = check_flags;
    
    if (check && IsCodeRef(check)) {
        sig->has_check = TRUE;
        sig->check_cv = (CV *)SvREFCNT_inc(SvRV(check));
    }
    else {
        sig->has_check = FALSE;
        sig->check_cv = NULL;
    }
    
    if (coercion && IsCodeRef(coercion)) {
        sig->has_coercion = TRUE;
        sig->coercion_cv = (CV *)SvREFCNT_inc(SvRV(coercion));
    }
    else {
        sig->has_coercion = FALSE;
        sig->coercion_cv = NULL;
    }

    SV *cloner = &PL_sv_undef;
    if (items >= 9) {
        cloner = ST(8);
    }

    if (cloner && IsCodeRef(cloner)) {
        sig->should_clone = TRUE;
        sig->cloner_cv = (CV *)SvREFCNT_inc(SvRV(cloner));
    }
    else if (cloner && SvTRUE(cloner)) {
        sig->should_clone = TRUE;
        sig->cloner_cv = NULL;
    }
    else {
        sig->has_coercion = FALSE;
        sig->coercion_cv = NULL;
    }

    CvXSUBANY(cv).any_ptr = sig;
}

void
clone(self, depth=-1)
    SV *self
    int depth
    PREINIT:
    SV *clone = &PL_sv_undef;
    HV *hseen = newHV();
    AV *weakrefs = newAV();
    PPCODE:
    TRACEME(("ref = 0x%x\n", self));
    clone = sv_clone( aTHX_ self, hseen, depth, 0, weakrefs );
    /* Now apply deferred weakening.
     * All strong references in the clone graph are established,
     * so it is safe to weaken references without destroying referents. */
    HANDLE_WEAKREFS( weakrefs );
    hv_clear(hseen);  /* Free HV */
    SvREFCNT_dec((SV *)hseen);
    EXTEND(SP,1);
    PUSHs(sv_2mortal(clone));



( run in 0.930 second using v1.01-cache-2.11-cpan-71847e10f99 )