All files

src/bytecode/codec.panack

Green: covered; red: known zero; amber: unavailable. Blank lines are outside the executable-start-line denominator.

    1 import "../compiler/emitter.panack"
    2 
    3 pure encode_u8(value: Nat): Bytes {
    4   byte_append(bytes(), value)
    5 }
    6 
    7 pure encode_u16(value: Nat): Bytes {
    8   mut output: Bytes = bytes()
    9   output = byte_append(output, (quotient(value, 256)) % 256)
   10   byte_append(output, value % 256)
   11 }
   12 
   13 pure encode_u32(value: Nat): Bytes {
   14   mut output: Bytes = bytes()
   15   output = byte_append(output, (quotient(value, 16777216)) % 256)
   16   output = byte_append(output, (quotient(value, 65536)) % 256)
   17   output = byte_append(output, (quotient(value, 256)) % 256)
   18   byte_append(output, value % 256)
   19 }
   20 
   21 pure encode_i16_negative(magnitude: Nat): Bytes {
   22   if magnitude <= 32768 {
   23     mut encoded: Nat = 65536
   24     mut remaining: Nat = magnitude
   25     while remaining > 0 {
   26       if encoded > 0 { encoded = encoded - 1; } else {}
   27       remaining = remaining - 1
   28     }
   29     encode_u16(encoded)
   30   } else {
   31     bytes()
   32   }
   33 }
   34 
   35 pure encode_name(value: Str): Bytes {
   36   encoded: Bytes = utf8_encode(value)
   37   bytes_concat(encode_u16(byte_len(encoded)), encoded)
   38 }
   39 
   40 pure encode_text(value: Str): Bytes {
   41   encoded: Bytes = utf8_encode(value)
   42   bytes_concat(encode_u32(byte_len(encoded)), encoded)
   43 }
   44 
   45 pure encode_nat_body(value: Nat): Bytes {
   46   if value < 256 {
   47     encode_u8(value)
   48   } else {
   49     byte_append(encode_nat_body(quotient(value, 256)), value % 256)
   50   }
   51 }
   52 
   53 pure encode_natural(value: Nat): Bytes {
   54   if value == 0 {
   55     encode_u16(0)
   56   } else {
   57     body: Bytes = encode_nat_body(value)
   58     bytes_concat(encode_u16(byte_len(body)), body)
   59   }
   60 }
   61 
   62 pure decimal_digits(text: Str): [Nat] {
   63   mut digits: [Nat] = []
   64   mut seen_nonzero: Bool = false
   65   mut cursor: Nat = 0
   66   while cursor < len(text) {
   67     character: Str = text[cursor]
   68     if character != "." && character != "-" {
   69       digit: Nat = nat_from_str(character)
   70       if digit != 0 || seen_nonzero {
   71         seen_nonzero = true
   72         digits = append(digits, digit)
   73       } else {
   74       }
   75     } else {
   76     }
   77     cursor = cursor + 1
   78   }
   79   if len(digits) == 0 {
   80     [0]
   81   } else {
   82     digits
   83   }
   84 }
   85 
   86 pure decimal_fraction_digits(text: Str): Nat {
   87   mut result: Nat = 0
   88   mut after_point: Bool = false
   89   mut cursor: Nat = 0
   90   while cursor < len(text) {
   91     character: Str = text[cursor]
   92     if character == "." {
   93       after_point = true
   94     } else {
   95       if after_point { result = result + 1; } else {}
   96     }
   97     cursor = cursor + 1
   98   }
   99   result
  100 }
  101 
  102 pure encode_decimal(text: Str): Bytes {
  103   negative: Bool = len(text) > 0 && text[0] == "-"
  104   digits: [Nat] = decimal_digits(text)
  105   fraction_digits: Nat = decimal_fraction_digits(text)
  106   mut output: Bytes = encode_u8(if negative { 1 } else { 0 })
  107   output = bytes_concat(output, encode_i16_negative(fraction_digits))
  108   output = bytes_concat(output, encode_u16(len(digits)))
  109   mut cursor: Nat = 0
  110   while cursor < len(digits) {
  111     high: Nat = digits[cursor]
  112     low: Nat = if cursor + 1 < len(digits) { digits[cursor + 1] } else { 15 }
  113     output = byte_append(output, high * 16 + low)
  114     cursor = cursor + 2
  115   }
  116   output
  117 }
  118 
  119 pure encode_decimal_parts(negative: Bool, digits: [Nat], exponent_negative: Bool, exponent_magnitude: Nat): Bytes {
  120   mut output: Bytes = encode_u8(if negative { 1 } else { 0 })
  121   if exponent_negative {
  122     output = bytes_concat(output, encode_i16_negative(exponent_magnitude))
  123   } else {
  124     output = bytes_concat(output, encode_u16(exponent_magnitude))
  125   }
  126   output = bytes_concat(output, encode_u16(len(digits)))
  127   mut cursor: Nat = 0
  128   while cursor < len(digits) {
  129     high: Nat = digits[cursor]
  130     low: Nat = if cursor + 1 < len(digits) { digits[cursor + 1] } else { 15 }
  131     output = byte_append(output, high * 16 + low)
  132     cursor = cursor + 2
  133   }
  134   output
  135 }
  136 
  137 pure encode_constant(constant: ConstantValue): Bytes {
  138   match constant {
  139     NatConstant(number) => bytes_concat(encode_u8(0), encode_natural(number)),
  140     IntConstant(negative, magnitude) => {
  141       mut output: Bytes = encode_u8(1)
  142       output = bytes_concat(output, encode_u8(if negative { 1 } else { 0 }))
  143       bytes_concat(output, encode_natural(magnitude))
  144     },
  145     DecimalConstant(text) => bytes_concat(encode_u8(2), encode_decimal(text)),
  146     DecimalPartsConstant(negative, digits, exponent_negative, exponent_magnitude) => {
  147       body: Bytes = encode_decimal_parts(negative, digits, exponent_negative, exponent_magnitude)
  148       bytes_concat(encode_u8(2), body)
  149     },
  150     StringConstant(text) => bytes_concat(encode_u8(3), encode_text(text)),
  151     BoolConstant(flag) => bytes_concat(encode_u8(4), encode_u8(if flag { 1 } else { 0 })),
  152     VoidConstant() => encode_u8(5)
  153   }
  154 }
  155 
  156 pure unary_code(operator: Str): Nat {
  157   if operator == "-" { 0 } else { 1 }
  158 }
  159 
  160 pure binary_code(operator: Str): Nat {
  161   if operator == "+" { 0 }
  162   else { if operator == "-" { 1 }
  163   else { if operator == "*" { 2 }
  164   else { if operator == "/" { 3 }
  165   else { if operator == "%" { 4 }
  166   else { if operator == "==" { 5 }
  167   else { if operator == "!=" { 6 }
  168   else { if operator == "<" { 7 }
  169   else { if operator == "<=" { 8 }
  170   else { if operator == ">" { 9 }
  171   else { if operator == ">=" { 10 }
  172   else { if operator == "&&" { 11 } else { 12 } } } } } } } } } } } }
  173 }
  174 
  175 pure encode_names(values: [Str]): Bytes {
  176   mut output: Bytes = bytes()
  177   for value in values {
  178     output = bytes_concat(output, encode_name(value))
  179   }
  180   output
  181 }
  182 
  183 pure encode_texts(values: [Str]): Bytes {
  184   mut output: Bytes = encode_u16(len(values))
  185   for value in values {
  186     output = bytes_concat(output, encode_text(value))
  187   }
  188   output
  189 }
  190 
  191 pure encode_instruction(instruction: Instruction): Bytes {
  192   match instruction {
  193     ConstInstruction(value) => bytes_concat(encode_u8(0), encode_constant(value)),
  194     LoadInstruction(name) => bytes_concat(encode_u8(1), encode_name(name)),
  195     StoreInstruction(name) => bytes_concat(encode_u8(2), encode_name(name)),
  196     PopInstruction() => encode_u8(3),
  197     UnaryInstruction(operator) => bytes_concat(encode_u8(4), encode_u8(unary_code(operator))),
  198     BinaryInstruction(operator) => bytes_concat(encode_u8(5), encode_u8(binary_code(operator))),
  199     MakeRangeInstruction() => encode_u8(6),
  200     MakeArrayInstruction(count) => bytes_concat(encode_u8(7), encode_u16(count)),
  201     IndexGetInstruction() => encode_u8(8),
  202     InterpolateInstruction(parts) => bytes_concat(encode_u8(9), encode_texts(parts)),
  203     IterInitInstruction(name) => bytes_concat(encode_u8(10), encode_name(name)),
  204     IterNextInstruction(iterator, name, end) => {
  205       mut output: Bytes = bytes_concat(encode_u8(11), encode_name(iterator))
  206       output = bytes_concat(output, encode_name(name))
  207       bytes_concat(output, encode_u32(end))
  208     },
  209     MakeRecordInstruction(name, fields) => {
  210       mut output: Bytes = bytes_concat(encode_u8(12), encode_name(name))
  211       output = bytes_concat(output, encode_u16(len(fields)))
  212       bytes_concat(output, encode_names(fields))
  213     },
  214     FieldGetInstruction(name) => bytes_concat(encode_u8(13), encode_name(name)),
  215     MakeVariantInstruction(enum_name, variant, count) => {
  216       mut output: Bytes = bytes_concat(encode_u8(14), encode_name(enum_name))
  217       output = bytes_concat(output, encode_name(variant))
  218       bytes_concat(output, encode_u16(count))
  219     },
  220     MatchVariantInstruction(variant, failure) => {
  221       mut output: Bytes = bytes_concat(encode_u8(15), encode_name(variant))
  222       bytes_concat(output, encode_u32(failure))
  223     },
  224     MatchFailInstruction() => encode_u8(16),
  225     CallInstruction(name, arity) => {
  226       mut output: Bytes = bytes_concat(encode_u8(17), encode_name(name))
  227       bytes_concat(output, encode_u8(arity))
  228     },
  229     JumpFalseInstruction(target) => bytes_concat(encode_u8(18), encode_u32(target)),
  230     JumpInstruction(target) => bytes_concat(encode_u8(19), encode_u32(target)),
  231     PendingEndJumpInstruction() => bytes(),
  232     ReturnInstruction() => encode_u8(20),
  233     AwaitCallInstruction(name, arity) => bytes_concat(bytes_concat(encode_u8(22), encode_name(name)), encode_u8(arity)),
  234     AwaitValueInstruction(arity) => bytes_concat(encode_u8(23), encode_u8(arity)),
  235     CallValueInstruction(arity) => bytes_concat(encode_u8(21), encode_u8(arity))
  236   }
  237 }
  238 
  239 pure insert_function(functions: [FunctionCode], function: FunctionCode): [FunctionCode] {
  240   mut result: [FunctionCode] = []
  241   mut inserted: Bool = false
  242   for existing in functions {
  243     if !inserted && function.name < existing.name {
  244       result = append(result, function)
  245       inserted = true
  246     } else {}
  247     result = append(result, existing)
  248   }
  249   if !inserted { result = append(result, function); } else {}
  250   result
  251 }
  252 
  253 pure sort_functions(functions: [FunctionCode]): [FunctionCode] {
  254   mut result: [FunctionCode] = []
  255   for function in functions {
  256     result = insert_function(result, function)
  257   }
  258   result
  259 }
  260 
  261 pure encode_function(function: FunctionCode): Bytes {
  262   mut output: Bytes = encode_name(function.name)
  263   output = bytes_concat(output, encode_u8(if function.is_async { 2 } else { if function.is_pure { 1 } else { 0 } }))
  264   output = bytes_concat(output, encode_u8(len(function.parameters)))
  265   output = bytes_concat(output, encode_names(function.parameters))
  266   output = bytes_concat(output, encode_u32(len(function.instructions)))
  267   for instruction in function.instructions {
  268     output = bytes_concat(output, encode_instruction(instruction))
  269   }
  270   output
  271 }
  272 
  273 pure serialize_bytecode(program: BytecodeProgram): Bytes {
  274   mut output: Bytes = utf8_encode("PANACKBC")
  275   output = byte_append(output, 0)
  276   output = bytes_concat(output, encode_u16(9))
  277   functions: [FunctionCode] = sort_functions(program.functions)
  278   output = bytes_concat(output, encode_u16(len(functions)))
  279   for function in functions {
  280     output = bytes_concat(output, encode_function(function))
  281   }
  282   output
  283 }
  284 
  285 pure compile_source_bytecode(source: Str): Bytes {
  286   match lex(source) {
  287     Ok(tokens) => {
  288       match parse_program_complete(tokens) {
  289         Ok(program) => {
  290           diagnostics: [Diagnostic] = check_program_frontend(program)
  291           if len(diagnostics) == 0 { serialize_bytecode(compile_program(program)) } else { bytes() }
  292         },
  293         Error(error) => bytes()
  294       }
  295     },
  296     Error(errors) => bytes()
  297   }
  298 }
  299 

