Variables

Status: implemented

export default (...a) => {
    let n = a[0];
    let [sum, count] = [0, 0];
    sum = sum + n;
    count = count + 1;
    if (n < 0) { sum = -sum; return [sum, count]; }
    n = n * 2;
    return [sum, count, n];
};

A let declares a variable: a name an assignment, x = value;, may rebind. Otherwise it is a const under the other keyword — a statement standing where a const stands, in a module, a function body, a guard's or a case's block and a loop's block, that binds a name or a pattern (destructuring) to the value of its initializer, evaluated as its own statement whether or not anything reads it (constants). The initializer is required, as a const's is: JavaScript's let x;, the variable undefined until its first assignment, is refused by design. A variable names its value where it is declared, as a body names what it returns in an explicit return (bodies and guards); a declaration that names none asks the reader to find the first assignment on every path, and this compiler tracks no such thing, so it admits no program that needs it (DESIGN.md §10). Write the value the variable starts from, let x = undefined; where that is what is meant. A later proposal may admit the declaration where every path assigns the variable before a read, let x; if (c) { x = 2; } else { x = 3; } as const x = c ? 2 : 3 (definite assignment). The name is a name of the body as a const's is: it takes the words a const takes, bound twice is duplicate id, read in its own initializer or before its declaration const not found, and from outside a nested function it is a capture. A parameter is a variable too, fixed or rest.

A declaration pattern initializes each of its bindings once; defaults and destructuring do not count as assignments. Destructuring assignment without a declaration, such as [a, b] = values;, remains a separate language extension.

  • An assignment, x = value;, rebinds the variable for the statements after it, in order, as JavaScript reads them: let r = 0; r = r + n; r = r * 2; return r; returns (0 + n) * 2. It is a statement, ended as every statement is, and no value of the language: a = b = 1;, f(a = 1) and o.a = 1; are refused where their = stands (refused constructs). The value is established for what it does, as a const's is, even where the next assignment overwrites it before any read: r = null.x; r = 1; throws.
  • Only a variable is assigned. An assignment to a const, to an import or to the name a function is declared under is refused (assignment to const): JavaScript throws there, at run time, and this compiler names the slip where it is written.
  • A variable denotes a sequence of values, not a cell. Each assignment establishes a fresh immutable value, and a read is a read of the latest; no node of the graph holds a variable, so the graph outputs write the values: let r = 0; r = r + n; return r; is the graph n + 0 is. A terminating guard never rejoins its returning arm. A conditional join may assign one outer binding across its arms: following statements read the selected arm's latest version, or the incoming version when that arm leaves it unchanged. A returning path supplies no normal result and skips the following continuation, preserving its original function owner. The one-outer-binding limit counts writes on returning paths too. Branch-local declarations stay local. A loop (loops) can carry several variables read or assigned by its condition and body.
  • A reassigned variable is captured by no function held as a value. A function nested in the variable's scope — a const, an item, an argument, a value returned, a condition — may not read or assign a variable that is assigned anywhere in that scope, whether the assignment comes before or after it (reassigned variable captured): JavaScript's closure sees the variable's last value, where the function's capture holds the value it had when the function was made, so the program is refused rather than read another way. Two spellings say what is meant: a function called where it is written, r = (() => r + 1)();, reads the value of that moment in both languages and is admitted, through any depth of such functions. An immediate call that normalizes to an expression block may also assign the variable: the block returns the updated binding versions to its continuation, as described below. A snapshot, const s = r; return () => s;, holds what the capture would hold, as a const does. A variable never assigned is captured as a const is: a let nothing assigns and a parameter nothing assigns are a const by another spelling, and the rule is one for both — a function that is a variable's whole value names itself, let f = n => n ? f(n - 1) : 0;, as a const's does, the name a capture the rule refuses the moment the variable is assigned anywhere.
  • The scope is the block. let is not hoisted and has no var: var is refused (var). A module's let is a variable of the module, which is a function (module structure), under every rule above; an export is a const, so export let is refused (export let). A loop can step several variables, at module level as well as in a function body (loops).

Compound assignments

A compound assignment is an assignment statement to a mutable identifier, under the same declaration, capture and statement-termination rules as =. Arithmetic and bitwise forms reuse the corresponding binary operation:

let n = 8n;
n >>= 1n; // n = n >> 1n
n += 2n; // n = n + 2n

The eager forms are +=, -=, *=, /=, %=, **=, <<=, >>=, >>>=, &=, ^= and |=. Read the current target value first, evaluate the right operand once, apply the existing binary operator, then establish the new value. Existing string, Number and BigInt semantics and failures apply without new coercions: += can concatenate strings, and >>>= still does not shift a BigInt.

Logical assignments read the target before deciding whether to evaluate the right operand and write:

FormEvaluate and assign the right operand when
a &&= ba is truthy
a ||= ba is falsy
a ??= ba is null or undefined

The skipped path performs neither a right-operand evaluation nor a write, preserving the existing value and identity. On the selected path, assign the right operand's value without converting it to a boolean. a ??= b differs from a = a ?? b, which always writes; similarly for &&= and ||=.

Targets remain mutable identifiers, including where a logical write would be skipped. Thus const a = 1; a ??= 2; is refused by the static assignment rule, although JavaScript can execute it without writing. Every source operand is checked before desugaring, including an unreachable right operand, and a held closure over a potentially reassigned binding is refused even if the logical write is never reached. Property mutation and assignment expressions, such as o.a += 1 or f(a += 1), remain refused. Prefix and postfix updates are separate constructs and remain outside the language.

Compound syntax is expanded by source desugaring into the existing binary operations and immutable binding versions, with conditional regions for the logical forms. No compound-assignment node reaches EDAG or the VM, and a serializer may write the expanded spelling.

Capture compatibility

General bindings replace the earlier treatment of a loop's final variable as an implicit const. A binding reassigned anywhere in its source scope stays mutable for capture admission, including after its last assignment or loop. A held function that captures it is refused even if the assignment follows the capture or appears in an unreachable loop. These source facts are checked before optimization.

Capture an explicit snapshot instead:

export default n => {
    let value = 0;
    while (value < n) { value = value + 1; }
    const snapshot = value;
    return () => snapshot;
};

A snapshot holds the same value without cloning an object. Object-content mutation has its own mutability design.

A never-reassigned let or parameter remains capturable. A function called where it is written can read a reassigned binding, through nested immediate calls as well. A direct call that normalizes to an expression block can also write an enclosing binding. This does not permit a held closure over a mutable binding, or a write across an ordinary invocation boundary that is retained.

Expression block assignments

An expression block runs in its surrounding execution region. An assignment inside it establishes the latest value for later reads, both inside the block and after the expression has completed:

export default n => {
    const result = (() => { n = n + 1; return n; })();
    return [result, n];
};

