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 )