Branch Coverage

JSON.xs
Criterion Covered Total %
branch 179 276 64.8


line true false branch
40 0 29 if (g_frj_true_sv) return;
61 0 197 if (!g_frj_default_stash) init_boolean_singletons(aTHX);
68 197 1 if (!class_name) return get_boolean_stash(aTHX);
85 0 23 if (!src) {
103 134 72 if (first_idx >= items) return NULL;
104 2 70 if ((items - first_idx) % 2 != 0)
108 79 70 for (i = first_idx; i + 1 < items; i += 2) {
112 0 79 if (!hv_store(opts, key, klen, vcopy, 0))
138 2743 2 for (p = VALID_OPT_KEYS; *p; p++) {
139 609 2134 if (strlen(*p) == klen && memcmp(*p, key, klen) == 0) return 1;
277 332 if (strlen(*p) == klen && memcmp(*p, key, klen) == 0) return 1;
150 134 216 if (!opts_hv) return NULL;
153 279 211 while ((he = hv_iternext(opts_hv))) {
159 2 277 if (!known_opt(key, klen)) {
163 0 277 if (!SvOK(val)) continue;
165 13 264 if (klen == 4 && memcmp(key, "mode", 4) == 0) {
13 0 if (klen == 4 && memcmp(key, "mode", 4) == 0) {
168 1 12 if (mlen == 8 && memcmp(mpv, "document", 8) == 0)
0 1 if (mlen == 8 && memcmp(mpv, "document", 8) == 0)
170 12 1 else if (mlen == 5 && memcmp(mpv, "lines", 5) == 0)
12 0 else if (mlen == 5 && memcmp(mpv, "lines", 5) == 0)
176 164 100 else if (klen == 6 && memcmp(key, "pretty", 6) == 0)
16 148 else if (klen == 6 && memcmp(key, "pretty", 6) == 0)
178 148 100 else if (klen == 6 && memcmp(key, "indent", 6) == 0) {
4 144 else if (klen == 6 && memcmp(key, "indent", 6) == 0) {
180 3 1 if (n != 2 && n != 4)
2 1 if (n != 2 && n != 4)
186 59 185 else if (klen == 9 && memcmp(key, "sort_keys", 9) == 0)
55 4 else if (klen == 9 && memcmp(key, "sort_keys", 9) == 0)
188 4 185 else if (klen == 9 && memcmp(key, "canonical", 9) == 0)
3 1 else if (klen == 9 && memcmp(key, "canonical", 9) == 0)
190 0 186 else if (klen == 4 && memcmp(key, "utf8", 4) == 0)
0 0 else if (klen == 4 && memcmp(key, "utf8", 4) == 0)
192 36 150 else if (klen == 7 && memcmp(key, "relaxed", 7) == 0)
5 31 else if (klen == 7 && memcmp(key, "relaxed", 7) == 0)
194 1 180 else if (klen == 12 && memcmp(key, "allow_nonref", 12) == 0)
1 0 else if (klen == 12 && memcmp(key, "allow_nonref", 12) == 0)
196 3 177 else if (klen == 13 && memcmp(key, "allow_nan_inf", 13) == 0)
2 1 else if (klen == 13 && memcmp(key, "allow_nan_inf", 13) == 0)
198 31 147 else if (klen == 7 && memcmp(key, "ordered", 7) == 0)
31 0 else if (klen == 7 && memcmp(key, "ordered", 7) == 0)
200 1 146 else if (klen == 9 && memcmp(key, "max_depth", 9) == 0) {
1 0 else if (klen == 9 && memcmp(key, "max_depth", 9) == 0) {
202 0 1 if (n < 1) croak("File::Raw::JSON: max_depth must be >= 1");
205 1 145 else if (klen == 3 && memcmp(key, "eol", 3) == 0) {
1 0 else if (klen == 3 && memcmp(key, "eol", 3) == 0) {
208 1 0 if (elen == 0 || elen > 3)
0 1 if (elen == 0 || elen > 3)
215 1 144 else if (klen == 13 && memcmp(key, "boolean_class", 13) == 0) {
1 0 else if (klen == 13 && memcmp(key, "boolean_class", 13) == 0) {
243 79 0 if (ctx->plugin_state)
249 0 77 if (!ctx->data) return &PL_sv_undef;
252 28 49 if (o.mode == JSON_MODE_LINES) {
264 51 0 if (ctx->plugin_state)
268 11 38 if (o.mode == JSON_MODE_LINES) {
309 0 16 if (!s) return;
310 16 0 if (s->acc_buf) Safefree(s->acc_buf);
311 1 15 if (s->die_msg) SvREFCNT_dec(s->die_msg);
318 4 16 if (s->acc_len + n > s->acc_cap) {
319 4 0 STRLEN newcap = s->acc_cap ? s->acc_cap : 8192;
320 8 4 while (newcap < s->acc_len + n) newcap *= 2;
324 20 0 if (n) memcpy(s->acc_buf + s->acc_len, p, n);
340 0 6041 if (!doc) {
347 0 0 croak("File::Raw::JSON: stream parse error: %s near \"%s\"",
350 6041 0 value = json_sv_from_yyjson(aTHX_ yyjson_doc_get_root(doc),
358 0 6041 PUSHMARK(SP);
359 0 6041 XPUSHs(sv_2mortal(value));
364 6041 0 errsv = ERRSV;
365 1 6040 if (SvTRUE(errsv)) {
369 6041 0 FREETMPS; LEAVE;
379 6045 30 while (cursor < s->acc_len) {
384 6041 4 if (rc == JSONL_FOUND) {
385 1 6040 if (jsonl_emit_one(aTHX_ ctx, s,
392 4 0 if (rc == JSONL_NEED_MORE) {
397 4 0 if (cursor > 0) {
402 4 0 if (!allow_truncate) return 0;
410 0 0 if (cursor >= s->acc_len) break; /* all whitespace */
411 0 0 if (s->opts.relaxed) { cursor++; continue; }
419 15 15 if (cursor > 0 && cursor < s->acc_len) {
0 15 if (cursor > 0 && cursor < s->acc_len) {
422 30 0 } else if (cursor >= s->acc_len) {
434 16 19 if (!s) {
438 16 0 if (ctx->plugin_state)
448 20 15 if (chunk && len > 0) {
20 0 if (chunk && len > 0) {
452 1 34 if (jsonl_drain_buffer(aTHX_ ctx, s, eof ? 1 : 0)) {
455 1 0 SV *m = die_msg ? newSVsv(die_msg) : NULL;
459 1 0 if (m) {
467 15 19 if (eof) {
514 37 0 pkg = CopSTASHPV(PL_curcop);
37 0 pkg = CopSTASHPV(PL_curcop);
37 0 pkg = CopSTASHPV(PL_curcop);
0 37 pkg = CopSTASHPV(PL_curcop);
0 0 pkg = CopSTASHPV(PL_curcop);
37 0 pkg = CopSTASHPV(PL_curcop);
0 37 pkg = CopSTASHPV(PL_curcop);
515 23 14 if (items <= 1) XSRETURN_EMPTY;
517 22 14 for (i = 1; i < items; i++) {
521 2 20 if ((len == 6 && strEQ(arg, ":codec")) ||
0 2 if ((len == 6 && strEQ(arg, ":codec")) ||
522 3 17 (len == 4 && strEQ(arg, ":all")))
1 2 (len == 4 && strEQ(arg, ":all")))
528 17 2 if ((len == 16 && strEQ(arg, "file_json_decode")) ||
9 8 if ((len == 16 && strEQ(arg, "file_json_decode")) ||
529 9 2 (len == 16 && strEQ(arg, "file_json_encode")))
9 0 (len == 16 && strEQ(arg, "file_json_encode")))
555 105 0 if (!bytes || !SvOK(bytes)) XSRETURN_UNDEF;
1 104 if (!bytes || !SvOK(bytes)) XSRETURN_UNDEF;
558 10 94 if (o.mode == JSON_MODE_LINES) {
563 92 0 RETVAL = out ? out : &PL_sv_undef;
564 0 92 if (RETVAL == &PL_sv_undef) SvREFCNT_inc(RETVAL);
581 2 96 if (o.mode == JSON_MODE_LINES) {
586 0 93 if (!RETVAL) {
603 0 29 if (file_register_plugin(aTHX_ &json_plugin) <= 0)
612 0 29 if (file_register_plugin(aTHX_ &jsonl_plugin) <= 0)
640 0 6 if (!g_frj_true_sv) init_boolean_singletons(aTHX);
641 6 0 SvREFCNT_inc_simple_void(g_frj_true_sv);
642 0 6 XPUSHs(sv_2mortal(g_frj_true_sv));
649 0 4 if (!g_frj_false_sv) init_boolean_singletons(aTHX);
650 4 0 SvREFCNT_inc_simple_void(g_frj_false_sv);
651 0 4 XPUSHs(sv_2mortal(g_frj_false_sv));
663 7 0 RETVAL = (SvROK(self) && SvTRUE(SvRV(self)))
664 7 0 ? &PL_sv_yes : &PL_sv_no;
665 7 0 SvREFCNT_inc_simple_void(RETVAL); /* OUTPUT typemap will mortalise */
678 0 0 RETVAL = newSViv(
0 0 RETVAL = newSViv(
693 0 0 RETVAL = newSVpvn(
0 0 RETVAL = newSVpvn(
708 10 0 if (SvROK(self) && SvTRUE(SvRV(self)))
2 8 if (SvROK(self) && SvTRUE(SvRV(self)))
719 0 0 RETVAL = (SvROK(self) && sv_isa(self, "File::Raw::JSON::Boolean")
0 0 RETVAL = (SvROK(self) && sv_isa(self, "File::Raw::JSON::Boolean")
720 0 0 && SvTRUE(SvRV(self))) ? 1 : 0;
0 0 && SvTRUE(SvRV(self))) ? 1 : 0;
728 0 0 RETVAL = (SvROK(self) && sv_isa(self, "File::Raw::JSON::Boolean")
0 0 RETVAL = (SvROK(self) && sv_isa(self, "File::Raw::JSON::Boolean")
729 0 0 && !SvTRUE(SvRV(self))) ? 1 : 0;
0 0 && !SvTRUE(SvRV(self))) ? 1 : 0;