Functions

[
  {
    "id": "declaration/1",
    "name": "encode_u8",
    "line": 3,
    "state": "covered",
    "entries": "74794"
  },
  {
    "id": "declaration/2",
    "name": "encode_u16",
    "line": 7,
    "state": "covered",
    "entries": "41594"
  },
  {
    "id": "declaration/3",
    "name": "encode_u32",
    "line": 13,
    "state": "covered",
    "entries": "28446"
  },
  {
    "id": "declaration/4",
    "name": "encode_i16_negative",
    "line": 21,
    "state": "covered",
    "entries": "7"
  },
  {
    "id": "declaration/5",
    "name": "encode_name",
    "line": 35,
    "state": "covered",
    "entries": "37666"
  },
  {
    "id": "declaration/6",
    "name": "encode_text",
    "line": 40,
    "state": "covered",
    "entries": "6263"
  },
  {
    "id": "declaration/7",
    "name": "encode_nat_body",
    "line": 45,
    "state": "covered",
    "entries": "1331"
  },
  {
    "id": "declaration/8",
    "name": "encode_natural",
    "line": 53,
    "state": "covered",
    "entries": "1642"
  },
  {
    "id": "declaration/9",
    "name": "decimal_digits",
    "line": 62,
    "state": "covered",
    "entries": "3"
  },
  {
    "id": "declaration/10",
    "name": "decimal_fraction_digits",
    "line": 86,
    "state": "covered",
    "entries": "3"
  },
  {
    "id": "declaration/11",
    "name": "encode_decimal",
    "line": 102,
    "state": "covered",
    "entries": "3"
  },
  {
    "id": "declaration/12",
    "name": "encode_decimal_parts",
    "line": 119,
    "state": "covered",
    "entries": "5"
  },
  {
    "id": "declaration/13",
    "name": "encode_constant",
    "line": 137,
    "state": "covered",
    "entries": "7985"
  },
  {
    "id": "declaration/14",
    "name": "unary_code",
    "line": 156,
    "state": "covered",
    "entries": "181"
  },
  {
    "id": "declaration/15",
    "name": "binary_code",
    "line": 160,
    "state": "covered",
    "entries": "3046"
  },
  {
    "id": "declaration/16",
    "name": "encode_names",
    "line": 175,
    "state": "covered",
    "entries": "1243"
  },
  {
    "id": "declaration/17",
    "name": "encode_texts",
    "line": 183,
    "state": "covered",
    "entries": "221"
  },
  {
    "id": "declaration/18",
    "name": "encode_instruction",
    "line": 191,
    "state": "covered",
    "entries": "54721"
  },
  {
    "id": "declaration/19",
    "name": "insert_function",
    "line": 239,
    "state": "covered",
    "entries": "725"
  },
  {
    "id": "declaration/20",
    "name": "sort_functions",
    "line": 253,
    "state": "covered",
    "entries": "77"
  },
  {
    "id": "declaration/21",
    "name": "encode_function",
    "line": 261,
    "state": "covered",
    "entries": "689"
  },
  {
    "id": "declaration/22",
    "name": "serialize_bytecode",
    "line": 273,
    "state": "covered",
    "entries": "49"
  },
  {
    "id": "declaration/23",
    "name": "compile_source_bytecode",
    "line": 285,
    "state": "covered",
    "entries": "22"
  }
]

