All files

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
  }
]