Class-XSConstructor
view release on metacpan or search on metacpan
xshelper.h
Copyright: Unknown
License: Unknown
Files: t/05strictconstructor.t
t/06inherit-from.t
t/07coercion.t
t/08defaults.t
t/09initarg.t
t/10triggers.t
t/11weaken.t
Copyright: This software is copyright (c) 2025 by Toby Inkster.
License: GPL-1.0+ or Artistic-1.0
Files: t/01basic.t
t/02types.t
t/03typetiny.t
t/04build.t
Copyright: This software is copyright (c) 2018-2019 by Toby Inkster.
License: GPL-1.0+ or Artistic-1.0
#define CLONE_FETCH(x) (hv_fetch(hseen, CLONE_KEY(x), PTRSIZE, 0))
#define PUSH_WEAKREFS(weakrefs, val) av_push( weakrefs, SvREFCNT_inc_simple_NN(val) )
#define HANDLE_WEAKREFS(weakrefs) \
do { \
I32 i; \
I32 len = av_len((weakrefs)); \
for ( i = 0; i <= len; i++ ) { \
SV **svp = av_fetch( (weakrefs), i, 0 ); \
if ( svp && *svp && SvROK(*svp) ) sv_rvweaken(*svp); \
} \
SvREFCNT_dec( (SV *)(weakrefs) ); \
} while (0)
static SV *hv_clone (pTHX_ SV *, SV *, HV *, int, int, AV *);
static SV *av_clone (pTHX_ SV *, SV *, HV *, int, int, AV *);
static SV *sv_clone (pTHX_ SV *, HV *, int, int, AV *);
/* static SV *rv_clone (pTHX_ SV *, HV *, int, int, AV *); */
static SV *av_clone_iterative(pTHX_ SV *, HV *, int, AV *);
clone = av_clone( aTHX_ ref, clone, hseen, depth, rdepth, weakrefs );
/* 3: REFERENCE (inlined for speed) */
else if ( SvROK(ref) ) {
TRACEME(("clone = 0x%x(%d)\n", clone, SvREFCNT(clone)));
SvREFCNT_dec( SvRV(clone) );
SvRV(clone) = sv_clone( aTHX_ SvRV(ref), hseen, depth, rdepth, weakrefs ); /* Clone the referent */
if ( sv_isobject(ref) ) {
sv_bless( clone, SvSTASH( SvRV(ref) ) );
}
if ( SvWEAKREF(ref) ) {
/* Defer weakening until after the entire clone graph is built.
* sv_rvweaken decrements the referent's refcount, which can
* destroy it if no other strong references exist yet.
* By deferring, we ensure all strong references are in place
* before any weakening occurs. */
PUSH_WEAKREFS( weakrefs, clone );
}
}
TRACEME(("clone = 0x%x(%d)\n", clone, SvREFCNT(clone)));
return clone;
}
t/02types.t
t/03typenano.t
t/03typetiny.t
t/04build.t
t/05strictconstructor.t
t/06inherit-from.t
t/07coercion.t
t/08defaults.t
t/09initarg.t
t/10triggers.t
t/11weaken.t
t/12aliases.t
t/13slotinit.t
t/14undeftolerant.t
t/15cloneonwrite.t
t/30buildargs.t
t/31foreignconstructor.t
t/32foreignbuildargs.t
t/33buildall.t
t/40layercake.t
t/90clearer.t
SHA256 f1d68184449f93d0acb645db25f3add7c431bb4804010f86d6e537d0d56a5596 t/02types.t
SHA256 e357c7c869b857f2bdacfc05493349421b9c0433c5fd7f15518c126ee59ee6b7 t/03typenano.t
SHA256 236d83af773573d506cb76e153e3cccbe25c0987335e4cb521ff8c077e742605 t/03typetiny.t
SHA256 4db300e786ea25d8427e719a2c234de7e3ae4ed9209c963c0a6ea2c44297c988 t/04build.t
SHA256 0cec6524a101f84481c098df6c97afb88623de2c1929c9cbde645a24eefb8dfa t/05strictconstructor.t
SHA256 6df2cf575fb2c6c0de86b27e6dc86b71a920bba988795398ba0bd0fc92cbafb5 t/06inherit-from.t
SHA256 a6c8a1720b1eb00899a2a0efe1ba38b98add73c3afe0b91989fd92488390bc23 t/07coercion.t
SHA256 c82802938d59927447626abb2dd2277fbc5806632c642565de235949ccc62b52 t/08defaults.t
SHA256 5b1300b5a6672f01ba6ed0742a800f86fd60e417c8754dcc2cabd12895fcd700 t/09initarg.t
SHA256 077027b2e3c21baa12713fcd107c15c6a17c594e900f4e6434c46a3c088ed584 t/10triggers.t
SHA256 0b2c3cd6f347378bec79cb93170825484aa6f816256f882af3cb02ea19022618 t/11weaken.t
SHA256 7615e36aa61bb44362c577329c49e3fb7fd989d1b90bbd707c2a14fdd6e3a877 t/12aliases.t
SHA256 4b30cd2c6ac814b89fda8d71157cea7f33ef57c2c22309c083b9f82d28796a94 t/13slotinit.t
SHA256 ba4f75156d9e1f59fbb6178df7b0c470b5b0e639f2ce18b325bc61935382b025 t/14undeftolerant.t
SHA256 c95e5c3977c540316e6be708dd9742720e0214676c958331025eb9f47ee30cc1 t/15cloneonwrite.t
SHA256 658681e89818012a4ad6f67830db1d8b0fda067e92ae99555b70f23c8e13c665 t/30buildargs.t
SHA256 76424703dc4e96f8c707cc19ebe94c054708db7cc3bcad9bef8bbdf1a9ba7485 t/31foreignconstructor.t
SHA256 43101bc32a22e5691c45e46ebcb529e21dd13ac5f83d4ec4204b31787363e1e1 t/32foreignbuildargs.t
SHA256 3b1d73036e0fc173ab5d9048e652e1788c5584a17a3c22cf1a855d7c775cac51 t/33buildall.t
SHA256 1f01d586436e67ad0174ad28c7de209acea6c00d684afd0a94da9328d2832468 t/40layercake.t
SHA256 56b47a8459e21c4afdaf9bfca094faaa2ef3d693a2791ba27e667b5fca8e5f4e t/90clearer.t
XSConstructor.xs view on Meta::CPAN
croak("Called on a placeholder");
}
if(mg_find((SV*)args, PERL_MAGIC_tied)){
croak("You cannot use tied HASH reference as initializing arguments");
}
I32 i;
int used = 0;
/* we can weaken everything at the end */
AV *weakrefs = NULL;
/* copy allowed attributes */
for (i = 0; i < sig->num_params; i++) {
xscon_param_t *param = &sig->params[i];
int flags = param->flags;
char *keyname = param->name;
int keylen = strlen(param->name);
char *init_arg = param->init_arg;
int init_arg_len = -1;
XSConstructor.xs view on Meta::CPAN
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));
sv_resetpvn|5.017005||Viu
SvRMAGICAL|5.003007||Viu
SvRMAGICAL_off|5.003007||Viu
SvRMAGICAL_on|5.003007||Viu
SvROK|5.003007|5.003007|
SvROK_off|5.003007|5.003007|
SvROK_on|5.003007|5.003007|
SvRV|5.003007|5.003007|
SvRV_const|5.010001||Viu
SvRV_set|5.009003|5.003007|p
sv_rvunweaken|5.027004|5.027004|
sv_rvweaken|5.006000|5.006000|
SvRVx|5.003007||Viu
SvRX|5.009005|5.003007|p
SvRXOK|5.009005|5.003007|p
SV_SAVED_COPY|5.009005||Viu
SvSCREAM|5.003007||Viu
SvSCREAM_off|5.003007||Viu
SvSCREAM_on|5.003007||Viu
sv_setbool|5.035004|5.035004|
sv_setbool_mg|5.035004|5.035004|
sv_setgid|5.019001||Viu
( run in 1.427 second using v1.01-cache-2.11-cpan-39bf76dae61 )