src/bytecode/decoder.panack
Green: covered; red: known zero; amber: unavailable. Blank lines are outside the executable-start-line denominator.
1 import "codec.panack" 2 3 record ByteReader { 4 data: Bytes, 5 offset: Nat, 6 valid: Bool, 7 message: Str 8 } 9 10 record ReadNat { 11 reader: ByteReader, 12 value: Nat 13 } 14 15 record ReadText { 16 reader: ByteReader, 17 value: Str 18 } 19 20 record ReadBytes { 21 reader: ByteReader, 22 value: Bytes 23 } 24 25 record ReadConstant { 26 reader: ByteReader, 27 value: ConstantValue 28 } 29 30 record ReadInstruction { 31 reader: ByteReader, 32 value: Instruction 33 } 34 35 record ReadInstructions { 36 reader: ByteReader, 37 values: [Instruction] 38 } 39 40 record ReadNames { 41 reader: ByteReader, 42 values: [Str] 43 } 44 45 record ReadFunction { 46 reader: ByteReader, 47 value: FunctionCode 48 } 49 50 record SignedMagnitude { 51 negative: Bool, 52 magnitude: Nat 53 } 54 55 record ReadSignedMagnitude { 56 reader: ByteReader, 57 value: SignedMagnitude 58 } 59 60 enum BytecodeDecodeResult { 61 BytecodeDecoded(BytecodeProgram), 62 BytecodeDecodeError(Str) 63 } 64 65 pure invalid_reader(reader: ByteReader, message: Str): ByteReader { 66 if reader.valid { ByteReader(reader.data, reader.offset, false, message) } else { reader } 67 } 68 69 pure reader_has(reader: ByteReader, count: Nat): Bool { 70 reader.valid && reader.offset + count <= byte_len(reader.data) 71 } 72 73 pure read_u8(reader: ByteReader): ReadNat { 74 if reader_has(reader, 1) { 75 value: Nat = byte_get(reader.data, reader.offset) 76 ReadNat(ByteReader(reader.data, reader.offset + 1, true, ""), value) 77 } else { 78 ReadNat(invalid_reader(reader, "truncated data"), 0) 79 } 80 } 81 82 pure read_u16(reader: ByteReader): ReadNat { 83 if reader_has(reader, 2) { 84 value: Nat = byte_get(reader.data, reader.offset) * 256 + byte_get(reader.data, reader.offset + 1) 85 ReadNat(ByteReader(reader.data, reader.offset + 2, true, ""), value) 86 } else { 87 ReadNat(invalid_reader(reader, "truncated data"), 0) 88 } 89 } 90 91 pure read_u32(reader: ByteReader): ReadNat { 92 if reader_has(reader, 4) { 93 value: Nat = byte_get(reader.data, reader.offset) * 16777216 + 94 byte_get(reader.data, reader.offset + 1) * 65536 + 95 byte_get(reader.data, reader.offset + 2) * 256 + 96 byte_get(reader.data, reader.offset + 3) 97 ReadNat(ByteReader(reader.data, reader.offset + 4, true, ""), value) 98 } else { 99 ReadNat(invalid_reader(reader, "truncated data"), 0) 100 } 101 } 102 103 pure read_raw(reader: ByteReader, count: Nat): ReadBytes { 104 if reader_has(reader, count) { 105 mut output: Bytes = bytes() 106 mut cursor: Nat = 0 107 while cursor < count { 108 output = byte_append(output, byte_get(reader.data, reader.offset + cursor)) 109 cursor = cursor + 1 110 } 111 ReadBytes(ByteReader(reader.data, reader.offset + count, true, ""), output) 112 } else { 113 ReadBytes(invalid_reader(reader, "truncated data"), bytes()) 114 } 115 } 116 117 pure utf8_continuation(value: Nat): Bool { 118 value >= 128 && value <= 191 119 } 120 121 pure valid_utf8(data: Bytes): Bool { 122 mut valid: Bool = true 123 mut cursor: Nat = 0 124 while cursor < byte_len(data) && valid { 125 first: Nat = byte_get(data, cursor) 126 if first <= 127 { 127 cursor = cursor + 1 128 } else { 129 if first >= 194 && first <= 223 { 130 if cursor + 1 < byte_len(data) && utf8_continuation(byte_get(data, cursor + 1)) { 131 cursor = cursor + 2 132 } else { valid = false; } 133 } else { 134 if first >= 224 && first <= 239 { 135 if cursor + 2 < byte_len(data) { 136 second: Nat = byte_get(data, cursor + 1) 137 third: Nat = byte_get(data, cursor + 2) 138 second_valid: Bool = utf8_continuation(second) && 139 (first != 224 || second >= 160) && (first != 237 || second <= 159) 140 if second_valid && utf8_continuation(third) { cursor = cursor + 3; } 141 else { valid = false; } 142 } else { valid = false; } 143 } else { 144 if first >= 240 && first <= 244 { 145 if cursor + 3 < byte_len(data) { 146 second: Nat = byte_get(data, cursor + 1) 147 third: Nat = byte_get(data, cursor + 2) 148 fourth: Nat = byte_get(data, cursor + 3) 149 second_valid: Bool = utf8_continuation(second) && 150 (first != 240 || second >= 144) && (first != 244 || second <= 143) 151 if second_valid && utf8_continuation(third) && utf8_continuation(fourth) { 152 cursor = cursor + 4 153 } else { valid = false; } 154 } else { valid = false; } 155 } else { valid = false; } 156 } 157 } 158 } 159 } 160 valid 161 } 162 163 pure decode_utf8(reader: ByteReader, count: Nat, limit: Nat, label: Str): ReadText { 164 if count > limit { 165 ReadText(invalid_reader(reader, "${label} exceeds limit"), "") 166 } else { 167 raw: ReadBytes = read_raw(reader, count) 168 if raw.reader.valid && valid_utf8(raw.value) { 169 ReadText(raw.reader, utf8_decode(raw.value)) 170 } else { 171 if raw.reader.valid { 172 ReadText(invalid_reader(raw.reader, "invalid UTF-8 in ${label}"), "") 173 } else { 174 ReadText(raw.reader, "") 175 } 176 } 177 } 178 } 179 180 pure read_name(reader: ByteReader): ReadText { 181 size: ReadNat = read_u16(reader) 182 decode_utf8(size.reader, size.value, 1024, "name") 183 } 184 185 pure read_text(reader: ByteReader): ReadText { 186 size: ReadNat = read_u32(reader) 187 decode_utf8(size.reader, size.value, 1048576, "text") 188 } 189 190 pure nat_digit_count(value: Nat): Nat { 191 if value == 0 { 1 } 192 else { 193 mut count: Nat = 0 194 mut remaining: Nat = value 195 while remaining > 0 { 196 remaining = quotient(remaining, 10) 197 count = count + 1 198 } 199 count 200 } 201 } 202 203 pure read_natural(reader: ByteReader): ReadNat { 204 size: ReadNat = read_u16(reader) 205 if !size.reader.valid { ReadNat(size.reader, 0) } 206 else { 207 if size.value > 1701 { 208 ReadNat(invalid_reader(size.reader, "integer exceeds digit limit"), 0) 209 } else { 210 raw: ReadBytes = read_raw(size.reader, size.value) 211 if !raw.reader.valid { ReadNat(raw.reader, 0) } 212 else { 213 if size.value > 0 && byte_get(raw.value, 0) == 0 { 214 ReadNat(invalid_reader(raw.reader, "non-minimal integer"), 0) 215 } else { 216 mut value: Nat = 0 217 for byte in raw.value { value = value * 256 + byte; } 218 if nat_digit_count(value) > 4096 { 219 ReadNat(invalid_reader(raw.reader, "integer exceeds digit limit"), 0) 220 } else { 221 ReadNat(raw.reader, value) 222 } 223 } 224 } 225 } 226 } 227 } 228 229 pure subtract_natural(larger: Nat, smaller: Nat): Nat { 230 mut result: Nat = larger 231 mut remaining: Nat = smaller 232 while remaining > 0 { 233 if result > 0 { result = result - 1; } else {} 234 remaining = remaining - 1 235 } 236 result 237 } 238 239 pure read_i16(reader: ByteReader): ReadSignedMagnitude { 240 encoded: ReadNat = read_u16(reader) 241 if encoded.value >= 32768 { 242 value: SignedMagnitude = SignedMagnitude(true, subtract_natural(65536, encoded.value)) 243 ReadSignedMagnitude(encoded.reader, value) 244 } else { 245 ReadSignedMagnitude(encoded.reader, SignedMagnitude(false, encoded.value)) 246 } 247 } 248 249 pure read_decimal(reader: ByteReader): ReadConstant { 250 sign: ReadNat = read_u8(reader) 251 exponent: ReadSignedMagnitude = read_i16(sign.reader) 252 count: ReadNat = read_u16(exponent.reader) 253 mut current: ByteReader = count.reader 254 if sign.value > 1 { current = invalid_reader(current, "invalid decimal sign"); } else {} 255 if exponent.value.magnitude > 4096 { current = invalid_reader(current, "decimal exponent exceeds limit"); } else {} 256 if count.value == 0 || count.value > 4096 { current = invalid_reader(current, "decimal coefficient exceeds digit limit"); } else {} 257 raw: ReadBytes = read_raw(current, quotient(count.value + 1, 2)) 258 mut digits: [Nat] = [] 259 mut cursor: Nat = 0 260 while cursor < byte_len(raw.value) && raw.reader.valid { 261 byte: Nat = byte_get(raw.value, cursor) 262 high: Nat = quotient(byte, 16) 263 low: Nat = byte % 16 264 if high > 9 { current = invalid_reader(raw.reader, "invalid decimal digit"); } 265 else { digits = append(digits, high); } 266 if len(digits) < count.value { 267 if low > 9 { current = invalid_reader(current, "invalid decimal digit"); } 268 else { digits = append(digits, low); } 269 } else { 270 if low != 15 { current = invalid_reader(current, "invalid decimal padding"); } else {} 271 } 272 cursor = cursor + 1 273 } 274 if len(digits) > 1 && digits[0] == 0 { 275 current = invalid_reader(current, "non-minimal decimal coefficient") 276 } else {} 277 value: ConstantValue = DecimalPartsConstant(sign.value == 1, digits, exponent.value.negative, exponent.value.magnitude) 278 ReadConstant(ByteReader(current.data, raw.reader.offset, current.valid && raw.reader.valid, if current.valid { raw.reader.message } else { current.message }), value) 279 } 280 281 pure read_constant(reader: ByteReader): ReadConstant { 282 tag: ReadNat = read_u8(reader) 283 if tag.value == 0 { 284 natural: ReadNat = read_natural(tag.reader) 285 ReadConstant(natural.reader, NatConstant(natural.value)) 286 } else { 287 if tag.value == 1 { 288 sign: ReadNat = read_u8(tag.reader) 289 magnitude: ReadNat = read_natural(sign.reader) 290 mut current: ByteReader = magnitude.reader 291 if sign.value > 1 { current = invalid_reader(current, "invalid integer sign"); } else {} 292 if sign.value == 1 && magnitude.value == 0 { current = invalid_reader(current, "negative zero integer"); } else {} 293 ReadConstant(current, IntConstant(sign.value == 1, magnitude.value)) 294 } else { 295 if tag.value == 2 { 296 read_decimal(tag.reader) 297 } else { 298 if tag.value == 3 { 299 text: ReadText = read_text(tag.reader) 300 ReadConstant(text.reader, StringConstant(text.value)) 301 } else { 302 if tag.value == 4 { 303 flag: ReadNat = read_u8(tag.reader) 304 if flag.value > 1 { 305 ReadConstant(invalid_reader(flag.reader, "invalid Bool constant"), BoolConstant(false)) 306 } else { 307 ReadConstant(flag.reader, BoolConstant(flag.value == 1)) 308 } 309 } else { 310 if tag.value == 5 { 311 ReadConstant(tag.reader, VoidConstant()) 312 } else { 313 ReadConstant(invalid_reader(tag.reader, "unknown constant tag"), VoidConstant()) 314 } 315 } 316 } 317 } 318 } 319 } 320 } 321 322 pure read_names(reader: ByteReader, count: Nat): ReadNames { 323 mut current: ByteReader = reader 324 mut values: [Str] = [] 325 mut cursor: Nat = 0 326 while cursor < count && current.valid { 327 item: ReadText = read_name(current) 328 current = item.reader 329 values = append(values, item.value) 330 cursor = cursor + 1 331 } 332 ReadNames(current, values) 333 } 334 335 pure read_texts(reader: ByteReader): ReadNames { 336 count: ReadNat = read_u16(reader) 337 if count.value > 65535 { 338 ReadNames(invalid_reader(count.reader, "interpolation exceeds item limit"), []) 339 } else { 340 mut current: ByteReader = count.reader 341 mut values: [Str] = [] 342 mut cursor: Nat = 0 343 while cursor < count.value && current.valid { 344 item: ReadText = read_text(current) 345 current = item.reader 346 values = append(values, item.value) 347 cursor = cursor + 1 348 } 349 ReadNames(current, values) 350 } 351 } 352 353 pure unary_operator(code: Nat): Str { 354 if code == 0 { "-" } else { "!" } 355 } 356 357 pure binary_operator(code: Nat): Str { 358 if code == 0 { "+" } 359 else { if code == 1 { "-" } 360 else { if code == 2 { "*" } 361 else { if code == 3 { "/" } 362 else { if code == 4 { "%" } 363 else { if code == 5 { "==" } 364 else { if code == 6 { "!=" } 365 else { if code == 7 { "<" } 366 else { if code == 8 { "<=" } 367 else { if code == 9 { ">" } 368 else { if code == 10 { ">=" } 369 else { if code == 11 { "&&" } else { "||" } } } } } } } } } } } } 370 } 371 372 pure read_instruction(reader: ByteReader): ReadInstruction { 373 opcode: ReadNat = read_u8(reader) 374 if opcode.value == 0 { 375 constant: ReadConstant = read_constant(opcode.reader) 376 ReadInstruction(constant.reader, ConstInstruction(constant.value)) 377 } else { if opcode.value == 1 { 378 name: ReadText = read_name(opcode.reader); ReadInstruction(name.reader, LoadInstruction(name.value)) 379 } else { if opcode.value == 2 { 380 name: ReadText = read_name(opcode.reader); ReadInstruction(name.reader, StoreInstruction(name.value)) 381 } else { if opcode.value == 3 { 382 ReadInstruction(opcode.reader, PopInstruction()) 383 } else { if opcode.value == 4 { 384 code: ReadNat = read_u8(opcode.reader) 385 if code.value > 1 { ReadInstruction(invalid_reader(code.reader, "unknown unary operator"), UnaryInstruction("-")) } 386 else { ReadInstruction(code.reader, UnaryInstruction(unary_operator(code.value))) } 387 } else { if opcode.value == 5 { 388 code: ReadNat = read_u8(opcode.reader) 389 if code.value > 12 { ReadInstruction(invalid_reader(code.reader, "unknown binary operator"), BinaryInstruction("+")) } 390 else { ReadInstruction(code.reader, BinaryInstruction(binary_operator(code.value))) } 391 } else { if opcode.value == 6 { 392 ReadInstruction(opcode.reader, MakeRangeInstruction()) 393 } else { if opcode.value == 7 { 394 count: ReadNat = read_u16(opcode.reader); ReadInstruction(count.reader, MakeArrayInstruction(count.value)) 395 } else { if opcode.value == 8 { 396 ReadInstruction(opcode.reader, IndexGetInstruction()) 397 } else { if opcode.value == 9 { 398 parts: ReadNames = read_texts(opcode.reader); ReadInstruction(parts.reader, InterpolateInstruction(parts.values)) 399 } else { if opcode.value == 10 { 400 name: ReadText = read_name(opcode.reader); ReadInstruction(name.reader, IterInitInstruction(name.value)) 401 } else { if opcode.value == 11 { 402 iterator: ReadText = read_name(opcode.reader) 403 name: ReadText = read_name(iterator.reader) 404 end: ReadNat = read_u32(name.reader) 405 ReadInstruction(end.reader, IterNextInstruction(iterator.value, name.value, end.value)) 406 } else { if opcode.value == 12 { 407 name: ReadText = read_name(opcode.reader) 408 count: ReadNat = read_u16(name.reader) 409 fields: ReadNames = read_names(count.reader, count.value) 410 ReadInstruction(fields.reader, MakeRecordInstruction(name.value, fields.values)) 411 } else { if opcode.value == 13 { 412 name: ReadText = read_name(opcode.reader); ReadInstruction(name.reader, FieldGetInstruction(name.value)) 413 } else { if opcode.value == 14 { 414 enum_name: ReadText = read_name(opcode.reader) 415 variant: ReadText = read_name(enum_name.reader) 416 count: ReadNat = read_u16(variant.reader) 417 ReadInstruction(count.reader, MakeVariantInstruction(enum_name.value, variant.value, count.value)) 418 } else { if opcode.value == 15 { 419 variant: ReadText = read_name(opcode.reader) 420 failure: ReadNat = read_u32(variant.reader) 421 ReadInstruction(failure.reader, MatchVariantInstruction(variant.value, failure.value)) 422 } else { if opcode.value == 16 { 423 ReadInstruction(opcode.reader, MatchFailInstruction()) 424 } else { if opcode.value == 17 { 425 name: ReadText = read_name(opcode.reader) 426 arity: ReadNat = read_u8(name.reader) 427 ReadInstruction(arity.reader, CallInstruction(name.value, arity.value)) 428 } else { if opcode.value == 18 { 429 target: ReadNat = read_u32(opcode.reader); ReadInstruction(target.reader, JumpFalseInstruction(target.value)) 430 } else { if opcode.value == 19 { 431 target: ReadNat = read_u32(opcode.reader); ReadInstruction(target.reader, JumpInstruction(target.value)) 432 } else { if opcode.value == 22 { 433 name: ReadText = read_name(opcode.reader) 434 arity: ReadNat = read_u8(name.reader) 435 ReadInstruction(arity.reader, AwaitCallInstruction(name.value, arity.value)) 436 } else { if opcode.value == 23 { 437 arity: ReadNat = read_u8(opcode.reader) 438 ReadInstruction(arity.reader, AwaitValueInstruction(arity.value)) 439 } else { if opcode.value == 20 { 440 ReadInstruction(opcode.reader, ReturnInstruction()) 441 } else { if opcode.value == 21 { 442 arity: ReadNat = read_u8(opcode.reader); ReadInstruction(arity.reader, CallValueInstruction(arity.value)) 443 } else { 444 ReadInstruction(invalid_reader(opcode.reader, "unknown bytecode opcode"), PopInstruction()) 445 } } } } } } } } } } } } } } } } } } } } } } } } 446 } 447 448 pure read_instructions(reader: ByteReader, count: Nat): ReadInstructions { 449 mut current: ByteReader = reader 450 mut values: [Instruction] = [] 451 mut cursor: Nat = 0 452 while cursor < count && current.valid { 453 instruction: ReadInstruction = read_instruction(current) 454 current = instruction.reader 455 values = append(values, instruction.value) 456 cursor = cursor + 1 457 } 458 ReadInstructions(current, values) 459 } 460 461 pure read_function(reader: ByteReader): ReadFunction { 462 name: ReadText = read_name(reader) 463 flags: ReadNat = read_u8(name.reader) 464 parameter_count: ReadNat = read_u8(flags.reader) 465 parameters: ReadNames = read_names(parameter_count.reader, parameter_count.value) 466 instruction_count: ReadNat = read_u32(parameters.reader) 467 mut current: ByteReader = instruction_count.reader 468 if flags.value > 2 { current = invalid_reader(current, "unknown function flags"); } else {} 469 if instruction_count.value > 1000000 { current = invalid_reader(current, "function exceeds instruction limit"); } else {} 470 instructions: ReadInstructions = read_instructions(current, instruction_count.value) 471 value: FunctionCode = FunctionCode(name.value, parameters.values, flags.value == 1, flags.value == 2, instructions.values) 472 ReadFunction(instructions.reader, value) 473 } 474 475 record FunctionCodeLookup { 476 found: Bool, 477 value: FunctionCode 478 } 479 480 pure builtin_exists(name: Str): Bool { 481 name != "tcp_exchange" && name != "tcp_serve" && (name == "$tcp_exchange" || name == "$tcp_serve" || is_builtin(name)) 482 } 483 484 pure builtin_is_pure(name: Str): Bool { 485 name != "$tcp_exchange" && name != "$tcp_serve" && !is_impure_builtin(name) 486 } 487 488 pure bytecode_function(program: BytecodeProgram, name: Str): FunctionCodeLookup { 489 mut found: Bool = false 490 mut result: FunctionCode = FunctionCode("", [], false, false, []) 491 for candidate in program.functions { 492 if candidate.name == name { 493 found = true 494 result = candidate 495 } else {} 496 } 497 FunctionCodeLookup(found, result) 498 } 499 500 pure duplicate_names(names: [Str]): Bool { 501 mut seen: Set[Str] = set() 502 mut duplicate: Bool = false 503 for name in names { 504 if set_has(seen, name) { duplicate = true; } 505 else { seen = set_add(seen, name); } 506 } 507 duplicate 508 } 509 510 pure verify_instruction(instruction: Instruction, function: FunctionCode, program: BytecodeProgram): Str { 511 count: Nat = len(function.instructions) 512 match instruction { 513 ConstInstruction(value) => "", 514 LoadInstruction(name) => "", 515 StoreInstruction(name) => "", 516 PopInstruction() => "", 517 UnaryInstruction(operator) => if operator == "-" || operator == "!" { "" } else { "invalid UNARY operand" }, 518 BinaryInstruction(operator) => "", 519 MakeRangeInstruction() => "", 520 MakeArrayInstruction(item_count) => "", 521 IndexGetInstruction() => "", 522 InterpolateInstruction(parts) => if len(parts) > 0 { "" } else { "invalid INTERPOLATE operand" }, 523 IterInitInstruction(name) => "", 524 IterNextInstruction(iterator, name, end) => if end < count { "" } else { "invalid ITER_NEXT operand" }, 525 MakeRecordInstruction(name, fields) => "", 526 FieldGetInstruction(name) => "", 527 MakeVariantInstruction(enum_name, variant, payload_count) => "", 528 MatchVariantInstruction(variant, failure) => if failure < count { "" } else { "invalid MATCH_VARIANT operand" }, 529 MatchFailInstruction() => "", 530 CallInstruction(name, arity) => { 531 target: FunctionCodeLookup = bytecode_function(program, name) 532 if !target.found && !builtin_exists(name) { 533 "bytecode calls unknown function ${name}" 534 } else { 535 expected: Nat = if builtin_exists(name) { builtin_arity(name) } else { len(target.value.parameters) } 536 target_pure: Bool = if builtin_exists(name) { builtin_is_pure(name) } else { target.value.is_pure } 537 if (!builtin_exists(name) && target.found && target.value.is_async) || name == "async_fake_read" || (name == "$tcp_exchange" || name == "$tcp_serve") { "ordinary call cannot enter async function" } 538 else { if function.is_async && !target_pure { "async function cannot call blocking function" } 539 else { if arity != expected { "bytecode call to ${name} has invalid arity" } 540 else { if function.is_pure && !target_pure { "pure bytecode function calls impure function ${name}" } else { "" } } } } 541 } 542 }, 543 CallValueInstruction(arity) => "", 544 AwaitCallInstruction(name, arity) => verify_await_call(name, arity, function, program), 545 AwaitValueInstruction(arity) => if function.is_async { "" } else { "await requires async function" }, 546 JumpFalseInstruction(target) => if target < count { "" } else { "invalid jump target" }, 547 JumpInstruction(target) => if target < count { "" } else { "invalid jump target" }, 548 PendingEndJumpInstruction() => "unresolved bytecode jump", 549 ReturnInstruction() => "" 550 } 551 } 552 553 pure verify_function(function: FunctionCode, program: BytecodeProgram): Str { 554 if (function.is_pure && function.is_async) || len(function.name) == 0 || duplicate_names(function.parameters) { 555 "invalid function signature" 556 } else { 557 if len(function.instructions) == 0 { 558 "bytecode function is empty" 559 } else { 560 mut message: Str = "" 561 mut has_return: Bool = false 562 for instruction in function.instructions { 563 match instruction { 564 ReturnInstruction() => { has_return = true; }, 565 ConstInstruction(value) => {}, LoadInstruction(name) => {}, StoreInstruction(name) => {}, 566 PopInstruction() => {}, UnaryInstruction(operator) => {}, BinaryInstruction(operator) => {}, 567 MakeRangeInstruction() => {}, MakeArrayInstruction(count) => {}, IndexGetInstruction() => {}, 568 InterpolateInstruction(parts) => {}, IterInitInstruction(name) => {}, 569 IterNextInstruction(iterator, name, end) => {}, MakeRecordInstruction(name, fields) => {}, 570 FieldGetInstruction(name) => {}, MakeVariantInstruction(enum_name, variant, count) => {}, 571 MatchVariantInstruction(variant, failure) => {}, MatchFailInstruction() => {}, 572 CallInstruction(name, arity) => {}, JumpFalseInstruction(target) => {}, 573 CallValueInstruction(arity) => {}, AwaitCallInstruction(name, arity) => {}, AwaitValueInstruction(arity) => {}, 574 JumpInstruction(target) => {}, PendingEndJumpInstruction() => {} 575 } 576 if len(message) == 0 { message = verify_instruction(instruction, function, program); } else {} 577 } 578 if len(message) > 0 { message } 579 else { if has_return { "" } else { "bytecode function has no RETURN" } } 580 } 581 } 582 } 583 584 pure verify_bytecode_program(program: BytecodeProgram): Str { 585 main: FunctionCodeLookup = bytecode_function(program, "main") 586 if !main.found { "bytecode has no main function" } 587 else { if len(main.value.parameters) > 0 { "bytecode main function cannot take parameters" } 588 else { 589 mut message: Str = "" 590 mut total: Nat = 0 591 for function in program.functions { 592 total = total + len(function.instructions) 593 if total > 4000000 && len(message) == 0 { message = "bytecode exceeds total instruction limit"; } else {} 594 if len(message) == 0 { message = verify_function(function, program); } else {} 595 } 596 message 597 } } 598 } 599 600 pure has_bytecode_magic(data: Bytes): Bool { 601 expected: Bytes = bytes_concat(utf8_encode("PANACKBC"), encode_u8(0)) 602 if byte_len(data) < byte_len(expected) { false } 603 else { 604 mut matches: Bool = true 605 mut cursor: Nat = 0 606 while cursor < byte_len(expected) && matches { 607 if byte_get(data, cursor) != byte_get(expected, cursor) { matches = false; } else {} 608 cursor = cursor + 1 609 } 610 matches 611 } 612 } 613 614 pure decode_bytecode(data: Bytes): BytecodeDecodeResult { 615 if byte_len(data) > 16777216 { BytecodeDecodeError("bytecode artifact exceeds size limit") } 616 else { if !has_bytecode_magic(data) { BytecodeDecodeError("not a Panackelty bytecode file") } 617 else { 618 initial: ByteReader = ByteReader(data, 9, true, "") 619 version: ReadNat = read_u16(initial) 620 if !version.reader.valid { BytecodeDecodeError(version.reader.message) } 621 else { if version.value != 9 { 622 version_number: Nat = version.value 623 BytecodeDecodeError("unsupported bytecode version ${version_number}") 624 } 625 else { 626 function_count: ReadNat = read_u16(version.reader) 627 mut current: ByteReader = function_count.reader 628 if function_count.value > 4096 { current = invalid_reader(current, "function count exceeds limit"); } else {} 629 mut functions: [FunctionCode] = [] 630 mut previous_name: Str = "" 631 mut cursor: Nat = 0 632 mut total: Nat = 0 633 while cursor < function_count.value && current.valid { 634 decoded: ReadFunction = read_function(current) 635 current = decoded.reader 636 function: FunctionCode = decoded.value 637 if cursor > 0 && function.name == previous_name { 638 duplicate_name: Str = function.name 639 current = invalid_reader(current, "duplicate function ${duplicate_name}") 640 } 641 else { if cursor > 0 && function.name < previous_name { current = invalid_reader(current, "functions are not canonically ordered"); } else {} } 642 total = total + len(function.instructions) 643 if total > 4000000 { current = invalid_reader(current, "total instruction count exceeds limit"); } else {} 644 functions = append(functions, function) 645 previous_name = function.name 646 cursor = cursor + 1 647 } 648 if current.valid && current.offset != byte_len(data) { current = invalid_reader(current, "trailing data"); } else {} 649 if !current.valid { BytecodeDecodeError(current.message) } 650 else { 651 program: BytecodeProgram = BytecodeProgram(functions) 652 verification: Str = verify_bytecode_program(program) 653 if len(verification) == 0 { BytecodeDecoded(program) } else { BytecodeDecodeError(verification) } 654 } 655 } } 656 } } 657 } 658 659 pure validate_bytecode(data: Bytes): Str { 660 match decode_bytecode(data) { 661 BytecodeDecoded(program) => "ok", 662 BytecodeDecodeError(message) => message 663 } 664 } 665 666 pure disassemble_bytecode(data: Bytes): Str { 667 match decode_bytecode(data) { 668 BytecodeDecoded(program) => render_bytecode(program), 669 BytecodeDecodeError(message) => message 670 } 671 } 672 673 pure round_trip_bytecode(data: Bytes): Bytes { 674 match decode_bytecode(data) { 675 BytecodeDecoded(program) => serialize_bytecode(program), 676 BytecodeDecodeError(message) => bytes() 677 } 678 } 679 680 pure verify_await_call(name: Str, arity: Nat, function: FunctionCode, program: BytecodeProgram): Str { 681 target: FunctionCodeLookup = bytecode_function(program, name) 682 if !function.is_async { "await requires async function" } 683 else { if name == "async_fake_read" || (name == "$tcp_exchange" || name == "$tcp_serve") { 684 if arity == builtin_arity(name) { "" } else { "async service arity mismatch" } 685 } else { if builtin_exists(name) || !target.found || !target.value.is_async { "await target must be async" } 686 else { if arity != len(target.value.parameters) { "async call arity mismatch" } else { "" } } } } 687 } 688
Functions
[
{
"id": "declaration/13",
"name": "invalid_reader",
"line": 65,
"state": "covered",
"entries": "89"
},
{
"id": "declaration/14",
"name": "reader_has",
"line": 69,
"state": "covered",
"entries": "1907"
},
{
"id": "declaration/15",
"name": "read_u8",
"line": 73,
"state": "covered",
"entries": "855"
},
{
"id": "declaration/16",
"name": "read_u16",
"line": 82,
"state": "covered",
"entries": "542"
},
{
"id": "declaration/17",
"name": "read_u32",
"line": 91,
"state": "covered",
"entries": "167"
},
{
"id": "declaration/18",
"name": "read_raw",
"line": 103,
"state": "covered",
"entries": "343"
},
{
"id": "declaration/19",
"name": "utf8_continuation",
"line": 117,
"state": "covered",
"entries": "62"
},
{
"id": "declaration/20",
"name": "valid_utf8",
"line": 121,
"state": "covered",
"entries": "341"
},
{
"id": "declaration/21",
"name": "decode_utf8",
"line": 163,
"state": "covered",
"entries": "294"
},
{
"id": "declaration/22",
"name": "read_name",
"line": 180,
"state": "covered",
"entries": "267"
},
{
"id": "declaration/23",
"name": "read_text",
"line": 185,
"state": "covered",
"entries": "27"
},
{
"id": "declaration/24",
"name": "nat_digit_count",
"line": 190,
"state": "covered",
"entries": "37"
},
{
"id": "declaration/25",
"name": "read_natural",
"line": 203,
"state": "covered",
"entries": "43"
},
{
"id": "declaration/26",
"name": "subtract_natural",
"line": 229,
"state": "covered",
"entries": "6"
},
{
"id": "declaration/27",
"name": "read_i16",
"line": 239,
"state": "covered",
"entries": "12"
},
{
"id": "declaration/28",
"name": "read_decimal",
"line": 249,
"state": "covered",
"entries": "12"
},
{
"id": "declaration/29",
"name": "read_constant",
"line": 281,
"state": "covered",
"entries": "111"
},
{
"id": "declaration/30",
"name": "read_names",
"line": 322,
"state": "covered",
"entries": "118"
},
{
"id": "declaration/31",
"name": "read_texts",
"line": 335,
"state": "covered",
"entries": "8"
},
{
"id": "declaration/32",
"name": "unary_operator",
"line": 353,
"state": "covered",
"entries": "3"
},
{
"id": "declaration/33",
"name": "binary_operator",
"line": 357,
"state": "covered",
"entries": "13"
},
{
"id": "declaration/34",
"name": "read_instruction",
"line": 372,
"state": "covered",
"entries": "416"
},
{
"id": "declaration/35",
"name": "read_instructions",
"line": 448,
"state": "covered",
"entries": "113"
},
{
"id": "declaration/36",
"name": "read_function",
"line": 461,
"state": "covered",
"entries": "113"
},
{
"id": "declaration/38",
"name": "builtin_exists",
"line": 480,
"state": "covered",
"entries": "162"
},
{
"id": "declaration/39",
"name": "builtin_is_pure",
"line": 484,
"state": "covered",
"entries": "25"
},
{
"id": "declaration/40",
"name": "bytecode_function",
"line": 488,
"state": "covered",
"entries": "95"
},
{
"id": "declaration/41",
"name": "duplicate_names",
"line": 500,
"state": "covered",
"entries": "63"
},
{
"id": "declaration/42",
"name": "verify_instruction",
"line": 510,
"state": "covered",
"entries": "357"
},
{
"id": "declaration/43",
"name": "verify_function",
"line": 553,
"state": "covered",
"entries": "63"
},
{
"id": "declaration/44",
"name": "verify_bytecode_program",
"line": 584,
"state": "covered",
"entries": "43"
},
{
"id": "declaration/45",
"name": "has_bytecode_magic",
"line": 600,
"state": "covered",
"entries": "99"
},
{
"id": "declaration/46",
"name": "decode_bytecode",
"line": 614,
"state": "covered",
"entries": "99"
},
{
"id": "declaration/47",
"name": "validate_bytecode",
"line": 659,
"state": "covered",
"entries": "78"
},
{
"id": "declaration/48",
"name": "disassemble_bytecode",
"line": 666,
"state": "covered",
"entries": "6"
},
{
"id": "declaration/49",
"name": "round_trip_bytecode",
"line": 673,
"state": "covered",
"entries": "15"
},
{
"id": "declaration/50",
"name": "verify_await_call",
"line": 680,
"state": "covered",
"entries": "6"
}
]Source branch outcomes
[
{
"id": "declaration/13/tail/decision/true",
"outcome": "true",
"line": 66,
"state": "covered",
"hits": "47"
},
{
"id": "declaration/13/tail/decision/false",
"outcome": "false",
"line": 66,
"state": "covered",
"hits": "42"
},
{
"id": "declaration/14/tail/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 70,
"state": "covered",
"hits": "1865"
},
{
"id": "declaration/14/tail/decision/skip-right",
"outcome": "skip-right",
"line": 70,
"state": "covered",
"hits": "42"
},
{
"id": "declaration/15/tail/decision/true",
"outcome": "true",
"line": 74,
"state": "covered",
"hits": "825"
},
{
"id": "declaration/15/tail/decision/false",
"outcome": "false",
"line": 74,
"state": "covered",
"hits": "30"
},
{
"id": "declaration/16/tail/decision/true",
"outcome": "true",
"line": 83,
"state": "covered",
"hits": "534"
},
{
"id": "declaration/16/tail/decision/false",
"outcome": "false",
"line": 83,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/17/tail/decision/true",
"outcome": "true",
"line": 92,
"state": "covered",
"hits": "151"
},
{
"id": "declaration/17/tail/decision/false",
"outcome": "false",
"line": 92,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/18/tail/decision/true",
"outcome": "true",
"line": 104,
"state": "covered",
"hits": "335"
},
{
"id": "declaration/18/tail/decision/false",
"outcome": "false",
"line": 104,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/18/tail/true/statement/2/decision/body",
"outcome": "body",
"line": 107,
"state": "covered",
"hits": "1636"
},
{
"id": "declaration/18/tail/true/statement/2/decision/exit",
"outcome": "exit",
"line": 107,
"state": "covered",
"hits": "335"
},
{
"id": "declaration/19/tail/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 118,
"state": "covered",
"hits": "56"
},
{
"id": "declaration/19/tail/decision/skip-right",
"outcome": "skip-right",
"line": 118,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/20/statement/2/decision/body",
"outcome": "body",
"line": 124,
"state": "covered",
"hits": "23308"
},
{
"id": "declaration/20/statement/2/decision/exit",
"outcome": "exit",
"line": 124,
"state": "covered",
"hits": "341"
},
{
"id": "declaration/20/statement/2/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 124,
"state": "covered",
"hits": "23329"
},
{
"id": "declaration/20/statement/2/condition/decision/skip-right",
"outcome": "skip-right",
"line": 124,
"state": "covered",
"hits": "320"
},
{
"id": "declaration/20/statement/2/body/tail/decision/true",
"outcome": "true",
"line": 126,
"state": "covered",
"hits": "23263"
},
{
"id": "declaration/20/statement/2/body/tail/decision/false",
"outcome": "false",
"line": 126,
"state": "covered",
"hits": "45"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/decision/true",
"outcome": "true",
"line": 129,
"state": "covered",
"hits": "13"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/decision/false",
"outcome": "false",
"line": 129,
"state": "covered",
"hits": "32"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 129,
"state": "covered",
"hits": "43"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 129,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/true/tail/decision/true",
"outcome": "true",
"line": 130,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/true/tail/decision/false",
"outcome": "false",
"line": 130,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/true/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 130,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/true/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 130,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 134,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 134,
"state": "covered",
"hits": "22"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 134,
"state": "covered",
"hits": "30"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 134,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/decision/true",
"outcome": "true",
"line": 135,
"state": "covered",
"hits": "9"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/decision/false",
"outcome": "false",
"line": 135,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/statement/2/value/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 138,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/statement/2/value/decision/skip-right",
"outcome": "skip-right",
"line": 138,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/statement/2/value/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 138,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/statement/2/value/left/decision/skip-right",
"outcome": "skip-right",
"line": 138,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/statement/2/value/left/right/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 139,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/statement/2/value/left/right/decision/skip-right",
"outcome": "skip-right",
"line": 139,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/statement/2/value/right/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 139,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/statement/2/value/right/decision/skip-right",
"outcome": "skip-right",
"line": 139,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/tail/decision/true",
"outcome": "true",
"line": 140,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/tail/decision/false",
"outcome": "false",
"line": 140,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 140,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/true/tail/true/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 140,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 144,
"state": "covered",
"hits": "15"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 144,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 144,
"state": "covered",
"hits": "20"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 144,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/decision/true",
"outcome": "true",
"line": 145,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/decision/false",
"outcome": "false",
"line": 145,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/statement/3/value/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 149,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/statement/3/value/decision/skip-right",
"outcome": "skip-right",
"line": 149,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/statement/3/value/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 149,
"state": "covered",
"hits": "13"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/statement/3/value/left/decision/skip-right",
"outcome": "skip-right",
"line": 149,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/statement/3/value/left/right/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 150,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/statement/3/value/left/right/decision/skip-right",
"outcome": "skip-right",
"line": 150,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/statement/3/value/right/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 150,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/statement/3/value/right/decision/skip-right",
"outcome": "skip-right",
"line": 150,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/tail/decision/true",
"outcome": "true",
"line": 151,
"state": "covered",
"hits": "9"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/tail/decision/false",
"outcome": "false",
"line": 151,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 151,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 151,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/tail/condition/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 151,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/20/statement/2/body/tail/false/tail/false/tail/false/tail/true/tail/true/tail/condition/left/decision/skip-right",
"outcome": "skip-right",
"line": 151,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/21/tail/decision/true",
"outcome": "true",
"line": 164,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/21/tail/decision/false",
"outcome": "false",
"line": 164,
"state": "covered",
"hits": "292"
},
{
"id": "declaration/21/tail/false/tail/decision/true",
"outcome": "true",
"line": 168,
"state": "covered",
"hits": "282"
},
{
"id": "declaration/21/tail/false/tail/decision/false",
"outcome": "false",
"line": 168,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/21/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 168,
"state": "covered",
"hits": "284"
},
{
"id": "declaration/21/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 168,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/21/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 171,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/21/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 171,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/24/tail/decision/true",
"outcome": "true",
"line": 191,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/24/tail/decision/false",
"outcome": "false",
"line": 191,
"state": "covered",
"hits": "27"
},
{
"id": "declaration/24/tail/false/statement/2/decision/body",
"outcome": "body",
"line": 195,
"state": "covered",
"hits": "383"
},
{
"id": "declaration/24/tail/false/statement/2/decision/exit",
"outcome": "exit",
"line": 195,
"state": "covered",
"hits": "27"
},
{
"id": "declaration/25/tail/decision/true",
"outcome": "true",
"line": 205,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/25/tail/decision/false",
"outcome": "false",
"line": 205,
"state": "covered",
"hits": "40"
},
{
"id": "declaration/25/tail/false/tail/decision/true",
"outcome": "true",
"line": 207,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/25/tail/false/tail/decision/false",
"outcome": "false",
"line": 207,
"state": "covered",
"hits": "39"
},
{
"id": "declaration/25/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 211,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/25/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 211,
"state": "covered",
"hits": "39"
},
{
"id": "declaration/25/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 213,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/25/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 213,
"state": "covered",
"hits": "37"
},
{
"id": "declaration/25/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 213,
"state": "covered",
"hits": "29"
},
{
"id": "declaration/25/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 213,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/25/tail/false/tail/false/tail/false/tail/false/statement/1/decision/body",
"outcome": "body",
"line": 217,
"state": "covered",
"hits": "168"
},
{
"id": "declaration/25/tail/false/tail/false/tail/false/tail/false/statement/1/decision/exit",
"outcome": "exit",
"line": 217,
"state": "covered",
"hits": "37"
},
{
"id": "declaration/25/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 218,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/25/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 218,
"state": "covered",
"hits": "37"
},
{
"id": "declaration/26/statement/2/decision/body",
"outcome": "body",
"line": 232,
"state": "covered",
"hits": "393195"
},
{
"id": "declaration/26/statement/2/decision/exit",
"outcome": "exit",
"line": 232,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/26/statement/2/body/statement/0/value/decision/true",
"outcome": "true",
"line": 233,
"state": "covered",
"hits": "393195"
},
{
"id": "declaration/26/statement/2/body/statement/0/value/decision/false",
"outcome": "false",
"line": 233,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/27/tail/decision/true",
"outcome": "true",
"line": 241,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/27/tail/decision/false",
"outcome": "false",
"line": 241,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/28/statement/4/value/decision/true",
"outcome": "true",
"line": 254,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/28/statement/4/value/decision/false",
"outcome": "false",
"line": 254,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/28/statement/5/value/decision/true",
"outcome": "true",
"line": 255,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/28/statement/5/value/decision/false",
"outcome": "false",
"line": 255,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/28/statement/6/value/decision/true",
"outcome": "true",
"line": 256,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/28/statement/6/value/decision/false",
"outcome": "false",
"line": 256,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/28/statement/6/value/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 256,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/28/statement/6/value/condition/decision/skip-right",
"outcome": "skip-right",
"line": 256,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/28/statement/10/decision/body",
"outcome": "body",
"line": 260,
"state": "covered",
"hits": "26"
},
{
"id": "declaration/28/statement/10/decision/exit",
"outcome": "exit",
"line": 260,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/28/statement/10/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 260,
"state": "covered",
"hits": "26"
},
{
"id": "declaration/28/statement/10/condition/decision/skip-right",
"outcome": "skip-right",
"line": 260,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/28/statement/10/body/statement/3/value/decision/true",
"outcome": "true",
"line": 264,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/28/statement/10/body/statement/3/value/decision/false",
"outcome": "false",
"line": 264,
"state": "covered",
"hits": "26"
},
{
"id": "declaration/28/statement/10/body/statement/4/value/decision/true",
"outcome": "true",
"line": 266,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/28/statement/10/body/statement/4/value/decision/false",
"outcome": "false",
"line": 266,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/28/statement/10/body/statement/4/value/true/tail/decision/true",
"outcome": "true",
"line": 267,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/28/statement/10/body/statement/4/value/true/tail/decision/false",
"outcome": "false",
"line": 267,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/28/statement/10/body/statement/4/value/false/tail/decision/true",
"outcome": "true",
"line": 270,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/28/statement/10/body/statement/4/value/false/tail/decision/false",
"outcome": "false",
"line": 270,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/28/statement/11/value/decision/true",
"outcome": "true",
"line": 274,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/28/statement/11/value/decision/false",
"outcome": "false",
"line": 274,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/28/statement/11/value/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 274,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/28/statement/11/value/condition/decision/skip-right",
"outcome": "skip-right",
"line": 274,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/28/tail/args/0/args/2/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 278,
"state": "covered",
"hits": "9"
},
{
"id": "declaration/28/tail/args/0/args/2/decision/skip-right",
"outcome": "skip-right",
"line": 278,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/28/tail/args/0/args/3/decision/true",
"outcome": "true",
"line": 278,
"state": "covered",
"hits": "9"
},
{
"id": "declaration/28/tail/args/0/args/3/decision/false",
"outcome": "false",
"line": 278,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/29/tail/decision/true",
"outcome": "true",
"line": 283,
"state": "covered",
"hits": "36"
},
{
"id": "declaration/29/tail/decision/false",
"outcome": "false",
"line": 283,
"state": "covered",
"hits": "75"
},
{
"id": "declaration/29/tail/false/tail/decision/true",
"outcome": "true",
"line": 287,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/29/tail/false/tail/decision/false",
"outcome": "false",
"line": 287,
"state": "covered",
"hits": "68"
},
{
"id": "declaration/29/tail/false/tail/true/statement/3/value/decision/true",
"outcome": "true",
"line": 291,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/29/tail/false/tail/true/statement/3/value/decision/false",
"outcome": "false",
"line": 291,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/29/tail/false/tail/true/statement/4/value/decision/true",
"outcome": "true",
"line": 292,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/29/tail/false/tail/true/statement/4/value/decision/false",
"outcome": "false",
"line": 292,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/29/tail/false/tail/true/statement/4/value/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 292,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/29/tail/false/tail/true/statement/4/value/condition/decision/skip-right",
"outcome": "skip-right",
"line": 292,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/29/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 295,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/29/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 295,
"state": "covered",
"hits": "56"
},
{
"id": "declaration/29/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 298,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/29/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 298,
"state": "covered",
"hits": "45"
},
{
"id": "declaration/29/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 302,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/29/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 302,
"state": "covered",
"hits": "39"
},
{
"id": "declaration/29/tail/false/tail/false/tail/false/tail/false/tail/true/tail/decision/true",
"outcome": "true",
"line": 304,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/29/tail/false/tail/false/tail/false/tail/false/tail/true/tail/decision/false",
"outcome": "false",
"line": 304,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/29/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 310,
"state": "covered",
"hits": "38"
},
{
"id": "declaration/29/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 310,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/30/statement/3/decision/body",
"outcome": "body",
"line": 326,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/30/statement/3/decision/exit",
"outcome": "exit",
"line": 326,
"state": "covered",
"hits": "118"
},
{
"id": "declaration/30/statement/3/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 326,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/30/statement/3/condition/decision/skip-right",
"outcome": "skip-right",
"line": 326,
"state": "covered",
"hits": "118"
},
{
"id": "declaration/31/tail/decision/true",
"outcome": "true",
"line": 337,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/31/tail/decision/false",
"outcome": "false",
"line": 337,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/31/tail/false/statement/3/decision/body",
"outcome": "body",
"line": 343,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/31/tail/false/statement/3/decision/exit",
"outcome": "exit",
"line": 343,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/31/tail/false/statement/3/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 343,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/31/tail/false/statement/3/condition/decision/skip-right",
"outcome": "skip-right",
"line": 343,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/32/tail/decision/true",
"outcome": "true",
"line": 354,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/32/tail/decision/false",
"outcome": "false",
"line": 354,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/decision/true",
"outcome": "true",
"line": 358,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/33/tail/decision/false",
"outcome": "false",
"line": 358,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/33/tail/false/tail/decision/true",
"outcome": "true",
"line": 359,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/decision/false",
"outcome": "false",
"line": 359,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/33/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 360,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 360,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 361,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 361,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 362,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 362,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 363,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 363,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 364,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 364,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 365,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 365,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 366,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 366,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 367,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 367,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 368,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 368,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 369,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/33/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 369,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/34/tail/decision/true",
"outcome": "true",
"line": 374,
"state": "covered",
"hits": "111"
},
{
"id": "declaration/34/tail/decision/false",
"outcome": "false",
"line": 374,
"state": "covered",
"hits": "305"
},
{
"id": "declaration/34/tail/false/tail/decision/true",
"outcome": "true",
"line": 377,
"state": "covered",
"hits": "26"
},
{
"id": "declaration/34/tail/false/tail/decision/false",
"outcome": "false",
"line": 377,
"state": "covered",
"hits": "279"
},
{
"id": "declaration/34/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 379,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/34/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 379,
"state": "covered",
"hits": "267"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 381,
"state": "covered",
"hits": "42"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 381,
"state": "covered",
"hits": "225"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 383,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 383,
"state": "covered",
"hits": "222"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/true/tail/decision/true",
"outcome": "true",
"line": 385,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/true/tail/decision/false",
"outcome": "false",
"line": 385,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 387,
"state": "covered",
"hits": "13"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 387,
"state": "covered",
"hits": "209"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/true/tail/decision/true",
"outcome": "true",
"line": 389,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/true/tail/decision/false",
"outcome": "false",
"line": 389,
"state": "covered",
"hits": "13"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 391,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 391,
"state": "covered",
"hits": "205"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 393,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 393,
"state": "covered",
"hits": "202"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 395,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 395,
"state": "covered",
"hits": "199"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 397,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 397,
"state": "covered",
"hits": "191"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 399,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 399,
"state": "covered",
"hits": "187"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 401,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 401,
"state": "covered",
"hits": "183"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 406,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 406,
"state": "covered",
"hits": "178"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 411,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 411,
"state": "covered",
"hits": "171"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 413,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 413,
"state": "covered",
"hits": "166"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 418,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 418,
"state": "covered",
"hits": "159"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 422,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 422,
"state": "covered",
"hits": "154"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 424,
"state": "covered",
"hits": "49"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 424,
"state": "covered",
"hits": "105"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 428,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 428,
"state": "covered",
"hits": "100"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 430,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 430,
"state": "covered",
"hits": "89"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 432,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 432,
"state": "covered",
"hits": "82"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 436,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 436,
"state": "covered",
"hits": "80"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 439,
"state": "covered",
"hits": "75"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 439,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 441,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/34/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 441,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/35/statement/3/decision/body",
"outcome": "body",
"line": 452,
"state": "covered",
"hits": "416"
},
{
"id": "declaration/35/statement/3/decision/exit",
"outcome": "exit",
"line": 452,
"state": "covered",
"hits": "113"
},
{
"id": "declaration/35/statement/3/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 452,
"state": "covered",
"hits": "433"
},
{
"id": "declaration/35/statement/3/condition/decision/skip-right",
"outcome": "skip-right",
"line": 452,
"state": "covered",
"hits": "96"
},
{
"id": "declaration/36/statement/6/value/decision/true",
"outcome": "true",
"line": 468,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/36/statement/6/value/decision/false",
"outcome": "false",
"line": 468,
"state": "covered",
"hits": "110"
},
{
"id": "declaration/36/statement/7/value/decision/true",
"outcome": "true",
"line": 469,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/36/statement/7/value/decision/false",
"outcome": "false",
"line": 469,
"state": "covered",
"hits": "112"
},
{
"id": "declaration/38/tail/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 481,
"state": "covered",
"hits": "162"
},
{
"id": "declaration/38/tail/decision/skip-right",
"outcome": "skip-right",
"line": 481,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/38/tail/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 481,
"state": "covered",
"hits": "162"
},
{
"id": "declaration/38/tail/left/decision/skip-right",
"outcome": "skip-right",
"line": 481,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/38/tail/right/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 481,
"state": "covered",
"hits": "158"
},
{
"id": "declaration/38/tail/right/decision/skip-right",
"outcome": "skip-right",
"line": 481,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/38/tail/right/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 481,
"state": "covered",
"hits": "162"
},
{
"id": "declaration/38/tail/right/left/decision/skip-right",
"outcome": "skip-right",
"line": 481,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/39/tail/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 485,
"state": "covered",
"hits": "24"
},
{
"id": "declaration/39/tail/decision/skip-right",
"outcome": "skip-right",
"line": 485,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/39/tail/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 485,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/39/tail/left/decision/skip-right",
"outcome": "skip-right",
"line": 485,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/40/statement/2/decision/body",
"outcome": "body",
"line": 491,
"state": "covered",
"hits": "161"
},
{
"id": "declaration/40/statement/2/decision/exit",
"outcome": "exit",
"line": 491,
"state": "covered",
"hits": "95"
},
{
"id": "declaration/40/statement/2/body/tail/decision/true",
"outcome": "true",
"line": 492,
"state": "covered",
"hits": "65"
},
{
"id": "declaration/40/statement/2/body/tail/decision/false",
"outcome": "false",
"line": 492,
"state": "covered",
"hits": "96"
},
{
"id": "declaration/41/statement/2/decision/body",
"outcome": "body",
"line": 503,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/41/statement/2/decision/exit",
"outcome": "exit",
"line": 503,
"state": "covered",
"hits": "63"
},
{
"id": "declaration/41/statement/2/body/tail/decision/true",
"outcome": "true",
"line": 504,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/41/statement/2/body/tail/decision/false",
"outcome": "false",
"line": 504,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/42/tail/arm/0",
"outcome": "ConstInstruction",
"line": 513,
"state": "covered",
"hits": "86"
},
{
"id": "declaration/42/tail/arm/1",
"outcome": "LoadInstruction",
"line": 514,
"state": "covered",
"hits": "26"
},
{
"id": "declaration/42/tail/arm/2",
"outcome": "StoreInstruction",
"line": 515,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/42/tail/arm/3",
"outcome": "PopInstruction",
"line": 516,
"state": "covered",
"hits": "42"
},
{
"id": "declaration/42/tail/arm/4",
"outcome": "UnaryInstruction",
"line": 517,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/42/tail/arm/4/body/decision/true",
"outcome": "true",
"line": 517,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/42/tail/arm/4/body/decision/false",
"outcome": "false",
"line": 517,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/4/body/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 517,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/4/body/condition/decision/skip-right",
"outcome": "skip-right",
"line": 517,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/42/tail/arm/5",
"outcome": "BinaryInstruction",
"line": 518,
"state": "covered",
"hits": "13"
},
{
"id": "declaration/42/tail/arm/6",
"outcome": "MakeRangeInstruction",
"line": 519,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/42/tail/arm/7",
"outcome": "MakeArrayInstruction",
"line": 520,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/42/tail/arm/8",
"outcome": "IndexGetInstruction",
"line": 521,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/42/tail/arm/9",
"outcome": "InterpolateInstruction",
"line": 522,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/42/tail/arm/9/body/decision/true",
"outcome": "true",
"line": 522,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/42/tail/arm/9/body/decision/false",
"outcome": "false",
"line": 522,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/10",
"outcome": "IterInitInstruction",
"line": 523,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/42/tail/arm/11",
"outcome": "IterNextInstruction",
"line": 524,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/42/tail/arm/11/body/decision/true",
"outcome": "true",
"line": 524,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/42/tail/arm/11/body/decision/false",
"outcome": "false",
"line": 524,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/12",
"outcome": "MakeRecordInstruction",
"line": 525,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/42/tail/arm/13",
"outcome": "FieldGetInstruction",
"line": 526,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/42/tail/arm/14",
"outcome": "MakeVariantInstruction",
"line": 527,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/42/tail/arm/15",
"outcome": "MatchVariantInstruction",
"line": 528,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/42/tail/arm/15/body/decision/true",
"outcome": "true",
"line": 528,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/42/tail/arm/15/body/decision/false",
"outcome": "false",
"line": 528,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/16",
"outcome": "MatchFailInstruction",
"line": 529,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/42/tail/arm/17",
"outcome": "CallInstruction",
"line": 530,
"state": "covered",
"hits": "46"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/decision/true",
"outcome": "true",
"line": 532,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/decision/false",
"outcome": "false",
"line": 532,
"state": "covered",
"hits": "45"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 532,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 532,
"state": "covered",
"hits": "21"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/statement/0/value/decision/true",
"outcome": "true",
"line": 535,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/statement/0/value/decision/false",
"outcome": "false",
"line": 535,
"state": "covered",
"hits": "20"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/statement/1/value/decision/true",
"outcome": "true",
"line": 536,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/statement/1/value/decision/false",
"outcome": "false",
"line": 536,
"state": "covered",
"hits": "20"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/decision/true",
"outcome": "true",
"line": 537,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/decision/false",
"outcome": "false",
"line": 537,
"state": "covered",
"hits": "43"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 537,
"state": "covered",
"hits": "44"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 537,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 537,
"state": "covered",
"hits": "44"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/left/decision/skip-right",
"outcome": "skip-right",
"line": 537,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/left/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 537,
"state": "covered",
"hits": "20"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/left/left/decision/skip-right",
"outcome": "skip-right",
"line": 537,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/left/left/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 537,
"state": "covered",
"hits": "20"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/left/left/left/decision/skip-right",
"outcome": "skip-right",
"line": 537,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/right/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 537,
"state": "covered",
"hits": "44"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/condition/right/decision/skip-right",
"outcome": "skip-right",
"line": 537,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 538,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 538,
"state": "covered",
"hits": "41"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 538,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 538,
"state": "covered",
"hits": "40"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 539,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 539,
"state": "covered",
"hits": "40"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 540,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 540,
"state": "covered",
"hits": "39"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 540,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/42/tail/arm/17/body/block/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 540,
"state": "covered",
"hits": "38"
},
{
"id": "declaration/42/tail/arm/18",
"outcome": "CallValueInstruction",
"line": 543,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/42/tail/arm/19",
"outcome": "AwaitCallInstruction",
"line": 544,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/42/tail/arm/20",
"outcome": "AwaitValueInstruction",
"line": 545,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/42/tail/arm/20/body/decision/true",
"outcome": "true",
"line": 545,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/20/body/decision/false",
"outcome": "false",
"line": 545,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/42/tail/arm/21",
"outcome": "JumpFalseInstruction",
"line": 546,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/42/tail/arm/21/body/decision/true",
"outcome": "true",
"line": 546,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/42/tail/arm/21/body/decision/false",
"outcome": "false",
"line": 546,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/22",
"outcome": "JumpInstruction",
"line": 547,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/42/tail/arm/22/body/decision/true",
"outcome": "true",
"line": 547,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/42/tail/arm/22/body/decision/false",
"outcome": "false",
"line": 547,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/42/tail/arm/23",
"outcome": "PendingEndJumpInstruction",
"line": 548,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/42/tail/arm/24",
"outcome": "ReturnInstruction",
"line": 549,
"state": "covered",
"hits": "48"
},
{
"id": "declaration/43/tail/decision/true",
"outcome": "true",
"line": 554,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/43/tail/decision/false",
"outcome": "false",
"line": 554,
"state": "covered",
"hits": "63"
},
{
"id": "declaration/43/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 554,
"state": "covered",
"hits": "63"
},
{
"id": "declaration/43/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 554,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/43/tail/condition/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 554,
"state": "covered",
"hits": "63"
},
{
"id": "declaration/43/tail/condition/left/decision/skip-right",
"outcome": "skip-right",
"line": 554,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/43/tail/condition/left/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 554,
"state": "covered",
"hits": "22"
},
{
"id": "declaration/43/tail/condition/left/left/decision/skip-right",
"outcome": "skip-right",
"line": 554,
"state": "covered",
"hits": "41"
},
{
"id": "declaration/43/tail/false/tail/decision/true",
"outcome": "true",
"line": 557,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/43/tail/false/tail/decision/false",
"outcome": "false",
"line": 557,
"state": "covered",
"hits": "63"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/decision/body",
"outcome": "body",
"line": 562,
"state": "covered",
"hits": "373"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/decision/exit",
"outcome": "exit",
"line": 562,
"state": "covered",
"hits": "63"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/0",
"outcome": "ReturnInstruction",
"line": 564,
"state": "covered",
"hits": "63"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/1",
"outcome": "ConstInstruction",
"line": 565,
"state": "covered",
"hits": "86"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/2",
"outcome": "LoadInstruction",
"line": 565,
"state": "covered",
"hits": "26"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/3",
"outcome": "StoreInstruction",
"line": 565,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/4",
"outcome": "PopInstruction",
"line": 566,
"state": "covered",
"hits": "42"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/5",
"outcome": "UnaryInstruction",
"line": 566,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/6",
"outcome": "BinaryInstruction",
"line": 566,
"state": "covered",
"hits": "13"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/7",
"outcome": "MakeRangeInstruction",
"line": 567,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/8",
"outcome": "MakeArrayInstruction",
"line": 567,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/9",
"outcome": "IndexGetInstruction",
"line": 567,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/10",
"outcome": "InterpolateInstruction",
"line": 568,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/11",
"outcome": "IterInitInstruction",
"line": 568,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/12",
"outcome": "IterNextInstruction",
"line": 569,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/13",
"outcome": "MakeRecordInstruction",
"line": 569,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/14",
"outcome": "FieldGetInstruction",
"line": 570,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/15",
"outcome": "MakeVariantInstruction",
"line": 570,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/16",
"outcome": "MatchVariantInstruction",
"line": 571,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/17",
"outcome": "MatchFailInstruction",
"line": 571,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/18",
"outcome": "CallInstruction",
"line": 572,
"state": "covered",
"hits": "47"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/19",
"outcome": "JumpFalseInstruction",
"line": 572,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/20",
"outcome": "CallValueInstruction",
"line": 573,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/21",
"outcome": "AwaitCallInstruction",
"line": 573,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/22",
"outcome": "AwaitValueInstruction",
"line": 573,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/23",
"outcome": "JumpInstruction",
"line": 574,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/statement/0/value/arm/24",
"outcome": "PendingEndJumpInstruction",
"line": 574,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/tail/decision/true",
"outcome": "true",
"line": 576,
"state": "covered",
"hits": "357"
},
{
"id": "declaration/43/tail/false/tail/false/statement/2/body/tail/decision/false",
"outcome": "false",
"line": 576,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/43/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 578,
"state": "covered",
"hits": "15"
},
{
"id": "declaration/43/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 578,
"state": "covered",
"hits": "48"
},
{
"id": "declaration/43/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 579,
"state": "covered",
"hits": "48"
},
{
"id": "declaration/43/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 579,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/44/tail/decision/true",
"outcome": "true",
"line": 586,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/44/tail/decision/false",
"outcome": "false",
"line": 586,
"state": "covered",
"hits": "42"
},
{
"id": "declaration/44/tail/false/tail/decision/true",
"outcome": "true",
"line": 587,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/44/tail/false/tail/decision/false",
"outcome": "false",
"line": 587,
"state": "covered",
"hits": "42"
},
{
"id": "declaration/44/tail/false/tail/false/statement/2/decision/body",
"outcome": "body",
"line": 591,
"state": "covered",
"hits": "65"
},
{
"id": "declaration/44/tail/false/tail/false/statement/2/decision/exit",
"outcome": "exit",
"line": 591,
"state": "covered",
"hits": "42"
},
{
"id": "declaration/44/tail/false/tail/false/statement/2/body/statement/1/value/decision/true",
"outcome": "true",
"line": 593,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/44/tail/false/tail/false/statement/2/body/statement/1/value/decision/false",
"outcome": "false",
"line": 593,
"state": "covered",
"hits": "65"
},
{
"id": "declaration/44/tail/false/tail/false/statement/2/body/statement/1/value/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 593,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/44/tail/false/tail/false/statement/2/body/statement/1/value/condition/decision/skip-right",
"outcome": "skip-right",
"line": 593,
"state": "covered",
"hits": "65"
},
{
"id": "declaration/44/tail/false/tail/false/statement/2/body/tail/decision/true",
"outcome": "true",
"line": 594,
"state": "covered",
"hits": "63"
},
{
"id": "declaration/44/tail/false/tail/false/statement/2/body/tail/decision/false",
"outcome": "false",
"line": 594,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/45/tail/decision/true",
"outcome": "true",
"line": 602,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/45/tail/decision/false",
"outcome": "false",
"line": 602,
"state": "covered",
"hits": "99"
},
{
"id": "declaration/45/tail/false/statement/2/decision/body",
"outcome": "body",
"line": 606,
"state": "covered",
"hits": "875"
},
{
"id": "declaration/45/tail/false/statement/2/decision/exit",
"outcome": "exit",
"line": 606,
"state": "covered",
"hits": "99"
},
{
"id": "declaration/45/tail/false/statement/2/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 606,
"state": "covered",
"hits": "877"
},
{
"id": "declaration/45/tail/false/statement/2/condition/decision/skip-right",
"outcome": "skip-right",
"line": 606,
"state": "covered",
"hits": "97"
},
{
"id": "declaration/45/tail/false/statement/2/body/statement/0/value/decision/true",
"outcome": "true",
"line": 607,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/45/tail/false/statement/2/body/statement/0/value/decision/false",
"outcome": "false",
"line": 607,
"state": "covered",
"hits": "873"
},
{
"id": "declaration/46/tail/decision/true",
"outcome": "true",
"line": 615,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/46/tail/decision/false",
"outcome": "false",
"line": 615,
"state": "covered",
"hits": "99"
},
{
"id": "declaration/46/tail/false/tail/decision/true",
"outcome": "true",
"line": 616,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/46/tail/false/tail/decision/false",
"outcome": "false",
"line": 616,
"state": "covered",
"hits": "97"
},
{
"id": "declaration/46/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 620,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/46/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 620,
"state": "covered",
"hits": "97"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 621,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 621,
"state": "covered",
"hits": "90"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/2/value/decision/true",
"outcome": "true",
"line": 628,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/2/value/decision/false",
"outcome": "false",
"line": 628,
"state": "covered",
"hits": "89"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/decision/body",
"outcome": "body",
"line": 633,
"state": "covered",
"hits": "113"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/decision/exit",
"outcome": "exit",
"line": 633,
"state": "covered",
"hits": "90"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 633,
"state": "covered",
"hits": "114"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/condition/decision/skip-right",
"outcome": "skip-right",
"line": 633,
"state": "covered",
"hits": "89"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/3/value/decision/true",
"outcome": "true",
"line": 637,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/3/value/decision/false",
"outcome": "false",
"line": 637,
"state": "covered",
"hits": "111"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/3/value/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 637,
"state": "covered",
"hits": "27"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/3/value/condition/decision/skip-right",
"outcome": "skip-right",
"line": 637,
"state": "covered",
"hits": "86"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/3/value/false/tail/decision/true",
"outcome": "true",
"line": 641,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/3/value/false/tail/decision/false",
"outcome": "false",
"line": 641,
"state": "covered",
"hits": "109"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/3/value/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 641,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/3/value/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 641,
"state": "covered",
"hits": "86"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/5/value/decision/true",
"outcome": "true",
"line": 643,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/7/body/statement/5/value/decision/false",
"outcome": "false",
"line": 643,
"state": "covered",
"hits": "113"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/8/value/decision/true",
"outcome": "true",
"line": 648,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/8/value/decision/false",
"outcome": "false",
"line": 648,
"state": "covered",
"hits": "88"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/8/value/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 648,
"state": "covered",
"hits": "45"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/statement/8/value/condition/decision/skip-right",
"outcome": "skip-right",
"line": 648,
"state": "covered",
"hits": "45"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 649,
"state": "covered",
"hits": "47"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 649,
"state": "covered",
"hits": "43"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 653,
"state": "covered",
"hits": "27"
},
{
"id": "declaration/46/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 653,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/47/tail/arm/0",
"outcome": "BytecodeDecoded",
"line": 661,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/47/tail/arm/1",
"outcome": "BytecodeDecodeError",
"line": 662,
"state": "covered",
"hits": "72"
},
{
"id": "declaration/48/tail/arm/0",
"outcome": "BytecodeDecoded",
"line": 668,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/48/tail/arm/1",
"outcome": "BytecodeDecodeError",
"line": 669,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/49/tail/arm/0",
"outcome": "BytecodeDecoded",
"line": 675,
"state": "covered",
"hits": "15"
},
{
"id": "declaration/49/tail/arm/1",
"outcome": "BytecodeDecodeError",
"line": 676,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/50/tail/decision/true",
"outcome": "true",
"line": 682,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/50/tail/decision/false",
"outcome": "false",
"line": 682,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/50/tail/false/tail/decision/true",
"outcome": "true",
"line": 683,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/50/tail/false/tail/decision/false",
"outcome": "false",
"line": 683,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/50/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 683,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/50/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 683,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/50/tail/false/tail/condition/right/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 683,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/50/tail/false/tail/condition/right/decision/skip-right",
"outcome": "skip-right",
"line": 683,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/50/tail/false/tail/true/tail/decision/true",
"outcome": "true",
"line": 684,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/50/tail/false/tail/true/tail/decision/false",
"outcome": "false",
"line": 684,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/50/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 685,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/50/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 685,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/50/tail/false/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 685,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/50/tail/false/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 685,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/50/tail/false/tail/false/tail/condition/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 685,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/50/tail/false/tail/false/tail/condition/left/decision/skip-right",
"outcome": "skip-right",
"line": 685,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/50/tail/false/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 686,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/50/tail/false/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 686,
"state": "zero",
"hits": "0"
}
]Reviewed declaration exclusions
[
{
"id": "declaration/0",
"reason": "import",
"line": 1
},
{
"id": "declaration/1",
"reason": "record-declaration",
"line": 3
},
{
"id": "declaration/2",
"reason": "record-declaration",
"line": 10
},
{
"id": "declaration/3",
"reason": "record-declaration",
"line": 15
},
{
"id": "declaration/4",
"reason": "record-declaration",
"line": 20
},
{
"id": "declaration/5",
"reason": "record-declaration",
"line": 25
},
{
"id": "declaration/6",
"reason": "record-declaration",
"line": 30
},
{
"id": "declaration/7",
"reason": "record-declaration",
"line": 35
},
{
"id": "declaration/8",
"reason": "record-declaration",
"line": 40
},
{
"id": "declaration/9",
"reason": "record-declaration",
"line": 45
},
{
"id": "declaration/10",
"reason": "record-declaration",
"line": 50
},
{
"id": "declaration/11",
"reason": "record-declaration",
"line": 55
},
{
"id": "declaration/12",
"reason": "enum-declaration",
"line": 60
},
{
"id": "declaration/37",
"reason": "record-declaration",
"line": 475
}
]