Branch Coverage

file_raw_json.c
Criterion Covered Total %
branch 245 424 57.7


line true false branch
61 6142 1 while (i < len) {
63 6139 3 if (c != ' ' && c != '\t' && c != '\n' && c != '\r') break;
6139 0 if (c != ' ' && c != '\t' && c != '\n' && c != '\r') break;
6136 3 if (c != ' ' && c != '\t' && c != '\n' && c != '\r') break;
6136 0 if (c != ' ' && c != '\t' && c != '\n' && c != '\r') break;
66 1 6136 if (i >= len) {
74 6120 16 if (c != '[' && c != '{') {
0 6120 if (c != '[' && c != '{') {
86 265534 5 while (i < len) {
88 166139 99395 if (in_string) {
89 8 166131 if (prev_backslash) {
91 8 166123 } else if (c == '\\') {
93 26276 139847 } else if (c == '"') {
105 6131 2032 if (depth == 0) {
110 12186 49 while (i < len) {
112 12180 6 if (w != ' ' && w != '\t' && w != '\n' && w != '\r')
12180 0 if (w != ' ' && w != '\t' && w != '\n' && w != '\r')
6082 6098 if (w != ' ' && w != '\t' && w != '\n' && w != '\r')
6082 0 if (w != ' ' && w != '\t' && w != '\n' && w != '\r')
155 0 50195 if (!val) return newSV(0);
157 50195 0 t = yyjson_get_type(val);
163 46713 3482 if ((t == YYJSON_TYPE_ARR || t == YYJSON_TYPE_OBJ) && depth >= max_depth) {
9510 37203 if ((t == YYJSON_TYPE_ARR || t == YYJSON_TYPE_OBJ) && depth >= max_depth) {
1 12991 if ((t == YYJSON_TYPE_ARR || t == YYJSON_TYPE_OBJ) && depth >= max_depth) {
172 23 0 case YYJSON_TYPE_BOOL: {
178 21 2 if (boolean_stash == g_frj_default_stash) {
179 12 9 SV *s = truth ? g_frj_true_sv : g_frj_false_sv;
180 21 0 if (s) {
190 7812 0 case YYJSON_SUBTYPE_UINT: {
192 7810 2 if (u <= (uint64_t)IV_MAX) return newSViv((IV)u);
195 3 0 case YYJSON_SUBTYPE_SINT:
197 6030 0 case YYJSON_SUBTYPE_REAL:
203 23315 0 case YYJSON_TYPE_STR: {
204 23315 0 const char *s = yyjson_get_str(val);
211 3481 0 case YYJSON_TYPE_ARR: {
215 26 3455 if (n == 0) return newRV_noinc((SV *)av);
221 16639 2943 while ((elem = yyjson_arr_iter_next(&it))) {
230 9510 0 case YYJSON_TYPE_OBJ: {
235 85 9425 HV *hv = ordered ? make_ordered_hv(aTHX) : newHV();
237 11 9499 if (n == 0) return newRV_noinc((SV *)hv);
241 9415 84 if (!ordered && n > 8) hv_ksplit(hv, (IV)n);
2 9413 if (!ordered && n > 8) hv_ksplit(hv, (IV)n);
246 27289 9499 while ((key = yyjson_obj_iter_next(&it))) {
247 27289 0 vv = yyjson_obj_iter_get_val(key);
248 27289 0 const char *kp = yyjson_get_str(key);
253 414 26875 if (ordered) {
260 0 26875 if (!hv_store(hv, kp, -(I32)kl, child, 0)) {
303 414 0 if (!mg || !mg->mg_obj) {
0 414 if (!mg || !mg->mg_obj) {
305 0 0 if (!hv_store(hv, key, (I32)klen, val, 0)) {
314 414 0 if (tie_oh_is_instance(aTHX_ tied_obj)) {
322 0 0 PUSHMARK(SP);
323 0 0 XPUSHs(tied_obj);
324 0 0 XPUSHs(sv_2mortal(newSVpvn(key, klen)));
325 0 0 XPUSHs(sv_2mortal(val));
330 0 0 FREETMPS; LEAVE;
336 0 2 if (!stash) {
337 0 0 return newSVsv(truth ? &PL_sv_yes : &PL_sv_no);
341 2 0 if (g_frj_default_stash && stash == g_frj_default_stash) {
0 2 if (g_frj_default_stash && stash == g_frj_default_stash) {
342 0 0 SV *s = truth ? g_frj_true_sv : g_frj_false_sv;
343 0 0 if (s) {
344 0 0 SvREFCNT_inc_simple_void(s);
392 11189 6633 for (i = v->depth - 1; i >= 0; i--) {
393 2 11187 if (v->stack[i] == target) return 1;
395 0 6633 if (v->overflow) {
404 6633 0 if (v->depth < VISITED_STACK_MAX) {
409 0 0 if (!v->overflow) v->overflow = newHV();
411 0 0 if (!hv_store(v->overflow, (const char *)&target, sizeof(SV *),
421 6631 0 if (v->depth > 0 && v->stack[v->depth - 1] == target) {
6631 0 if (v->depth > 0 && v->stack[v->depth - 1] == target) {
425 0 0 if (v->overflow) {
444 0 1150 if (visited.overflow) SvREFCNT_dec((SV *)visited.overflow);
454 32627 0 if (!sv || !SvOK(sv)) return yyjson_mut_null(doc);
14 32613 if (!sv || !SvOK(sv)) return yyjson_mut_null(doc);
456 6653 25960 if (SvROK(sv)) {
458 15 6638 if (SvOBJECT(target) && sv_is_known_boolean_class(aTHX_ sv)) {
13 2 if (SvOBJECT(target) && sv_is_known_boolean_class(aTHX_ sv)) {
460 13 0 return yyjson_mut_bool(doc, truth);
462 2228 4412 if (SvTYPE(target) == SVt_PVAV) {
467 1 2227 if (visited_seen(aTHX_ visited, target)) {
478 15330 2226 for (i = 0; i < n; i++) {
481 15328 2 sv_to_yyjson_v(aTHX_ ep ? ep : &PL_sv_undef,
488 4407 5 if (SvTYPE(target) == SVt_PVHV) {
507 259 4148 int do_sort = opts->sort_keys || opts->canonical;
18 241 int do_sort = opts->sort_keys || opts->canonical;
509 1 4406 if (visited_seen(aTHX_ visited, target)) {
517 4166 240 if (do_sort) {
557 5 4161 if (tied_mg && tied_mg->mg_obj
5 0 if (tied_mg && tied_mg->mg_obj
558 5 0 && tie_oh_is_instance(aTHX_ tied_mg->mg_obj))
566 13 5 while (tie_oh_iter_next(aTHX_ self, &it,
569 0 13 FRJ_PUSH_PAIR(ksv, vsv);
0 0 FRJ_PUSH_PAIR(ksv, vsv);
0 0 FRJ_PUSH_PAIR(ksv, vsv);
0 0 FRJ_PUSH_PAIR(ksv, vsv);
0 0 FRJ_PUSH_PAIR(ksv, vsv);
0 0 FRJ_PUSH_PAIR(ksv, vsv);
571 0 4161 } else if (tied_mg && tied_mg->mg_obj) {
0 0 } else if (tied_mg && tied_mg->mg_obj) {
573 0 0 while ((he = hv_iternext(hv))) {
580 0 0 PUSHMARK(SP);
581 0 0 XPUSHs(tied_mg->mg_obj);
582 0 0 XPUSHs(sv_2mortal(newSVpvn(key, klen)));
586 0 0 fetched = rc > 0 ? POPs : &PL_sv_undef;
589 0 0 FREETMPS; LEAVE;
591 0 0 FRJ_PUSH_PAIR(ksv, sv_2mortal(copy));
0 0 FRJ_PUSH_PAIR(ksv, sv_2mortal(copy));
0 0 FRJ_PUSH_PAIR(ksv, sv_2mortal(copy));
0 0 FRJ_PUSH_PAIR(ksv, sv_2mortal(copy));
0 0 FRJ_PUSH_PAIR(ksv, sv_2mortal(copy));
0 0 FRJ_PUSH_PAIR(ksv, sv_2mortal(copy));
598 14400 4161 while ((he = hv_iternext(hv))) {
599 0 14400 FRJ_PUSH_PAIR(hv_iterkeysv(he), HeVAL(he));
0 0 FRJ_PUSH_PAIR(hv_iterkeysv(he), HeVAL(he));
0 0 FRJ_PUSH_PAIR(hv_iterkeysv(he), HeVAL(he));
0 0 FRJ_PUSH_PAIR(hv_iterkeysv(he), HeVAL(he));
0 0 FRJ_PUSH_PAIR(hv_iterkeysv(he), HeVAL(he));
0 0 FRJ_PUSH_PAIR(hv_iterkeysv(he), HeVAL(he));
609 10252 4166 for (a = 1; a < count; a++) {
615 18108 3329 while (b >= 0) {
620 6923 11185 if (rc < 0 || (rc == 0 && clen < plen)) {
2 6921 if (rc < 0 || (rc == 0 && clen < plen)) {
0 2 if (rc < 0 || (rc == 0 && clen < plen)) {
631 14413 4166 for (i = 0; i < count; i++) {
634 14413 0 yyjson_mut_val *kval = yyjson_mut_strn(doc, kp, (size_t)klen);
640 0 4166 if (on_heap) {
646 54 186 else if (tied_mg && tied_mg->mg_obj
54 0 else if (tied_mg && tied_mg->mg_obj
647 54 0 && tie_oh_is_instance(aTHX_ tied_mg->mg_obj))
656 333 54 while (tie_oh_iter_next(aTHX_ self, &it,
658 333 0 yyjson_mut_val *kval = yyjson_mut_strn(
665 0 186 else if (tied_mg && tied_mg->mg_obj) {
0 0 else if (tied_mg && tied_mg->mg_obj) {
668 0 0 while ((he = hv_iternext(hv))) {
676 0 0 PUSHMARK(SP);
677 0 0 XPUSHs(tied_mg->mg_obj);
678 0 0 XPUSHs(sv_2mortal(newSVpvn(key, klen)));
682 0 0 fetched = rc > 0 ? POPs : &PL_sv_undef;
685 0 0 FREETMPS; LEAVE;
688 0 0 kval = yyjson_mut_strn(doc, key, (size_t)klen);
698 1396 185 while ((he = hv_iternext(hv))) {
701 1396 0 yyjson_mut_val *kval = yyjson_mut_strn(
715 1 4 if (tt == SVt_PVCV) {
718 1 3 if (tt == SVt_PVGV) {
723 2 1 if (SvRXOK(sv) || SvRXOK(target)) {
0 2 if (SvRXOK(sv) || SvRXOK(target)) {
735 2 0 if (!SvOBJECT(target)) {
736 2 0 return yyjson_mut_bool(doc, SvTRUE(target) ? 1 : 0);
744 0 0 return yyjson_mut_strn(doc, s, (size_t)len);
748 5689 20271 if (SvIOK(sv) && !SvNOK(sv)) {
1689 4000 if (SvIOK(sv) && !SvNOK(sv)) {
749 2 1687 if (SvIsUV(sv)) return yyjson_mut_uint(doc, (uint64_t)SvUV(sv));
752 6019 18252 if (SvNOK(sv)) {
758 18252 0 return yyjson_mut_strn(doc, s, (size_t)len);
774 0 15 if (!SvROK(sv)) return 0;
775 0 15 if (!SvOBJECT(SvRV(sv))) return 0;
777 0 15 if (!stash) return 0;
779 15 0 if (g_frj_default_stash && stash == g_frj_default_stash) return 1;
11 4 if (g_frj_default_stash && stash == g_frj_default_stash) return 1;
781 4 0 name = HvNAME_get(stash);
4 0 name = HvNAME_get(stash);
0 4 name = HvNAME_get(stash);
0 0 name = HvNAME_get(stash);
4 0 name = HvNAME_get(stash);
0 4 name = HvNAME_get(stash);
782 0 4 if (!name) return 0;
783 2 2 if (strEQ(name, "JSON::PP::Boolean")) return 1;
784 0 2 if (strEQ(name, "Types::Serialiser::Boolean")) return 1;
785 0 2 if (strEQ(name, "Cpanel::JSON::XS::Boolean")) return 1;
786 0 2 if (strEQ(name, "JSON::XS::Boolean")) return 1;
787 0 2 if (strEQ(name, "boolean")) return 1;
807 44 6 for (i = 0; i < ctx_len; i++) {
808 43 1 if (p[i] == '\n' || p[i] == '\r' || p[i] == '\t') p[i] = ' ';
43 0 if (p[i] == '\n' || p[i] == '\r' || p[i] == '\t') p[i] = ' ';
0 43 if (p[i] == '\n' || p[i] == '\r' || p[i] == '\t') p[i] = ' ';
810 6 0 croak("File::Raw::JSON: %s at byte offset %lu near \"%.*s\"",
819 5 228 if (opts->relaxed) {
823 1 232 if (opts->allow_nan_inf) f |= YYJSON_READ_ALLOW_INF_AND_NAN;
855 535 9 if (aligned + size <= c->pool_size) {
866 78 4 if (ptr >= (void *)c->pool && ptr < (void *)(c->pool + c->pool_size)) {
78 0 if (ptr >= (void *)c->pool && ptr < (void *)(c->pool + c->pool_size)) {
870 78 0 if (new_ptr && old_size > 0) {
78 0 if (new_ptr && old_size > 0) {
882 456 8 if (ptr >= (void *)c->pool && ptr < (void *)(c->pool + c->pool_size)) {
456 0 if (ptr >= (void *)c->pool && ptr < (void *)(c->pool + c->pool_size)) {
913 6 137 if (!doc) {
918 1 136 if (!opts->allow_nonref && root) {
1 0 if (!opts->allow_nonref && root) {
920 1 0 if (t != YYJSON_TYPE_ARR && t != YYJSON_TYPE_OBJ) {
1 0 if (t != YYJSON_TYPE_ARR && t != YYJSON_TYPE_OBJ) {
951 92 36 while (cursor < len) {
955 90 2 if (rc == JSONL_FOUND) {
962 0 90 if (!doc) {
967 90 0 av_push(result,
975 1 1 if (rc == JSONL_NEED_MORE) {
981 1 0 if (s >= len - cursor) break; /* trailing whitespace */
982 0 0 if (opts->relaxed) { cursor += s + 1; continue; }
999 14 1136 if (opts->pretty && !opts->canonical) {
14 0 if (opts->pretty && !opts->canonical) {
1000 1 13 if (opts->indent == 4) {
1006 0 1150 if (!opts->utf8) f |= YYJSON_WRITE_ESCAPE_UNICODE;
1007 1 1149 if (opts->allow_nan_inf) f |= YYJSON_WRITE_ALLOW_INF_AND_NAN;
1021 0 1155 if (!doc) croak("File::Raw::JSON: out of memory (mut_doc_new)");
1028 0 1150 if (!out) {
1030 0 0 croak("File::Raw::JSON: encode failed: %s",
1046 13 0 if (!payload || !SvROK(payload) || SvTYPE(SvRV(payload)) != SVt_PVAV)
12 1 if (!payload || !SvROK(payload) || SvTYPE(SvRV(payload)) != SVt_PVAV)
1 11 if (!payload || !SvROK(payload) || SvTYPE(SvRV(payload)) != SVt_PVAV)
1053 1021 11 for (i = 0; i < n; i++) {
1058 1021 0 rec_bytes = json_encode_document(aTHX_
1059 1021 0 (ep && *ep) ? *ep : &PL_sv_undef, opts);