Objects

Status: implemented

export default {
    a: "hello",
    "b": 2,
    ["c"]: [1, 2],
};

An object may be empty and may end with a trailing comma, like an array. When one key is written twice, the last value wins, as in JavaScript.

A member may be a name alone, the shorthand JavaScript reads as the name twice, { a } for { a: a }: the name is the key, and a reference to the name — a const, an import, a parameter — is the value, resolved and refused as any reference is, so { b } with nothing binding b is an error, as is { typeof } — and { NaN }, since NaN, Infinity and undefined are reserved words that denote a value and name no binding. Only the identifier spelling has the shorthand: { "a" } and { ["a"] } are errors, the key alone being no reference.

const a = 1;
const b = [a];
export default { a, b, c: 3 };   // { a: 1, b: [1], c: 3 }

Object Spread

A member may be a spread, ... and any value, at any position and any number of times:

const o = { a: 1, b: 2 };
export default [{ ...o, c: 3 }, { a: 0, ...o }, { ...o, a: 0 }, { ...'ab' }, { ...null }];
// [{ a: 1, b: 2, c: 3 }, { a: 1, b: 2 }, { a: 0, b: 2 }, { 0: 'a', 1: 'b' }, {}]

The operand is evaluated in its place among the members, left to right, and its own enumerable string-keyed properties are copied in, in its own property order, as JavaScript's CopyDataProperties copies them. A copied key behaves as a written one: when it is already present, the later value wins and the key keeps its first position. What each value contributes agrees with JavaScript:

  • An object: its own properties, array-index keys first in ascending order, then the others in the order they were made.
  • An array: its elements, keyed '0', '1', ….
  • A string: one property per UTF-16 code unit, not per code point: { ...'😀' } is { 0: '\ud83d', 1: '\ude00' }, where [...'😀'] is ['😀']. The two spreads read a string differently in JavaScript, and so here.
  • Anything else — null, undefined, a boolean, a number, a bigint, a function — contributes nothing: { ...null } is {}.

So, unlike an array's spread, copying these properties never throws; evaluating the operand still may. A function contributes nothing: export default { ...(() => 1) }; writes {} as JSON and export default {}; as DataJS. Graph outputs preserve the spread (output). A copied __proto__ key is an ordinary own property, as JavaScript's CreateDataProperty makes it: { ...{ ['__proto__']: 1 } } owns a property named __proto__ and has no new prototype (the __proto__ key).

The value outputs write the object the spread made, and the graph outputs the spread itself: .js and .f.js write it back, { ...o, c: 3 }, the EDAG keeps its ['...', exp] entry, and .rs prints it through nanvm-lib's object_spread. A constant spread is not folded, so { ...{ a: 1 } } is a different graph from { a: 1 }. With a spread among the members, which keys the literal has is known only once the operand is: no key selects inside such a literal during source reconstruction, and no member before a spread is dropped as overwritten. Value outputs instead evaluate the members and spreads before selecting and serializing the result.

A member may hold any value, undefined included, and a member holding undefined is still an own property, as in JavaScript: it keeps its key and that key's position, so { x: undefined } is not {}, although reading x gives undefined from both. { x: 1, x: undefined }.x is undefined, and { x: undefined, y: 2, x: 3 } has the keys x and y, in that order. A DataJS or FunctionalScript output writes the member, {"x":undefined}; a .json output refuses it rather than drop it the way JSON.stringify does (output).

Property Keys

A key is written in one of three ways:

FormExample
string literal{ "a": 1 }
identifier{ a: 1 }
computed{ ["a"]: 1 }, { [k]: 1 }

The first two spell a constant key. The brackets of a computed key hold any value, as an index's do: a string literal there is the same constant key by a third spelling, and the three spellings mix freely inside one object. An identifier key is an identifier — ASCII letters, digits, _ and $, not starting with a digit — and may be a reserved word, { if: 1 }, as it may in JavaScript. A key no identifier spells is written as a string: { "é": 1 }, { "a-b": 1 }.

Any other value in the brackets is a computed key. sergey-shandar approved the design in #2828, as DESIGN.md §12 requires. The key is evaluated where the object is built — after the members before it and before its own value, as JavaScript evaluates a literal — and converted to a property key as JavaScript's ToPropertyKey converts it: a string is the key, and every other value is the string it converts to, [1] the key "1", [null] the key "null", [[1, 2]] the key "1,2":

const k = 'a';
export default (i) => ({ [k]: 1, [k + 'b']: 2, [i]: 3 });
// ({ a: 1, ab: 2, [i]: 3 }); called with 0, { a: 1, ab: 2, 0: 3 }

A computed key that is a constant is that constant: { ["a"]: 1 } and { a: 1 } are the same literal, and so is const k = 'a'; export default { [k]: 1 };, k being the literal it is bound to. The graph outputs write a key that is no constant string in brackets, as it was read, { [i]: 3 } and { [0]: 1 }; the value outputs write the key the value has, { "0": 1 } (output).

A key may be any name, including one a built-in prototype gives a value: { constructor: 1, toString: 2, push: 3 } is an object that owns those three properties, as in JavaScript, whichever spelling each key takes. What property access refuses is reading such a member back, not owning it, and __proto__ is the one key with a rule of its own (below).

A numeric key literal such as { 3e7: true } is not recognized yet — see the roadmap; { [3e7]: true } is the same object.

The __proto__ Key

JavaScript gives the three spellings of a __proto__ key two different meanings:

{ __proto__: v }      // sets [[Prototype]]; no own property
{ "__proto__": v }    // sets [[Prototype]]; no own property
{ ["__proto__"]: v }  // an ordinary own property named "__proto__"

Only the bracketed spelling denotes a property, so it is the only keyed one FunctionalScript accepts. The other two are compilation errors:

export default { __proto__: 1 };    // error
export default { "__proto__": 1 };  // error
export default { ["__proto__"]: 1 }; // ok

The bracketed form is the workaround: it is how a module holds a property actually named __proto__. The shorthand { __proto__ } is the other way, and denotes the same own property, as it does in JavaScript, where the prototype rule names the keyed spellings alone.

FunctionalScript has no prototype chains at run time (property-accessor), so a spelling whose only meaning is "assign a prototype" has no meaning to give. Rejecting it is the whitelist principle rather than a special case, and it keeps principle 2: a module means on the FunctionalScript VM what it means on any other JavaScript engine.

