Fixed bugs in JSON encoding with UPB_JSONENC_EMITDEFAULTS.
Previously the code would crash on certain empty fields.
diff --git a/upb/json_encode.c b/upb/json_encode.c
index 628d1c1..9217c65 100644
--- a/upb/json_encode.c
+++ b/upb/json_encode.c
@@ -594,7 +594,7 @@
static void jsonenc_array(jsonenc *e, const upb_array *arr,
const upb_fielddef *f) {
size_t i;
- size_t size = upb_array_size(arr);
+ size_t size = arr ? upb_array_size(arr) : 0;
bool first = true;
jsonenc_putstr(e, "[");
@@ -616,10 +616,12 @@
jsonenc_putstr(e, "{");
- while (upb_mapiter_next(map, &iter)) {
- jsonenc_putsep(e, ",", &first);
- jsonenc_mapkey(e, upb_mapiter_key(map, iter), key_f);
- jsonenc_scalar(e, upb_mapiter_value(map, iter), val_f);
+ if (map) {
+ while (upb_mapiter_next(map, &iter)) {
+ jsonenc_putsep(e, ",", &first);
+ jsonenc_mapkey(e, upb_mapiter_key(map, iter), key_f);
+ jsonenc_scalar(e, upb_mapiter_value(map, iter), val_f);
+ }
}
jsonenc_putstr(e, "}");
@@ -659,7 +661,9 @@
int n = upb_msgdef_fieldcount(m);
for (i = 0; i < n; i++) {
f = upb_msgdef_field(m, i);
- jsonenc_fieldval(e, f, upb_msg_get(msg, f), &first);
+ if (!upb_fielddef_haspresence(f) || upb_msg_has(msg, f)) {
+ jsonenc_fieldval(e, f, upb_msg_get(msg, f), &first);
+ }
}
} else {
/* Iterate over non-empty fields. */