The unpac monorepo manager self-hosting as a monorepo using unpac

Always eventually return `End on toplevel decode error.

Used to return `Error (`Expected `Json) infinitely often violating
the API spec. The bug was present in earlier version of Jsonm.

+12 -6
+1 -1
vendor/opam/jsonm/src/jsonm.ml
··· 373 373 374 374 let rec r_json k d = (* {value} *) 375 375 let err k d = spos d; discard_to_white err_exp_json (r_white (r_json k)) d in 376 - r_value err k d 376 + if d.c <> ux_eoi then r_value err k d else ret err_exp_json k d 377 377 378 378 let r_start d = (* start of input *) 379 379 let bom k d = if Uutf.decoder_removed_bom d.u then ret err_bom k d else k d in
+11 -5
vendor/opam/jsonm/test/test.ml
··· 98 98 99 99 let test_seq decode src seq = 100 100 let d = Jsonm.decoder (`String src) in 101 - let rec loop d = function [] -> () 101 + let rec loop d = function 102 + | [] -> if decode d <> `End then fail "decoder not at the `End"; () 102 103 | v :: vs -> test_decode (decode d) v; loop d vs 103 104 in 104 105 loop d seq ··· 258 259 259 260 let decoder_json_text () = 260 261 log "Decoder JSON text.\n"; 262 + test_seq Jsonm.decode "a" [ `Error (`Expected `Json); 263 + `Error (`Expected `Json); `End ]; 264 + test_seq Jsonm.decode "" [ `Error (`Expected `Json); `End ]; 261 265 test_seq Jsonm.decode "a : null {}" 262 266 [ `Error (`Expected `Json); 263 267 `Error (`Expected `Json); 264 268 `Lexeme `Null; 265 - `Error (`Expected `Eoi)]; 269 + `Error (`Expected `Eoi); `End]; 266 270 test_seq Jsonm.decode "a : null []" 267 271 [ `Error (`Expected `Json); 268 272 `Error (`Expected `Json); 269 273 `Lexeme `Null; 270 - `Error (`Expected `Eoi)]; 274 + `Error (`Expected `Eoi); `End]; 271 275 () 272 276 273 277 let decoder_bom () = 274 278 log "Decoder BOM.\n"; 275 - let seq = [`Error `Illegal_BOM; `Lexeme `Os; `Lexeme `Oe] in 279 + let seq = [`Error `Illegal_BOM; `Lexeme `Os; `Lexeme `Oe; `End] in 276 280 test_seq Jsonm.decode "\xEF\xBB\xBF {}" seq; 277 281 test_seq Jsonm.decode "\xFE\xFF\x00\x7B\x00\x7D" seq; 278 - test_seq Jsonm.decode "\xFE\xFF\x00\x7B\x00\x7D\x00" seq 282 + test_seq Jsonm.decode "\xFF\xFE\x7B\x00\x7D\x00" seq; 283 + () 284 + 279 285 280 286 let decoder_eoi () = 281 287 log "Decoder end of input.\n";