A value may still carry a __proto__ property; what a module cannot do is read it with o.__proto__, which is a separate rule of property-accessor.

The one key the two languages read differently

"__proto__" is an ordinary data key in a JSON document — JSON.parse makes it an own property — and a prototype assignment in a JavaScript module. It is the only text the two languages disagree about; every other JSON document denotes the same value in both.

Each language keeps its own reading, because each is right about itself: JSON's reader gives the document the value JSON.parse gives it, and the module parser refuses the spelling rather than give a module a value no JavaScript engine would give it.

So fjs compile reads and writes the key differently in each language, and the extension of each file named on the command line picks the language:

fjs compile input.f.js output.data.js   # {["__proto__"]:1}
fjs compile input.f.js output.json      # {"__proto__":1}
fjs compile input.json  output.data.js  # reads {"__proto__":1} as a property

A JSON document therefore survives the loop proto.json → a.data.js → out.json byte for byte, each hop spelling the key its own language's way. The disagreement is about a text, not a value, so nothing is unreachable.

The identifier spelling is not a key in either language: no JSON document contains one, so { __proto__: 1 } is an error whatever the input file is called.

In JavaScript output the bracketed form is what makes the module round-trip — of the keyed spellings it is the only one whose evaluation reproduces the property, and the writer has no other, since the shorthand needs a binding named __proto__ to refer to and an output binds none. In JSON output the plain key stays: JSON.parse has no prototype special case, so JSON already round-trips, and the bracketed form is not JSON at all.

Examples

The compiler demo offers the programs objects 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 — an object literal with an identifier key, a string key and a computed key — 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 1 and 2, as JavaScript and as WebAssembly, and shows what each call returned or threw.

export default (...a) => {
    const o = { a: "hello", "b": a[0], ["c"]: [1, 2] };
    return Object.entries(o).length + o.b;
};

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 1, 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) (Objects) as a function of one
 * number, for the page's WASM demo: an object literal with an identifier
 * key, a string key and a computed key.
 *
 * @module
 */

/** @type {(...a: readonly number[]) => unknown} */
export default (...a) => {
    const o = { a: "hello", "b": a[0], ["c"]: [1, 2] };
    return Object.entries(o).length + o.b;
};

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

=>lengthbody0++leftright.objkey()"length".objkey{}"b"()callee...Object.entries[][]0{}abc"hello".[].objidxrest0[]0112

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