With n equal to 2, this returns [3, 3]. Plain direct immediate calls with no arguments, no parameter or rest declarations, and no internal return that requires an ordinary function boundary normalize to these blocks. A terminal return supplies the block's value.

Operand evaluation stays ordered. In [n, (() => { n = n + 1; return n; })(), n], the first element holds the incoming value and the last two hold the updated value. A skipped conditional, logical or optional operand makes no assignment. A reached loop condition may update a variable even when its result ends the loop. Assignments to a const and captures by held functions remain refused before optimization, including in unreachable code.

The compiler may serialize an expression block as an immediately invoked arrow function, including assignments when needed. It may instead spell the same immutable versions with fresh const names. Recompiling the output preserves the result, required evaluations and shared identities. Graphs with internal member-lookup queries or shared values established in lazy regions retain the source writer's existing explicit refusals; their source profiles are tracked in the follow-up.

Normalization

Write and capture analysis uses resolved binding identities throughout the source scope before optimization. A binding is mutable when it is reassigned after initialization, including a write in an unreachable branch or nested function. A shadowed name has its own write classification. Destructured parameters and locals follow the same rules as ordinary bindings. Source declaration legality is checked before declaration kinds are discarded: the shared isMutable fact does not authorize an assignment to a source const.

After source admission, normalization maps each resolved source binding to its current immutable FAST value. An assignment establishes a fresh value and updates that map. Required initializers and assignment computations remain required even when a later write overwrites their values. Admitted conditional regions pass the selected current values to their normal continuation; an arm that leaves a binding unchanged supplies its incoming value, and an abrupt arm supplies no normal result. The loop normalization contract defines ordered branch and loop signatures. The shared representation belongs to the FAST binding contract.

Value-producing regions also pass their expression result and updated outer bindings explicitly. Normalization sequences these updates before subsequent operands and statements; lazy paths join their selected versions. This happens in AST-to-FAST normalization, before graph construction, and introduces no shared mutable cell in FAST or EDAG.

Design approval

sergey-shandar approved the bounded ordinary conditional joins and partly returning branches in the design session. The reachable-block-end issue records the separately approved increments and remaining admission limits.

sergey-shandar approved assignments in expression blocks and serialization to that spelling in the design session.

sergey-shandar approved the general binding, capture and loop rules in PR #3167. The earlier single-variable let/while subset was approved in PR #2852. The capture compatibility record describes the extension's replacement of the earlier post-loop capture policy.

Examples

The compiler demo offers the programs variables in module.f.js, each with its real output.

The demo on this page runs sample.f.js, this page's example as a function of one number — two lets, one with a pattern, and assignments in the body and in a guard's block, to the lets and to a parameter — with every output fjs compile makes of it: the expression graph (EDAG), the Rust and the WebAssembly that Rust builds to. Its Run button calls the default export with 3 and -2, as JavaScript and as WebAssembly, and shows what each call returned or threw.

Reference

Demo

In FunctionalScript

fjs compile accepts this module, and it runs as JavaScript and as WebAssembly alike.

A FunctionalScript module and what fjs compile makes of it: the expression graph it lowers to, the Rust it compiles to on the NaNVM runtime, and the WebAssembly that Rust builds to. Run calls its default export with 3, then -2, first as the JavaScript it already is and then as WebAssembly, and shows what each call returned or threw and how long one call takes, timed over 1000 calls.

FunctionalScript source:

/**
 * The example of [`README.md`](./README.md) (Variables) as a function of
 * one number, for the page's WASM demo: two `let`s, one with a pattern, and
 * assignments in the body and in a guard's block, to the `let`s and to a
 * parameter.
 *
 * @module
 */

/** @type {(...a: readonly number[]) => unknown} */
export default (...a) => {
    let n = a[0];
    let [sum, count] = [0, 0];
    sum = sum + n;
    count = count + 1;
    if (n < 0) { sum = -sum; return [sum, count]; }
    n = n * 2;
    return [sum, count, n];
};

Expression graph (EDAG) that fjs compile lowers it to:

=>lengthbody0,,anchoranchoranchorresult?:condthenelse<leftright.0[]01[]012+leftright.1-operand*leftright.2.objidx[]1+leftright.objidx[]0.objidxrest0[]...0[]0100

The same graph, as fjs compile writes it to a .edag.data.js file:

const $0=["[]",[["...",["[]",[0,0]]]]];const $1=[".",$0,1];const $2=[".",["rest"],0];const $3=["+",[".",$0,0],$2];const $4=["+",$1,1];export default ["{}",[[":","default",["=>",0,[],[",",[$1,$3,$4,["?:",["<",$2,0],["[]",[["-",$3],$4]],["[]",[$3,$4,["*",$2,2]]]]]]]]]];

Rust that fjs compile writes from it, on the NaNVM runtime:

// @generated by `fjs compile`. Do not edit: recompile the source module instead.

use nanvm_lib::vm::unstable::{f64_any, spread_array, spread_item, string_key};
use nanvm_lib::vm::{Any, Array, IStaticFunction, ToAny, ToArray, ToObject};

#[rustfmt::skip]
#[allow(clippy::if_same_then_else)]
pub fn module<A: IStaticFunction>(_runtime: Any<A>) -> Result<Any<A>, Any<A>> {
    Ok([(string_key("default"), A::static_function(|_self, _args| {
        let _b768: Any<A> = _args.rest(0).to_any();
        let _b1: Any<A> = (spread_array([spread_item([f64_any(0x0000000000000000), f64_any(0x0000000000000000)].to_array().to_any())?]))?;
        let _b2: Any<A> = (Any::dot(_b1.clone(), f64_any(0x3ff0000000000000)).end())?;
        let _b3: Any<A> = (Any::dot(_b1.clone(), f64_any(0x0000000000000000)).end())?;
        let _b5: Any<A> = (Any::dot(_b768.clone(), f64_any(0x0000000000000000)).end())?;
        let _b6: Any<A> = (_b3.clone() + _b5.clone())?;
        let _b7: Any<A> = (_b2.clone() + f64_any(0x3ff0000000000000))?;
        if Any::<A>::to_boolean((Any::lt(_b5.clone(), f64_any(0x0000000000000000)))?) { Ok([(<Any<A> as core::ops::Neg>::neg(_b6.clone()))?, _b7.clone()].to_array().to_any()) } else { Ok([_b6.clone(), _b7.clone(), (_b5.clone() * f64_any(0x4000000000000000))?].to_array().to_any()) }
    }, 0, Array::default(), Some("(...$0)=>{const $1=[...[0,0]];const $2=$1[1];const $3=$1[0];const $4=$0[0];const $5=$3+$4;const $6=$2+1;return $4<0?[-$5,$6]:[$5,$6,$4*2];}")).to_any())].to_object().to_any())
}

