src/compiler/emitter.panack
Green: covered; red: known zero; amber: unavailable. Blank lines are outside the executable-start-line denominator.
1 import "purity.panack" 2 3 enum ConstantValue { 4 NatConstant(Nat), 5 IntConstant(Bool, Nat), 6 DecimalConstant(Str), 7 DecimalPartsConstant(Bool, [Nat], Bool, Nat), 8 StringConstant(Str), 9 BoolConstant(Bool), 10 VoidConstant 11 } 12 13 enum Instruction { 14 ConstInstruction(ConstantValue), 15 LoadInstruction(Str), 16 StoreInstruction(Str), 17 PopInstruction, 18 UnaryInstruction(Str), 19 BinaryInstruction(Str), 20 MakeRangeInstruction, 21 MakeArrayInstruction(Nat), 22 IndexGetInstruction, 23 InterpolateInstruction([Str]), 24 IterInitInstruction(Str), 25 IterNextInstruction(Str, Str, Nat), 26 MakeRecordInstruction(Str, [Str]), 27 FieldGetInstruction(Str), 28 MakeVariantInstruction(Str, Str, Nat), 29 MatchVariantInstruction(Str, Nat), 30 MatchFailInstruction, 31 CallInstruction(Str, Nat), 32 CallValueInstruction(Nat), 33 AwaitCallInstruction(Str, Nat), 34 AwaitValueInstruction(Nat), 35 JumpFalseInstruction(Nat), 36 JumpInstruction(Nat), 37 PendingEndJumpInstruction, 38 ReturnInstruction 39 } 40 41 record FunctionCode { 42 name: Str, 43 parameters: [Str], 44 is_pure: Bool, 45 is_async: Bool, 46 instructions: [Instruction] 47 } 48 49 record BytecodeProgram { 50 functions: [FunctionCode] 51 } 52 53 record EmittedCode { 54 instructions: [Instruction], 55 next_temporary: Nat, 56 sources: [InstructionSource], 57 probes: [EmissionProbe] 58 } 59 60 // Sparse, function-local instruction indices; an absent entry means unavailable. 61 // Lowered entries associate compiler-generated machinery with its source construct, 62 // rather than claiming a one-to-one source operation. This is an internal contract. 63 record EmissionProbe { 64 kind: Str, 65 span: SourceSpan, 66 start: Nat, 67 end: Nat 68 } 69 70 record FunctionProbes { name: Str, entries: [EmissionProbe] } 71 72 pure add_emission_probe(probes: [EmissionProbe], kind: Str, expression: Expr, start: Nat, end: Nat, enabled: Bool): [EmissionProbe] { 73 if enabled { 74 match expression_span(expression) { 75 Some(span) => append(probes, EmissionProbe(kind, span, start, end)), 76 None() => probes 77 } 78 } else { probes } 79 } 80 81 record InstructionSource { 82 index: Nat, 83 span: SourceSpan, 84 lowered: Bool 85 } 86 87 record FunctionSources { 88 name: Str, 89 entries: [InstructionSource] 90 } 91 92 record SourceMappedProgram { 93 bytecode: BytecodeProgram, 94 sources: [FunctionSources], 95 probes: [FunctionProbes] 96 } 97 98 pure add_instruction_source(sources: [InstructionSource], origin: Option[SourceSpan], index: Nat, lowered: Bool): [InstructionSource] { 99 match origin { 100 None() => sources, 101 Some(span) => append(sources, InstructionSource(index, span, lowered)) 102 } 103 } 104 105 pure parameter_name(parameter: FunctionParameter): Str { parameter.name } 106 107 pure parameter_names(parameters: [FunctionParameter]): [Str] { 108 parameters.map(@parameter_name) 109 } 110 111 pure record_field_name(field: RecordField): Str { field.name } 112 113 pure record_field_names(fields: [RecordField]): [Str] { 114 fields.map(@record_field_name) 115 } 116 117 pure resolve_pending_jumps(instructions: [Instruction], target: Nat): [Instruction] { 118 mut result: [Instruction] = [] 119 for instruction in instructions { 120 match instruction { 121 PendingEndJumpInstruction() => { 122 result = append(result, JumpInstruction(target)) 123 }, 124 ConstInstruction(value) => { result = append(result, instruction); }, 125 LoadInstruction(name) => { result = append(result, instruction); }, 126 StoreInstruction(name) => { result = append(result, instruction); }, 127 PopInstruction() => { result = append(result, instruction); }, 128 UnaryInstruction(operator) => { result = append(result, instruction); }, 129 BinaryInstruction(operator) => { result = append(result, instruction); }, 130 MakeRangeInstruction() => { result = append(result, instruction); }, 131 MakeArrayInstruction(count) => { result = append(result, instruction); }, 132 IndexGetInstruction() => { result = append(result, instruction); }, 133 InterpolateInstruction(parts) => { result = append(result, instruction); }, 134 IterInitInstruction(name) => { result = append(result, instruction); }, 135 IterNextInstruction(iterator, name, end) => { result = append(result, instruction); }, 136 MakeRecordInstruction(name, fields) => { result = append(result, instruction); }, 137 FieldGetInstruction(name) => { result = append(result, instruction); }, 138 MakeVariantInstruction(enum_name, variant, count) => { result = append(result, instruction); }, 139 MatchVariantInstruction(variant, failure) => { result = append(result, instruction); }, 140 MatchFailInstruction() => { result = append(result, instruction); }, 141 CallInstruction(name, arity) => { result = append(result, instruction); }, 142 CallValueInstruction(arity) => { result = append(result, instruction); }, 143 AwaitCallInstruction(name, arity) => { result = append(result, instruction); }, 144 AwaitValueInstruction(arity) => { result = append(result, instruction); }, 145 JumpFalseInstruction(jump_target) => { result = append(result, instruction); }, 146 JumpInstruction(jump_target) => { result = append(result, instruction); }, 147 ReturnInstruction() => { result = append(result, instruction); } 148 } 149 } 150 result 151 } 152 153 pure render_string_items(items: [Str]): Str { 154 mut output: Str = "" 155 mut first: Bool = true 156 for item in items { 157 if first { first = false; } else { output = output + ","; } 158 output = output + item 159 } 160 output 161 } 162 163 pure render_constant(value: ConstantValue): Str { 164 match value { 165 NatConstant(number) => "Nat:${number}", 166 IntConstant(negative, magnitude) => { 167 if negative { "Int:-${magnitude}" } else { "Int:${magnitude}" } 168 }, 169 DecimalConstant(text) => "Dec:${text}", 170 DecimalPartsConstant(negative, digits, exponent_negative, exponent_magnitude) => { 171 sign: Str = if negative { "-" } else { "" } 172 exponent_sign: Str = if exponent_negative { "-" } else { "+" } 173 digits_text: Str = "" 174 mut rendered_digits: Str = digits_text 175 for digit in digits { rendered_digits = rendered_digits + "${digit}"; } 176 "DecParts:${sign}${rendered_digits}e${exponent_sign}${exponent_magnitude}" 177 }, 178 StringConstant(text) => "Str:${text}", 179 BoolConstant(flag) => if flag { "Bool:true" } else { "Bool:false" }, 180 VoidConstant() => "Void" 181 } 182 } 183 184 pure render_instruction(instruction: Instruction): Str { 185 match instruction { 186 ConstInstruction(value) => { 187 value_text: Str = render_constant(value) 188 "CONST|${value_text}" 189 }, 190 LoadInstruction(name) => "LOAD|${name}", 191 StoreInstruction(name) => "STORE|${name}", 192 PopInstruction() => "POP", 193 UnaryInstruction(operator) => "UNARY|${operator}", 194 BinaryInstruction(operator) => "BINARY|${operator}", 195 MakeRangeInstruction() => "MAKE_RANGE", 196 MakeArrayInstruction(count) => "MAKE_ARRAY|${count}", 197 IndexGetInstruction() => "INDEX_GET", 198 InterpolateInstruction(parts) => { 199 parts_text: Str = render_string_items(parts) 200 "INTERPOLATE|${parts_text}" 201 }, 202 IterInitInstruction(name) => "ITER_INIT|${name}", 203 IterNextInstruction(iterator, name, end) => "ITER_NEXT|${iterator}|${name}|${end}", 204 MakeRecordInstruction(name, fields) => { 205 fields_text: Str = render_string_items(fields) 206 "MAKE_RECORD|${name}|${fields_text}" 207 }, 208 FieldGetInstruction(name) => "FIELD_GET|${name}", 209 MakeVariantInstruction(enum_name, variant, count) => "MAKE_VARIANT|${enum_name}|${variant}|${count}", 210 MatchVariantInstruction(variant, failure) => "MATCH_VARIANT|${variant}|${failure}", 211 MatchFailInstruction() => "MATCH_FAIL", 212 CallInstruction(name, arity) => "CALL|${name}|${arity}", 213 CallValueInstruction(arity) => "CALL_VALUE|${arity}", 214 AwaitCallInstruction(name, arity) => "AWAIT_CALL|${name}|${arity}", 215 AwaitValueInstruction(arity) => "AWAIT_VALUE|${arity}", 216 JumpFalseInstruction(target) => "JUMP_FALSE|${target}", 217 JumpInstruction(target) => "JUMP|${target}", 218 PendingEndJumpInstruction() => "PENDING_END_JUMP", 219 ReturnInstruction() => "RETURN" 220 } 221 } 222 223 pure render_bytecode(program: BytecodeProgram): Str { 224 mut output: Str = "" 225 for function in program.functions { 226 purity: Str = if function.is_async { "async" } else { if function.is_pure { "pure" } else { "impure" } } 227 function_name: Str = function.name 228 parameters_text: Str = render_string_items(function.parameters) 229 output = output + "FUNCTION|${function_name}|${purity}|${parameters_text}\n" 230 mut index: Nat = 0 231 for instruction in function.instructions { 232 instruction_text: Str = render_instruction(instruction) 233 output = output + "${index}|${instruction_text}\n" 234 index = index + 1 235 } 236 } 237 output 238 } 239 240 pure emit_expression_list(expressions: [Expr], program: Program, next_temporary: Nat, offset: Nat, retain_sources: Bool): EmittedCode { 241 mut sources: [InstructionSource] = [] 242 mut probes: [EmissionProbe] = [] 243 mut instructions: [Instruction] = [] 244 mut temporary: Nat = next_temporary 245 for expression in expressions { 246 emitted: EmittedCode = emit_expression(expression, program, temporary, offset + len(instructions), retain_sources) 247 sources = concat(sources, emitted.sources) 248 probes = concat(probes, emitted.probes) 249 instructions = concat(instructions, emitted.instructions) 250 temporary = emitted.next_temporary 251 } 252 EmittedCode(instructions, temporary, sources, probes) 253 } 254 255 pure emit_block(block: Block, program: Program, next_temporary: Nat, offset: Nat, retain_sources: Bool): EmittedCode { 256 mut sources: [InstructionSource] = [] 257 mut probes: [EmissionProbe] = [] 258 mut instructions: [Instruction] = [] 259 mut temporary: Nat = next_temporary 260 for statement in block.statements { 261 statement_offset: Nat = offset + len(instructions) 262 match statement { 263 BindingStatement(name, type_name, mutable, value) => { 264 emitted: EmittedCode = emit_expression(value, program, temporary, statement_offset, retain_sources) 265 sources = concat(sources, emitted.sources) 266 probes = concat(probes, emitted.probes) 267 instructions = concat(instructions, emitted.instructions) 268 instructions = append(instructions, StoreInstruction(name)) 269 temporary = emitted.next_temporary 270 }, 271 AssignmentStatement(name, value) => { 272 emitted: EmittedCode = emit_expression(value, program, temporary, statement_offset, retain_sources) 273 sources = concat(sources, emitted.sources) 274 probes = concat(probes, emitted.probes) 275 instructions = concat(instructions, emitted.instructions) 276 instructions = append(instructions, StoreInstruction(name)) 277 temporary = emitted.next_temporary 278 }, 279 ExpressionStatement(value) => { 280 emitted: EmittedCode = emit_expression(value, program, temporary, statement_offset, retain_sources) 281 sources = concat(sources, emitted.sources) 282 probes = concat(probes, emitted.probes) 283 instructions = concat(instructions, emitted.instructions) 284 instructions = append(instructions, PopInstruction()) 285 temporary = emitted.next_temporary 286 }, 287 WhileStatement(condition, body) => { 288 condition_code: EmittedCode = emit_expression(condition, program, temporary, statement_offset, retain_sources) 289 jump_index: Nat = statement_offset + len(condition_code.instructions) 290 body_code: EmittedCode = emit_block(body, program, condition_code.next_temporary, jump_index + 1, retain_sources) 291 end: Nat = jump_index + 1 + len(body_code.instructions) + 2 292 sources = concat(sources, condition_code.sources) 293 probes = concat(probes, condition_code.probes) 294 instructions = concat(instructions, condition_code.instructions) 295 probes = add_emission_probe(probes, "while", condition, jump_index, jump_index + 1, retain_sources) 296 instructions = append(instructions, JumpFalseInstruction(end)) 297 sources = concat(sources, body_code.sources) 298 probes = concat(probes, body_code.probes) 299 instructions = concat(instructions, body_code.instructions) 300 instructions = append(instructions, PopInstruction()) 301 instructions = append(instructions, JumpInstruction(statement_offset)) 302 temporary = body_code.next_temporary 303 }, 304 ForStatement(name, iterable, body) => { 305 iterator: Str = "$iter${temporary}" 306 iterable_code: EmittedCode = emit_expression(iterable, program, temporary + 1, statement_offset, retain_sources) 307 iter_init_index: Nat = statement_offset + len(iterable_code.instructions) 308 loop_start: Nat = iter_init_index + 1 309 body_start: Nat = loop_start + 1 310 body_code: EmittedCode = emit_block(body, program, iterable_code.next_temporary, body_start, retain_sources) 311 end: Nat = body_start + len(body_code.instructions) + 2 312 sources = concat(sources, iterable_code.sources) 313 probes = concat(probes, iterable_code.probes) 314 instructions = concat(instructions, iterable_code.instructions) 315 instructions = append(instructions, IterInitInstruction(iterator)) 316 probes = add_emission_probe(probes, "for", iterable, loop_start, loop_start + 1, retain_sources) 317 instructions = append(instructions, IterNextInstruction(iterator, name, end)) 318 sources = concat(sources, body_code.sources) 319 probes = concat(probes, body_code.probes) 320 instructions = concat(instructions, body_code.instructions) 321 instructions = append(instructions, PopInstruction()) 322 instructions = append(instructions, JumpInstruction(loop_start)) 323 temporary = body_code.next_temporary 324 } 325 } 326 } 327 match block.value { 328 NoBlockValue() => { 329 instructions = append(instructions, ConstInstruction(VoidConstant())) 330 }, 331 TailBlockValue(value) => { 332 emitted: EmittedCode = emit_expression(value, program, temporary, offset + len(instructions), retain_sources) 333 sources = concat(sources, emitted.sources) 334 probes = concat(probes, emitted.probes) 335 instructions = concat(instructions, emitted.instructions) 336 temporary = emitted.next_temporary 337 } 338 } 339 EmittedCode(instructions, temporary, sources, probes) 340 } 341 342 pure emit_short_circuit(operator: Str, left: Expr, right: Expr, program: Program, next_temporary: Nat, offset: Nat, retain_sources: Bool, origin: Option[SourceSpan]): EmittedCode { 343 mut sources: [InstructionSource] = [] 344 mut probes: [EmissionProbe] = [] 345 left_code: EmittedCode = emit_expression(left, program, next_temporary, offset, retain_sources) 346 branch: Nat = offset + len(left_code.instructions) 347 if operator == "&&" { 348 right_code: EmittedCode = emit_expression(right, program, left_code.next_temporary, branch + 1, retain_sources) 349 false_target: Nat = branch + 1 + len(right_code.instructions) + 1 350 end: Nat = false_target + 1 351 sources = left_code.sources 352 probes = left_code.probes 353 mut instructions: [Instruction] = left_code.instructions 354 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 355 instructions = append(instructions, JumpFalseInstruction(false_target)) 356 sources = concat(sources, right_code.sources) 357 probes = concat(probes, right_code.probes) 358 instructions = concat(instructions, right_code.instructions) 359 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 360 instructions = append(instructions, JumpInstruction(end)) 361 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 362 instructions = append(instructions, ConstInstruction(BoolConstant(false))) 363 probes = add_emission_probe(probes, operator, left, branch, branch + 1, retain_sources) 364 EmittedCode(instructions, right_code.next_temporary, sources, probes) 365 } else { 366 true_index: Nat = branch + 1 367 right_target: Nat = true_index + 2 368 right_code: EmittedCode = emit_expression(right, program, left_code.next_temporary, right_target, retain_sources) 369 end: Nat = right_target + len(right_code.instructions) 370 sources = left_code.sources 371 probes = left_code.probes 372 mut instructions: [Instruction] = left_code.instructions 373 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 374 instructions = append(instructions, JumpFalseInstruction(right_target)) 375 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 376 instructions = append(instructions, ConstInstruction(BoolConstant(true))) 377 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 378 instructions = append(instructions, JumpInstruction(end)) 379 sources = concat(sources, right_code.sources) 380 probes = concat(probes, right_code.probes) 381 instructions = concat(instructions, right_code.instructions) 382 probes = add_emission_probe(probes, operator, left, branch, branch + 1, retain_sources) 383 EmittedCode(instructions, right_code.next_temporary, sources, probes) 384 } 385 } 386 387 pure emit_string_expression(token_text: Str, next_temporary: Nat, retain_sources: Bool, origin: Option[SourceSpan], offset: Nat): EmittedCode { 388 mut sources: [InstructionSource] = [] 389 mut probes: [EmissionProbe] = [] 390 text: Str = decode_string_literal(token_text) 391 interpolation: InterpolatedString = split_interpolated_string(text) 392 mut instructions: [Instruction] = [] 393 if len(interpolation.variables) == 0 { 394 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), false); } 395 instructions = append(instructions, ConstInstruction(StringConstant(text))) 396 } else { 397 for variable in interpolation.variables { 398 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 399 instructions = append(instructions, LoadInstruction(variable)) 400 } 401 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), false); } 402 instructions = append(instructions, InterpolateInstruction(interpolation.parts)) 403 } 404 EmittedCode(instructions, next_temporary, sources, probes) 405 } 406 407 pure emit_call(name: Str, arguments: [Expr], program: Program, next_temporary: Nat, offset: Nat, retain_sources: Bool, origin: Option[SourceSpan]): EmittedCode { 408 mut sources: [InstructionSource] = [] 409 mut probes: [EmissionProbe] = [] 410 if name == "$method_call" { 411 emitted: EmittedCode = emit_expression_list(arguments, program, next_temporary, offset, retain_sources) 412 EmittedCode(append(emitted.instructions, CallValueInstruction(prior_index(len(arguments)))), emitted.next_temporary, 413 if retain_sources { add_instruction_source(emitted.sources, origin, offset + len(emitted.instructions), false) } else { [] }, emitted.probes) 414 } else { if name == "$method_map" || name == "$method_reduce" { 415 collection_name: Str = "$collection${next_temporary}" 416 callback_name: Str = "$callback${next_temporary}" 417 item_name: Str = "$item${next_temporary}" 418 iterator_name: Str = "$iterator${next_temporary}" 419 accumulator_name: Str = "$accumulator${next_temporary}" 420 collection: EmittedCode = emit_expression(arguments[0], program, next_temporary + 1, offset, retain_sources) 421 sources = collection.sources 422 probes = collection.probes 423 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(collection.instructions), true); } 424 mut instructions: [Instruction] = append(collection.instructions, StoreInstruction(collection_name)) 425 mut temporary: Nat = collection.next_temporary 426 if name == "$method_reduce" { 427 initial: EmittedCode = emit_expression(arguments[1], program, temporary, offset + len(instructions), retain_sources) 428 sources = concat(sources, initial.sources) 429 probes = concat(probes, initial.probes) 430 instructions = concat(instructions, initial.instructions) 431 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 432 instructions = append(instructions, StoreInstruction(accumulator_name)) 433 temporary = initial.next_temporary 434 } else { 435 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 436 instructions = append(instructions, MakeArrayInstruction(0)) 437 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 438 instructions = append(instructions, StoreInstruction(accumulator_name)) 439 } 440 callback: EmittedCode = emit_expression(arguments[prior_index(len(arguments))], program, temporary, offset + len(instructions), retain_sources) 441 sources = concat(sources, callback.sources) 442 probes = concat(probes, callback.probes) 443 instructions = concat(instructions, callback.instructions) 444 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 445 instructions = append(instructions, StoreInstruction(callback_name)) 446 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 447 instructions = append(instructions, LoadInstruction(collection_name)) 448 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 449 instructions = append(instructions, IterInitInstruction(iterator_name)) 450 loop_start: Nat = offset + len(instructions) 451 next_index: Nat = len(instructions) 452 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 453 instructions = append(instructions, IterNextInstruction(iterator_name, item_name, 0)) 454 if name == "$method_map" { 455 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 456 instructions = append(instructions, LoadInstruction(accumulator_name)) 457 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 458 instructions = append(instructions, LoadInstruction(callback_name)) 459 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 460 instructions = append(instructions, LoadInstruction(item_name)) 461 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 462 instructions = append(instructions, CallValueInstruction(1)) 463 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 464 instructions = append(instructions, CallInstruction("append", 2)) 465 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 466 instructions = append(instructions, StoreInstruction(accumulator_name)) 467 } else { 468 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 469 instructions = append(instructions, LoadInstruction(callback_name)) 470 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 471 instructions = append(instructions, LoadInstruction(accumulator_name)) 472 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 473 instructions = append(instructions, LoadInstruction(item_name)) 474 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 475 instructions = append(instructions, CallValueInstruction(2)) 476 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 477 instructions = append(instructions, StoreInstruction(accumulator_name)) 478 } 479 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 480 instructions = append(instructions, JumpInstruction(loop_start)) 481 end: Nat = offset + len(instructions) 482 mut resolved: [Instruction] = [] 483 mut instruction_index: Nat = 0 484 for instruction in instructions { 485 if instruction_index == next_index { resolved = append(resolved, IterNextInstruction(iterator_name, item_name, end)); } 486 else { resolved = append(resolved, instruction); } 487 instruction_index = instruction_index + 1 488 } 489 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(resolved), true); } 490 resolved = append(resolved, LoadInstruction(accumulator_name)) 491 EmittedCode(resolved, callback.next_temporary, sources, probes) 492 } else { 493 emitted: EmittedCode = emit_expression_list(arguments, program, next_temporary, offset, retain_sources) 494 sources = emitted.sources 495 probes = emitted.probes 496 mut instructions: [Instruction] = emitted.instructions 497 record: RecordLookup = record_type(program, name) 498 variant: VariantLookup = variant_type(program, name) 499 if record.found { 500 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), false); } 501 instructions = append(instructions, MakeRecordInstruction(name, record_field_names(record.fields))) 502 } else { 503 if variant.found { 504 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), false); } 505 instructions = append(instructions, MakeVariantInstruction(variant.enum_name, name, len(arguments))) 506 } else { 507 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), false); } 508 instructions = append(instructions, CallInstruction(if name == "tcp_exchange" { "$tcp_exchange" } else { if name == "tcp_serve" { "$tcp_serve" } else { name } }, len(arguments))) 509 } 510 } 511 EmittedCode(instructions, emitted.next_temporary, sources, probes) 512 } } 513 } 514 515 pure emit_match(subject: Expr, arms: [MatchArm], program: Program, next_temporary: Nat, offset: Nat, retain_sources: Bool, origin: Option[SourceSpan]): EmittedCode { 516 mut sources: [InstructionSource] = [] 517 mut probes: [EmissionProbe] = [] 518 temporary_name: Str = "$match${next_temporary}" 519 subject_code: EmittedCode = emit_expression(subject, program, next_temporary + 1, offset, retain_sources) 520 sources = subject_code.sources 521 probes = subject_code.probes 522 mut instructions: [Instruction] = subject_code.instructions 523 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 524 instructions = append(instructions, StoreInstruction(temporary_name)) 525 mut temporary: Nat = subject_code.next_temporary 526 for arm in arms { 527 arm_offset: Nat = offset + len(instructions) 528 body_offset: Nat = arm_offset + 2 + len(arm.pattern.bindings) 529 body_code: EmittedCode = emit_expression(arm.body, program, temporary, body_offset, retain_sources) 530 failure: Nat = body_offset + len(body_code.instructions) + 1 531 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 532 instructions = append(instructions, LoadInstruction(temporary_name)) 533 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 534 probes = add_emission_probe(probes, "arm:" + arm.pattern.variant, arm.body, arm_offset + 1, arm_offset + 2, retain_sources) 535 instructions = append(instructions, MatchVariantInstruction(arm.pattern.variant, failure)) 536 mut binding_index: Nat = len(arm.pattern.bindings) 537 while binding_index > 0 { 538 binding_index = binding_index - 1 539 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 540 instructions = append(instructions, StoreInstruction(arm.pattern.bindings[binding_index])) 541 } 542 sources = concat(sources, body_code.sources) 543 probes = concat(probes, body_code.probes) 544 instructions = concat(instructions, body_code.instructions) 545 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 546 instructions = append(instructions, PendingEndJumpInstruction()) 547 temporary = body_code.next_temporary 548 } 549 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 550 instructions = append(instructions, MatchFailInstruction()) 551 end: Nat = offset + len(instructions) 552 EmittedCode(resolve_pending_jumps(instructions, end), temporary, sources, probes) 553 } 554 555 pure emit_expression(expression: Expr, program: Program, next_temporary: Nat, offset: Nat, retain_sources: Bool): EmittedCode { 556 emit_expression_at(expression, program, next_temporary, offset, retain_sources, None()) 557 } 558 559 pure emit_expression_at(expression: Expr, program: Program, next_temporary: Nat, offset: Nat, retain_sources: Bool, origin: Option[SourceSpan]): EmittedCode { 560 mut sources: [InstructionSource] = [] 561 mut probes: [EmissionProbe] = [] 562 match expression { 563 LocatedExpr(span, value) => { 564 emitted: EmittedCode = emit_expression_at(value, program, next_temporary, offset, retain_sources, if retain_sources { Some(span) } else { None() }) 565 EmittedCode(emitted.instructions, emitted.next_temporary, emitted.sources, 566 if retain_sources { append(emitted.probes, EmissionProbe("expression", span, offset, offset + len(emitted.instructions))) } else { [] }) 567 }, 568 NatExpr(value) => { 569 if retain_sources { sources = add_instruction_source(sources, origin, offset, false); } 570 instructions: [Instruction] = [ConstInstruction(NatConstant(value))] 571 EmittedCode(instructions, next_temporary, sources, probes) 572 }, 573 DecimalExpr(text) => { 574 if retain_sources { sources = add_instruction_source(sources, origin, offset, false); } 575 instructions: [Instruction] = [ConstInstruction(DecimalConstant(text))] 576 EmittedCode(instructions, next_temporary, sources, probes) 577 }, 578 StringExpr(text) => emit_string_expression(text, next_temporary, retain_sources, origin, offset), 579 BoolExpr(value) => { 580 if retain_sources { sources = add_instruction_source(sources, origin, offset, false); } 581 instructions: [Instruction] = [ConstInstruction(BoolConstant(value))] 582 EmittedCode(instructions, next_temporary, sources, probes) 583 }, 584 NameExpr(name) => { 585 if retain_sources { sources = add_instruction_source(sources, origin, offset, false); } 586 instructions: [Instruction] = [LoadInstruction(name)] 587 EmittedCode(instructions, next_temporary, sources, probes) 588 }, 589 FunctionExpr(name) => { 590 if retain_sources { sources = add_instruction_source(sources, origin, offset, false); } 591 instructions: [Instruction] = [ConstInstruction(StringConstant(name))] 592 EmittedCode(instructions, next_temporary, sources, probes) 593 }, 594 ArrayExpr(items) => { 595 emitted: EmittedCode = emit_expression_list(items, program, next_temporary, offset, retain_sources) 596 sources = emitted.sources 597 probes = emitted.probes 598 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(emitted.instructions), false); } 599 instructions: [Instruction] = append(emitted.instructions, MakeArrayInstruction(len(items))) 600 EmittedCode(instructions, emitted.next_temporary, sources, probes) 601 }, 602 UnaryExpr(operator, operand) => { 603 emitted: EmittedCode = emit_expression(operand, program, next_temporary, offset, retain_sources) 604 sources = emitted.sources 605 probes = emitted.probes 606 mut instructions: [Instruction] = [] 607 if operator == "await" { 608 // Only the terminal invocation is awaited; argument calls keep their effects. 609 mut index: Nat = 0 610 for instruction in emitted.instructions { 611 if index + 1 == len(emitted.instructions) { 612 instructions = append(instructions, awaited_instruction(instruction)) 613 } else { instructions = append(instructions, instruction); } 614 index = index + 1 615 } 616 } else { 617 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(emitted.instructions), false); } 618 instructions = append(emitted.instructions, UnaryInstruction(operator)) 619 } 620 EmittedCode(instructions, emitted.next_temporary, sources, probes) 621 }, 622 BinaryExpr(operator, left, right) => { 623 if operator == "&&" || operator == "||" { 624 emit_short_circuit(operator, left, right, program, next_temporary, offset, retain_sources, origin) 625 } else { 626 left_code: EmittedCode = emit_expression(left, program, next_temporary, offset, retain_sources) 627 right_offset: Nat = offset + len(left_code.instructions) 628 right_code: EmittedCode = emit_expression(right, program, left_code.next_temporary, right_offset, retain_sources) 629 sources = concat(left_code.sources, right_code.sources) 630 probes = concat(left_code.probes, right_code.probes) 631 mut instructions: [Instruction] = concat(left_code.instructions, right_code.instructions) 632 if operator == ".." { 633 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), false); } 634 instructions = append(instructions, MakeRangeInstruction()) 635 } else { 636 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), false); } 637 instructions = append(instructions, BinaryInstruction(operator)) 638 } 639 EmittedCode(instructions, right_code.next_temporary, sources, probes) 640 } 641 }, 642 // Defensive trap for internal callers bypassing the checked frontend. 643 DotCallExpr(target, name, arguments, types) => EmittedCode([MatchFailInstruction()], next_temporary, [], []), 644 CallExpr(name, arguments, type_arguments) => emit_call(name, arguments, program, next_temporary, offset, retain_sources, origin), 645 FieldExpr(target, field) => { 646 emitted: EmittedCode = emit_expression(target, program, next_temporary, offset, retain_sources) 647 sources = emitted.sources 648 probes = emitted.probes 649 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(emitted.instructions), false); } 650 instructions: [Instruction] = append(emitted.instructions, FieldGetInstruction(field)) 651 EmittedCode(instructions, emitted.next_temporary, sources, probes) 652 }, 653 IndexExpr(target, index) => { 654 target_code: EmittedCode = emit_expression(target, program, next_temporary, offset, retain_sources) 655 index_code: EmittedCode = emit_expression(index, program, target_code.next_temporary, offset + len(target_code.instructions), retain_sources) 656 sources = concat(target_code.sources, index_code.sources) 657 probes = concat(target_code.probes, index_code.probes) 658 mut instructions: [Instruction] = concat(target_code.instructions, index_code.instructions) 659 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), false); } 660 instructions = append(instructions, IndexGetInstruction()) 661 EmittedCode(instructions, index_code.next_temporary, sources, probes) 662 }, 663 IfExpr(condition, yes, no, has_else) => { 664 condition_code: EmittedCode = emit_expression(condition, program, next_temporary, offset, retain_sources) 665 branch: Nat = offset + len(condition_code.instructions) 666 yes_code: EmittedCode = emit_block(yes, program, condition_code.next_temporary, branch + 1, retain_sources) 667 if has_else { 668 jump: Nat = branch + 1 + len(yes_code.instructions) 669 no_start: Nat = jump + 1 670 no_code: EmittedCode = emit_block(no, program, yes_code.next_temporary, no_start, retain_sources) 671 end: Nat = no_start + len(no_code.instructions) 672 sources = condition_code.sources 673 probes = condition_code.probes 674 mut instructions: [Instruction] = condition_code.instructions 675 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 676 instructions = append(instructions, JumpFalseInstruction(no_start)) 677 sources = concat(sources, yes_code.sources) 678 probes = concat(probes, yes_code.probes) 679 instructions = concat(instructions, yes_code.instructions) 680 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 681 instructions = append(instructions, JumpInstruction(end)) 682 sources = concat(sources, no_code.sources) 683 probes = concat(probes, no_code.probes) 684 instructions = concat(instructions, no_code.instructions) 685 probes = add_emission_probe(probes, "if", condition, branch, branch + 1, retain_sources) 686 EmittedCode(instructions, no_code.next_temporary, sources, probes) 687 } else { 688 void_start: Nat = branch + 2 + len(yes_code.instructions) 689 sources = condition_code.sources 690 probes = condition_code.probes 691 mut instructions: [Instruction] = condition_code.instructions 692 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 693 instructions = append(instructions, JumpFalseInstruction(void_start)) 694 sources = concat(sources, yes_code.sources) 695 probes = concat(probes, yes_code.probes) 696 instructions = concat(instructions, yes_code.instructions) 697 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 698 instructions = append(instructions, PopInstruction()) 699 if retain_sources { sources = add_instruction_source(sources, origin, offset + len(instructions), true); } 700 instructions = append(instructions, ConstInstruction(VoidConstant())) 701 probes = add_emission_probe(probes, "if", condition, branch, branch + 1, retain_sources) 702 EmittedCode(instructions, yes_code.next_temporary, sources, probes) 703 } 704 }, 705 BlockExpr(block) => emit_block(block, program, next_temporary, offset, retain_sources), 706 MatchExpr(subject, arms) => emit_match(subject, arms, program, next_temporary, offset, retain_sources, origin) 707 } 708 } 709 710 // Core routines are implicit but emitted only when reachable from user code. 711 // Keep all ordinary functions: only compiler-owned implementation names are pruned. 712 pure core_call_name(instruction: Instruction): Str { 713 match instruction { 714 ConstInstruction(a0) => "", 715 LoadInstruction(a0) => "", 716 StoreInstruction(a0) => "", 717 PopInstruction() => "", 718 UnaryInstruction(a0) => "", 719 BinaryInstruction(a0) => "", 720 MakeRangeInstruction() => "", 721 MakeArrayInstruction(a0) => "", 722 IndexGetInstruction() => "", 723 InterpolateInstruction(a0) => "", 724 IterInitInstruction(a0) => "", 725 IterNextInstruction(a0, a1, a2) => "", 726 MakeRecordInstruction(a0, a1) => "", 727 FieldGetInstruction(a0) => "", 728 MakeVariantInstruction(a0, a1, a2) => "", 729 MatchVariantInstruction(a0, a1) => "", 730 MatchFailInstruction() => "", 731 CallInstruction(a0, a1) => a0, 732 CallValueInstruction(a0) => "", 733 AwaitCallInstruction(a0, a1) => a0, 734 AwaitValueInstruction(a0) => "", 735 JumpFalseInstruction(a0) => "", 736 JumpInstruction(a0) => "", 737 PendingEndJumpInstruction() => "", 738 ReturnInstruction() => "" 739 } 740 } 741 742 pure used_core_functions(functions: [FunctionCode]): Set[Str] { 743 mut used: Set[Str] = set() 744 mut changed: Bool = true 745 while changed { 746 changed = false 747 for function in functions { 748 if !function.name.starts_with("$core_") || used.has(function.name) { 749 for instruction in function.instructions { 750 name: Str = core_call_name(instruction) 751 if name.starts_with("$core_") && !used.has(name) { 752 used = used.add(name) 753 changed = true 754 } 755 } 756 } 757 } 758 } 759 used 760 } 761 762 pure compile_program(program: Program): BytecodeProgram { 763 compile_program_emission(program, false).bytecode 764 } 765 766 pure compile_program_with_sources(program: Program): SourceMappedProgram { 767 compile_program_emission(program, true) 768 } 769 770 pure compile_program_emission(program: Program, retain_sources: Bool): SourceMappedProgram { 771 mut sources: [FunctionSources] = [] 772 mut probes: [FunctionProbes] = [] 773 mut functions: [FunctionCode] = [] 774 for declaration in program.declarations { 775 match declaration { 776 FunctionDeclaration(name, parameters, return_type, is_pure, is_async, body, type_parameters) => { 777 emitted: EmittedCode = emit_block(body, program, 0, 0, retain_sources) 778 instructions: [Instruction] = append(emitted.instructions, ReturnInstruction()) 779 if retain_sources { 780 sources = append(sources, FunctionSources(name, emitted.sources)) 781 probes = append(probes, FunctionProbes(name, emitted.probes)) 782 } 783 functions = append(functions, FunctionCode(name, parameter_names(parameters), is_pure, is_async, instructions)) 784 }, 785 ImportDeclaration(path) => {}, 786 TypeDeclaration(name, base, guard) => {}, 787 RecordDeclaration(name, parameters, fields) => {}, 788 EnumDeclaration(name, parameters, variants) => {} 789 } 790 } 791 used: Set[Str] = used_core_functions(functions) 792 mut selected: [FunctionCode] = [] 793 for function in functions { 794 if !function.name.starts_with("$core_") || used.has(function.name) { 795 selected = selected.append(function) 796 } 797 } 798 mut selected_sources: [FunctionSources] = [] 799 for source in sources { 800 if !source.name.starts_with("$core_") || used.has(source.name) { 801 selected_sources = append(selected_sources, source) 802 } 803 } 804 mut selected_probes: [FunctionProbes] = [] 805 for probe in probes { 806 if !probe.name.starts_with("$core_") || used.has(probe.name) { selected_probes = append(selected_probes, probe); } 807 } 808 SourceMappedProgram(BytecodeProgram(selected), selected_sources, selected_probes) 809 } 810 811 pure compile_source_disassembly(source: Str): Str { 812 match lex(source) { 813 Ok(tokens) => { 814 match parse_program_complete(tokens) { 815 Ok(program) => { 816 diagnostics: [Diagnostic] = check_program_frontend(program) 817 if len(diagnostics) > 0 { 818 render_resolver_diagnostics(diagnostics) 819 } else { 820 render_bytecode(compile_program(program)) 821 } 822 }, 823 Error(error) => error.message 824 } 825 }, 826 Error(errors) => "lexing failed" 827 } 828 } 829 830 pure awaited_instruction(instruction: Instruction): Instruction { 831 match instruction { 832 ConstInstruction(a0) => instruction, 833 LoadInstruction(a0) => instruction, 834 StoreInstruction(a0) => instruction, 835 PopInstruction() => instruction, 836 UnaryInstruction(a0) => instruction, 837 BinaryInstruction(a0) => instruction, 838 MakeRangeInstruction() => instruction, 839 MakeArrayInstruction(a0) => instruction, 840 IndexGetInstruction() => instruction, 841 InterpolateInstruction(a0) => instruction, 842 IterInitInstruction(a0) => instruction, 843 IterNextInstruction(a0, a1, a2) => instruction, 844 MakeRecordInstruction(a0, a1) => instruction, 845 FieldGetInstruction(a0) => instruction, 846 MakeVariantInstruction(a0, a1, a2) => instruction, 847 MatchVariantInstruction(a0, a1) => instruction, 848 MatchFailInstruction() => instruction, 849 CallInstruction(a0, a1) => AwaitCallInstruction(a0, a1), 850 CallValueInstruction(a0) => AwaitValueInstruction(a0), 851 AwaitCallInstruction(a0, a1) => instruction, 852 AwaitValueInstruction(a0) => instruction, 853 JumpFalseInstruction(a0) => instruction, 854 JumpInstruction(a0) => instruction, 855 PendingEndJumpInstruction() => instruction, 856 ReturnInstruction() => instruction 857 } 858 } 859
Functions
[
{
"id": "declaration/8",
"name": "add_emission_probe",
"line": 72,
"state": "covered",
"entries": "4935"
},
{
"id": "declaration/12",
"name": "add_instruction_source",
"line": 98,
"state": "covered",
"entries": "2787"
},
{
"id": "declaration/13",
"name": "parameter_name",
"line": 105,
"state": "covered",
"entries": "1429"
},
{
"id": "declaration/14",
"name": "parameter_names",
"line": 107,
"state": "covered",
"entries": "769"
},
{
"id": "declaration/15",
"name": "record_field_name",
"line": 111,
"state": "covered",
"entries": "1585"
},
{
"id": "declaration/16",
"name": "record_field_names",
"line": 113,
"state": "covered",
"entries": "554"
},
{
"id": "declaration/17",
"name": "resolve_pending_jumps",
"line": 117,
"state": "covered",
"entries": "418"
},
{
"id": "declaration/18",
"name": "render_string_items",
"line": 153,
"state": "covered",
"entries": "36"
},
{
"id": "declaration/19",
"name": "render_constant",
"line": 163,
"state": "covered",
"entries": "121"
},
{
"id": "declaration/20",
"name": "render_instruction",
"line": 184,
"state": "covered",
"entries": "480"
},
{
"id": "declaration/21",
"name": "render_bytecode",
"line": 223,
"state": "covered",
"entries": "17"
},
{
"id": "declaration/22",
"name": "emit_expression_list",
"line": 240,
"state": "covered",
"entries": "7247"
},
{
"id": "declaration/23",
"name": "emit_block",
"line": 255,
"state": "covered",
"entries": "5085"
},
{
"id": "declaration/24",
"name": "emit_short_circuit",
"line": 342,
"state": "covered",
"entries": "1155"
},
{
"id": "declaration/25",
"name": "emit_string_expression",
"line": 387,
"state": "covered",
"entries": "2513"
},
{
"id": "declaration/26",
"name": "emit_call",
"line": 407,
"state": "covered",
"entries": "6755"
},
{
"id": "declaration/27",
"name": "emit_match",
"line": 515,
"state": "covered",
"entries": "418"
},
{
"id": "declaration/28",
"name": "emit_expression",
"line": 555,
"state": "covered",
"entries": "38062"
},
{
"id": "declaration/29",
"name": "emit_expression_at",
"line": 559,
"state": "covered",
"entries": "76119"
},
{
"id": "declaration/30",
"name": "core_call_name",
"line": 712,
"state": "covered",
"entries": "107135"
},
{
"id": "declaration/31",
"name": "used_core_functions",
"line": 742,
"state": "covered",
"entries": "51"
},
{
"id": "declaration/32",
"name": "compile_program",
"line": 762,
"state": "covered",
"entries": "29"
},
{
"id": "declaration/33",
"name": "compile_program_with_sources",
"line": 766,
"state": "covered",
"entries": "16"
},
{
"id": "declaration/34",
"name": "compile_program_emission",
"line": 770,
"state": "covered",
"entries": "51"
},
{
"id": "declaration/35",
"name": "compile_source_disassembly",
"line": 811,
"state": "covered",
"entries": "14"
},
{
"id": "declaration/36",
"name": "awaited_instruction",
"line": 830,
"state": "covered",
"entries": "14"
}
]Source branch outcomes
[
{
"id": "declaration/8/tail/decision/true",
"outcome": "true",
"line": 73,
"state": "covered",
"hits": "181"
},
{
"id": "declaration/8/tail/decision/false",
"outcome": "false",
"line": 73,
"state": "covered",
"hits": "4754"
},
{
"id": "declaration/8/tail/true/tail/arm/0",
"outcome": "Some",
"line": 75,
"state": "covered",
"hits": "181"
},
{
"id": "declaration/8/tail/true/tail/arm/1",
"outcome": "None",
"line": 76,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/12/tail/arm/0",
"outcome": "None",
"line": 100,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/12/tail/arm/1",
"outcome": "Some",
"line": 101,
"state": "covered",
"hits": "2782"
},
{
"id": "declaration/17/statement/1/decision/body",
"outcome": "body",
"line": 119,
"state": "covered",
"hits": "37324"
},
{
"id": "declaration/17/statement/1/decision/exit",
"outcome": "exit",
"line": 119,
"state": "covered",
"hits": "418"
},
{
"id": "declaration/17/statement/1/body/tail/arm/0",
"outcome": "PendingEndJumpInstruction",
"line": 121,
"state": "covered",
"hits": "1676"
},
{
"id": "declaration/17/statement/1/body/tail/arm/1",
"outcome": "ConstInstruction",
"line": 124,
"state": "covered",
"hits": "4337"
},
{
"id": "declaration/17/statement/1/body/tail/arm/2",
"outcome": "LoadInstruction",
"line": 125,
"state": "covered",
"hits": "10778"
},
{
"id": "declaration/17/statement/1/body/tail/arm/3",
"outcome": "StoreInstruction",
"line": 126,
"state": "covered",
"hits": "5917"
},
{
"id": "declaration/17/statement/1/body/tail/arm/4",
"outcome": "PopInstruction",
"line": 127,
"state": "covered",
"hits": "554"
},
{
"id": "declaration/17/statement/1/body/tail/arm/5",
"outcome": "UnaryInstruction",
"line": 128,
"state": "covered",
"hits": "123"
},
{
"id": "declaration/17/statement/1/body/tail/arm/6",
"outcome": "BinaryInstruction",
"line": 129,
"state": "covered",
"hits": "1228"
},
{
"id": "declaration/17/statement/1/body/tail/arm/7",
"outcome": "MakeRangeInstruction",
"line": 130,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/17/statement/1/body/tail/arm/8",
"outcome": "MakeArrayInstruction",
"line": 131,
"state": "covered",
"hits": "174"
},
{
"id": "declaration/17/statement/1/body/tail/arm/9",
"outcome": "IndexGetInstruction",
"line": 132,
"state": "covered",
"hits": "171"
},
{
"id": "declaration/17/statement/1/body/tail/arm/10",
"outcome": "InterpolateInstruction",
"line": 133,
"state": "covered",
"hits": "152"
},
{
"id": "declaration/17/statement/1/body/tail/arm/11",
"outcome": "IterInitInstruction",
"line": 134,
"state": "covered",
"hits": "165"
},
{
"id": "declaration/17/statement/1/body/tail/arm/12",
"outcome": "IterNextInstruction",
"line": 135,
"state": "covered",
"hits": "165"
},
{
"id": "declaration/17/statement/1/body/tail/arm/13",
"outcome": "MakeRecordInstruction",
"line": 136,
"state": "covered",
"hits": "365"
},
{
"id": "declaration/17/statement/1/body/tail/arm/14",
"outcome": "FieldGetInstruction",
"line": 137,
"state": "covered",
"hits": "2197"
},
{
"id": "declaration/17/statement/1/body/tail/arm/15",
"outcome": "MakeVariantInstruction",
"line": 138,
"state": "covered",
"hits": "762"
},
{
"id": "declaration/17/statement/1/body/tail/arm/16",
"outcome": "MatchVariantInstruction",
"line": 139,
"state": "covered",
"hits": "2283"
},
{
"id": "declaration/17/statement/1/body/tail/arm/17",
"outcome": "MatchFailInstruction",
"line": 140,
"state": "covered",
"hits": "619"
},
{
"id": "declaration/17/statement/1/body/tail/arm/18",
"outcome": "CallInstruction",
"line": 141,
"state": "covered",
"hits": "2858"
},
{
"id": "declaration/17/statement/1/body/tail/arm/19",
"outcome": "CallValueInstruction",
"line": 142,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/17/statement/1/body/tail/arm/20",
"outcome": "AwaitCallInstruction",
"line": 143,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/17/statement/1/body/tail/arm/21",
"outcome": "AwaitValueInstruction",
"line": 144,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/17/statement/1/body/tail/arm/22",
"outcome": "JumpFalseInstruction",
"line": 145,
"state": "covered",
"hits": "1091"
},
{
"id": "declaration/17/statement/1/body/tail/arm/23",
"outcome": "JumpInstruction",
"line": 146,
"state": "covered",
"hits": "1674"
},
{
"id": "declaration/17/statement/1/body/tail/arm/24",
"outcome": "ReturnInstruction",
"line": 147,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/18/statement/2/decision/body",
"outcome": "body",
"line": 156,
"state": "covered",
"hits": "23"
},
{
"id": "declaration/18/statement/2/decision/exit",
"outcome": "exit",
"line": 156,
"state": "covered",
"hits": "36"
},
{
"id": "declaration/18/statement/2/body/statement/0/value/decision/true",
"outcome": "true",
"line": 157,
"state": "covered",
"hits": "15"
},
{
"id": "declaration/18/statement/2/body/statement/0/value/decision/false",
"outcome": "false",
"line": 157,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/19/tail/arm/0",
"outcome": "NatConstant",
"line": 165,
"state": "covered",
"hits": "65"
},
{
"id": "declaration/19/tail/arm/1",
"outcome": "IntConstant",
"line": 166,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/19/tail/arm/1/body/block/tail/decision/true",
"outcome": "true",
"line": 167,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/19/tail/arm/1/body/block/tail/decision/false",
"outcome": "false",
"line": 167,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/19/tail/arm/2",
"outcome": "DecimalConstant",
"line": 169,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/19/tail/arm/3",
"outcome": "DecimalPartsConstant",
"line": 170,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/19/tail/arm/3/body/block/statement/0/value/decision/true",
"outcome": "true",
"line": 171,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/19/tail/arm/3/body/block/statement/0/value/decision/false",
"outcome": "false",
"line": 171,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/19/tail/arm/3/body/block/statement/1/value/decision/true",
"outcome": "true",
"line": 172,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/19/tail/arm/3/body/block/statement/1/value/decision/false",
"outcome": "false",
"line": 172,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/19/tail/arm/3/body/block/statement/4/decision/body",
"outcome": "body",
"line": 175,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/19/tail/arm/3/body/block/statement/4/decision/exit",
"outcome": "exit",
"line": 175,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/19/tail/arm/4",
"outcome": "StringConstant",
"line": 178,
"state": "covered",
"hits": "17"
},
{
"id": "declaration/19/tail/arm/5",
"outcome": "BoolConstant",
"line": 179,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/19/tail/arm/5/body/decision/true",
"outcome": "true",
"line": 179,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/19/tail/arm/5/body/decision/false",
"outcome": "false",
"line": 179,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/19/tail/arm/6",
"outcome": "VoidConstant",
"line": 180,
"state": "covered",
"hits": "23"
},
{
"id": "declaration/20/tail/arm/0",
"outcome": "ConstInstruction",
"line": 186,
"state": "covered",
"hits": "121"
},
{
"id": "declaration/20/tail/arm/1",
"outcome": "LoadInstruction",
"line": 190,
"state": "covered",
"hits": "80"
},
{
"id": "declaration/20/tail/arm/2",
"outcome": "StoreInstruction",
"line": 191,
"state": "covered",
"hits": "43"
},
{
"id": "declaration/20/tail/arm/3",
"outcome": "PopInstruction",
"line": 192,
"state": "covered",
"hits": "37"
},
{
"id": "declaration/20/tail/arm/4",
"outcome": "UnaryInstruction",
"line": 193,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/20/tail/arm/5",
"outcome": "BinaryInstruction",
"line": 194,
"state": "covered",
"hits": "21"
},
{
"id": "declaration/20/tail/arm/6",
"outcome": "MakeRangeInstruction",
"line": 195,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/20/tail/arm/7",
"outcome": "MakeArrayInstruction",
"line": 196,
"state": "covered",
"hits": "9"
},
{
"id": "declaration/20/tail/arm/8",
"outcome": "IndexGetInstruction",
"line": 197,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/20/tail/arm/9",
"outcome": "InterpolateInstruction",
"line": 198,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/20/tail/arm/10",
"outcome": "IterInitInstruction",
"line": 202,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/20/tail/arm/11",
"outcome": "IterNextInstruction",
"line": 203,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/20/tail/arm/12",
"outcome": "MakeRecordInstruction",
"line": 204,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/20/tail/arm/13",
"outcome": "FieldGetInstruction",
"line": 208,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/20/tail/arm/14",
"outcome": "MakeVariantInstruction",
"line": 209,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/20/tail/arm/15",
"outcome": "MatchVariantInstruction",
"line": 210,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/20/tail/arm/16",
"outcome": "MatchFailInstruction",
"line": 211,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/20/tail/arm/17",
"outcome": "CallInstruction",
"line": 212,
"state": "covered",
"hits": "49"
},
{
"id": "declaration/20/tail/arm/18",
"outcome": "CallValueInstruction",
"line": 213,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/20/tail/arm/19",
"outcome": "AwaitCallInstruction",
"line": 214,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/20/tail/arm/20",
"outcome": "AwaitValueInstruction",
"line": 215,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/20/tail/arm/21",
"outcome": "JumpFalseInstruction",
"line": 216,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/20/tail/arm/22",
"outcome": "JumpInstruction",
"line": 217,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/20/tail/arm/23",
"outcome": "PendingEndJumpInstruction",
"line": 218,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/20/tail/arm/24",
"outcome": "ReturnInstruction",
"line": 219,
"state": "covered",
"hits": "33"
},
{
"id": "declaration/21/statement/1/decision/body",
"outcome": "body",
"line": 225,
"state": "covered",
"hits": "29"
},
{
"id": "declaration/21/statement/1/decision/exit",
"outcome": "exit",
"line": 225,
"state": "covered",
"hits": "17"
},
{
"id": "declaration/21/statement/1/body/statement/0/value/decision/true",
"outcome": "true",
"line": 226,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/21/statement/1/body/statement/0/value/decision/false",
"outcome": "false",
"line": 226,
"state": "covered",
"hits": "29"
},
{
"id": "declaration/21/statement/1/body/statement/0/value/false/tail/decision/true",
"outcome": "true",
"line": 226,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/21/statement/1/body/statement/0/value/false/tail/decision/false",
"outcome": "false",
"line": 226,
"state": "covered",
"hits": "17"
},
{
"id": "declaration/21/statement/1/body/statement/5/decision/body",
"outcome": "body",
"line": 231,
"state": "covered",
"hits": "338"
},
{
"id": "declaration/21/statement/1/body/statement/5/decision/exit",
"outcome": "exit",
"line": 231,
"state": "covered",
"hits": "29"
},
{
"id": "declaration/22/statement/4/decision/body",
"outcome": "body",
"line": 245,
"state": "covered",
"hits": "12138"
},
{
"id": "declaration/22/statement/4/decision/exit",
"outcome": "exit",
"line": 245,
"state": "covered",
"hits": "7247"
},
{
"id": "declaration/23/statement/4/decision/body",
"outcome": "body",
"line": 260,
"state": "covered",
"hits": "5236"
},
{
"id": "declaration/23/statement/4/decision/exit",
"outcome": "exit",
"line": 260,
"state": "covered",
"hits": "5085"
},
{
"id": "declaration/23/statement/4/body/tail/arm/0",
"outcome": "BindingStatement",
"line": 263,
"state": "covered",
"hits": "1838"
},
{
"id": "declaration/23/statement/4/body/tail/arm/1",
"outcome": "AssignmentStatement",
"line": 271,
"state": "covered",
"hits": "2249"
},
{
"id": "declaration/23/statement/4/body/tail/arm/2",
"outcome": "ExpressionStatement",
"line": 279,
"state": "covered",
"hits": "620"
},
{
"id": "declaration/23/statement/4/body/tail/arm/3",
"outcome": "WhileStatement",
"line": 287,
"state": "covered",
"hits": "150"
},
{
"id": "declaration/23/statement/4/body/tail/arm/4",
"outcome": "ForStatement",
"line": 304,
"state": "covered",
"hits": "379"
},
{
"id": "declaration/23/statement/5/value/arm/0",
"outcome": "NoBlockValue",
"line": 328,
"state": "covered",
"hits": "2145"
},
{
"id": "declaration/23/statement/5/value/arm/1",
"outcome": "TailBlockValue",
"line": 331,
"state": "covered",
"hits": "2940"
},
{
"id": "declaration/24/tail/decision/true",
"outcome": "true",
"line": 347,
"state": "covered",
"hits": "486"
},
{
"id": "declaration/24/tail/decision/false",
"outcome": "false",
"line": 347,
"state": "covered",
"hits": "669"
},
{
"id": "declaration/24/tail/true/statement/6/value/decision/true",
"outcome": "true",
"line": 354,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/24/tail/true/statement/6/value/decision/false",
"outcome": "false",
"line": 354,
"state": "covered",
"hits": "472"
},
{
"id": "declaration/24/tail/true/statement/11/value/decision/true",
"outcome": "true",
"line": 359,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/24/tail/true/statement/11/value/decision/false",
"outcome": "false",
"line": 359,
"state": "covered",
"hits": "472"
},
{
"id": "declaration/24/tail/true/statement/13/value/decision/true",
"outcome": "true",
"line": 361,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/24/tail/true/statement/13/value/decision/false",
"outcome": "false",
"line": 361,
"state": "covered",
"hits": "472"
},
{
"id": "declaration/24/tail/false/statement/7/value/decision/true",
"outcome": "true",
"line": 373,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/24/tail/false/statement/7/value/decision/false",
"outcome": "false",
"line": 373,
"state": "covered",
"hits": "667"
},
{
"id": "declaration/24/tail/false/statement/9/value/decision/true",
"outcome": "true",
"line": 375,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/24/tail/false/statement/9/value/decision/false",
"outcome": "false",
"line": 375,
"state": "covered",
"hits": "667"
},
{
"id": "declaration/24/tail/false/statement/11/value/decision/true",
"outcome": "true",
"line": 377,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/24/tail/false/statement/11/value/decision/false",
"outcome": "false",
"line": 377,
"state": "covered",
"hits": "667"
},
{
"id": "declaration/25/statement/5/value/decision/true",
"outcome": "true",
"line": 393,
"state": "covered",
"hits": "2294"
},
{
"id": "declaration/25/statement/5/value/decision/false",
"outcome": "false",
"line": 393,
"state": "covered",
"hits": "219"
},
{
"id": "declaration/25/statement/5/value/true/statement/0/value/decision/true",
"outcome": "true",
"line": 394,
"state": "covered",
"hits": "28"
},
{
"id": "declaration/25/statement/5/value/true/statement/0/value/decision/false",
"outcome": "false",
"line": 394,
"state": "covered",
"hits": "2266"
},
{
"id": "declaration/25/statement/5/value/false/statement/0/decision/body",
"outcome": "body",
"line": 397,
"state": "covered",
"hits": "340"
},
{
"id": "declaration/25/statement/5/value/false/statement/0/decision/exit",
"outcome": "exit",
"line": 397,
"state": "covered",
"hits": "219"
},
{
"id": "declaration/25/statement/5/value/false/statement/0/body/statement/0/value/decision/true",
"outcome": "true",
"line": 398,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/25/statement/5/value/false/statement/0/body/statement/0/value/decision/false",
"outcome": "false",
"line": 398,
"state": "covered",
"hits": "337"
},
{
"id": "declaration/25/statement/5/value/false/statement/1/value/decision/true",
"outcome": "true",
"line": 401,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/25/statement/5/value/false/statement/1/value/decision/false",
"outcome": "false",
"line": 401,
"state": "covered",
"hits": "216"
},
{
"id": "declaration/26/tail/decision/true",
"outcome": "true",
"line": 410,
"state": "covered",
"hits": "31"
},
{
"id": "declaration/26/tail/decision/false",
"outcome": "false",
"line": 410,
"state": "covered",
"hits": "6724"
},
{
"id": "declaration/26/tail/true/tail/args/2/decision/true",
"outcome": "true",
"line": 413,
"state": "covered",
"hits": "15"
},
{
"id": "declaration/26/tail/true/tail/args/2/decision/false",
"outcome": "false",
"line": 413,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/decision/true",
"outcome": "true",
"line": 414,
"state": "covered",
"hits": "35"
},
{
"id": "declaration/26/tail/false/tail/decision/false",
"outcome": "false",
"line": 414,
"state": "covered",
"hits": "6689"
},
{
"id": "declaration/26/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 414,
"state": "covered",
"hits": "6708"
},
{
"id": "declaration/26/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 414,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/8/value/decision/true",
"outcome": "true",
"line": 423,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/8/value/decision/false",
"outcome": "false",
"line": 423,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/11/value/decision/true",
"outcome": "true",
"line": 426,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/11/value/decision/false",
"outcome": "false",
"line": 426,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/11/value/true/statement/4/value/decision/true",
"outcome": "true",
"line": 431,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/26/tail/false/tail/true/statement/11/value/true/statement/4/value/decision/false",
"outcome": "false",
"line": 431,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/11/value/false/statement/0/value/decision/true",
"outcome": "true",
"line": 435,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/11/value/false/statement/0/value/decision/false",
"outcome": "false",
"line": 435,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/11/value/false/statement/2/value/decision/true",
"outcome": "true",
"line": 437,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/11/value/false/statement/2/value/decision/false",
"outcome": "false",
"line": 437,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/16/value/decision/true",
"outcome": "true",
"line": 444,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/16/value/decision/false",
"outcome": "false",
"line": 444,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/18/value/decision/true",
"outcome": "true",
"line": 446,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/18/value/decision/false",
"outcome": "false",
"line": 446,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/20/value/decision/true",
"outcome": "true",
"line": 448,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/20/value/decision/false",
"outcome": "false",
"line": 448,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/24/value/decision/true",
"outcome": "true",
"line": 452,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/24/value/decision/false",
"outcome": "false",
"line": 452,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/decision/true",
"outcome": "true",
"line": 454,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/decision/false",
"outcome": "false",
"line": 454,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/0/value/decision/true",
"outcome": "true",
"line": 455,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/0/value/decision/false",
"outcome": "false",
"line": 455,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/2/value/decision/true",
"outcome": "true",
"line": 457,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/2/value/decision/false",
"outcome": "false",
"line": 457,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/4/value/decision/true",
"outcome": "true",
"line": 459,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/4/value/decision/false",
"outcome": "false",
"line": 459,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/6/value/decision/true",
"outcome": "true",
"line": 461,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/6/value/decision/false",
"outcome": "false",
"line": 461,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/8/value/decision/true",
"outcome": "true",
"line": 463,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/8/value/decision/false",
"outcome": "false",
"line": 463,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/10/value/decision/true",
"outcome": "true",
"line": 465,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/true/statement/10/value/decision/false",
"outcome": "false",
"line": 465,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/0/value/decision/true",
"outcome": "true",
"line": 468,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/0/value/decision/false",
"outcome": "false",
"line": 468,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/2/value/decision/true",
"outcome": "true",
"line": 470,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/2/value/decision/false",
"outcome": "false",
"line": 470,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/4/value/decision/true",
"outcome": "true",
"line": 472,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/4/value/decision/false",
"outcome": "false",
"line": 472,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/6/value/decision/true",
"outcome": "true",
"line": 474,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/6/value/decision/false",
"outcome": "false",
"line": 474,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/8/value/decision/true",
"outcome": "true",
"line": 476,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/26/tail/false/tail/true/statement/26/value/false/statement/8/value/decision/false",
"outcome": "false",
"line": 476,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/26/tail/false/tail/true/statement/27/value/decision/true",
"outcome": "true",
"line": 479,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/27/value/decision/false",
"outcome": "false",
"line": 479,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/true/statement/32/decision/body",
"outcome": "body",
"line": 484,
"state": "covered",
"hits": "705"
},
{
"id": "declaration/26/tail/false/tail/true/statement/32/decision/exit",
"outcome": "exit",
"line": 484,
"state": "covered",
"hits": "35"
},
{
"id": "declaration/26/tail/false/tail/true/statement/32/body/statement/0/value/decision/true",
"outcome": "true",
"line": 485,
"state": "covered",
"hits": "35"
},
{
"id": "declaration/26/tail/false/tail/true/statement/32/body/statement/0/value/decision/false",
"outcome": "false",
"line": 485,
"state": "covered",
"hits": "670"
},
{
"id": "declaration/26/tail/false/tail/true/statement/33/value/decision/true",
"outcome": "true",
"line": 489,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/26/tail/false/tail/true/statement/33/value/decision/false",
"outcome": "false",
"line": 489,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/decision/true",
"outcome": "true",
"line": 499,
"state": "covered",
"hits": "554"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/decision/false",
"outcome": "false",
"line": 499,
"state": "covered",
"hits": "6135"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/true/statement/0/value/decision/true",
"outcome": "true",
"line": 500,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/true/statement/0/value/decision/false",
"outcome": "false",
"line": 500,
"state": "covered",
"hits": "550"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/decision/true",
"outcome": "true",
"line": 503,
"state": "covered",
"hits": "995"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/decision/false",
"outcome": "false",
"line": 503,
"state": "covered",
"hits": "5140"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/true/statement/0/value/decision/true",
"outcome": "true",
"line": 504,
"state": "covered",
"hits": "53"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/true/statement/0/value/decision/false",
"outcome": "false",
"line": 504,
"state": "covered",
"hits": "942"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/false/statement/0/value/decision/true",
"outcome": "true",
"line": 507,
"state": "covered",
"hits": "439"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/false/statement/0/value/decision/false",
"outcome": "false",
"line": 507,
"state": "covered",
"hits": "4701"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/false/statement/1/value/args/1/args/0/decision/true",
"outcome": "true",
"line": 508,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/false/statement/1/value/args/1/args/0/decision/false",
"outcome": "false",
"line": 508,
"state": "covered",
"hits": "5140"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/false/statement/1/value/args/1/args/0/false/tail/decision/true",
"outcome": "true",
"line": 508,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/26/tail/false/tail/false/statement/6/value/false/tail/false/statement/1/value/args/1/args/0/false/tail/decision/false",
"outcome": "false",
"line": 508,
"state": "covered",
"hits": "5140"
},
{
"id": "declaration/27/statement/7/value/decision/true",
"outcome": "true",
"line": 523,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/27/statement/7/value/decision/false",
"outcome": "false",
"line": 523,
"state": "covered",
"hits": "402"
},
{
"id": "declaration/27/statement/10/decision/body",
"outcome": "body",
"line": 526,
"state": "covered",
"hits": "1676"
},
{
"id": "declaration/27/statement/10/decision/exit",
"outcome": "exit",
"line": 526,
"state": "covered",
"hits": "418"
},
{
"id": "declaration/27/statement/10/body/statement/4/value/decision/true",
"outcome": "true",
"line": 531,
"state": "covered",
"hits": "32"
},
{
"id": "declaration/27/statement/10/body/statement/4/value/decision/false",
"outcome": "false",
"line": 531,
"state": "covered",
"hits": "1644"
},
{
"id": "declaration/27/statement/10/body/statement/6/value/decision/true",
"outcome": "true",
"line": 533,
"state": "covered",
"hits": "32"
},
{
"id": "declaration/27/statement/10/body/statement/6/value/decision/false",
"outcome": "false",
"line": 533,
"state": "covered",
"hits": "1644"
},
{
"id": "declaration/27/statement/10/body/statement/10/decision/body",
"outcome": "body",
"line": 537,
"state": "covered",
"hits": "2434"
},
{
"id": "declaration/27/statement/10/body/statement/10/decision/exit",
"outcome": "exit",
"line": 537,
"state": "covered",
"hits": "1676"
},
{
"id": "declaration/27/statement/10/body/statement/10/body/statement/1/value/decision/true",
"outcome": "true",
"line": 539,
"state": "covered",
"hits": "26"
},
{
"id": "declaration/27/statement/10/body/statement/10/body/statement/1/value/decision/false",
"outcome": "false",
"line": 539,
"state": "covered",
"hits": "2408"
},
{
"id": "declaration/27/statement/10/body/statement/14/value/decision/true",
"outcome": "true",
"line": 545,
"state": "covered",
"hits": "32"
},
{
"id": "declaration/27/statement/10/body/statement/14/value/decision/false",
"outcome": "false",
"line": 545,
"state": "covered",
"hits": "1644"
},
{
"id": "declaration/27/statement/11/value/decision/true",
"outcome": "true",
"line": 549,
"state": "covered",
"hits": "16"
},
{
"id": "declaration/27/statement/11/value/decision/false",
"outcome": "false",
"line": 549,
"state": "covered",
"hits": "402"
},
{
"id": "declaration/29/tail/arm/0",
"outcome": "LocatedExpr",
"line": 563,
"state": "covered",
"hits": "38057"
},
{
"id": "declaration/29/tail/arm/0/body/block/statement/0/value/args/5/decision/true",
"outcome": "true",
"line": 564,
"state": "covered",
"hits": "2314"
},
{
"id": "declaration/29/tail/arm/0/body/block/statement/0/value/args/5/decision/false",
"outcome": "false",
"line": 564,
"state": "covered",
"hits": "35743"
},
{
"id": "declaration/29/tail/arm/0/body/block/tail/args/3/decision/true",
"outcome": "true",
"line": 566,
"state": "covered",
"hits": "2314"
},
{
"id": "declaration/29/tail/arm/0/body/block/tail/args/3/decision/false",
"outcome": "false",
"line": 566,
"state": "covered",
"hits": "35743"
},
{
"id": "declaration/29/tail/arm/1",
"outcome": "NatExpr",
"line": 568,
"state": "covered",
"hits": "1997"
},
{
"id": "declaration/29/tail/arm/1/body/block/statement/0/value/decision/true",
"outcome": "true",
"line": 569,
"state": "covered",
"hits": "288"
},
{
"id": "declaration/29/tail/arm/1/body/block/statement/0/value/decision/false",
"outcome": "false",
"line": 569,
"state": "covered",
"hits": "1709"
},
{
"id": "declaration/29/tail/arm/2",
"outcome": "DecimalExpr",
"line": 573,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/29/tail/arm/2/body/block/statement/0/value/decision/true",
"outcome": "true",
"line": 574,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/29/tail/arm/2/body/block/statement/0/value/decision/false",
"outcome": "false",
"line": 574,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/29/tail/arm/3",
"outcome": "StringExpr",
"line": 578,
"state": "covered",
"hits": "2513"
},
{
"id": "declaration/29/tail/arm/4",
"outcome": "BoolExpr",
"line": 579,
"state": "covered",
"hits": "565"
},
{
"id": "declaration/29/tail/arm/4/body/block/statement/0/value/decision/true",
"outcome": "true",
"line": 580,
"state": "covered",
"hits": "36"
},
{
"id": "declaration/29/tail/arm/4/body/block/statement/0/value/decision/false",
"outcome": "false",
"line": 580,
"state": "covered",
"hits": "529"
},
{
"id": "declaration/29/tail/arm/5",
"outcome": "NameExpr",
"line": 584,
"state": "covered",
"hits": "14002"
},
{
"id": "declaration/29/tail/arm/5/body/block/statement/0/value/decision/true",
"outcome": "true",
"line": 585,
"state": "covered",
"hits": "872"
},
{
"id": "declaration/29/tail/arm/5/body/block/statement/0/value/decision/false",
"outcome": "false",
"line": 585,
"state": "covered",
"hits": "13130"
},
{
"id": "declaration/29/tail/arm/6",
"outcome": "FunctionExpr",
"line": 589,
"state": "covered",
"hits": "38"
},
{
"id": "declaration/29/tail/arm/6/body/block/statement/0/value/decision/true",
"outcome": "true",
"line": 590,
"state": "covered",
"hits": "20"
},
{
"id": "declaration/29/tail/arm/6/body/block/statement/0/value/decision/false",
"outcome": "false",
"line": 590,
"state": "covered",
"hits": "18"
},
{
"id": "declaration/29/tail/arm/7",
"outcome": "ArrayExpr",
"line": 594,
"state": "covered",
"hits": "527"
},
{
"id": "declaration/29/tail/arm/7/body/block/statement/3/value/decision/true",
"outcome": "true",
"line": 598,
"state": "covered",
"hits": "69"
},
{
"id": "declaration/29/tail/arm/7/body/block/statement/3/value/decision/false",
"outcome": "false",
"line": 598,
"state": "covered",
"hits": "458"
},
{
"id": "declaration/29/tail/arm/8",
"outcome": "UnaryExpr",
"line": 602,
"state": "covered",
"hits": "195"
},
{
"id": "declaration/29/tail/arm/8/body/block/statement/4/value/decision/true",
"outcome": "true",
"line": 607,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/29/tail/arm/8/body/block/statement/4/value/decision/false",
"outcome": "false",
"line": 607,
"state": "covered",
"hits": "181"
},
{
"id": "declaration/29/tail/arm/8/body/block/statement/4/value/true/statement/1/decision/body",
"outcome": "body",
"line": 610,
"state": "covered",
"hits": "37"
},
{
"id": "declaration/29/tail/arm/8/body/block/statement/4/value/true/statement/1/decision/exit",
"outcome": "exit",
"line": 610,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/29/tail/arm/8/body/block/statement/4/value/true/statement/1/body/statement/0/value/decision/true",
"outcome": "true",
"line": 611,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/29/tail/arm/8/body/block/statement/4/value/true/statement/1/body/statement/0/value/decision/false",
"outcome": "false",
"line": 611,
"state": "covered",
"hits": "23"
},
{
"id": "declaration/29/tail/arm/8/body/block/statement/4/value/false/statement/0/value/decision/true",
"outcome": "true",
"line": 617,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/29/tail/arm/8/body/block/statement/4/value/false/statement/0/value/decision/false",
"outcome": "false",
"line": 617,
"state": "covered",
"hits": "180"
},
{
"id": "declaration/29/tail/arm/9",
"outcome": "BinaryExpr",
"line": 622,
"state": "covered",
"hits": "4609"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/decision/true",
"outcome": "true",
"line": 623,
"state": "covered",
"hits": "1155"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/decision/false",
"outcome": "false",
"line": 623,
"state": "covered",
"hits": "3454"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 623,
"state": "covered",
"hits": "4123"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 623,
"state": "covered",
"hits": "486"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/false/statement/6/value/decision/true",
"outcome": "true",
"line": 632,
"state": "covered",
"hits": "76"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/false/statement/6/value/decision/false",
"outcome": "false",
"line": 632,
"state": "covered",
"hits": "3378"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/false/statement/6/value/true/statement/0/value/decision/true",
"outcome": "true",
"line": 633,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/false/statement/6/value/true/statement/0/value/decision/false",
"outcome": "false",
"line": 633,
"state": "covered",
"hits": "51"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/false/statement/6/value/false/statement/0/value/decision/true",
"outcome": "true",
"line": 636,
"state": "covered",
"hits": "214"
},
{
"id": "declaration/29/tail/arm/9/body/block/tail/false/statement/6/value/false/statement/0/value/decision/false",
"outcome": "false",
"line": 636,
"state": "covered",
"hits": "3164"
},
{
"id": "declaration/29/tail/arm/10",
"outcome": "DotCallExpr",
"line": 643,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/29/tail/arm/11",
"outcome": "CallExpr",
"line": 644,
"state": "covered",
"hits": "6755"
},
{
"id": "declaration/29/tail/arm/12",
"outcome": "FieldExpr",
"line": 645,
"state": "covered",
"hits": "3146"
},
{
"id": "declaration/29/tail/arm/12/body/block/statement/3/value/decision/true",
"outcome": "true",
"line": 649,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/29/tail/arm/12/body/block/statement/3/value/decision/false",
"outcome": "false",
"line": 649,
"state": "covered",
"hits": "3141"
},
{
"id": "declaration/29/tail/arm/13",
"outcome": "IndexExpr",
"line": 653,
"state": "covered",
"hits": "706"
},
{
"id": "declaration/29/tail/arm/13/body/block/statement/5/value/decision/true",
"outcome": "true",
"line": 659,
"state": "covered",
"hits": "119"
},
{
"id": "declaration/29/tail/arm/13/body/block/statement/5/value/decision/false",
"outcome": "false",
"line": 659,
"state": "covered",
"hits": "587"
},
{
"id": "declaration/29/tail/arm/14",
"outcome": "IfExpr",
"line": 663,
"state": "covered",
"hits": "1575"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/decision/true",
"outcome": "true",
"line": 667,
"state": "covered",
"hits": "1201"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/decision/false",
"outcome": "false",
"line": 667,
"state": "covered",
"hits": "374"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/true/statement/7/value/decision/true",
"outcome": "true",
"line": 675,
"state": "covered",
"hits": "62"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/true/statement/7/value/decision/false",
"outcome": "false",
"line": 675,
"state": "covered",
"hits": "1139"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/true/statement/12/value/decision/true",
"outcome": "true",
"line": 680,
"state": "covered",
"hits": "62"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/true/statement/12/value/decision/false",
"outcome": "false",
"line": 680,
"state": "covered",
"hits": "1139"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/false/statement/4/value/decision/true",
"outcome": "true",
"line": 692,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/false/statement/4/value/decision/false",
"outcome": "false",
"line": 692,
"state": "covered",
"hits": "373"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/false/statement/9/value/decision/true",
"outcome": "true",
"line": 697,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/false/statement/9/value/decision/false",
"outcome": "false",
"line": 697,
"state": "covered",
"hits": "373"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/false/statement/11/value/decision/true",
"outcome": "true",
"line": 699,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/29/tail/arm/14/body/block/tail/false/statement/11/value/decision/false",
"outcome": "false",
"line": 699,
"state": "covered",
"hits": "373"
},
{
"id": "declaration/29/tail/arm/15",
"outcome": "BlockExpr",
"line": 705,
"state": "covered",
"hits": "1011"
},
{
"id": "declaration/29/tail/arm/16",
"outcome": "MatchExpr",
"line": 706,
"state": "covered",
"hits": "418"
},
{
"id": "declaration/30/tail/arm/0",
"outcome": "ConstInstruction",
"line": 714,
"state": "covered",
"hits": "15612"
},
{
"id": "declaration/30/tail/arm/1",
"outcome": "LoadInstruction",
"line": 715,
"state": "covered",
"hits": "28894"
},
{
"id": "declaration/30/tail/arm/2",
"outcome": "StoreInstruction",
"line": 716,
"state": "covered",
"hits": "12767"
},
{
"id": "declaration/30/tail/arm/3",
"outcome": "PopInstruction",
"line": 717,
"state": "covered",
"hits": "2658"
},
{
"id": "declaration/30/tail/arm/4",
"outcome": "UnaryInstruction",
"line": 718,
"state": "covered",
"hits": "360"
},
{
"id": "declaration/30/tail/arm/5",
"outcome": "BinaryInstruction",
"line": 719,
"state": "covered",
"hits": "5980"
},
{
"id": "declaration/30/tail/arm/6",
"outcome": "MakeRangeInstruction",
"line": 720,
"state": "covered",
"hits": "50"
},
{
"id": "declaration/30/tail/arm/7",
"outcome": "MakeArrayInstruction",
"line": 721,
"state": "covered",
"hits": "861"
},
{
"id": "declaration/30/tail/arm/8",
"outcome": "IndexGetInstruction",
"line": 722,
"state": "covered",
"hits": "947"
},
{
"id": "declaration/30/tail/arm/9",
"outcome": "InterpolateInstruction",
"line": 723,
"state": "covered",
"hits": "429"
},
{
"id": "declaration/30/tail/arm/10",
"outcome": "IterInitInstruction",
"line": 724,
"state": "covered",
"hits": "685"
},
{
"id": "declaration/30/tail/arm/11",
"outcome": "IterNextInstruction",
"line": 725,
"state": "covered",
"hits": "685"
},
{
"id": "declaration/30/tail/arm/12",
"outcome": "MakeRecordInstruction",
"line": 726,
"state": "covered",
"hits": "1099"
},
{
"id": "declaration/30/tail/arm/13",
"outcome": "FieldGetInstruction",
"line": 727,
"state": "covered",
"hits": "6278"
},
{
"id": "declaration/30/tail/arm/14",
"outcome": "MakeVariantInstruction",
"line": 728,
"state": "covered",
"hits": "1833"
},
{
"id": "declaration/30/tail/arm/15",
"outcome": "MatchVariantInstruction",
"line": 729,
"state": "covered",
"hits": "3284"
},
{
"id": "declaration/30/tail/arm/16",
"outcome": "MatchFailInstruction",
"line": 730,
"state": "covered",
"hits": "802"
},
{
"id": "declaration/30/tail/arm/17",
"outcome": "CallInstruction",
"line": 731,
"state": "covered",
"hits": "8825"
},
{
"id": "declaration/30/tail/arm/18",
"outcome": "CallValueInstruction",
"line": 732,
"state": "covered",
"hits": "39"
},
{
"id": "declaration/30/tail/arm/19",
"outcome": "AwaitCallInstruction",
"line": 733,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/30/tail/arm/20",
"outcome": "AwaitValueInstruction",
"line": 734,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/30/tail/arm/21",
"outcome": "JumpFalseInstruction",
"line": 735,
"state": "covered",
"hits": "5313"
},
{
"id": "declaration/30/tail/arm/22",
"outcome": "JumpInstruction",
"line": 736,
"state": "covered",
"hits": "8538"
},
{
"id": "declaration/30/tail/arm/23",
"outcome": "PendingEndJumpInstruction",
"line": 737,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/30/tail/arm/24",
"outcome": "ReturnInstruction",
"line": 738,
"state": "covered",
"hits": "1184"
},
{
"id": "declaration/31/statement/2/decision/body",
"outcome": "body",
"line": 745,
"state": "covered",
"hits": "52"
},
{
"id": "declaration/31/statement/2/decision/exit",
"outcome": "exit",
"line": 745,
"state": "covered",
"hits": "51"
},
{
"id": "declaration/31/statement/2/body/statement/1/decision/body",
"outcome": "body",
"line": 747,
"state": "covered",
"hits": "1261"
},
{
"id": "declaration/31/statement/2/body/statement/1/decision/exit",
"outcome": "exit",
"line": 747,
"state": "covered",
"hits": "52"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/decision/true",
"outcome": "true",
"line": 748,
"state": "covered",
"hits": "1184"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/decision/false",
"outcome": "false",
"line": 748,
"state": "covered",
"hits": "77"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 748,
"state": "covered",
"hits": "78"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 748,
"state": "covered",
"hits": "1183"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/true/statement/0/decision/body",
"outcome": "body",
"line": 749,
"state": "covered",
"hits": "107135"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/true/statement/0/decision/exit",
"outcome": "exit",
"line": 749,
"state": "covered",
"hits": "1184"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/true/statement/0/body/tail/decision/true",
"outcome": "true",
"line": 751,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/true/statement/0/body/tail/decision/false",
"outcome": "false",
"line": 751,
"state": "covered",
"hits": "107134"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/true/statement/0/body/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 751,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/31/statement/2/body/statement/1/body/tail/true/statement/0/body/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 751,
"state": "covered",
"hits": "107131"
},
{
"id": "declaration/34/statement/3/decision/body",
"outcome": "body",
"line": 774,
"state": "covered",
"hits": "1100"
},
{
"id": "declaration/34/statement/3/decision/exit",
"outcome": "exit",
"line": 774,
"state": "covered",
"hits": "51"
},
{
"id": "declaration/34/statement/3/body/tail/arm/0",
"outcome": "FunctionDeclaration",
"line": 776,
"state": "covered",
"hits": "769"
},
{
"id": "declaration/34/statement/3/body/tail/arm/0/body/block/statement/2/value/decision/true",
"outcome": "true",
"line": 779,
"state": "covered",
"hits": "121"
},
{
"id": "declaration/34/statement/3/body/tail/arm/0/body/block/statement/2/value/decision/false",
"outcome": "false",
"line": 779,
"state": "covered",
"hits": "648"
},
{
"id": "declaration/34/statement/3/body/tail/arm/1",
"outcome": "ImportDeclaration",
"line": 785,
"state": "covered",
"hits": "99"
},
{
"id": "declaration/34/statement/3/body/tail/arm/2",
"outcome": "TypeDeclaration",
"line": 786,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/34/statement/3/body/tail/arm/3",
"outcome": "RecordDeclaration",
"line": 787,
"state": "covered",
"hits": "133"
},
{
"id": "declaration/34/statement/3/body/tail/arm/4",
"outcome": "EnumDeclaration",
"line": 788,
"state": "covered",
"hits": "97"
},
{
"id": "declaration/34/statement/6/decision/body",
"outcome": "body",
"line": 793,
"state": "covered",
"hits": "769"
},
{
"id": "declaration/34/statement/6/decision/exit",
"outcome": "exit",
"line": 793,
"state": "covered",
"hits": "51"
},
{
"id": "declaration/34/statement/6/body/tail/decision/true",
"outcome": "true",
"line": 794,
"state": "covered",
"hits": "695"
},
{
"id": "declaration/34/statement/6/body/tail/decision/false",
"outcome": "false",
"line": 794,
"state": "covered",
"hits": "74"
},
{
"id": "declaration/34/statement/6/body/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 794,
"state": "covered",
"hits": "75"
},
{
"id": "declaration/34/statement/6/body/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 794,
"state": "covered",
"hits": "694"
},
{
"id": "declaration/34/statement/8/decision/body",
"outcome": "body",
"line": 799,
"state": "covered",
"hits": "121"
},
{
"id": "declaration/34/statement/8/decision/exit",
"outcome": "exit",
"line": 799,
"state": "covered",
"hits": "51"
},
{
"id": "declaration/34/statement/8/body/tail/decision/true",
"outcome": "true",
"line": 800,
"state": "covered",
"hits": "85"
},
{
"id": "declaration/34/statement/8/body/tail/decision/false",
"outcome": "false",
"line": 800,
"state": "covered",
"hits": "36"
},
{
"id": "declaration/34/statement/8/body/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 800,
"state": "covered",
"hits": "36"
},
{
"id": "declaration/34/statement/8/body/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 800,
"state": "covered",
"hits": "85"
},
{
"id": "declaration/34/statement/10/decision/body",
"outcome": "body",
"line": 805,
"state": "covered",
"hits": "121"
},
{
"id": "declaration/34/statement/10/decision/exit",
"outcome": "exit",
"line": 805,
"state": "covered",
"hits": "51"
},
{
"id": "declaration/34/statement/10/body/tail/decision/true",
"outcome": "true",
"line": 806,
"state": "covered",
"hits": "85"
},
{
"id": "declaration/34/statement/10/body/tail/decision/false",
"outcome": "false",
"line": 806,
"state": "covered",
"hits": "36"
},
{
"id": "declaration/34/statement/10/body/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 806,
"state": "covered",
"hits": "36"
},
{
"id": "declaration/34/statement/10/body/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 806,
"state": "covered",
"hits": "85"
},
{
"id": "declaration/35/tail/arm/0",
"outcome": "Ok",
"line": 813,
"state": "covered",
"hits": "14"
},
{
"id": "declaration/35/tail/arm/0/body/block/tail/arm/0",
"outcome": "Ok",
"line": 815,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/35/tail/arm/0/body/block/tail/arm/0/body/block/tail/decision/true",
"outcome": "true",
"line": 817,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/35/tail/arm/0/body/block/tail/arm/0/body/block/tail/decision/false",
"outcome": "false",
"line": 817,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/35/tail/arm/0/body/block/tail/arm/1",
"outcome": "Error",
"line": 823,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/35/tail/arm/1",
"outcome": "Error",
"line": 826,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/0",
"outcome": "ConstInstruction",
"line": 832,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/1",
"outcome": "LoadInstruction",
"line": 833,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/2",
"outcome": "StoreInstruction",
"line": 834,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/3",
"outcome": "PopInstruction",
"line": 835,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/4",
"outcome": "UnaryInstruction",
"line": 836,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/5",
"outcome": "BinaryInstruction",
"line": 837,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/6",
"outcome": "MakeRangeInstruction",
"line": 838,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/7",
"outcome": "MakeArrayInstruction",
"line": 839,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/8",
"outcome": "IndexGetInstruction",
"line": 840,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/9",
"outcome": "InterpolateInstruction",
"line": 841,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/10",
"outcome": "IterInitInstruction",
"line": 842,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/11",
"outcome": "IterNextInstruction",
"line": 843,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/12",
"outcome": "MakeRecordInstruction",
"line": 844,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/13",
"outcome": "FieldGetInstruction",
"line": 845,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/14",
"outcome": "MakeVariantInstruction",
"line": 846,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/15",
"outcome": "MatchVariantInstruction",
"line": 847,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/16",
"outcome": "MatchFailInstruction",
"line": 848,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/17",
"outcome": "CallInstruction",
"line": 849,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/36/tail/arm/18",
"outcome": "CallValueInstruction",
"line": 850,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/36/tail/arm/19",
"outcome": "AwaitCallInstruction",
"line": 851,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/20",
"outcome": "AwaitValueInstruction",
"line": 852,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/21",
"outcome": "JumpFalseInstruction",
"line": 853,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/22",
"outcome": "JumpInstruction",
"line": 854,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/23",
"outcome": "PendingEndJumpInstruction",
"line": 855,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/36/tail/arm/24",
"outcome": "ReturnInstruction",
"line": 856,
"state": "zero",
"hits": "0"
}
]Reviewed declaration exclusions
[
{
"id": "declaration/0",
"reason": "import",
"line": 1
},
{
"id": "declaration/1",
"reason": "enum-declaration",
"line": 3
},
{
"id": "declaration/2",
"reason": "enum-declaration",
"line": 13
},
{
"id": "declaration/3",
"reason": "record-declaration",
"line": 41
},
{
"id": "declaration/4",
"reason": "record-declaration",
"line": 49
},
{
"id": "declaration/5",
"reason": "record-declaration",
"line": 53
},
{
"id": "declaration/6",
"reason": "record-declaration",
"line": 63
},
{
"id": "declaration/7",
"reason": "record-declaration",
"line": 70
},
{
"id": "declaration/9",
"reason": "record-declaration",
"line": 81
},
{
"id": "declaration/10",
"reason": "record-declaration",
"line": 87
},
{
"id": "declaration/11",
"reason": "record-declaration",
"line": 92
}
]