Source branch outcomes

[
  {
    "id": "declaration/4/tail/decision/true",
    "outcome": "true",
    "line": 22,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/4/tail/decision/false",
    "outcome": "false",
    "line": 22,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/4/tail/true/statement/2/decision/body",
    "outcome": "body",
    "line": 25,
    "state": "covered",
    "hits": "22"
  },
  {
    "id": "declaration/4/tail/true/statement/2/decision/exit",
    "outcome": "exit",
    "line": 25,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/4/tail/true/statement/2/body/statement/0/value/decision/true",
    "outcome": "true",
    "line": 26,
    "state": "covered",
    "hits": "22"
  },
  {
    "id": "declaration/4/tail/true/statement/2/body/statement/0/value/decision/false",
    "outcome": "false",
    "line": 26,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/7/tail/decision/true",
    "outcome": "true",
    "line": 46,
    "state": "covered",
    "hits": "1079"
  },
  {
    "id": "declaration/7/tail/decision/false",
    "outcome": "false",
    "line": 46,
    "state": "covered",
    "hits": "252"
  },
  {
    "id": "declaration/8/tail/decision/true",
    "outcome": "true",
    "line": 54,
    "state": "covered",
    "hits": "563"
  },
  {
    "id": "declaration/8/tail/decision/false",
    "outcome": "false",
    "line": 54,
    "state": "covered",
    "hits": "1079"
  },
  {
    "id": "declaration/9/statement/3/decision/body",
    "outcome": "body",
    "line": 66,
    "state": "covered",
    "hits": "18"
  },
  {
    "id": "declaration/9/statement/3/decision/exit",
    "outcome": "exit",
    "line": 66,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/9/statement/3/body/statement/1/value/decision/true",
    "outcome": "true",
    "line": 68,
    "state": "covered",
    "hits": "15"
  },
  {
    "id": "declaration/9/statement/3/body/statement/1/value/decision/false",
    "outcome": "false",
    "line": 68,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/9/statement/3/body/statement/1/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 68,
    "state": "covered",
    "hits": "15"
  },
  {
    "id": "declaration/9/statement/3/body/statement/1/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 68,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/9/statement/3/body/statement/1/value/true/tail/decision/true",
    "outcome": "true",
    "line": 70,
    "state": "covered",
    "hits": "13"
  },
  {
    "id": "declaration/9/statement/3/body/statement/1/value/true/tail/decision/false",
    "outcome": "false",
    "line": 70,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/9/statement/3/body/statement/1/value/true/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 70,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/9/statement/3/body/statement/1/value/true/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 70,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/9/tail/decision/true",
    "outcome": "true",
    "line": 79,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/9/tail/decision/false",
    "outcome": "false",
    "line": 79,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/10/statement/3/decision/body",
    "outcome": "body",
    "line": 90,
    "state": "covered",
    "hits": "18"
  },
  {
    "id": "declaration/10/statement/3/decision/exit",
    "outcome": "exit",
    "line": 90,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/10/statement/3/body/statement/1/value/decision/true",
    "outcome": "true",
    "line": 92,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/10/statement/3/body/statement/1/value/decision/false",
    "outcome": "false",
    "line": 92,
    "state": "covered",
    "hits": "15"
  },
  {
    "id": "declaration/10/statement/3/body/statement/1/value/false/tail/decision/true",
    "outcome": "true",
    "line": 95,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/10/statement/3/body/statement/1/value/false/tail/decision/false",
    "outcome": "false",
    "line": 95,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/11/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 103,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/11/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 103,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/3/value/args/0/decision/true",
    "outcome": "true",
    "line": 106,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/3/value/args/0/decision/false",
    "outcome": "false",
    "line": 106,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/11/statement/7/decision/body",
    "outcome": "body",
    "line": 110,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/11/statement/7/decision/exit",
    "outcome": "exit",
    "line": 110,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/11/statement/7/body/statement/1/value/decision/true",
    "outcome": "true",
    "line": 112,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/11/statement/7/body/statement/1/value/decision/false",
    "outcome": "false",
    "line": 112,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/12/statement/0/value/args/0/decision/true",
    "outcome": "true",
    "line": 120,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/12/statement/0/value/args/0/decision/false",
    "outcome": "false",
    "line": 120,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/12/statement/1/value/decision/true",
    "outcome": "true",
    "line": 121,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/12/statement/1/value/decision/false",
    "outcome": "false",
    "line": 121,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/12/statement/4/decision/body",
    "outcome": "body",
    "line": 128,
    "state": "covered",
    "hits": "13"
  },
  {
    "id": "declaration/12/statement/4/decision/exit",
    "outcome": "exit",
    "line": 128,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/12/statement/4/body/statement/1/value/decision/true",
    "outcome": "true",
    "line": 130,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/12/statement/4/body/statement/1/value/decision/false",
    "outcome": "false",
    "line": 130,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/13/tail/arm/0",
    "outcome": "NatConstant",
    "line": 139,
    "state": "covered",
    "hits": "1640"
  },
  {
    "id": "declaration/13/tail/arm/1",
    "outcome": "IntConstant",
    "line": 140,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/13/tail/arm/1/body/block/statement/1/value/args/1/args/0/decision/true",
    "outcome": "true",
    "line": 142,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/13/tail/arm/1/body/block/statement/1/value/args/1/args/0/decision/false",
    "outcome": "false",
    "line": 142,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/13/tail/arm/2",
    "outcome": "DecimalConstant",
    "line": 145,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/13/tail/arm/3",
    "outcome": "DecimalPartsConstant",
    "line": 146,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/13/tail/arm/4",
    "outcome": "StringConstant",
    "line": 150,
    "state": "covered",
    "hits": "2315"
  },
  {
    "id": "declaration/13/tail/arm/5",
    "outcome": "BoolConstant",
    "line": 151,
    "state": "covered",
    "hits": "1654"
  },
  {
    "id": "declaration/13/tail/arm/5/body/args/1/args/0/decision/true",
    "outcome": "true",
    "line": 151,
    "state": "covered",
    "hits": "893"
  },
  {
    "id": "declaration/13/tail/arm/5/body/args/1/args/0/decision/false",
    "outcome": "false",
    "line": 151,
    "state": "covered",
    "hits": "761"
  },
  {
    "id": "declaration/13/tail/arm/6",
    "outcome": "VoidConstant",
    "line": 152,
    "state": "covered",
    "hits": "2366"
  },
  {
    "id": "declaration/14/tail/decision/true",
    "outcome": "true",
    "line": 157,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/14/tail/decision/false",
    "outcome": "false",
    "line": 157,
    "state": "covered",
    "hits": "180"
  },
  {
    "id": "declaration/15/tail/decision/true",
    "outcome": "true",
    "line": 161,
    "state": "covered",
    "hits": "942"
  },
  {
    "id": "declaration/15/tail/decision/false",
    "outcome": "false",
    "line": 161,
    "state": "covered",
    "hits": "2104"
  },
  {
    "id": "declaration/15/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 162,
    "state": "covered",
    "hits": "20"
  },
  {
    "id": "declaration/15/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 162,
    "state": "covered",
    "hits": "2084"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 163,
    "state": "covered",
    "hits": "38"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 163,
    "state": "covered",
    "hits": "2046"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 164,
    "state": "covered",
    "hits": "16"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 164,
    "state": "covered",
    "hits": "2030"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 165,
    "state": "covered",
    "hits": "12"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 165,
    "state": "covered",
    "hits": "2018"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 166,
    "state": "covered",
    "hits": "1419"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 166,
    "state": "covered",
    "hits": "599"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 167,
    "state": "covered",
    "hits": "165"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 167,
    "state": "covered",
    "hits": "434"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 168,
    "state": "covered",
    "hits": "186"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 168,
    "state": "covered",
    "hits": "248"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 169,
    "state": "covered",
    "hits": "45"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 169,
    "state": "covered",
    "hits": "203"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 170,
    "state": "covered",
    "hits": "130"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 170,
    "state": "covered",
    "hits": "73"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 171,
    "state": "covered",
    "hits": "73"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 171,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 172,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 172,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/statement/1/decision/body",
    "outcome": "body",
    "line": 177,
    "state": "covered",
    "hits": "2880"
  },
  {
    "id": "declaration/16/statement/1/decision/exit",
    "outcome": "exit",
    "line": 177,
    "state": "covered",
    "hits": "1243"
  },
  {
    "id": "declaration/17/statement/1/decision/body",
    "outcome": "body",
    "line": 185,
    "state": "covered",
    "hits": "563"
  },
  {
    "id": "declaration/17/statement/1/decision/exit",
    "outcome": "exit",
    "line": 185,
    "state": "covered",
    "hits": "221"
  },
  {
    "id": "declaration/18/tail/arm/0",
    "outcome": "ConstInstruction",
    "line": 193,
    "state": "covered",
    "hits": "7985"
  },
  {
    "id": "declaration/18/tail/arm/1",
    "outcome": "LoadInstruction",
    "line": 194,
    "state": "covered",
    "hits": "14683"
  },
  {
    "id": "declaration/18/tail/arm/2",
    "outcome": "StoreInstruction",
    "line": 195,
    "state": "covered",
    "hits": "6483"
  },
  {
    "id": "declaration/18/tail/arm/3",
    "outcome": "PopInstruction",
    "line": 196,
    "state": "covered",
    "hits": "1384"
  },
  {
    "id": "declaration/18/tail/arm/4",
    "outcome": "UnaryInstruction",
    "line": 197,
    "state": "covered",
    "hits": "181"
  },
  {
    "id": "declaration/18/tail/arm/5",
    "outcome": "BinaryInstruction",
    "line": 198,
    "state": "covered",
    "hits": "3046"
  },
  {
    "id": "declaration/18/tail/arm/6",
    "outcome": "MakeRangeInstruction",
    "line": 199,
    "state": "covered",
    "hits": "28"
  },
  {
    "id": "declaration/18/tail/arm/7",
    "outcome": "MakeArrayInstruction",
    "line": 200,
    "state": "covered",
    "hits": "455"
  },
  {
    "id": "declaration/18/tail/arm/8",
    "outcome": "IndexGetInstruction",
    "line": 201,
    "state": "covered",
    "hits": "484"
  },
  {
    "id": "declaration/18/tail/arm/9",
    "outcome": "InterpolateInstruction",
    "line": 202,
    "state": "covered",
    "hits": "221"
  },
  {
    "id": "declaration/18/tail/arm/10",
    "outcome": "IterInitInstruction",
    "line": 203,
    "state": "covered",
    "hits": "355"
  },
  {
    "id": "declaration/18/tail/arm/11",
    "outcome": "IterNextInstruction",
    "line": 204,
    "state": "covered",
    "hits": "355"
  },
  {
    "id": "declaration/18/tail/arm/12",
    "outcome": "MakeRecordInstruction",
    "line": 209,
    "state": "covered",
    "hits": "554"
  },
  {
    "id": "declaration/18/tail/arm/13",
    "outcome": "FieldGetInstruction",
    "line": 214,
    "state": "covered",
    "hits": "3146"
  },
  {
    "id": "declaration/18/tail/arm/14",
    "outcome": "MakeVariantInstruction",
    "line": 215,
    "state": "covered",
    "hits": "942"
  },
  {
    "id": "declaration/18/tail/arm/15",
    "outcome": "MatchVariantInstruction",
    "line": 220,
    "state": "covered",
    "hits": "1673"
  },
  {
    "id": "declaration/18/tail/arm/16",
    "outcome": "MatchFailInstruction",
    "line": 224,
    "state": "covered",
    "hits": "417"
  },
  {
    "id": "declaration/18/tail/arm/17",
    "outcome": "CallInstruction",
    "line": 225,
    "state": "covered",
    "hits": "4599"
  },
  {
    "id": "declaration/18/tail/arm/18",
    "outcome": "JumpFalseInstruction",
    "line": 229,
    "state": "covered",
    "hits": "2672"
  },
  {
    "id": "declaration/18/tail/arm/19",
    "outcome": "JumpInstruction",
    "line": 230,
    "state": "covered",
    "hits": "4327"
  },
  {
    "id": "declaration/18/tail/arm/20",
    "outcome": "PendingEndJumpInstruction",
    "line": 231,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/tail/arm/21",
    "outcome": "ReturnInstruction",
    "line": 232,
    "state": "covered",
    "hits": "689"
  },
  {
    "id": "declaration/18/tail/arm/22",
    "outcome": "AwaitCallInstruction",
    "line": 233,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/18/tail/arm/23",
    "outcome": "AwaitValueInstruction",
    "line": 234,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/18/tail/arm/24",
    "outcome": "CallValueInstruction",
    "line": 235,
    "state": "covered",
    "hits": "30"
  },
  {
    "id": "declaration/19/statement/2/decision/body",
    "outcome": "body",
    "line": 242,
    "state": "covered",
    "hits": "120869"
  },
  {
    "id": "declaration/19/statement/2/decision/exit",
    "outcome": "exit",
    "line": 242,
    "state": "covered",
    "hits": "725"
  },
  {
    "id": "declaration/19/statement/2/body/statement/0/value/decision/true",
    "outcome": "true",
    "line": 243,
    "state": "covered",
    "hits": "602"
  },
  {
    "id": "declaration/19/statement/2/body/statement/0/value/decision/false",
    "outcome": "false",
    "line": 243,
    "state": "covered",
    "hits": "120267"
  },
  {
    "id": "declaration/19/statement/2/body/statement/0/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 243,
    "state": "covered",
    "hits": "54223"
  },
  {
    "id": "declaration/19/statement/2/body/statement/0/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 243,
    "state": "covered",
    "hits": "66646"
  },
  {
    "id": "declaration/19/statement/3/value/decision/true",
    "outcome": "true",
    "line": 249,
    "state": "covered",
    "hits": "123"
  },
  {
    "id": "declaration/19/statement/3/value/decision/false",
    "outcome": "false",
    "line": 249,
    "state": "covered",
    "hits": "602"
  },
  {
    "id": "declaration/20/statement/1/decision/body",
    "outcome": "body",
    "line": 255,
    "state": "covered",
    "hits": "725"
  },
  {
    "id": "declaration/20/statement/1/decision/exit",
    "outcome": "exit",
    "line": 255,
    "state": "covered",
    "hits": "77"
  },
  {
    "id": "declaration/21/statement/1/value/args/1/args/0/decision/true",
    "outcome": "true",
    "line": 263,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/21/statement/1/value/args/1/args/0/decision/false",
    "outcome": "false",
    "line": 263,
    "state": "covered",
    "hits": "683"
  },
  {
    "id": "declaration/21/statement/1/value/args/1/args/0/false/tail/decision/true",
    "outcome": "true",
    "line": 263,
    "state": "covered",
    "hits": "607"
  },
  {
    "id": "declaration/21/statement/1/value/args/1/args/0/false/tail/decision/false",
    "outcome": "false",
    "line": 263,
    "state": "covered",
    "hits": "76"
  },
  {
    "id": "declaration/21/statement/5/decision/body",
    "outcome": "body",
    "line": 267,
    "state": "covered",
    "hits": "54721"
  },
  {
    "id": "declaration/21/statement/5/decision/exit",
    "outcome": "exit",
    "line": 267,
    "state": "covered",
    "hits": "689"
  },
  {
    "id": "declaration/22/statement/5/decision/body",
    "outcome": "body",
    "line": 279,
    "state": "covered",
    "hits": "689"
  },
  {
    "id": "declaration/22/statement/5/decision/exit",
    "outcome": "exit",
    "line": 279,
    "state": "covered",
    "hits": "49"
  },
  {
    "id": "declaration/23/tail/arm/0",
    "outcome": "Ok",
    "line": 287,
    "state": "covered",
    "hits": "22"
  },
  {
    "id": "declaration/23/tail/arm/0/body/block/tail/arm/0",
    "outcome": "Ok",
    "line": 289,
    "state": "covered",
    "hits": "12"
  },
  {
    "id": "declaration/23/tail/arm/0/body/block/tail/arm/0/body/block/tail/decision/true",
    "outcome": "true",
    "line": 291,
    "state": "covered",
    "hits": "12"
  },
  {
    "id": "declaration/23/tail/arm/0/body/block/tail/arm/0/body/block/tail/decision/false",
    "outcome": "false",
    "line": 291,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/23/tail/arm/0/body/block/tail/arm/1",
    "outcome": "Error",
    "line": 293,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/23/tail/arm/1",
    "outcome": "Error",
    "line": 296,
    "state": "zero",
    "hits": "0"
  }
]

Reviewed declaration exclusions

[
  {
    "id": "declaration/0",
    "reason": "import",
    "line": 1
  }
]