WebAssembly text (WAT) of the functions compiled from this source, without the NaNVM runtime:

  (func $nanvm_demos::samples::variables::module::<nanvm_lib::naive::Naive> (;485;) (type 1) (param i32 i32)
    (local i32 i32 i32 i32 i32)
    global.get $__stack_pointer
    i32.const 96
    i32.sub
    local.tee 2
    global.set $__stack_pointer
    local.get 2
    i32.const 0
    i32.store16 offset=28
    local.get 2
    i32.const 1063531
    i32.store offset=24
    local.get 2
    i32.const 1063524
    i32.store offset=20
    local.get 2
    i32.const 48
    i32.add
    local.get 2
    i32.const 20
    i32.add
    call $"core::iter::adapters::try_process::<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>, u16, core::result::Result<core::convert::Infallible, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>, <core::result::Result<alloc::rc::Rc<[u16]>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>> as core::iter::traits::collect::FromIterator<core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>>::from_iter<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>>::{closure#0}, alloc::rc::Rc<[u16]>>"
    block ;; label = @1
      block ;; label = @2
        block ;; label = @3
          local.get 2
          i32.load8_u offset=48
          local.tee 3
          i32.const 255
          i32.ne
          br_if 0 (;@3;)
          local.get 2
          i32.load offset=56
          local.set 4
          local.get 2
          i32.load offset=52
          local.set 5
          local.get 2
          i32.const 0
          i32.store8 offset=32
          local.get 2
          i32.const 8
          i32.add
          local.get 2
          i32.const 32
          i32.add
          call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::iter::sources::empty::Empty<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>, core::result::Result<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>::to_rc_slice"
          local.get 2
          local.get 2
          i32.load offset=12
          local.tee 6
          i32.store offset=52
          local.get 2
          local.get 2
          i32.load offset=8
          local.tee 3
          i32.store offset=48
          block ;; label = @4
            local.get 2
            i32.load8_u offset=32
            i32.const 1
            i32.ne
            br_if 0 (;@4;)
            local.get 3
            local.get 3
            i32.load
            i32.const -1
            i32.add
            local.tee 0
            i32.store
            local.get 0
            br_if 3 (;@1;)
            local.get 2
            i32.const 48
            i32.add
            call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
            br 3 (;@1;)
          end
          local.get 3
          i32.eqz
          br_if 2 (;@1;)
          i32.const 118
          i32.const 0
          local.get 3
          local.get 6
          i32.const 1063623
          i32.const 139
          call $<nanvm_lib::naive::function::Function>::new
          local.set 3
          local.get 2
          i32.const 0
          i32.store8 offset=20
          local.get 2
          local.get 3
          i32.store offset=68
          local.get 2
          i32.const 7
          i32.store8 offset=64
          local.get 2
          local.get 4
          i32.store offset=60
          local.get 2
          local.get 5
          i32.store offset=56
          local.get 2
          i64.const 4294967296
          i64.store offset=48
          local.get 2
          local.get 2
          i32.const 20
          i32.add
          i32.store offset=80
          local.get 2
          local.get 2
          i32.const 48
          i32.add
          call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::array::iter::IntoIter<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>), 1>, core::result::Result<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>), ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)>>::to_rc_slice"
          local.get 2
          local.get 2
          i32.load offset=4
          local.tee 4
          i32.store offset=36
          local.get 2
          local.get 2
          i32.load
          local.tee 3
          i32.store offset=32
          block ;; label = @4
            local.get 2
            i32.load8_u offset=20
            i32.const 1
            i32.ne
            br_if 0 (;@4;)
            local.get 3
            local.get 3
            i32.load
            i32.const -1
            i32.add
            local.tee 0
            i32.store
            local.get 0
            br_if 2 (;@2;)
            local.get 2
            i32.const 32
            i32.add
            call $"<alloc::rc::Rc<[(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)]>>::drop_slow"
            br 2 (;@2;)
          end
          local.get 3
          i32.eqz
          br_if 1 (;@2;)
          local.get 0
          local.get 4
          i32.store offset=16
          local.get 0
          local.get 3
          i32.store offset=12
          local.get 0
          i32.const 5
          i32.store8 offset=8
          local.get 0
          i64.const 0
          i64.store
          local.get 1
          call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
          local.get 2
          i32.const 96
          i32.add
          global.set $__stack_pointer
          return
        end
        local.get 2
        local.get 2
        i32.load8_u offset=51
        i32.store8 offset=35
        local.get 2
        local.get 2
        i32.load16_u offset=49 align=1
        i32.store16 offset=33 align=1
        local.get 2
        local.get 2
        i32.load offset=60
        i32.store offset=44
        local.get 2
        local.get 2
        i64.load offset=52 align=4
        i64.store offset=36 align=4
        local.get 2
        local.get 3
        i32.store8 offset=32
        i32.const 1065572
        i32.const 43
        local.get 2
        i32.const 32
        i32.add
        i32.const 1065556
        i32.const 1065616
        call $core::result::unwrap_failed
        unreachable
      end
      i32.const 1057428
      i32.const 43
      local.get 2
      i32.const 95
      i32.add
      i32.const 1057412
      i32.const 1057472
      call $core::result::unwrap_failed
      unreachable
    end
    i32.const 1057428
    i32.const 43
    local.get 2
    i32.const 95
    i32.add
    i32.const 1057412
    i32.const 1057472
    call $core::result::unwrap_failed
    unreachable
  )
  (func $"<nanvm_demos::samples::variables::module<nanvm_lib::naive::Naive>::{closure#0} as core::ops::function::FnOnce<(&nanvm_lib::naive::function::Function, nanvm_lib::vm::array::Array<nanvm_lib::naive::Naive>)>>::call_once" (;486;) (type 4) (param i32 i32 i32 i32)
    (local i32 i32 i64 i32 i32)
    global.get $__stack_pointer
    i32.const 448
    i32.sub
    local.tee 4
    global.set $__stack_pointer
    local.get 4
    local.get 3
    i32.store offset=28
    local.get 4
    local.get 2
    i32.store offset=24
    local.get 2
    local.get 2
    i32.load
    i32.const 1
    i32.add
    local.tee 5
    i32.store
    block ;; label = @1
      block ;; label = @2
        local.get 5
        i32.eqz
        br_if 0 (;@2;)
        local.get 4
        local.get 3
        i32.store offset=40
        local.get 4
        local.get 2
        i32.store offset=36
        local.get 4
        i32.const 6
        i32.store8 offset=32
        local.get 4
        i32.const 0
        i32.store8 offset=280
        local.get 4
        i64.const 0
        i64.store offset=408
        local.get 4
        i32.const 2
        i32.store8 offset=400
        local.get 4
        i64.const 0
        i64.store offset=392
        local.get 4
        i32.const 2
        i32.store8 offset=384
        local.get 4
        i64.const 8589934592
        i64.store offset=376
        local.get 4
        local.get 4
        i32.const 280
        i32.add
        i32.store offset=416
        local.get 4
        i32.const 16
        i32.add
        local.get 4
        i32.const 376
        i32.add
        call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::array::iter::IntoIter<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, 2>, core::result::Result<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>::to_rc_slice"
        local.get 4
        local.get 4
        i32.load offset=20
        local.tee 5
        i32.store offset=348
        local.get 4
        local.get 4
        i32.load offset=16
        local.tee 3
        i32.store offset=344
        block ;; label = @3
          local.get 4
          i32.load8_u offset=280
          i32.const 1
          i32.ne
          br_if 0 (;@3;)
          local.get 3
          local.get 3
          i32.load
          i32.const -1
          i32.add
          local.tee 2
          i32.store
          local.get 2
          br_if 2 (;@1;)
          local.get 4
          i32.const 344
          i32.add
          call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
          br 2 (;@1;)
        end
        local.get 3
        i32.eqz
        br_if 1 (;@1;)
        local.get 4
        i32.const 0
        i32.store offset=392
        local.get 4
        local.get 5
        i32.store offset=388
        local.get 4
        local.get 3
        i32.store offset=384
        local.get 4
        i64.const 1
        i64.store offset=376
        local.get 4
        i32.const 344
        i32.add
        local.get 4
        i32.const 376
        i32.add
        call $"nanvm_lib::vm::unstable::spread_array::<nanvm_lib::naive::Naive, [nanvm_lib::vm::unstable::ArrayItem<nanvm_lib::naive::Naive>; 1]>"
        local.get 4
        local.get 4
        i64.load offset=352
        i64.store offset=312
        local.get 4
        local.get 4
        i64.load offset=360
        i64.store offset=320
        block ;; label = @3
          block ;; label = @4
            block ;; label = @5
              block ;; label = @6
                local.get 4
                i64.load offset=344
                i64.const 1
                i64.ne
                br_if 0 (;@6;)
                local.get 0
                local.get 4
                i64.load offset=320
                i64.store offset=16
                local.get 0
                local.get 4
                i64.load offset=312
                i64.store offset=8
                local.get 0
                i64.const 1
                i64.store
                br 1 (;@5;)
              end
              local.get 4
              local.get 4
              i64.load offset=320
              i64.store offset=56
              local.get 4
              local.get 4
              i64.load offset=312
              local.tee 6
              i64.store offset=48
              block ;; label = @6
                block ;; label = @7
                  block ;; label = @8
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  local.get 6
                                  i32.wrap_i64
                                  local.tee 5
                                  i32.const 255
                                  i32.and
                                  br_table 6 (;@9;) 6 (;@9;) 0 (;@15;) 1 (;@14;) 2 (;@13;) 3 (;@12;) 4 (;@11;) 5 (;@10;) 6 (;@9;)
                                end
                                local.get 4
                                i64.load offset=56
                                local.set 6
                                br 8 (;@6;)
                              end
                              local.get 4
                              i32.load offset=52
                              local.tee 3
                              local.get 3
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 7
                              i32.store
                              local.get 7
                              i32.eqz
                              br_if 11 (;@2;)
                              br 6 (;@7;)
                            end
                            local.get 4
                            i32.load offset=52
                            local.tee 3
                            local.get 3
                            i32.load
                            i32.const 1
                            i32.add
                            local.tee 7
                            i32.store
                            local.get 7
                            i32.eqz
                            br_if 10 (;@2;)
                            local.get 4
                            i64.load8_u offset=60
                            i64.const 32
                            i64.shl
                            local.get 4
                            i64.load32_u offset=56
                            i64.or
                            local.set 6
                            br 6 (;@6;)
                          end
                          local.get 4
                          i32.load offset=52
                          local.tee 3
                          local.get 3
                          i32.load
                          i32.const 1
                          i32.add
                          local.tee 7
                          i32.store
                          local.get 7
                          br_if 4 (;@7;)
                          br 9 (;@2;)
                        end
                        local.get 4
                        i32.load offset=52
                        local.tee 3
                        local.get 3
                        i32.load
                        i32.const 1
                        i32.add
                        local.tee 7
                        i32.store
                        local.get 7
                        br_if 3 (;@7;)
                        br 8 (;@2;)
                      end
                      local.get 4
                      i32.load offset=52
                      local.tee 3
                      local.get 3
                      i32.load
                      i32.const 1
                      i32.add
                      local.tee 7
                      i32.store
                      local.get 7
                      i32.eqz
                      br_if 7 (;@2;)
                      br 1 (;@8;)
                    end
                    local.get 4
                    i32.load8_u offset=49
                    local.set 7
                  end
                  br 1 (;@6;)
                end
                local.get 4
                i64.load32_u offset=56
                local.set 6
              end
              local.get 4
              local.get 6
              i64.store offset=352
              local.get 4
              local.get 3
              i32.store offset=348
              local.get 4
              local.get 7
              i32.store8 offset=345
              local.get 4
              local.get 5
              i32.store8 offset=344
              local.get 4
              i64.const 4607182418800017408
              i64.store offset=384
              local.get 4
              i32.const 2
              i32.store8 offset=376
              local.get 4
              i32.const 280
              i32.add
              local.get 4
              i32.const 344
              i32.add
              local.get 4
              i32.const 376
              i32.add
              call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
              block ;; label = @6
                block ;; label = @7
                  local.get 4
                  i32.load8_u offset=280
                  i32.const 255
                  i32.ne
                  br_if 0 (;@7;)
                  local.get 0
                  local.get 4
                  i64.load offset=296
                  i64.store offset=16
                  local.get 0
                  local.get 4
                  i64.load offset=288
                  i64.store offset=8
                  local.get 0
                  i64.const 1
                  i64.store
                  br 1 (;@6;)
                end
                local.get 4
                local.get 4
                i64.load offset=304
                i64.store offset=400
                local.get 4
                local.get 4
                i64.load offset=296
                i64.store offset=392
                local.get 4
                local.get 4
                i64.load offset=288
                i64.store offset=384
                local.get 4
                local.get 4
                i64.load offset=280
                i64.store offset=376
                local.get 4
                i32.const 344
                i32.add
                local.get 4
                i32.const 376
                i32.add
                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                block ;; label = @7
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=344
                    i32.const 255
                    i32.eq
                    br_if 0 (;@8;)
                    local.get 4
                    local.get 4
                    i64.load offset=352
                    i64.store offset=72
                    local.get 4
                    local.get 4
                    i64.load offset=344
                    i64.store offset=64
                    br 1 (;@7;)
                  end
                  local.get 4
                  i32.const 256
                  i32.store16 offset=64
                end
                local.get 4
                i32.const 376
                i32.add
                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                local.get 4
                i32.const 392
                i32.add
                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                block ;; label = @7
                  block ;; label = @8
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    local.get 4
                                    i32.load8_u offset=48
                                    local.tee 5
                                    br_table 6 (;@10;) 6 (;@10;) 0 (;@16;) 1 (;@15;) 2 (;@14;) 3 (;@13;) 4 (;@12;) 5 (;@11;) 6 (;@10;)
                                  end
                                  local.get 4
                                  i64.load offset=56
                                  local.set 6
                                  br 8 (;@7;)
                                end
                                local.get 4
                                i32.load offset=52
                                local.tee 3
                                local.get 3
                                i32.load
                                i32.const 1
                                i32.add
                                local.tee 7
                                i32.store
                                local.get 7
                                i32.eqz
                                br_if 12 (;@2;)
                                br 6 (;@8;)
                              end
                              local.get 4
                              i32.load offset=52
                              local.tee 3
                              local.get 3
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 7
                              i32.store
                              local.get 7
                              i32.eqz
                              br_if 11 (;@2;)
                              local.get 4
                              i64.load8_u offset=60
                              i64.const 32
                              i64.shl
                              local.get 4
                              i64.load32_u offset=56
                              i64.or
                              local.set 6
                              br 6 (;@7;)
                            end
                            local.get 4
                            i32.load offset=52
                            local.tee 3
                            local.get 3
                            i32.load
                            i32.const 1
                            i32.add
                            local.tee 7
                            i32.store
                            local.get 7
                            i32.eqz
                            br_if 10 (;@2;)
                            br 4 (;@8;)
                          end
                          local.get 4
                          i32.load offset=52
                          local.tee 3
                          local.get 3
                          i32.load
                          i32.const 1
                          i32.add
                          local.tee 7
                          i32.store
                          local.get 7
                          i32.eqz
                          br_if 9 (;@2;)
                          br 3 (;@8;)
                        end
                        local.get 4
                        i32.load offset=52
                        local.tee 3
                        local.get 3
                        i32.load
                        i32.const 1
                        i32.add
                        local.tee 7
                        i32.store
                        local.get 7
                        i32.eqz
                        br_if 8 (;@2;)
                        br 1 (;@9;)
                      end
                      local.get 4
                      i32.load8_u offset=49
                      local.set 7
                    end
                    br 1 (;@7;)
                  end
                  local.get 4
                  i64.load32_u offset=56
                  local.set 6
                end
                local.get 4
                local.get 6
                i64.store offset=352
                local.get 4
                local.get 3
                i32.store offset=348
                local.get 4
                local.get 7
                i32.store8 offset=345
                local.get 4
                local.get 5
                i32.store8 offset=344
                local.get 4
                i64.const 0
                i64.store offset=384
                local.get 4
                i32.const 2
                i32.store8 offset=376
                local.get 4
                i32.const 312
                i32.add
                local.get 4
                i32.const 344
                i32.add
                local.get 4
                i32.const 376
                i32.add
                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                block ;; label = @7
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=312
                    i32.const 255
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 0
                    local.get 4
                    i64.load offset=328
                    i64.store offset=16
                    local.get 0
                    local.get 4
                    i64.load offset=320
                    i64.store offset=8
                    local.get 0
                    i64.const 1
                    i64.store
                    br 1 (;@7;)
                  end
                  local.get 4
                  local.get 4
                  i64.load offset=336
                  i64.store offset=400
                  local.get 4
                  local.get 4
                  i64.load offset=328
                  i64.store offset=392
                  local.get 4
                  local.get 4
                  i64.load offset=320
                  i64.store offset=384
                  local.get 4
                  local.get 4
                  i64.load offset=312
                  i64.store offset=376
                  local.get 4
                  i32.const 344
                  i32.add
                  local.get 4
                  i32.const 376
                  i32.add
                  call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                  block ;; label = @8
                    block ;; label = @9
                      local.get 4
                      i32.load8_u offset=344
                      i32.const 255
                      i32.eq
                      br_if 0 (;@9;)
                      local.get 4
                      local.get 4
                      i64.load offset=352
                      i64.store offset=88
                      local.get 4
                      local.get 4
                      i64.load offset=344
                      i64.store offset=80
                      br 1 (;@8;)
                    end
                    local.get 4
                    i32.const 256
                    i32.store16 offset=80
                  end
                  local.get 4
                  i32.const 376
                  i32.add
                  call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 392
                  i32.add
                  call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  block ;; label = @8
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    block ;; label = @17
                                      local.get 4
                                      i32.load8_u offset=32
                                      local.tee 5
                                      br_table 6 (;@11;) 6 (;@11;) 0 (;@17;) 1 (;@16;) 2 (;@15;) 3 (;@14;) 4 (;@13;) 5 (;@12;) 6 (;@11;)
                                    end
                                    local.get 4
                                    i64.load offset=40
                                    local.set 6
                                    br 8 (;@8;)
                                  end
                                  local.get 4
                                  i32.load offset=36
                                  local.tee 3
                                  local.get 3
                                  i32.load
                                  i32.const 1
                                  i32.add
                                  local.tee 7
                                  i32.store
                                  local.get 7
                                  i32.eqz
                                  br_if 13 (;@2;)
                                  br 6 (;@9;)
                                end
                                local.get 4
                                i32.load offset=36
                                local.tee 3
                                local.get 3
                                i32.load
                                i32.const 1
                                i32.add
                                local.tee 7
                                i32.store
                                local.get 7
                                i32.eqz
                                br_if 12 (;@2;)
                                local.get 4
                                i64.load8_u offset=44
                                i64.const 32
                                i64.shl
                                local.get 4
                                i64.load32_u offset=40
                                i64.or
                                local.set 6
                                br 6 (;@8;)
                              end
                              local.get 4
                              i32.load offset=36
                              local.tee 3
                              local.get 3
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 7
                              i32.store
                              local.get 7
                              i32.eqz
                              br_if 11 (;@2;)
                              br 4 (;@9;)
                            end
                            local.get 4
                            i32.load offset=36
                            local.tee 3
                            local.get 3
                            i32.load
                            i32.const 1
                            i32.add
                            local.tee 7
                            i32.store
                            local.get 7
                            i32.eqz
                            br_if 10 (;@2;)
                            br 3 (;@9;)
                          end
                          local.get 4
                          i32.load offset=36
                          local.tee 3
                          local.get 3
                          i32.load
                          i32.const 1
                          i32.add
                          local.tee 7
                          i32.store
                          local.get 7
                          i32.eqz
                          br_if 9 (;@2;)
                          br 1 (;@10;)
                        end
                        local.get 4
                        i32.load8_u offset=33
                        local.set 7
                      end
                      br 1 (;@8;)
                    end
                    local.get 4
                    i64.load32_u offset=40
                    local.set 6
                  end
                  local.get 4
                  local.get 6
                  i64.store offset=432
                  local.get 4
                  local.get 3
                  i32.store offset=428
                  local.get 4
                  local.get 7
                  i32.store8 offset=425
                  local.get 4
                  local.get 5
                  i32.store8 offset=424
                  local.get 4
                  i64.const 0
                  i64.store offset=384
                  local.get 4
                  i32.const 2
                  i32.store8 offset=376
                  local.get 4
                  i32.const 344
                  i32.add
                  local.get 4
                  i32.const 424
                  i32.add
                  local.get 4
                  i32.const 376
                  i32.add
                  call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                  block ;; label = @8
                    block ;; label = @9
                      local.get 4
                      i32.load8_u offset=344
                      i32.const 255
                      i32.ne
                      br_if 0 (;@9;)
                      local.get 0
                      local.get 4
                      i64.load offset=360
                      i64.store offset=16
                      local.get 0
                      local.get 4
                      i64.load offset=352
                      i64.store offset=8
                      local.get 0
                      i64.const 1
                      i64.store
                      br 1 (;@8;)
                    end
                    local.get 4
                    local.get 4
                    i64.load offset=368
                    i64.store offset=400
                    local.get 4
                    local.get 4
                    i64.load offset=360
                    i64.store offset=392
                    local.get 4
                    local.get 4
                    i64.load offset=352
                    i64.store offset=384
                    local.get 4
                    local.get 4
                    i64.load offset=344
                    i64.store offset=376
                    local.get 4
                    i32.const 424
                    i32.add
                    local.get 4
                    i32.const 376
                    i32.add
                    call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                    block ;; label = @9
                      block ;; label = @10
                        local.get 4
                        i32.load8_u offset=424
                        i32.const 255
                        i32.eq
                        br_if 0 (;@10;)
                        local.get 4
                        local.get 4
                        i64.load offset=432
                        i64.store offset=104
                        local.get 4
                        local.get 4
                        i64.load offset=424
                        i64.store offset=96
                        br 1 (;@9;)
                      end
                      local.get 4
                      i32.const 256
                      i32.store16 offset=96
                    end
                    local.get 4
                    i32.const 376
                    i32.add
                    call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    local.get 4
                    i32.const 392
                    i32.add
                    call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    block ;; label = @17
                                      block ;; label = @18
                                        local.get 4
                                        i32.load8_u offset=80
                                        local.tee 5
                                        br_table 6 (;@12;) 6 (;@12;) 0 (;@18;) 1 (;@17;) 2 (;@16;) 3 (;@15;) 4 (;@14;) 5 (;@13;) 6 (;@12;)
                                      end
                                      local.get 4
                                      i64.load offset=88
                                      local.set 6
                                      br 8 (;@9;)
                                    end
                                    local.get 4
                                    i32.load offset=84
                                    local.tee 3
                                    local.get 3
                                    i32.load
                                    i32.const 1
                                    i32.add
                                    local.tee 7
                                    i32.store
                                    local.get 7
                                    i32.eqz
                                    br_if 14 (;@2;)
                                    br 6 (;@10;)
                                  end
                                  local.get 4
                                  i32.load offset=84
                                  local.tee 3
                                  local.get 3
                                  i32.load
                                  i32.const 1
                                  i32.add
                                  local.tee 7
                                  i32.store
                                  local.get 7
                                  i32.eqz
                                  br_if 13 (;@2;)
                                  local.get 4
                                  i64.load8_u offset=92
                                  i64.const 32
                                  i64.shl
                                  local.get 4
                                  i64.load32_u offset=88
                                  i64.or
                                  local.set 6
                                  br 6 (;@9;)
                                end
                                local.get 4
                                i32.load offset=84
                                local.tee 3
                                local.get 3
                                i32.load
                                i32.const 1
                                i32.add
                                local.tee 7
                                i32.store
                                local.get 7
                                i32.eqz
                                br_if 12 (;@2;)
                                br 4 (;@10;)
                              end
                              local.get 4
                              i32.load offset=84
                              local.tee 3
                              local.get 3
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 7
                              i32.store
                              local.get 7
                              i32.eqz
                              br_if 11 (;@2;)
                              br 3 (;@10;)
                            end
                            local.get 4
                            i32.load offset=84
                            local.tee 3
                            local.get 3
                            i32.load
                            i32.const 1
                            i32.add
                            local.tee 7
                            i32.store
                            local.get 7
                            i32.eqz
                            br_if 10 (;@2;)
                            br 1 (;@11;)
                          end
                          local.get 4
                          i32.load8_u offset=81
                          local.set 7
                        end
                        br 1 (;@9;)
                      end
                      local.get 4
                      i64.load32_u offset=88
                      local.set 6
                    end
                    local.get 4
                    local.get 6
                    i64.store offset=272
                    local.get 4
                    local.get 3
                    i32.store offset=268
                    local.get 4
                    local.get 7
                    i32.store8 offset=265
                    local.get 4
                    local.get 5
                    i32.store8 offset=264
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    block ;; label = @17
                                      block ;; label = @18
                                        local.get 4
                                        i32.load8_u offset=96
                                        local.tee 5
                                        br_table 6 (;@12;) 6 (;@12;) 0 (;@18;) 1 (;@17;) 2 (;@16;) 3 (;@15;) 4 (;@14;) 5 (;@13;) 6 (;@12;)
                                      end
                                      local.get 4
                                      i64.load offset=104
                                      local.set 6
                                      br 8 (;@9;)
                                    end
                                    local.get 4
                                    i32.load offset=100
                                    local.tee 3
                                    local.get 3
                                    i32.load
                                    i32.const 1
                                    i32.add
                                    local.tee 7
                                    i32.store
                                    local.get 7
                                    i32.eqz
                                    br_if 14 (;@2;)
                                    br 6 (;@10;)
                                  end
                                  local.get 4
                                  i32.load offset=100
                                  local.tee 3
                                  local.get 3
                                  i32.load
                                  i32.const 1
                                  i32.add
                                  local.tee 7
                                  i32.store
                                  local.get 7
                                  i32.eqz
                                  br_if 13 (;@2;)
                                  local.get 4
                                  i64.load8_u offset=108
                                  i64.const 32
                                  i64.shl
                                  local.get 4
                                  i64.load32_u offset=104
                                  i64.or
                                  local.set 6
                                  br 6 (;@9;)
                                end
                                local.get 4
                                i32.load offset=100
                                local.tee 3
                                local.get 3
                                i32.load
                                i32.const 1
                                i32.add
                                local.tee 7
                                i32.store
                                local.get 7
                                i32.eqz
                                br_if 12 (;@2;)
                                br 4 (;@10;)
                              end
                              local.get 4
                              i32.load offset=100
                              local.tee 3
                              local.get 3
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 7
                              i32.store
                              local.get 7
                              i32.eqz
                              br_if 11 (;@2;)
                              br 3 (;@10;)
                            end
                            local.get 4
                            i32.load offset=100
                            local.tee 3
                            local.get 3
                            i32.load
                            i32.const 1
                            i32.add
                            local.tee 7
                            i32.store
                            local.get 7
                            i32.eqz
                            br_if 10 (;@2;)
                            br 1 (;@11;)
                          end
                          local.get 4
                          i32.load8_u offset=97
                          local.set 7
                        end
                        br 1 (;@9;)
                      end
                      local.get 4
                      i64.load32_u offset=104
                      local.set 6
                    end
                    local.get 4
                    local.get 6
                    i64.store offset=432
                    local.get 4
                    local.get 3
                    i32.store offset=428
                    local.get 4
                    local.get 7
                    i32.store8 offset=425
                    local.get 4
                    local.get 5
                    i32.store8 offset=424
                    local.get 4
                    i32.const 376
                    i32.add
                    local.get 4
                    i32.const 264
                    i32.add
                    local.get 4
                    i32.const 424
                    i32.add
                    call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive> as core::ops::arith::Add>::add"
                    local.get 4
                    local.get 4
                    i64.load offset=384
                    i64.store offset=248
                    local.get 4
                    local.get 4
                    i64.load offset=392
                    i64.store offset=256
                    block ;; label = @9
                      block ;; label = @10
                        local.get 4
                        i64.load offset=376
                        i64.const 1
                        i64.ne
                        br_if 0 (;@10;)
                        local.get 0
                        local.get 4
                        i64.load offset=256
                        i64.store offset=16
                        local.get 0
                        local.get 4
                        i64.load offset=248
                        i64.store offset=8
                        local.get 0
                        i64.const 1
                        i64.store
                        br 1 (;@9;)
                      end
                      local.get 4
                      local.get 4
                      i64.load offset=256
                      i64.store offset=120
                      local.get 4
                      local.get 4
                      i64.load offset=248
                      i64.store offset=112
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    block ;; label = @17
                                      block ;; label = @18
                                        block ;; label = @19
                                          local.get 4
                                          i32.load8_u offset=64
                                          local.tee 7
                                          br_table 6 (;@13;) 6 (;@13;) 0 (;@19;) 1 (;@18;) 2 (;@17;) 3 (;@16;) 4 (;@15;) 5 (;@14;) 6 (;@13;)
                                        end
                                        local.get 4
                                        i64.load offset=72
                                        local.set 6
                                        br 8 (;@10;)
                                      end
                                      local.get 4
                                      i32.load offset=68
                                      local.tee 5
                                      local.get 5
                                      i32.load
                                      i32.const 1
                                      i32.add
                                      local.tee 3
                                      i32.store
                                      local.get 3
                                      i32.eqz
                                      br_if 15 (;@2;)
                                      br 6 (;@11;)
                                    end
                                    local.get 4
                                    i32.load offset=68
                                    local.tee 5
                                    local.get 5
                                    i32.load
                                    i32.const 1
                                    i32.add
                                    local.tee 3
                                    i32.store
                                    local.get 3
                                    i32.eqz
                                    br_if 14 (;@2;)
                                    local.get 4
                                    i64.load8_u offset=76
                                    i64.const 32
                                    i64.shl
                                    local.get 4
                                    i64.load32_u offset=72
                                    i64.or
                                    local.set 6
                                    br 6 (;@10;)
                                  end
                                  local.get 4
                                  i32.load offset=68
                                  local.tee 5
                                  local.get 5
                                  i32.load
                                  i32.const 1
                                  i32.add
                                  local.tee 3
                                  i32.store
                                  local.get 3
                                  i32.eqz
                                  br_if 13 (;@2;)
                                  br 4 (;@11;)
                                end
                                local.get 4
                                i32.load offset=68
                                local.tee 5
                                local.get 5
                                i32.load
                                i32.const 1
                                i32.add
                                local.tee 3
                                i32.store
                                local.get 3
                                i32.eqz
                                br_if 12 (;@2;)
                                br 3 (;@11;)
                              end
                              local.get 4
                              i32.load offset=68
                              local.tee 5
                              local.get 5
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 3
                              i32.store
                              local.get 3
                              i32.eqz
                              br_if 11 (;@2;)
                              br 1 (;@12;)
                            end
                            local.get 4
                            i32.load8_u offset=65
                            local.set 8
                          end
                          br 1 (;@10;)
                        end
                        local.get 4
                        i64.load32_u offset=72
                        local.set 6
                      end
                      local.get 4
                      i32.const 144
                      i32.add
                      i32.const 8
                      i32.add
                      local.set 3
                      local.get 4
                      local.get 6
                      i64.store offset=432
                      local.get 4
                      local.get 5
                      i32.store offset=428
                      local.get 4
                      local.get 8
                      i32.store8 offset=425
                      local.get 4
                      local.get 7
                      i32.store8 offset=424
                      local.get 4
                      i64.const 4607182418800017408
                      i64.store offset=384
                      local.get 4
                      i32.const 2
                      i32.store8 offset=376
                      local.get 4
                      i32.const 144
                      i32.add
                      local.get 4
                      i32.const 424
                      i32.add
                      local.get 4
                      i32.const 376
                      i32.add
                      call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive> as core::ops::arith::Add>::add"
                      block ;; label = @10
                        block ;; label = @11
                          local.get 4
                          i64.load offset=144
                          i64.const 1
                          i64.ne
                          br_if 0 (;@11;)
                          local.get 0
                          i64.const 1
                          i64.store
                          local.get 0
                          local.get 3
                          i64.load offset=8
                          i64.store offset=16
                          local.get 0
                          local.get 3
                          i64.load
                          i64.store offset=8
                          br 1 (;@10;)
                        end
                        local.get 4
                        local.get 3
                        i64.load offset=8
                        i64.store offset=136
                        local.get 4
                        local.get 3
                        i64.load
                        i64.store offset=128
                        local.get 4
                        i32.const 248
                        i32.add
                        local.get 4
                        i32.const 96
                        i32.add
                        call $"#func515 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                        local.get 4
                        i64.const 0
                        i64.store offset=272
                        local.get 4
                        i32.const 2
                        i32.store8 offset=264
                        local.get 4
                        i32.const 376
                        i32.add
                        local.get 4
                        i32.const 248
                        i32.add
                        local.get 4
                        i32.const 264
                        i32.add
                        call $nanvm_lib::vm::any::relational::compare::<nanvm_lib::naive::Naive>
                        local.get 4
                        i32.load8_u offset=377
                        local.set 3
                        block ;; label = @11
                          block ;; label = @12
                            local.get 4
                            i32.load8_u offset=376
                            local.tee 5
                            i32.const 255
                            i32.eq
                            br_if 0 (;@12;)
                            local.get 4
                            local.get 4
                            i64.load offset=384 align=2
                            i64.store offset=432 align=2
                            local.get 4
                            local.get 4
                            i64.load offset=378 align=2
                            i64.store offset=426 align=2
                            local.get 4
                            local.get 3
                            i32.store8 offset=425
                            local.get 4
                            local.get 5
                            i32.store8 offset=424
                            local.get 0
                            local.get 4
                            i64.load offset=424
                            i64.store offset=8
                            local.get 0
                            local.get 4
                            i64.load offset=432
                            i64.store offset=16
                            local.get 0
                            i64.const 1
                            i64.store
                            br 1 (;@11;)
                          end
                          local.get 4
                          i32.const 1
                          i32.store8 offset=424
                          local.get 4
                          local.get 3
                          i32.const 255
                          i32.and
                          i32.const 255
                          i32.eq
                          i32.store8 offset=425
                          block ;; label = @12
                            block ;; label = @13
                              local.get 4
                              i32.const 424
                              i32.add
                              call $<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>::dispatch::<nanvm_lib::vm::boolean_coercion::BooleanCoercion>
                              br_if 0 (;@13;)
                              local.get 4
                              i32.const 224
                              i32.add
                              i32.const 8
                              i32.add
                              local.set 3
                              local.get 4
                              i32.const 192
                              i32.add
                              local.get 4
                              i32.const 112
                              i32.add
                              call $"#func515 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                              local.get 4
                              i32.const 208
                              i32.add
                              local.get 4
                              i32.const 128
                              i32.add
                              call $"#func515 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                              local.get 4
                              i32.const 248
                              i32.add
                              local.get 4
                              i32.const 96
                              i32.add
                              call $"#func515 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                              local.get 4
                              i64.const 4611686018427387904
                              i64.store offset=272
                              local.get 4
                              i32.const 2
                              i32.store8 offset=264
                              local.get 4
                              i32.const 224
                              i32.add
                              local.get 4
                              i32.const 248
                              i32.add
                              local.get 4
                              i32.const 264
                              i32.add
                              call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::numeric_op::<<nanvm_lib::vm::numeric::Numeric<nanvm_lib::naive::Naive> as core::ops::arith::Mul>::mul>"
                              block ;; label = @14
                                local.get 4
                                i32.load offset=224
                                i32.eqz
                                br_if 0 (;@14;)
                                local.get 0
                                i64.const 1
                                i64.store
                                local.get 0
                                local.get 3
                                i64.load offset=8
                                i64.store offset=16
                                local.get 0
                                local.get 3
                                i64.load
                                i64.store offset=8
                                local.get 4
                                i32.const 208
                                i32.add
                                call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                                local.get 4
                                i32.const 192
                                i32.add
                                call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                                br 3 (;@11;)
                              end
                              local.get 4
                              local.get 4
                              i64.load offset=192
                              i64.store offset=376
                              local.get 4
                              local.get 4
                              i64.load offset=200
                              i64.store offset=384
                              local.get 4
                              local.get 4
                              i64.load offset=208
                              i64.store offset=392
                              local.get 4
                              local.get 4
                              i64.load offset=216
                              i64.store offset=400
                              local.get 4
                              local.get 3
                              i64.load offset=8
                              i64.store offset=416
                              local.get 4
                              local.get 3
                              i64.load
                              i64.store offset=408
                              local.get 4
                              i32.const 8
                              i32.add
                              local.get 4
                              i32.const 376
                              i32.add
                              call $"<nanvm_lib::naive::container::Container<(), nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>> as nanvm_lib::vm::internal::icontainer::IContainer<nanvm_lib::naive::Naive>>::new_ok::<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>; 3]>"
                              local.get 4
                              i32.load offset=12
                              local.set 3
                              local.get 4
                              i32.load offset=8
                              local.set 5
                              br 1 (;@12;)
                            end
                            local.get 4
                            i32.const 168
                            i32.add
                            i32.const 8
                            i32.add
                            local.set 3
                            local.get 4
                            i32.const 264
                            i32.add
                            local.get 4
                            i32.const 112
                            i32.add
                            call $"#func515 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                            local.get 4
                            i32.const 168
                            i32.add
                            local.get 4
                            i32.const 264
                            i32.add
                            call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive> as core::ops::arith::Neg>::neg"
                            block ;; label = @13
                              local.get 4
                              i32.load offset=168
                              br_if 0 (;@13;)
                              local.get 4
                              local.get 3
                              i64.load offset=8
                              i64.store offset=384
                              local.get 4
                              local.get 3
                              i64.load
                              i64.store offset=376
                              local.get 4
                              i32.const 392
                              i32.add
                              local.get 4
                              i32.const 128
                              i32.add
                              call $"#func515 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                              local.get 4
                              local.get 4
                              i32.const 376
                              i32.add
                              call $"<nanvm_lib::naive::container::Container<(), nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>> as nanvm_lib::vm::internal::icontainer::IContainer<nanvm_lib::naive::Naive>>::new_ok::<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>; 2]>"
                              local.get 4
                              i32.load offset=4
                              local.set 3
                              local.get 4
                              i32.load
                              local.set 5
                              br 1 (;@12;)
                            end
                            local.get 0
                            i64.const 1
                            i64.store
                            local.get 0
                            local.get 3
                            i64.load offset=8
                            i64.store offset=16
                            local.get 0
                            local.get 3
                            i64.load
                            i64.store offset=8
                            br 1 (;@11;)
                          end
                          local.get 0
                          local.get 5
                          i32.store offset=12
                          local.get 0
                          i32.const 6
                          i32.store8 offset=8
                          local.get 0
                          i64.const 0
                          i64.store
                          local.get 0
                          local.get 3
                          i32.store offset=16
                          local.get 4
                          i32.const 128
                          i32.add
                          call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 112
                          i32.add
                          call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 96
                          i32.add
                          call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 80
                          i32.add
                          call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 64
                          i32.add
                          call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 48
                          i32.add
                          call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 32
                          i32.add
                          call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 2
                          local.get 2
                          i32.load
                          i32.const -1
                          i32.add
                          local.tee 0
                          i32.store
                          local.get 0
                          br_if 8 (;@3;)
                          br 7 (;@4;)
                        end
                        local.get 4
                        i32.const 128
                        i32.add
                        call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                      end
                      local.get 4
                      i32.const 112
                      i32.add
                      call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    end
                    local.get 4
                    i32.const 96
                    i32.add
                    call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  end
                  local.get 4
                  i32.const 80
                  i32.add
                  call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                end
                local.get 4
                i32.const 64
                i32.add
                call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              end
              local.get 4
              i32.const 48
              i32.add
              call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
            end
            local.get 4
            i32.const 32
            i32.add
            call $"#func480 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
            local.get 2
            local.get 2
            i32.load
            i32.const -1
            i32.add
            local.tee 0
            i32.store
            local.get 0
            br_if 1 (;@3;)
          end
          local.get 4
          i32.const 24
          i32.add
          call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
        end
        local.get 4
        i32.const 448
        i32.add
        global.set $__stack_pointer
        return
      end
      unreachable
    end
    i32.const 1057428
    i32.const 43
    local.get 4
    i32.const 447
    i32.add
    i32.const 1057412
    i32.const 1057472
    call $core::result::unwrap_failed
    unreachable
  )

Emergent Testing

Idle. Press Run to start the suite.

  • ./proof.f.mjs