Branch Coverage

lib/Data/Clone.xs
Criterion Covered Total %
branch 89 124 71.7


line true false branch
35 8 363 SvGETMAGIC(cloning);
37 267 104 if(SvROK(cloning)){
56 110 90 while((iter = hv_iternext(cloning))){
73 92 52 for(i = 0; i <= last; i++){
75 92 0 if(svp){
86 145 6 if(he && isGV(HeVAL(he)) && GvCV((GV*)HeVAL(he))){ /* shortcut */
145 0 if(he && isGV(HeVAL(he)) && GvCV((GV*)HeVAL(he))){ /* shortcut */
10 135 if(he && isGV(HeVAL(he)) && GvCV((GV*)HeVAL(he))){ /* shortcut */
96 3 138 if(SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_backref)) {
0 3 if(SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_backref)) {
100 105 33 else if(SvTYPE(sv) == SVt_PVHV){
101 8 97 return SvOOK(sv) && HvAUX((HV*)sv)->xhv_backreferences != NULL;
5 3 return SvOOK(sv) && HvAUX((HV*)sv)->xhv_backreferences != NULL;
114 329 99 for (i = startingblock; i >= 0; i--) {
0 0 for (i = startingblock; i >= 0; i--) {
0 0 for (i = startingblock; i >= 0; i--) {
116 70 259 if(CxTYPE(cx) == CXt_SUB){
0 0 if(CxTYPE(cx) == CXt_SUB){
0 0 if(CxTYPE(cx) == CXt_SUB){
133 99 70 while (cxix < 0 && si->si_type != PERLSI_MAIN) {
0 99 while (cxix < 0 && si->si_type != PERLSI_MAIN) {
142 70 0 if (PL_DBsub && GvCV(PL_DBsub) &&
0 70 if (PL_DBsub && GvCV(PL_DBsub) &&
143 0 0 ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
145 0 70 if (!count--)
172 0 69 PUSHMARK(SP);
173 0 69 XPUSHs(arg1);
184 55 0 FREETMPS;
194 61 58 return method != GvCV(MY_CXT.my_clone) && method != MY_CXT.caller_cv;
203 14 137 if(!method){ /* not a clonable object */
204 14 0 SV* const object_callback = GvSVn(MY_CXT.object_callback);
207 0 14 SvGETMAGIC(object_callback);
209 8 6 if(SvOK(object_callback)){
212 0 2 if(!SvROK(x)){
213 0 0 croak("ObjectCallback function returned %s, but it must return a reference",
226 119 18 if(dc_need_to_call(aTHX_ aMY_CXT_ GvCV(method))){
229 0 53 if(!SvROK(x)){
230 0 0 croak("Cloning method '%"SVf"' returned %s, but it must return a reference",
255 141 126 may_be_circular = (SvREFCNT(sv) > 1 || sv_has_backrefs(aTHX_ sv) );
6 135 may_be_circular = (SvREFCNT(sv) > 1 || sv_has_backrefs(aTHX_ sv) );
259 14 118 if(svp){
265 143 110 if(SvOBJECT(sv) && !SvRXOK(cloning)){
139 4 if(SvOBJECT(sv) && !SvRXOK(cloning)){
268 57 72 if(proto){
275 14 100 else if((mg = SvTIED_mg(sv, PERL_MAGIC_tied))){
12 2 else if((mg = SvTIED_mg(sv, PERL_MAGIC_tied))){
277 0 12 proto = dc_clone_object(aTHX_ aMY_CXT_ SvTIED_obj(sv, mg), MY_CXT.tieclone_method);
279 4 4 if(proto){
282 2 2 : (SV*)newAV()); // can we use newSV_type()?
295 52 126 if(SvTYPE(sv) == SVt_PVAV){
297 22 30 if(may_be_circular){
302 92 34 else if(SvTYPE(sv) == SVt_PVHV){
304 56 36 if(may_be_circular){
318 131 120 if(SvOBJECT(sv)){
322 4 247 return SvWEAKREF(cloning) ? sv_rvweaken(cloned) : cloned;
333 0 169 if(++MY_CXT.depth == U32_MAX){
340 169 14 XCPT_TRY_START {
346 113 56 if(--MY_CXT.depth == 0){
350 14 155 XCPT_CATCH {
351 14 0 XCPT_RETHROW;
0 0 XCPT_RETHROW;
405 0 0 RETVAL = (MY_CXT.depth != 0);