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). A named let may omit its initializer: let x; initializes x to the primitive undefined when execution reaches the declaration, exactly as let x = undefined; does. A const or a destructuring declaration still requires an initializer.

A variable takes the same binding names as a const. A duplicate declaration is duplicate id; a read before the declaration or in its explicit initializer is const not found. A reference from a nested function is a capture. A parameter is a variable too, fixed or rest.

Declarations without initializers

Reads after let x; and before a later assignment return undefined:

export default () => {
    let x;
    const before = x;
    x = 2;
    return [before, x];
};

This returns [undefined, 2]. No definite-assignment analysis requires an assignment on each path, or any later assignment at all. A conditional arm that leaves the variable unchanged preserves its preceding value, including undefined. The declaration supplies that primitive value directly; it does not resolve a source identifier named undefined.

The declaration still establishes the binding at its written position. A read before it remains refused, and an explicit initializer such as let x = x; does not acquire an implicit initial value. A declaration inside a loop body starts again on each reached iteration. A named declaration in a classic for header may also omit its initializer; it runs once before the first condition test and retains the header's lexical scope.

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.

Assignments and scope

  • 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. An omitted named let initializer enters the same path with primitive undefined; it adds no FAST or EDAG operation. 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 named let declarations without initializers and their JavaScript-compatible undefined initialization in the design session. This supersedes the earlier initializer-required restriction and closes the former 3225-definite-assignment.md proposal. Familiar JavaScript source can be parsed and lowered through the existing binding model without path analysis; the tradeoff is allowing the starting value to be implicit.

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> (;348;) (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 1059558
    i32.store offset=24
    local.get 2
    i32.const 1059551
    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 64
          i32.const 0
          local.get 3
          local.get 6
          i32.const 1059679
          i32.const 139
          call $"<nanvm_lib::naive::Naive as nanvm_lib::vm::internal::IVm>::static_function"
          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 $"#func339 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 1057960
        i32.const 43
        local.get 2
        i32.const 32
        i32.add
        i32.const 1057944
        i32.const 1058004
        call $core::result::unwrap_failed
        unreachable
      end
      i32.const 1064316
      i32.const 43
      local.get 2
      i32.const 95
      i32.add
      i32.const 1064300
      i32.const 1064360
      call $core::result::unwrap_failed
      unreachable
    end
    i32.const 1064316
    i32.const 43
    local.get 2
    i32.const 95
    i32.add
    i32.const 1064300
    i32.const 1064360
    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" (;349;) (type 4) (param i32 i32 i32 i32)
    (local i32 i32 i64 i32 i32)
    global.get $__stack_pointer
    i32.const 432
    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=264
        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 0
        i64.store offset=376
        local.get 4
        i32.const 2
        i32.store8 offset=368
        local.get 4
        i64.const 8589934592
        i64.store offset=360
        local.get 4
        local.get 4
        i32.const 264
        i32.add
        i32.store offset=400
        local.get 4
        i32.const 16
        i32.add
        local.get 4
        i32.const 360
        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=332
        local.get 4
        local.get 4
        i32.load offset=16
        local.tee 3
        i32.store offset=328
        block ;; label = @3
          local.get 4
          i32.load8_u offset=264
          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 328
          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=376
        local.get 4
        local.get 5
        i32.store offset=372
        local.get 4
        local.get 3
        i32.store offset=368
        local.get 4
        i64.const 1
        i64.store offset=360
        local.get 4
        i32.const 328
        i32.add
        local.get 4
        i32.const 360
        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=336
        i64.store offset=296
        local.get 4
        local.get 4
        i64.load offset=344
        i64.store offset=304
        block ;; label = @3
          block ;; label = @4
            block ;; label = @5
              block ;; label = @6
                local.get 4
                i64.load offset=328
                i64.const 1
                i64.ne
                br_if 0 (;@6;)
                local.get 0
                local.get 4
                i64.load offset=304
                i64.store offset=16
                local.get 0
                local.get 4
                i64.load offset=296
                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=304
              i64.store offset=56
              local.get 4
              local.get 4
              i64.load offset=296
              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=336
              local.get 4
              local.get 3
              i32.store offset=332
              local.get 4
              local.get 7
              i32.store8 offset=329
              local.get 4
              local.get 5
              i32.store8 offset=328
              local.get 4
              i64.const 4607182418800017408
              i64.store offset=368
              local.get 4
              i32.const 2
              i32.store8 offset=360
              local.get 4
              i32.const 264
              i32.add
              local.get 4
              i32.const 328
              i32.add
              local.get 4
              i32.const 360
              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=264
                  i32.const 255
                  i32.ne
                  br_if 0 (;@7;)
                  local.get 0
                  local.get 4
                  i64.load offset=280
                  i64.store offset=16
                  local.get 0
                  local.get 4
                  i64.load offset=272
                  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=288
                i64.store offset=384
                local.get 4
                local.get 4
                i64.load offset=280
                i64.store offset=376
                local.get 4
                local.get 4
                i64.load offset=272
                i64.store offset=368
                local.get 4
                local.get 4
                i64.load offset=264
                i64.store offset=360
                local.get 4
                i32.const 328
                i32.add
                local.get 4
                i32.const 360
                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=328
                    i32.const 255
                    i32.eq
                    br_if 0 (;@8;)
                    local.get 4
                    local.get 4
                    i64.load offset=336
                    i64.store offset=72
                    local.get 4
                    local.get 4
                    i64.load offset=328
                    i64.store offset=64
                    br 1 (;@7;)
                  end
                  local.get 4
                  i32.const 256
                  i32.store16 offset=64
                end
                local.get 4
                i32.const 360
                i32.add
                call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                local.get 4
                i32.const 376
                i32.add
                call $"#func693 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=336
                local.get 4
                local.get 3
                i32.store offset=332
                local.get 4
                local.get 7
                i32.store8 offset=329
                local.get 4
                local.get 5
                i32.store8 offset=328
                local.get 4
                i64.const 0
                i64.store offset=368
                local.get 4
                i32.const 2
                i32.store8 offset=360
                local.get 4
                i32.const 296
                i32.add
                local.get 4
                i32.const 328
                i32.add
                local.get 4
                i32.const 360
                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=296
                    i32.const 255
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 0
                    local.get 4
                    i64.load offset=312
                    i64.store offset=16
                    local.get 0
                    local.get 4
                    i64.load offset=304
                    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=320
                  i64.store offset=384
                  local.get 4
                  local.get 4
                  i64.load offset=312
                  i64.store offset=376
                  local.get 4
                  local.get 4
                  i64.load offset=304
                  i64.store offset=368
                  local.get 4
                  local.get 4
                  i64.load offset=296
                  i64.store offset=360
                  local.get 4
                  i32.const 328
                  i32.add
                  local.get 4
                  i32.const 360
                  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=328
                      i32.const 255
                      i32.eq
                      br_if 0 (;@9;)
                      local.get 4
                      local.get 4
                      i64.load offset=336
                      i64.store offset=88
                      local.get 4
                      local.get 4
                      i64.load offset=328
                      i64.store offset=80
                      br 1 (;@8;)
                    end
                    local.get 4
                    i32.const 256
                    i32.store16 offset=80
                  end
                  local.get 4
                  i32.const 360
                  i32.add
                  call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 376
                  i32.add
                  call $"#func693 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=416
                  local.get 4
                  local.get 3
                  i32.store offset=412
                  local.get 4
                  local.get 7
                  i32.store8 offset=409
                  local.get 4
                  local.get 5
                  i32.store8 offset=408
                  local.get 4
                  i64.const 0
                  i64.store offset=368
                  local.get 4
                  i32.const 2
                  i32.store8 offset=360
                  local.get 4
                  i32.const 328
                  i32.add
                  local.get 4
                  i32.const 408
                  i32.add
                  local.get 4
                  i32.const 360
                  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=328
                      i32.const 255
                      i32.ne
                      br_if 0 (;@9;)
                      local.get 0
                      local.get 4
                      i64.load offset=344
                      i64.store offset=16
                      local.get 0
                      local.get 4
                      i64.load offset=336
                      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=352
                    i64.store offset=384
                    local.get 4
                    local.get 4
                    i64.load offset=344
                    i64.store offset=376
                    local.get 4
                    local.get 4
                    i64.load offset=336
                    i64.store offset=368
                    local.get 4
                    local.get 4
                    i64.load offset=328
                    i64.store offset=360
                    local.get 4
                    i32.const 408
                    i32.add
                    local.get 4
                    i32.const 360
                    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=408
                        i32.const 255
                        i32.eq
                        br_if 0 (;@10;)
                        local.get 4
                        local.get 4
                        i64.load offset=416
                        i64.store offset=104
                        local.get 4
                        local.get 4
                        i64.load offset=408
                        i64.store offset=96
                        br 1 (;@9;)
                      end
                      local.get 4
                      i32.const 256
                      i32.store16 offset=96
                    end
                    local.get 4
                    i32.const 360
                    i32.add
                    call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    local.get 4
                    i32.const 376
                    i32.add
                    call $"#func693 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=256
                    local.get 4
                    local.get 3
                    i32.store offset=252
                    local.get 4
                    local.get 7
                    i32.store8 offset=249
                    local.get 4
                    local.get 5
                    i32.store8 offset=248
                    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=416
                    local.get 4
                    local.get 3
                    i32.store offset=412
                    local.get 4
                    local.get 7
                    i32.store8 offset=409
                    local.get 4
                    local.get 5
                    i32.store8 offset=408
                    local.get 4
                    i32.const 360
                    i32.add
                    local.get 4
                    i32.const 248
                    i32.add
                    local.get 4
                    i32.const 408
                    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=368
                    i64.store offset=208
                    local.get 4
                    local.get 4
                    i64.load offset=376
                    i64.store offset=216
                    block ;; label = @9
                      block ;; label = @10
                        local.get 4
                        i64.load offset=360
                        i64.const 1
                        i64.ne
                        br_if 0 (;@10;)
                        local.get 0
                        local.get 4
                        i64.load offset=216
                        i64.store offset=16
                        local.get 0
                        local.get 4
                        i64.load offset=208
                        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=216
                      i64.store offset=120
                      local.get 4
                      local.get 4
                      i64.load offset=208
                      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=416
                      local.get 4
                      local.get 5
                      i32.store offset=412
                      local.get 4
                      local.get 8
                      i32.store8 offset=409
                      local.get 4
                      local.get 7
                      i32.store8 offset=408
                      local.get 4
                      i64.const 4607182418800017408
                      i64.store offset=368
                      local.get 4
                      i32.const 2
                      i32.store8 offset=360
                      local.get 4
                      i32.const 144
                      i32.add
                      local.get 4
                      i32.const 408
                      i32.add
                      local.get 4
                      i32.const 360
                      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 $"#func375 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                        local.get 4
                        i64.const 0
                        i64.store offset=416
                        local.get 4
                        i32.const 2
                        i32.store8 offset=408
                        local.get 4
                        i32.const 360
                        i32.add
                        local.get 4
                        i32.const 248
                        i32.add
                        local.get 4
                        i32.const 408
                        i32.add
                        call $nanvm_lib::vm::any::relational::compare::<nanvm_lib::naive::Naive>
                        local.get 4
                        i32.load8_u offset=361
                        local.set 3
                        block ;; label = @11
                          block ;; label = @12
                            local.get 4
                            i32.load8_u offset=360
                            local.tee 5
                            i32.const 255
                            i32.eq
                            br_if 0 (;@12;)
                            local.get 0
                            local.get 4
                            i64.load offset=368 align=2
                            i64.store offset=16 align=2
                            local.get 0
                            local.get 4
                            i64.load offset=362 align=2
                            i64.store offset=10 align=2
                            local.get 0
                            local.get 3
                            i32.store8 offset=9
                            local.get 0
                            local.get 5
                            i32.store8 offset=8
                            local.get 0
                            i64.const 1
                            i64.store
                            br 1 (;@11;)
                          end
                          local.get 4
                          i32.const 1
                          i32.store8 offset=208
                          local.get 4
                          local.get 3
                          i32.const 255
                          i32.and
                          i32.const 255
                          i32.eq
                          i32.store8 offset=209
                          local.get 4
                          i32.const 208
                          i32.add
                          call $"<nanvm_lib::naive::Naive as nanvm_lib::vm::internal::IVm>::with_unpacked::<bool, <nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>::to_boolean>"
                          local.set 3
                          local.get 4
                          i32.const 208
                          i32.add
                          call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          block ;; label = @12
                            block ;; label = @13
                              local.get 3
                              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 $"#func375 <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 $"#func375 <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 $"#func375 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                              local.get 4
                              i64.const 4611686018427387904
                              i64.store offset=416
                              local.get 4
                              i32.const 2
                              i32.store8 offset=408
                              local.get 4
                              i32.const 224
                              i32.add
                              local.get 4
                              i32.const 248
                              i32.add
                              local.get 4
                              i32.const 408
                              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 $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                                local.get 4
                                i32.const 192
                                i32.add
                                call $"#func339 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=360
                              local.get 4
                              local.get 4
                              i64.load offset=200
                              i64.store offset=368
                              local.get 4
                              local.get 4
                              i64.load offset=208
                              i64.store offset=376
                              local.get 4
                              local.get 4
                              i64.load offset=216
                              i64.store offset=384
                              local.get 4
                              local.get 3
                              i64.load offset=8
                              i64.store offset=400
                              local.get 4
                              local.get 3
                              i64.load
                              i64.store offset=392
                              local.get 4
                              i32.const 8
                              i32.add
                              local.get 4
                              i32.const 360
                              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 408
                            i32.add
                            local.get 4
                            i32.const 112
                            i32.add
                            call $"#func375 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                            local.get 4
                            i32.const 168
                            i32.add
                            local.get 4
                            i32.const 408
                            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=368
                              local.get 4
                              local.get 3
                              i64.load
                              i64.store offset=360
                              local.get 4
                              i32.const 376
                              i32.add
                              local.get 4
                              i32.const 128
                              i32.add
                              call $"#func375 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                              local.get 4
                              local.get 4
                              i32.const 360
                              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 $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 112
                          i32.add
                          call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 96
                          i32.add
                          call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 80
                          i32.add
                          call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 64
                          i32.add
                          call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 48
                          i32.add
                          call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 32
                          i32.add
                          call $"#func339 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 $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                      end
                      local.get 4
                      i32.const 112
                      i32.add
                      call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    end
                    local.get 4
                    i32.const 96
                    i32.add
                    call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  end
                  local.get 4
                  i32.const 80
                  i32.add
                  call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                end
                local.get 4
                i32.const 64
                i32.add
                call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              end
              local.get 4
              i32.const 48
              i32.add
              call $"#func339 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
            end
            local.get 4
            i32.const 32
            i32.add
            call $"#func339 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 432
        i32.add
        global.set $__stack_pointer
        return
      end
      unreachable
    end
    i32.const 1064316
    i32.const 43
    local.get 4
    i32.const 431
    i32.add
    i32.const 1064300
    i32.const 1064360
    call $core::result::unwrap_failed
    unreachable
  )

Emergent Testing

Idle. Press Run to start the suite.

  • ./proof.f.mjs