const $0=["{}",[[":","a","hello"],[":","b",[".",["rest"],0]],[":","c",["[]",[1,2]]]]];export default ["{}",[[":","default",["=>",0,[],["+",[".",["()",["Object.entries"],[$0]],"length"],[".",$0,"b"]]]]]];

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, static_read, string_any, string_key};
use nanvm_lib::vm::{Any, 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 _b414: Any<A> = _args.rest(0).to_any();
        let _b0: Any<A> = (static_read(&A::frame(_self)[0], "Object.entries"))?;
        let _b4: Any<A> = [(string_key("a"), string_any("hello")), (string_key("b"), (Any::dot(_b414.clone(), f64_any(0x0000000000000000)).end())?), (string_key("c"), [f64_any(0x3ff0000000000000), f64_any(0x4000000000000000)].to_array().to_any())].to_object().to_any();
        (Any::dot((Any::call(_b0.clone(), [_b4.clone()].to_array().to_any()))?, string_any("length")).end())? + (Any::dot(_b4.clone(), string_any("b")).end())?
    }, 0, [runtime.clone()].to_array(), Some("(...$0)=>{const $1=Object.entries;const $2={\"a\":\"hello\",\"b\":$0[0],\"c\":[1,2]};return $1($2).length+$2.b;}")).to_any())].to_object().to_any())
}

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

  (func $nanvm_demos::samples::objects::module::<nanvm_lib::naive::Naive> (;663;) (type 1) (param i32 i32)
    (local i32 i32 i32 i32 i32 i64 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 1066166
    i32.store offset=24
    local.get 2
    i32.const 1066159
    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
          block ;; label = @4
            local.get 2
            i32.load8_u offset=48
            local.tee 3
            i32.const 255
            i32.ne
            br_if 0 (;@4;)
            local.get 2
            i32.load offset=56
            local.set 4
            local.get 2
            i32.load offset=52
            local.set 5
            block ;; label = @5
              block ;; label = @6
                block ;; label = @7
                  block ;; label = @8
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            local.get 1
                            i32.load8_u
                            local.tee 6
                            br_table 6 (;@6;) 6 (;@6;) 0 (;@12;) 1 (;@11;) 2 (;@10;) 3 (;@9;) 4 (;@8;) 5 (;@7;) 6 (;@6;)
                          end
                          local.get 1
                          i64.load offset=8
                          local.set 7
                          br 10 (;@1;)
                        end
                        local.get 1
                        i32.load offset=4
                        local.tee 3
                        local.get 3
                        i32.load
                        i32.const 1
                        i32.add
                        local.tee 8
                        i32.store
                        local.get 8
                        i32.eqz
                        br_if 7 (;@3;)
                        br 8 (;@2;)
                      end
                      local.get 1
                      i32.load offset=4
                      local.tee 3
                      local.get 3
                      i32.load
                      i32.const 1
                      i32.add
                      local.tee 8
                      i32.store
                      local.get 8
                      i32.eqz
                      br_if 6 (;@3;)
                      local.get 1
                      i64.load8_u offset=12
                      i64.const 32
                      i64.shl
                      local.get 1
                      i64.load32_u offset=8
                      i64.or
                      local.set 7
                      br 8 (;@1;)
                    end
                    local.get 1
                    i32.load offset=4
                    local.tee 3
                    local.get 3
                    i32.load
                    i32.const 1
                    i32.add
                    local.tee 8
                    i32.store
                    local.get 8
                    br_if 6 (;@2;)
                    br 5 (;@3;)
                  end
                  local.get 1
                  i32.load offset=4
                  local.tee 3
                  local.get 3
                  i32.load
                  i32.const 1
                  i32.add
                  local.tee 8
                  i32.store
                  local.get 8
                  br_if 5 (;@2;)
                  br 4 (;@3;)
                end
                local.get 1
                i32.load offset=4
                local.tee 3
                local.get 3
                i32.load
                i32.const 1
                i32.add
                local.tee 8
                i32.store
                local.get 8
                i32.eqz
                br_if 3 (;@3;)
                br 1 (;@5;)
              end
              local.get 1
              i32.load8_u offset=1
              local.set 8
            end
            br 3 (;@1;)
          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
        unreachable
      end
      local.get 1
      i64.load32_u offset=8
      local.set 7
    end
    local.get 2
    i32.const 0
    i32.store8 offset=20
    local.get 2
    local.get 7
    i64.store offset=64
    local.get 2
    local.get 3
    i32.store offset=60
    local.get 2
    local.get 8
    i32.store8 offset=57
    local.get 2
    local.get 6
    i32.store8 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=72
    local.get 2
    i32.const 8
    i32.add
    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::any::Any<nanvm_lib::naive::Naive>, 1>, 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=36
    local.get 2
    local.get 2
    i32.load offset=8
    local.tee 3
    i32.store offset=32
    block ;; label = @1
      block ;; label = @2
        local.get 2
        i32.load8_u offset=20
        i32.const 1
        i32.ne
        br_if 0 (;@2;)
        local.get 3
        local.get 3
        i32.load
        i32.const -1
        i32.add
        local.tee 0
        i32.store
        local.get 0
        br_if 1 (;@1;)
        local.get 2
        i32.const 32
        i32.add
        call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
        br 1 (;@1;)
      end
      local.get 3
      i32.eqz
      br_if 0 (;@1;)
      i32.const 201
      i32.const 0
      local.get 3
      local.get 6
      i32.const 1067451
      i32.const 104
      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 6
      i32.store offset=36
      local.get 2
      local.get 2
      i32.load
      local.tee 3
      i32.store offset=32
      block ;; label = @2
        block ;; label = @3
          local.get 2
          i32.load8_u offset=20
          i32.const 1
          i32.ne
          br_if 0 (;@3;)
          local.get 3
          local.get 3
          i32.load
          i32.const -1
          i32.add
          local.tee 0
          i32.store
          local.get 0
          br_if 1 (;@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 1 (;@2;)
        end
        local.get 3
        i32.eqz
        br_if 0 (;@2;)
        local.get 0
        local.get 6
        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 $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
        local.get 2
        i32.const 96
        i32.add
        global.set $__stack_pointer
        return
      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::objects::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" (;664;) (type 4) (param i32 i32 i32 i32)
    (local i32 i32 i32 i32 i64 i32 i32 i32)
    global.get $__stack_pointer
    i32.const 368
    i32.sub
    local.tee 4
    global.set $__stack_pointer
    local.get 1
    i32.load
    local.set 1
    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
      local.get 5
      i32.eqz
      br_if 0 (;@1;)
      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
      block ;; label = @2
        block ;; label = @3
          block ;; label = @4
            block ;; label = @5
              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 1
                                  i32.load offset=16
                                  i32.eqz
                                  br_if 0 (;@15;)
                                  local.get 4
                                  i32.const 240
                                  i32.add
                                  local.get 1
                                  i32.load offset=12
                                  i32.const 8
                                  i32.add
                                  i32.const 1068005
                                  i32.const 14
                                  call $nanvm_lib::vm::unstable::static_read::<nanvm_lib::naive::Naive>
                                  local.get 4
                                  local.get 4
                                  i64.load offset=248
                                  i64.store offset=208
                                  local.get 4
                                  local.get 4
                                  i64.load offset=256
                                  i64.store offset=216
                                  block ;; label = @16
                                    local.get 4
                                    i64.load offset=240
                                    i64.const 1
                                    i64.ne
                                    br_if 0 (;@16;)
                                    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 7 (;@9;)
                                  end
                                  local.get 4
                                  local.get 4
                                  i64.load offset=216
                                  i64.store offset=56
                                  local.get 4
                                  local.get 4
                                  i64.load offset=208
                                  i64.store offset=48
                                  local.get 4
                                  i32.const 0
                                  i32.store16 offset=152
                                  local.get 4
                                  i32.const 1068020
                                  i32.store offset=148
                                  local.get 4
                                  i32.const 1068019
                                  i32.store offset=144
                                  local.get 4
                                  i32.const 240
                                  i32.add
                                  local.get 4
                                  i32.const 144
                                  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]>>"
                                  local.get 4
                                  i32.load8_u offset=240
                                  local.tee 3
                                  i32.const 255
                                  i32.ne
                                  br_if 1 (;@14;)
                                  local.get 4
                                  i32.load offset=248
                                  local.set 1
                                  local.get 4
                                  i32.load offset=244
                                  local.set 3
                                  local.get 4
                                  i32.const 0
                                  i32.store16 offset=152
                                  local.get 4
                                  i32.const 1068025
                                  i32.store offset=148
                                  local.get 4
                                  i32.const 1068020
                                  i32.store offset=144
                                  local.get 4
                                  i32.const 240
                                  i32.add
                                  local.get 4
                                  i32.const 144
                                  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]>>"
                                  local.get 4
                                  i32.load8_u offset=240
                                  local.tee 5
                                  i32.const 255
                                  i32.ne
                                  br_if 2 (;@13;)
                                  local.get 4
                                  local.get 4
                                  i64.load offset=244 align=4
                                  i64.store offset=220 align=4
                                  local.get 4
                                  i32.const 3
                                  i32.store8 offset=216
                                  local.get 4
                                  local.get 1
                                  i32.store offset=212
                                  local.get 4
                                  local.get 3
                                  i32.store offset=208
                                  local.get 4
                                  i32.const 0
                                  i32.store16 offset=152
                                  local.get 4
                                  i32.const 1068026
                                  i32.store offset=148
                                  local.get 4
                                  i32.const 1068025
                                  i32.store offset=144
                                  local.get 4
                                  i32.const 240
                                  i32.add
                                  local.get 4
                                  i32.const 144
                                  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]>>"
                                  local.get 4
                                  i32.load8_u offset=240
                                  local.tee 1
                                  i32.const 255
                                  i32.ne
                                  br_if 3 (;@12;)
                                  local.get 4
                                  local.get 4
                                  i32.load offset=248
                                  local.tee 6
                                  i32.store offset=132
                                  local.get 4
                                  local.get 4
                                  i32.load offset=244
                                  local.tee 5
                                  i32.store offset=128
                                  block ;; label = @16
                                    block ;; label = @17
                                      block ;; label = @18
                                        block ;; label = @19
                                          block ;; label = @20
                                            block ;; label = @21
                                              block ;; label = @22
                                                block ;; label = @23
                                                  local.get 4
                                                  i32.load8_u offset=32
                                                  local.tee 7
                                                  br_table 6 (;@17;) 6 (;@17;) 0 (;@23;) 1 (;@22;) 2 (;@21;) 3 (;@20;) 4 (;@19;) 5 (;@18;) 6 (;@17;)
                                                end
                                                local.get 4
                                                i64.load offset=40
                                                local.set 8
                                                br 12 (;@10;)
                                              end
                                              local.get 4
                                              i32.load offset=36
                                              local.tee 1
                                              local.get 1
                                              i32.load
                                              i32.const 1
                                              i32.add
                                              local.tee 9
                                              i32.store
                                              local.get 9
                                              i32.eqz
                                              br_if 20 (;@1;)
                                              br 10 (;@11;)
                                            end
                                            local.get 4
                                            i32.load offset=36
                                            local.tee 1
                                            local.get 1
                                            i32.load
                                            i32.const 1
                                            i32.add
                                            local.tee 9
                                            i32.store
                                            local.get 9
                                            i32.eqz
                                            br_if 19 (;@1;)
                                            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 8
                                            br 10 (;@10;)
                                          end
                                          local.get 4
                                          i32.load offset=36
                                          local.tee 1
                                          local.get 1
                                          i32.load
                                          i32.const 1
                                          i32.add
                                          local.tee 9
                                          i32.store
                                          local.get 9
                                          br_if 8 (;@11;)
                                          br 18 (;@1;)
                                        end
                                        local.get 4
                                        i32.load offset=36
                                        local.tee 1
                                        local.get 1
                                        i32.load
                                        i32.const 1
                                        i32.add
                                        local.tee 9
                                        i32.store
                                        local.get 9
                                        br_if 7 (;@11;)
                                        br 17 (;@1;)
                                      end
                                      local.get 4
                                      i32.load offset=36
                                      local.tee 1
                                      local.get 1
                                      i32.load
                                      i32.const 1
                                      i32.add
                                      local.tee 9
                                      i32.store
                                      local.get 9
                                      i32.eqz
                                      br_if 16 (;@1;)
                                      br 1 (;@16;)
                                    end
                                    local.get 4
                                    i32.load8_u offset=33
                                    local.set 9
                                  end
                                  br 5 (;@10;)
                                end
                                i32.const 0
                                i32.const 0
                                i32.const 1063408
                                call $core::panicking::panic_bounds_check
                                unreachable
                              end
                              local.get 4
                              local.get 4
                              i32.load8_u offset=243
                              i32.store8 offset=179
                              local.get 4
                              local.get 4
                              i32.load16_u offset=241 align=1
                              i32.store16 offset=177 align=1
                              local.get 4
                              local.get 4
                              i32.load offset=252
                              i32.store offset=188
                              local.get 4
                              local.get 4
                              i64.load offset=244 align=4
                              i64.store offset=180 align=4
                              local.get 4
                              local.get 3
                              i32.store8 offset=176
                              i32.const 1065572
                              i32.const 43
                              local.get 4
                              i32.const 176
                              i32.add
                              i32.const 1065556
                              i32.const 1065616
                              call $core::result::unwrap_failed
                              unreachable
                            end
                            local.get 4
                            local.get 4
                            i32.load8_u offset=243
                            i32.store8 offset=179
                            local.get 4
                            local.get 4
                            i32.load16_u offset=241 align=1
                            i32.store16 offset=177 align=1
                            local.get 4
                            local.get 4
                            i32.load offset=252
                            i32.store offset=188
                            local.get 4
                            local.get 4
                            i64.load offset=244 align=4
                            i64.store offset=180 align=4
                            local.get 4
                            local.get 5
                            i32.store8 offset=176
                            i32.const 1065572
                            i32.const 43
                            local.get 4
                            i32.const 176
                            i32.add
                            i32.const 1065556
                            i32.const 1065616
                            call $core::result::unwrap_failed
                            unreachable
                          end
                          local.get 4
                          local.get 4
                          i32.load8_u offset=243
                          i32.store8 offset=179
                          local.get 4
                          local.get 4
                          i32.load16_u offset=241 align=1
                          i32.store16 offset=177 align=1
                          local.get 4
                          local.get 4
                          i32.load offset=252
                          i32.store offset=188
                          local.get 4
                          local.get 4
                          i64.load offset=244 align=4
                          i64.store offset=180 align=4
                          local.get 4
                          local.get 1
                          i32.store8 offset=176
                          i32.const 1065572
                          i32.const 43
                          local.get 4
                          i32.const 176
                          i32.add
                          i32.const 1065556
                          i32.const 1065616
                          call $core::result::unwrap_failed
                          unreachable
                        end
                        local.get 4
                        i64.load32_u offset=40
                        local.set 8
                      end
                      local.get 4
                      local.get 8
                      i64.store offset=184
                      local.get 4
                      local.get 1
                      i32.store offset=180
                      local.get 4
                      local.get 9
                      i32.store8 offset=177
                      local.get 4
                      local.get 7
                      i32.store8 offset=176
                      local.get 4
                      i64.const 0
                      i64.store offset=248
                      local.get 4
                      i32.const 2
                      i32.store8 offset=240
                      local.get 4
                      i32.const 144
                      i32.add
                      local.get 4
                      i32.const 176
                      i32.add
                      local.get 4
                      i32.const 240
                      i32.add
                      call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                      block ;; label = @10
                        block ;; label = @11
                          local.get 4
                          i32.load8_u offset=144
                          i32.const 255
                          i32.ne
                          br_if 0 (;@11;)
                          local.get 0
                          local.get 4
                          i64.load offset=160
                          i64.store offset=16
                          local.get 0
                          local.get 4
                          i64.load offset=152
                          i64.store offset=8
                          local.get 0
                          i64.const 1
                          i64.store
                          local.get 5
                          local.get 5
                          i32.load
                          i32.const -1
                          i32.add
                          local.tee 0
                          i32.store
                          block ;; label = @12
                            local.get 0
                            br_if 0 (;@12;)
                            local.get 4
                            i32.const 128
                            i32.add
                            call $"<alloc::rc::Rc<[u16]>>::drop_slow"
                          end
                          local.get 4
                          i32.const 216
                          i32.add
                          local.set 0
                          local.get 3
                          local.get 3
                          i32.load
                          i32.const -1
                          i32.add
                          local.tee 1
                          i32.store
                          block ;; label = @12
                            local.get 1
                            br_if 0 (;@12;)
                            local.get 4
                            i32.const 208
                            i32.add
                            call $"<alloc::rc::Rc<[u16]>>::drop_slow"
                          end
                          local.get 0
                          call $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
                          br 1 (;@10;)
                        end
                        local.get 4
                        local.get 4
                        i64.load offset=168
                        i64.store offset=264
                        local.get 4
                        local.get 4
                        i64.load offset=160
                        i64.store offset=256
                        local.get 4
                        local.get 4
                        i64.load offset=152
                        i64.store offset=248
                        local.get 4
                        local.get 4
                        i64.load offset=144
                        i64.store offset=240
                        local.get 4
                        i32.const 176
                        i32.add
                        local.get 4
                        i32.const 240
                        i32.add
                        call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                        block ;; label = @11
                          block ;; label = @12
                            local.get 4
                            i32.load8_u offset=176
                            local.tee 1
                            i32.const 255
                            i32.ne
                            br_if 0 (;@12;)
                            i32.const 1
                            local.set 7
                            i32.const 0
                            local.set 1
                            br 1 (;@11;)
                          end
                          local.get 4
                          local.get 4
                          i64.load offset=178 align=2
                          i64.store offset=344
                          local.get 4
                          local.get 4
                          i64.load offset=184 align=2
                          i64.store offset=350 align=2
                          local.get 4
                          i32.load8_u offset=177
                          local.set 7
                        end
                        local.get 4
                        i32.const 240
                        i32.add
                        call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                        local.get 4
                        i32.const 256
                        i32.add
                        call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                        local.get 4
                        i32.const 0
                        i32.store16 offset=136
                        local.get 4
                        i32.const 1068027
                        i32.store offset=132
                        local.get 4
                        i32.const 1068026
                        i32.store offset=128
                        local.get 4
                        i32.const 240
                        i32.add
                        local.get 4
                        i32.const 128
                        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 = @11
                          block ;; label = @12
                            block ;; label = @13
                              local.get 4
                              i32.load8_u offset=240
                              local.tee 3
                              i32.const 255
                              i32.ne
                              br_if 0 (;@13;)
                              local.get 4
                              i32.load offset=248
                              local.set 9
                              local.get 4
                              i32.load offset=244
                              local.set 10
                              local.get 4
                              i32.const 0
                              i32.store8 offset=128
                              local.get 4
                              i64.const 4611686018427387904
                              i64.store offset=272
                              local.get 4
                              i32.const 2
                              i32.store8 offset=264
                              local.get 4
                              i64.const 4607182418800017408
                              i64.store offset=256
                              local.get 4
                              i32.const 2
                              i32.store8 offset=248
                              local.get 4
                              i64.const 8589934592
                              i64.store offset=240
                              local.get 4
                              local.get 4
                              i32.const 128
                              i32.add
                              i32.store offset=280
                              local.get 4
                              i32.const 16
                              i32.add
                              local.get 4
                              i32.const 240
                              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 11
                              i32.store offset=180
                              local.get 4
                              local.get 4
                              i32.load offset=16
                              local.tee 3
                              i32.store offset=176
                              block ;; label = @14
                                local.get 4
                                i32.load8_u offset=128
                                i32.const 1
                                i32.ne
                                br_if 0 (;@14;)
                                local.get 3
                                local.get 3
                                i32.load
                                i32.const -1
                                i32.add
                                local.tee 2
                                i32.store
                                local.get 2
                                br_if 12 (;@2;)
                                local.get 4
                                i32.const 176
                                i32.add
                                call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
                                br 12 (;@2;)
                              end
                              local.get 3
                              i32.eqz
                              br_if 11 (;@2;)
                              local.get 4
                              local.get 4
                              i64.load offset=224
                              i64.store offset=264
                              local.get 4
                              local.get 4
                              i64.load offset=216
                              i64.store offset=256
                              local.get 4
                              local.get 4
                              i64.load offset=208
                              i64.store offset=248
                              local.get 4
                              i32.const 0
                              i32.store8 offset=176
                              local.get 4
                              local.get 7
                              i32.store8 offset=281
                              local.get 4
                              local.get 1
                              i32.store8 offset=280
                              local.get 4
                              local.get 6
                              i32.store offset=276
                              local.get 4
                              local.get 5
                              i32.store offset=272
                              local.get 4
                              i64.const 12884901888
                              i64.store offset=240
                              local.get 4
                              local.get 4
                              i64.load offset=344
                              i64.store offset=282 align=2
                              local.get 4
                              local.get 4
                              i64.load offset=350 align=2
                              i64.store offset=288 align=2
                              local.get 4
                              local.get 11
                              i32.store offset=312
                              local.get 4
                              local.get 3
                              i32.store offset=308
                              local.get 4
                              i32.const 6
                              i32.store8 offset=304
                              local.get 4
                              local.get 9
                              i32.store offset=300
                              local.get 4
                              local.get 10
                              i32.store offset=296
                              local.get 4
                              local.get 4
                              i32.const 176
                              i32.add
                              i32.store offset=320
                              local.get 4
                              i32.const 8
                              i32.add
                              local.get 4
                              i32.const 240
                              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>), 3>, 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 4
                              local.get 4
                              i32.load offset=12
                              local.tee 1
                              i32.store offset=212
                              local.get 4
                              local.get 4
                              i32.load offset=8
                              local.tee 3
                              i32.store offset=208
                              block ;; label = @14
                                local.get 4
                                i32.load8_u offset=176
                                i32.const 1
                                i32.ne
                                br_if 0 (;@14;)
                                local.get 3
                                local.get 3
                                i32.load
                                i32.const -1
                                i32.add
                                local.tee 2
                                i32.store
                                local.get 2
                                br_if 11 (;@3;)
                                local.get 4
                                i32.const 208
                                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 11 (;@3;)
                              end
                              local.get 3
                              i32.eqz
                              br_if 10 (;@3;)
                              local.get 4
                              local.get 1
                              i32.store offset=72
                              local.get 4
                              local.get 3
                              i32.store offset=68
                              local.get 4
                              i32.const 5
                              i32.store8 offset=64
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    block ;; label = @17
                                      block ;; label = @18
                                        block ;; label = @19
                                          block ;; label = @20
                                            block ;; label = @21
                                              local.get 4
                                              i32.load8_u offset=48
                                              local.tee 1
                                              br_table 6 (;@15;) 6 (;@15;) 0 (;@21;) 1 (;@20;) 2 (;@19;) 3 (;@18;) 4 (;@17;) 5 (;@16;) 6 (;@15;)
                                            end
                                            local.get 4
                                            i64.load offset=56
                                            local.set 8
                                            br 9 (;@11;)
                                          end
                                          local.get 4
                                          i32.load offset=52
                                          local.tee 3
                                          local.get 3
                                          i32.load
                                          i32.const 1
                                          i32.add
                                          local.tee 5
                                          i32.store
                                          local.get 5
                                          i32.eqz
                                          br_if 18 (;@1;)
                                          br 7 (;@12;)
                                        end
                                        local.get 4
                                        i32.load offset=52
                                        local.tee 3
                                        local.get 3
                                        i32.load
                                        i32.const 1
                                        i32.add
                                        local.tee 5
                                        i32.store
                                        local.get 5
                                        i32.eqz
                                        br_if 17 (;@1;)
                                        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 8
                                        br 7 (;@11;)
                                      end
                                      local.get 4
                                      i32.load offset=52
                                      local.tee 3
                                      local.get 3
                                      i32.load
                                      i32.const 1
                                      i32.add
                                      local.tee 5
                                      i32.store
                                      local.get 5
                                      i32.eqz
                                      br_if 16 (;@1;)
                                      br 5 (;@12;)
                                    end
                                    local.get 4
                                    i32.load offset=52
                                    local.tee 3
                                    local.get 3
                                    i32.load
                                    i32.const 1
                                    i32.add
                                    local.tee 5
                                    i32.store
                                    local.get 5
                                    i32.eqz
                                    br_if 15 (;@1;)
                                    br 4 (;@12;)
                                  end
                                  local.get 4
                                  i32.load offset=52
                                  local.tee 3
                                  local.get 3
                                  i32.load
                                  i32.const 1
                                  i32.add
                                  local.tee 5
                                  i32.store
                                  local.get 5
                                  i32.eqz
                                  br_if 14 (;@1;)
                                  br 1 (;@14;)
                                end
                                local.get 4
                                i32.load8_u offset=49
                                local.set 5
                              end
                              br 2 (;@11;)
                            end
                            local.get 4
                            local.get 4
                            i32.load8_u offset=243
                            i32.store8 offset=179
                            local.get 4
                            local.get 4
                            i32.load16_u offset=241 align=1
                            i32.store16 offset=177 align=1
                            local.get 4
                            local.get 4
                            i32.load offset=252
                            i32.store offset=188
                            local.get 4
                            local.get 4
                            i64.load offset=244 align=4
                            i64.store offset=180 align=4
                            local.get 4
                            local.get 3
                            i32.store8 offset=176
                            i32.const 1065572
                            i32.const 43
                            local.get 4
                            i32.const 176
                            i32.add
                            i32.const 1065556
                            i32.const 1065616
                            call $core::result::unwrap_failed
                            unreachable
                          end
                          local.get 4
                          i64.load32_u offset=56
                          local.set 8
                        end
                        local.get 4
                        local.get 8
                        i64.store offset=184
                        local.get 4
                        local.get 3
                        i32.store offset=180
                        local.get 4
                        local.get 5
                        i32.store8 offset=177
                        local.get 4
                        local.get 1
                        i32.store8 offset=176
                        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
                                          block ;; label = @20
                                            local.get 4
                                            i32.load8_u offset=64
                                            local.tee 1
                                            br_table 6 (;@14;) 6 (;@14;) 0 (;@20;) 1 (;@19;) 2 (;@18;) 3 (;@17;) 4 (;@16;) 5 (;@15;) 6 (;@14;)
                                          end
                                          local.get 4
                                          i64.load offset=72
                                          local.set 8
                                          br 8 (;@11;)
                                        end
                                        local.get 4
                                        i32.load offset=68
                                        local.tee 3
                                        local.get 3
                                        i32.load
                                        i32.const 1
                                        i32.add
                                        local.tee 5
                                        i32.store
                                        local.get 5
                                        i32.eqz
                                        br_if 17 (;@1;)
                                        br 6 (;@12;)
                                      end
                                      local.get 4
                                      i32.load offset=68
                                      local.tee 3
                                      local.get 3
                                      i32.load
                                      i32.const 1
                                      i32.add
                                      local.tee 5
                                      i32.store
                                      local.get 5
                                      i32.eqz
                                      br_if 16 (;@1;)
                                      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 8
                                      br 6 (;@11;)
                                    end
                                    local.get 4
                                    i32.load offset=68
                                    local.tee 3
                                    local.get 3
                                    i32.load
                                    i32.const 1
                                    i32.add
                                    local.tee 5
                                    i32.store
                                    local.get 5
                                    i32.eqz
                                    br_if 15 (;@1;)
                                    br 4 (;@12;)
                                  end
                                  local.get 4
                                  i32.load offset=68
                                  local.tee 3
                                  local.get 3
                                  i32.load
                                  i32.const 1
                                  i32.add
                                  local.tee 5
                                  i32.store
                                  local.get 5
                                  i32.eqz
                                  br_if 14 (;@1;)
                                  br 3 (;@12;)
                                end
                                local.get 4
                                i32.load offset=68
                                local.tee 3
                                local.get 3
                                i32.load
                                i32.const 1
                                i32.add
                                local.tee 5
                                i32.store
                                local.get 5
                                i32.eqz
                                br_if 13 (;@1;)
                                br 1 (;@13;)
                              end
                              local.get 4
                              i32.load8_u offset=65
                              local.set 5
                            end
                            br 1 (;@11;)
                          end
                          local.get 4
                          i64.load32_u offset=72
                          local.set 8
                        end
                        local.get 4
                        i32.const 0
                        i32.store8 offset=344
                        local.get 4
                        local.get 8
                        i64.store offset=256
                        local.get 4
                        local.get 3
                        i32.store offset=252
                        local.get 4
                        local.get 5
                        i32.store8 offset=249
                        local.get 4
                        local.get 1
                        i32.store8 offset=248
                        local.get 4
                        i64.const 4294967296
                        i64.store offset=240
                        local.get 4
                        local.get 4
                        i32.const 344
                        i32.add
                        i32.store offset=264
                        local.get 4
                        local.get 4
                        i32.const 240
                        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>, 1>, 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=4
                        local.tee 1
                        i32.store offset=212
                        local.get 4
                        local.get 4
                        i32.load
                        local.tee 3
                        i32.store offset=208
                        block ;; label = @11
                          local.get 4
                          i32.load8_u offset=344
                          i32.const 1
                          i32.ne
                          br_if 0 (;@11;)
                          local.get 3
                          local.get 3
                          i32.load
                          i32.const -1
                          i32.add
                          local.tee 2
                          i32.store
                          local.get 2
                          br_if 7 (;@4;)
                          local.get 4
                          i32.const 208
                          i32.add
                          call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
                          br 7 (;@4;)
                        end
                        local.get 3
                        i32.eqz
                        br_if 6 (;@4;)
                        local.get 4
                        local.get 1
                        i32.store offset=216
                        local.get 4
                        local.get 3
                        i32.store offset=212
                        local.get 4
                        i32.const 6
                        i32.store8 offset=208
                        local.get 4
                        i32.const 240
                        i32.add
                        local.get 4
                        i32.const 176
                        i32.add
                        local.get 4
                        i32.const 208
                        i32.add
                        call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::call
                        local.get 4
                        local.get 4
                        i64.load offset=248
                        i64.store offset=96
                        local.get 4
                        local.get 4
                        i64.load offset=256
                        i64.store offset=104
                        block ;; label = @11
                          block ;; label = @12
                            local.get 4
                            i64.load offset=240
                            i64.const 1
                            i64.ne
                            br_if 0 (;@12;)
                            local.get 0
                            local.get 4
                            i64.load offset=104
                            i64.store offset=16
                            local.get 0
                            local.get 4
                            i64.load offset=96
                            i64.store offset=8
                            local.get 0
                            i64.const 1
                            i64.store
                            br 1 (;@11;)
                          end
                          local.get 4
                          local.get 4
                          i64.load offset=104
                          i64.store offset=120
                          local.get 4
                          local.get 4
                          i64.load offset=96
                          i64.store offset=112
                          local.get 4
                          i32.const 0
                          i32.store16 offset=184
                          local.get 4
                          i32.const 1067680
                          i32.store offset=180
                          local.get 4
                          i32.const 1067674
                          i32.store offset=176
                          local.get 4
                          i32.const 240
                          i32.add
                          local.get 4
                          i32.const 176
                          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 = @12
                            block ;; label = @13
                              block ;; label = @14
                                local.get 4
                                i32.load8_u offset=240
                                local.tee 3
                                i32.const 255
                                i32.ne
                                br_if 0 (;@14;)
                                local.get 4
                                local.get 4
                                i64.load offset=244 align=4
                                i64.store offset=212 align=4
                                local.get 4
                                i32.const 3
                                i32.store8 offset=208
                                local.get 4
                                i32.const 176
                                i32.add
                                local.get 4
                                i32.const 112
                                i32.add
                                local.get 4
                                i32.const 208
                                i32.add
                                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                                block ;; label = @15
                                  local.get 4
                                  i32.load8_u offset=176
                                  i32.const 255
                                  i32.ne
                                  br_if 0 (;@15;)
                                  local.get 0
                                  local.get 4
                                  i64.load offset=192
                                  i64.store offset=16
                                  local.get 0
                                  local.get 4
                                  i64.load offset=184
                                  i64.store offset=8
                                  local.get 0
                                  i64.const 1
                                  i64.store
                                  br 4 (;@11;)
                                end
                                local.get 4
                                local.get 4
                                i64.load offset=200
                                i64.store offset=264
                                local.get 4
                                local.get 4
                                i64.load offset=192
                                i64.store offset=256
                                local.get 4
                                local.get 4
                                i64.load offset=184
                                i64.store offset=248
                                local.get 4
                                local.get 4
                                i64.load offset=176
                                i64.store offset=240
                                local.get 4
                                i32.const 208
                                i32.add
                                local.get 4
                                i32.const 240
                                i32.add
                                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                                block ;; label = @15
                                  block ;; label = @16
                                    local.get 4
                                    i32.load8_u offset=208
                                    i32.const 255
                                    i32.eq
                                    br_if 0 (;@16;)
                                    local.get 4
                                    local.get 4
                                    i64.load offset=216
                                    i64.store offset=88
                                    local.get 4
                                    local.get 4
                                    i64.load offset=208
                                    i64.store offset=80
                                    br 1 (;@15;)
                                  end
                                  local.get 4
                                  i32.const 256
                                  i32.store16 offset=80
                                end
                                local.get 4
                                i32.const 240
                                i32.add
                                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                                local.get 4
                                i32.const 256
                                i32.add
                                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                                block ;; label = @15
                                  block ;; label = @16
                                    block ;; label = @17
                                      block ;; label = @18
                                        block ;; label = @19
                                          block ;; label = @20
                                            block ;; label = @21
                                              block ;; label = @22
                                                local.get 4
                                                i32.load8_u offset=64
                                                local.tee 1
                                                br_table 6 (;@16;) 6 (;@16;) 0 (;@22;) 1 (;@21;) 2 (;@20;) 3 (;@19;) 4 (;@18;) 5 (;@17;) 6 (;@16;)
                                              end
                                              local.get 4
                                              i64.load offset=72
                                              local.set 8
                                              br 9 (;@12;)
                                            end
                                            local.get 4
                                            i32.load offset=68
                                            local.tee 3
                                            local.get 3
                                            i32.load
                                            i32.const 1
                                            i32.add
                                            local.tee 5
                                            i32.store
                                            local.get 5
                                            i32.eqz
                                            br_if 19 (;@1;)
                                            br 7 (;@13;)
                                          end
                                          local.get 4
                                          i32.load offset=68
                                          local.tee 3
                                          local.get 3
                                          i32.load
                                          i32.const 1
                                          i32.add
                                          local.tee 5
                                          i32.store
                                          local.get 5
                                          i32.eqz
                                          br_if 18 (;@1;)
                                          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 8
                                          br 7 (;@12;)
                                        end
                                        local.get 4
                                        i32.load offset=68
                                        local.tee 3
                                        local.get 3
                                        i32.load
                                        i32.const 1
                                        i32.add
                                        local.tee 5
                                        i32.store
                                        local.get 5
                                        i32.eqz
                                        br_if 17 (;@1;)
                                        br 5 (;@13;)
                                      end
                                      local.get 4
                                      i32.load offset=68
                                      local.tee 3
                                      local.get 3
                                      i32.load
                                      i32.const 1
                                      i32.add
                                      local.tee 5
                                      i32.store
                                      local.get 5
                                      i32.eqz
                                      br_if 16 (;@1;)
                                      br 4 (;@13;)
                                    end
                                    local.get 4
                                    i32.load offset=68
                                    local.tee 3
                                    local.get 3
                                    i32.load
                                    i32.const 1
                                    i32.add
                                    local.tee 5
                                    i32.store
                                    local.get 5
                                    i32.eqz
                                    br_if 15 (;@1;)
                                    br 1 (;@15;)
                                  end
                                  local.get 4
                                  i32.load8_u offset=65
                                  local.set 5
                                end
                                br 2 (;@12;)
                              end
                              local.get 4
                              local.get 4
                              i32.load8_u offset=243
                              i32.store8 offset=211
                              local.get 4
                              local.get 4
                              i32.load16_u offset=241 align=1
                              i32.store16 offset=209 align=1
                              local.get 4
                              local.get 4
                              i32.load offset=252
                              i32.store offset=220
                              local.get 4
                              local.get 4
                              i64.load offset=244 align=4
                              i64.store offset=212 align=4
                              local.get 4
                              local.get 3
                              i32.store8 offset=208
                              i32.const 1065572
                              i32.const 43
                              local.get 4
                              i32.const 208
                              i32.add
                              i32.const 1065556
                              i32.const 1065616
                              call $core::result::unwrap_failed
                              unreachable
                            end
                            local.get 4
                            i64.load32_u offset=72
                            local.set 8
                          end
                          local.get 4
                          local.get 8
                          i64.store offset=136
                          local.get 4
                          local.get 3
                          i32.store offset=132
                          local.get 4
                          local.get 5
                          i32.store8 offset=129
                          local.get 4
                          local.get 1
                          i32.store8 offset=128
                          local.get 4
                          i32.const 0
                          i32.store16 offset=340
                          local.get 4
                          i32.const 1068026
                          i32.store offset=336
                          local.get 4
                          i32.const 1068025
                          i32.store offset=332
                          local.get 4
                          i32.const 240
                          i32.add
                          local.get 4
                          i32.const 332
                          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]>>"
                          local.get 4
                          i32.load8_u offset=240
                          local.tee 3
                          i32.const 255
                          i32.ne
                          br_if 6 (;@5;)
                          local.get 4
                          local.get 4
                          i64.load offset=244 align=4
                          i64.store offset=348 align=4
                          local.get 4
                          i32.const 3
                          i32.store8 offset=344
                          local.get 4
                          i32.const 208
                          i32.add
                          local.get 4
                          i32.const 128
                          i32.add
                          local.get 4
                          i32.const 344
                          i32.add
                          call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                          local.get 4
                          i32.load8_u offset=208
                          i32.const 255
                          i32.ne
                          br_if 3 (;@8;)
                          local.get 0
                          local.get 4
                          i64.load offset=224
                          i64.store offset=16
                          local.get 0
                          local.get 4
                          i64.load offset=216
                          i64.store offset=8
                          local.get 0
                          i64.const 1
                          i64.store
                          local.get 4
                          i32.const 80
                          i32.add
                          call $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
                        end
                        local.get 4
                        i32.const 64
                        i32.add
                        call $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
                      end
                      local.get 4
                      i32.const 48
                      i32.add
                      call $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
                    end
                    local.get 4
                    i32.const 32
                    i32.add
                    call $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<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
                    i32.eqz
                    br_if 1 (;@7;)
                    br 2 (;@6;)
                  end
                  local.get 4
                  local.get 4
                  i64.load offset=232
                  i64.store offset=264
                  local.get 4
                  local.get 4
                  i64.load offset=224
                  i64.store offset=256
                  local.get 4
                  local.get 4
                  i64.load offset=216
                  i64.store offset=248
                  local.get 4
                  local.get 4
                  i64.load offset=208
                  i64.store offset=240
                  local.get 4
                  i32.const 344
                  i32.add
                  local.get 4
                  i32.const 240
                  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=136
                      local.get 4
                      local.get 4
                      i64.load offset=344
                      i64.store offset=128
                      br 1 (;@8;)
                    end
                    local.get 4
                    i32.const 256
                    i32.store16 offset=128
                  end
                  local.get 4
                  i32.const 240
                  i32.add
                  call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 256
                  i32.add
                  call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 0
                  local.get 4
                  i32.const 80
                  i32.add
                  local.get 4
                  i32.const 128
                  i32.add
                  call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive> as core::ops::arith::Add>::add"
                  local.get 4
                  i32.const 64
                  i32.add
                  call $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 48
                  i32.add
                  call $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 32
                  i32.add
                  call $"#func639 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<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 (;@6;)
                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 368
              i32.add
              global.set $__stack_pointer
              return
            end
            local.get 4
            local.get 4
            i32.load8_u offset=243
            i32.store8 offset=211
            local.get 4
            local.get 4
            i32.load16_u offset=241 align=1
            i32.store16 offset=209 align=1
            local.get 4
            local.get 4
            i32.load offset=252
            i32.store offset=220
            local.get 4
            local.get 4
            i64.load offset=244 align=4
            i64.store offset=212 align=4
            local.get 4
            local.get 3
            i32.store8 offset=208
            i32.const 1065572
            i32.const 43
            local.get 4
            i32.const 208
            i32.add
            i32.const 1065556
            i32.const 1065616
            call $core::result::unwrap_failed
            unreachable
          end
          i32.const 1057428
          i32.const 43
          local.get 4
          i32.const 367
          i32.add
          i32.const 1057412
          i32.const 1057472
          call $core::result::unwrap_failed
          unreachable
        end
        i32.const 1057428
        i32.const 43
        local.get 4
        i32.const 367
        i32.add
        i32.const 1057412
        i32.const 1057472
        call $core::result::unwrap_failed
        unreachable
      end
      i32.const 1057428
      i32.const 43
      local.get 4
      i32.const 367
      i32.add
      i32.const 1057412
      i32.const 1057472
      call $core::result::unwrap_failed
      unreachable
    end
    unreachable
  )

Emergent Testing

Idle. Press Run to start the suite.

  • ./proof.f.mjs
  • ./proto-key/proof.f.mjs