Operators

Status: implemented

export default 1 + 2 * 3;

Beyond unary - (supported value types), the language has arithmetic (+ - * / % **), comparison (=== !== > >= < <=), and bitwise (& | ^ ~ << >> >>>) — Stage A, the first the language had — and, above them, the lazy operators (&& || ??) and the conditional (?:), Stage B — and ! and typeof, the logical not and the type tag, the prefixes neither stage had — and instanceof Array, the one instance check (below) — and "k" in o, the entry check with a literal key (below) — and the comma operator, written in parentheses (below). ==/!= stay refused, since neither language reads them the same way twice. Unary + is not in the language: the conversion to a number is Number(x) (number conversion). The EDAG admits every pure operation, unary + among them, and the language spells a subset of them; which is the language's decision, made on these pages, not the EDAG's.

Precedence and associativity follow JavaScript's own. From the tightest, the levels are the prefixes -, ~, ! and typeof; **; * / %; + -; the shifts << >> >>>; < <= > >= and instanceof; === !==; &; ^; |; &&; ||, with ?? a chain of its own at the same level; the conditional above them; and the comma above them all, in its parentheses. The shifts therefore sit between arithmetic and comparison, unlike & ^ |: 1 << 2 + 3 is 1 << (2 + 3) and 1 << 2 < 5 is (1 << 2) < 5. ** is right-associative (2 ** 3 ** 2 is 2 ** (3 ** 2)), the conditional nests to the right (a ? b : c ? d : e is a ? b : (c ? d : e)), and every other operator here is left-associative; a group overrides both (grouping). A prefix immediately before ** is refused, matching JavaScript exactly: -2 ** 2, ~2 ** 2, !2 ** 2 and typeof 2 ** 2 are syntax errors here as there, at any depth of prefix nesting, and parentheses are the only way to write either reading — (-2) ** 2 raises the negation, -(2 ** 2) negates the power. Immediately after ** a prefix needs no parentheses, since JavaScript reads the right operand of ** as another power or a UnaryExpression: 2 ** -2 is 2 ** (-2) and 2 ** ~2 is 2 ** (~2). The refusal holds inside that operand too, so 2 ** -2 ** 2 is a syntax error in both languages, as its right side -2 ** 2 is. ?? mixes with &&/|| only under parentheses, as in JavaScript: a ?? b || c and a && b ?? c are syntax errors in both, and (a ?? b) || c is the one spelling of that reading.

Each operator means what JavaScript's means and takes any value as an operand, converted exactly as JavaScript converts it — save a function's string, which the function-source representation exception governs. Arithmetic and bitwise operators convert each operand to a number, a bigint staying one: "5" - 2 is 3, true + true is 2, null + 1 is 1, and undefined + 1 and [1, 2] * 1 are NaN. + alone concatenates instead when either operand, made primitive, is a string — "a" + 1 is "a1", 1 + "2" is "12", "x" + null is "xnull" — and an array or an object is made primitive as JavaScript's ToPrimitive makes it: an array is its elements joined by ,, null and undefined as empty strings ([1] + [2] is "12", [1, [2, 3]] + "" is "1,2,3"), and an object is "[object Object]" unless it owns a valueOf or a toString, which is called as JavaScript calls it. Left associativity decides the rest: 1 + 2 + "3" is "33" and "1" + 2 + 3 is "123". < <= > >= compare by UTF-16 code unit when both operands, made primitive, are strings ("10" < "9" is true), and numerically otherwise ("10" < 9 is false, null >= 0 is true, undefined < 1 is false); ===/!== convert nothing. ! converts its operand as JavaScript's ToBoolean does and negates it: !0, !"", !null, !undefined and !NaN are true, and ![] and !{} are false, an array or an object being truthy however empty. typeof is the type tag of its operand, the string JavaScript gives: "undefined", "boolean", "number", "bigint", "string", "object" for null, an array and an object alike, and "function". typeof is a reserved word, so it names no const and no parameter, while { typeof: 1 } and a.typeof are a key and a property name as in JavaScript; the FunctionalScript writer spells it with a space after the word, typeof 1 and typeof (1+2). fjs/edag/operations owns each node's meaning, and the fjs/nanvm corpus checks its cases against a JavaScript engine.

A bigint stays exact. Over two of them the arithmetic and bitwise operators are integer operations of any size — 2n ** 64n and 1n << 70n are exact, 7n / 2n is 3n and -7n / 2n is -3n, truncated toward zero, -7n % 2n is -1n and ~5n is -6n — and < <= > >= weigh a bigint against a number by value (1n < 2, 3 > 2n and 1n <= 1.5 are true), while === never equates the two (1n === 1 is false). Where JavaScript throws, so does the operation here (failure is one outcome): a bigint mixed with a number in an arithmetic or bitwise operator (1 + 1n), >>> on a bigint, / or % by 0n, and a negative bigint exponent (2n ** -1n). A string still concatenates: "a" + 1n is "a1".

The lazy operators establish their right operand only when the left decides nothing — a && b's b when a is truthy, a || b's when a is falsy, a ?? b's when a is null or undefined — and yield the last operand they established, not a boolean (0 && 2 is 0, 1 && 2 is 2); the conditional establishes exactly one of its arms, as JavaScript does. A const reached only through such a position is still evaluated when the module loads, as its own statement: const c = null.x; export default [a && c, b && c]; throws at load in both languages, whatever a and b are. The failure contract says what an implementation may reorder around that; being reached only through a lazy position is not what decides whether a const runs.

The anchoring rule says which computations a module or a body holds, and is best read as a subtraction. Every const and every import starts as an operand of a comma, in source order, with the result last; then each operand is deleted that a later operand is guaranteed to evaluate through eager edges alone — a container's item, an access's base, a call's callee and its arguments, a prefix's operand, both operands of an eager binary operator and the left one of a lazy one, a conditional's condition, and a comma's operand (comma) — and never through a lazy one: the right operand of &&, || or ??, or a conditional's arm. const c = null.x; export default 1 + c; deletes c, the + evaluating it, where 1 && c keeps it. A function body is not lazy for this purpose, since constructing the function evaluates its frame. So const c = null.x; export default [a && c, b && c]; keeps c, [',', [c, ['[]', [['?:', a, c, a], ['?:', b, c, b]]]]], and throws at load as JavaScript does, where [c, a && c] deletes it, the array evaluating it first. The rule holds one level down too: an operand another unreached operand reaches only lazily is not deleted for it — const d = null.x; const c = a && d; export default b && c; keeps both d and c, since evaluating a && d as a root establishes d no more than b && c established c. Required FAST definitions are preserved by fjs/edag/from_fast under this rule.

Unparenthesized, a function is no operand of these operators, the conditional's condition included: (...a) => body reads everything to its right as body, exactly as in JavaScript, so 1 * (...a) => 2 is refused where 1 * (...a) runs out of value to read, and (...a) => 1 ? 2 : 3 is one function whose body is the conditional. A group makes a function an operand, the same way it does for -: 1 * ((...a) => 2) is a value, NaN, however little multiplying by a function is worth. The conditional's arms are the exception: each is a whole value, as in JavaScript, so a function stands in either bare, its body ending where : cannot continue it — 1 ? () => 2 : 3 is the function and then the else arm, and 0 ? 2 : () => 3 ? 4 : 5 is 0 ? 2 : () => (3 ? 4 : 5).

Unary - folds over an operand that lowers to a number or a bigint, exact and total arithmetic (numbers). AST-to-FAST lowering establishes the left operand of &&, || and ?? once in its original region, then uses conditionals. For a binding t of that value, t && b becomes t ? b : t, t || b becomes t ? t : b, and t ?? b becomes (t === null ? true : t === undefined) ? b : t. The undefined is the primitive value even when source code shadows its name. Every occurrence of t shares the same established value; the selected arm alone runs. Canonical EDAG has no logical-operator tags. Other operators reach EDAG as nodes, over numbers too (1 + 2, ~1). + would need ToPrimitive to decide number or string, and folding the rest while leaving + a node would draw an inconsistent line: fold what is exact, and leave what needs an assumption to the readers that want a value. Of the other outputs (output), the Rust one spells every operator, running a lazy operand or an arm only where JavaScript would, and calls an object's own valueOf or toString when conversion requires it. JSON and DataJS output evaluate these operators through the represented EDAG interpreter, then check whether the selected result belongs to their data format. The FunctionalScript writer, the .js output, spells canonical operators, with the parentheses its precedence and associativity ask for and no more — 1 + 2 * 3 and (1 + 2) * 3 come back as written, less the spaces, and (1 + 2) + 3 as 1+2+3; logical source operators return as conditionals; a prefix or a negative number on the left of ** is grouped, (-2)**2; a - before a text opening with - takes a space, 1- -2; a function under an operator, and an operator's text under an access, stand in a group, -(()=>1) and (1+2).x; a value shared under one lazy operand alone is written in a block of the operand's own (functions); and a comma's discarded operand is the const of the block it is anchored in (comma). Read back, that text is the graph it was written from. Graph output retains the operation, while value output retains its result: export default 1 + 2 * 3; is export default 1+2*3; as FunctionalScript, export default 7; as DataJS and 7 as JSON.

Pages

Refused by design, each page showing what fjs compile prints and what to write instead:

Examples

The compiler demo offers the programs index 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 — the arithmetic, bitwise, logical, typeof and conditional operators — 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) => [a[0] + 2 * 3, 7 % a[0], 2 ** a[0], ~a[0], !a[0], typeof a[0], a[0] > 1 ? "big" : "small"];

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) (Operators) as a function of one
 * number, for the page's WASM demo: the arithmetic, bitwise, logical,
 * `typeof` and conditional operators.
 *
 * @module
 */

/** @type {(...a: readonly number[]) => unknown} */
export default (...a) => [a[0] + 2 * 3, 7 % a[0], 2 ** a[0], ~a[0], !a[0], typeof a[0], a[0] > 1 ? "big" : "small"];

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

=>lengthbody0[][]0123456+leftright%leftright7.**leftright2.~operand!operandtypeofoperand?:condthenelse>"big""small".objidxrest0*leftright23.objidxrest0.objidxrest0.objidxrest0.objidxrest0.objidxrest0>leftright.1.objidxrest0

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

const $0=["rest"];export default ["{}",[[":","default",["=>",0,[],["[]",[["+",[".",$0,0],["*",2,3]],["%",7,[".",$0,0]],["**",2,[".",$0,0]],["~",[".",$0,0]],["!",[".",$0,0]],["typeof",[".",$0,0]],["?:",[">",[".",$0,0],1],"big","small"]]]]]]];

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, string_any, string_key};
use nanvm_lib::vm::{Any, Array, IStaticFunction, ToAny, ToArray, ToObject};

#[rustfmt::skip]
#[allow(clippy::if_same_then_else)]
pub fn module<A: IStaticFunction>(_runtime: Any<A>) -> Result<Any<A>, Any<A>> {
    Ok([(string_key("default"), A::static_function(|_self, _args| {
        let _b972: Any<A> = _args.rest(0).to_any();
        Ok([((Any::dot(_b972.clone(), f64_any(0x0000000000000000)).end())? + (f64_any(0x4000000000000000) * f64_any(0x4008000000000000))?)?, (f64_any(0x401c000000000000) % (Any::dot(_b972.clone(), f64_any(0x0000000000000000)).end())?)?, (Any::pow(f64_any(0x4000000000000000), (Any::dot(_b972.clone(), f64_any(0x0000000000000000)).end())?))?, (Any::bitwise_not((Any::dot(_b972.clone(), f64_any(0x0000000000000000)).end())?))?, (<Any<A> as core::ops::Not>::not((Any::dot(_b972.clone(), f64_any(0x0000000000000000)).end())?))?, (Any::typeof_((Any::dot(_b972.clone(), f64_any(0x0000000000000000)).end())?))?, if Any::<A>::to_boolean((Any::gt((Any::dot(_b972.clone(), f64_any(0x0000000000000000)).end())?, f64_any(0x3ff0000000000000)))?) { string_any("big") } else { string_any("small") }].to_array().to_any())
    }, 0, Array::default(), Some("(...$0)=>[$0[0]+2*3,7%$0[0],2**$0[0],~$0[0],!$0[0],typeof $0[0],$0[0]>1?\"big\":\"small\"]")).to_any())].to_object().to_any())
}

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

  (func $nanvm_demos::samples::operators::module::<nanvm_lib::naive::Naive> (;441;) (type 1) (param i32 i32)
    (local i32 i32 i32 i32 i32)
    global.get $__stack_pointer
    i32.const 96
    i32.sub
    local.tee 2
    global.set $__stack_pointer
    local.get 2
    i32.const 0
    i32.store16 offset=28
    local.get 2
    i32.const 1062863
    i32.store offset=24
    local.get 2
    i32.const 1062856
    i32.store offset=20
    local.get 2
    i32.const 48
    i32.add
    local.get 2
    i32.const 20
    i32.add
    call $"core::iter::adapters::try_process::<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>, u16, core::result::Result<core::convert::Infallible, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>, <core::result::Result<alloc::rc::Rc<[u16]>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>> as core::iter::traits::collect::FromIterator<core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>>::from_iter<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>>::{closure#0}, alloc::rc::Rc<[u16]>>"
    block ;; label = @1
      block ;; label = @2
        block ;; label = @3
          local.get 2
          i32.load8_u offset=48
          local.tee 3
          i32.const 255
          i32.ne
          br_if 0 (;@3;)
          local.get 2
          i32.load offset=56
          local.set 4
          local.get 2
          i32.load offset=52
          local.set 5
          local.get 2
          i32.const 0
          i32.store8 offset=32
          local.get 2
          i32.const 8
          i32.add
          local.get 2
          i32.const 32
          i32.add
          call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::iter::sources::empty::Empty<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>, core::result::Result<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>::to_rc_slice"
          local.get 2
          local.get 2
          i32.load offset=12
          local.tee 6
          i32.store offset=52
          local.get 2
          local.get 2
          i32.load offset=8
          local.tee 3
          i32.store offset=48
          block ;; label = @4
            local.get 2
            i32.load8_u offset=32
            i32.const 1
            i32.ne
            br_if 0 (;@4;)
            local.get 3
            local.get 3
            i32.load
            i32.const -1
            i32.add
            local.tee 0
            i32.store
            local.get 0
            br_if 3 (;@1;)
            local.get 2
            i32.const 48
            i32.add
            call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
            br 3 (;@1;)
          end
          local.get 3
          i32.eqz
          br_if 2 (;@1;)
          i32.const 93
          i32.const 0
          local.get 3
          local.get 6
          i32.const 1063006
          i32.const 86
          call $<nanvm_lib::naive::function::Function>::new
          local.set 3
          local.get 2
          i32.const 0
          i32.store8 offset=20
          local.get 2
          local.get 3
          i32.store offset=68
          local.get 2
          i32.const 7
          i32.store8 offset=64
          local.get 2
          local.get 4
          i32.store offset=60
          local.get 2
          local.get 5
          i32.store offset=56
          local.get 2
          i64.const 4294967296
          i64.store offset=48
          local.get 2
          local.get 2
          i32.const 20
          i32.add
          i32.store offset=80
          local.get 2
          local.get 2
          i32.const 48
          i32.add
          call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::array::iter::IntoIter<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>), 1>, core::result::Result<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>), ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)>>::to_rc_slice"
          local.get 2
          local.get 2
          i32.load offset=4
          local.tee 4
          i32.store offset=36
          local.get 2
          local.get 2
          i32.load
          local.tee 3
          i32.store offset=32
          block ;; label = @4
            local.get 2
            i32.load8_u offset=20
            i32.const 1
            i32.ne
            br_if 0 (;@4;)
            local.get 3
            local.get 3
            i32.load
            i32.const -1
            i32.add
            local.tee 0
            i32.store
            local.get 0
            br_if 2 (;@2;)
            local.get 2
            i32.const 32
            i32.add
            call $"<alloc::rc::Rc<[(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)]>>::drop_slow"
            br 2 (;@2;)
          end
          local.get 3
          i32.eqz
          br_if 1 (;@2;)
          local.get 0
          local.get 4
          i32.store offset=16
          local.get 0
          local.get 3
          i32.store offset=12
          local.get 0
          i32.const 5
          i32.store8 offset=8
          local.get 0
          i64.const 0
          i64.store
          local.get 1
          call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
          local.get 2
          i32.const 96
          i32.add
          global.set $__stack_pointer
          return
        end
        local.get 2
        local.get 2
        i32.load8_u offset=51
        i32.store8 offset=35
        local.get 2
        local.get 2
        i32.load16_u offset=49 align=1
        i32.store16 offset=33 align=1
        local.get 2
        local.get 2
        i32.load offset=60
        i32.store offset=44
        local.get 2
        local.get 2
        i64.load offset=52 align=4
        i64.store offset=36 align=4
        local.get 2
        local.get 3
        i32.store8 offset=32
        i32.const 1065572
        i32.const 43
        local.get 2
        i32.const 32
        i32.add
        i32.const 1065556
        i32.const 1065616
        call $core::result::unwrap_failed
        unreachable
      end
      i32.const 1057428
      i32.const 43
      local.get 2
      i32.const 95
      i32.add
      i32.const 1057412
      i32.const 1057472
      call $core::result::unwrap_failed
      unreachable
    end
    i32.const 1057428
    i32.const 43
    local.get 2
    i32.const 95
    i32.add
    i32.const 1057412
    i32.const 1057472
    call $core::result::unwrap_failed
    unreachable
  )
  (func $"<nanvm_demos::samples::operators::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" (;442;) (type 4) (param i32 i32 i32 i32)
    (local i32 i32 i32 i64)
    global.get $__stack_pointer
    i32.const 784
    i32.sub
    local.tee 4
    global.set $__stack_pointer
    local.get 4
    local.get 3
    i32.store offset=36
    local.get 4
    local.get 2
    i32.store offset=32
    local.get 2
    local.get 2
    i32.load
    local.tee 5
    i32.const 1
    i32.add
    local.tee 6
    i32.store
    block ;; label = @1
      block ;; label = @2
        block ;; label = @3
          block ;; label = @4
            local.get 6
            i32.eqz
            br_if 0 (;@4;)
            local.get 4
            local.get 3
            i32.store offset=48
            local.get 4
            local.get 2
            i32.store offset=44
            local.get 4
            i32.const 6
            i32.store8 offset=40
            local.get 2
            local.get 5
            i32.const 2
            i32.add
            local.tee 6
            i32.store
            local.get 6
            i32.eqz
            br_if 0 (;@4;)
            local.get 4
            local.get 2
            i32.store offset=676
            local.get 4
            i32.const 6
            i32.store8 offset=672
            local.get 4
            local.get 3
            i64.extend_i32_u
            i64.store offset=680
            local.get 4
            i64.const 0
            i64.store offset=744
            local.get 4
            i32.const 2
            i32.store8 offset=736
            local.get 4
            i32.const 512
            i32.add
            local.get 4
            i32.const 672
            i32.add
            local.get 4
            i32.const 736
            i32.add
            call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
            block ;; label = @5
              local.get 4
              i32.load8_u offset=512
              i32.const 255
              i32.ne
              br_if 0 (;@5;)
              local.get 0
              local.get 4
              i64.load offset=528
              i64.store offset=16
              local.get 0
              local.get 4
              i64.load offset=520
              i64.store offset=8
              local.get 0
              i64.const 1
              i64.store
              br 2 (;@3;)
            end
            local.get 4
            local.get 4
            i64.load offset=536
            i64.store offset=760
            local.get 4
            local.get 4
            i64.load offset=528
            i64.store offset=752
            local.get 4
            local.get 4
            i64.load offset=520
            i64.store offset=744
            local.get 4
            local.get 4
            i64.load offset=512
            i64.store offset=736
            local.get 4
            i32.const 672
            i32.add
            local.get 4
            i32.const 736
            i32.add
            call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
            block ;; label = @5
              block ;; label = @6
                local.get 4
                i32.load8_u offset=672
                i32.const 255
                i32.eq
                br_if 0 (;@6;)
                local.get 4
                local.get 4
                i64.load offset=680
                i64.store offset=616
                local.get 4
                local.get 4
                i64.load offset=672
                i64.store offset=608
                br 1 (;@5;)
              end
              local.get 4
              i32.const 256
              i32.store16 offset=608
            end
            local.get 4
            i32.const 736
            i32.add
            call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
            local.get 4
            i32.const 752
            i32.add
            call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
            local.get 4
            i64.const 4611686018427387904
            i64.store offset=648
            local.get 4
            i32.const 2
            i32.store8 offset=640
            local.get 4
            i64.const 4613937818241073152
            i64.store offset=680
            local.get 4
            i32.const 2
            i32.store8 offset=672
            local.get 4
            i32.const 736
            i32.add
            local.get 4
            i32.const 640
            i32.add
            local.get 4
            i32.const 672
            i32.add
            call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::numeric_op::<<nanvm_lib::vm::numeric::Numeric<nanvm_lib::naive::Naive> as core::ops::arith::Mul>::mul>"
            local.get 4
            local.get 4
            i64.load offset=744
            i64.store offset=200
            local.get 4
            local.get 4
            i64.load offset=752
            i64.store offset=208
            block ;; label = @5
              local.get 4
              i64.load offset=736
              i64.const 1
              i64.ne
              br_if 0 (;@5;)
              local.get 0
              local.get 4
              i64.load offset=208
              i64.store offset=16
              local.get 0
              local.get 4
              i64.load offset=200
              i64.store offset=8
              local.get 0
              i64.const 1
              i64.store
              local.get 4
              i32.const 608
              i32.add
              call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              br 2 (;@3;)
            end
            local.get 4
            local.get 4
            i64.load offset=208
            i64.store offset=224
            local.get 4
            local.get 4
            i64.load offset=200
            i64.store offset=216
            local.get 4
            i32.const 704
            i32.add
            local.get 4
            i32.const 608
            i32.add
            local.get 4
            i32.const 216
            i32.add
            call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive> as core::ops::arith::Add>::add"
            local.get 4
            local.get 4
            i64.load offset=712
            i64.store offset=184
            local.get 4
            local.get 4
            i64.load offset=720
            i64.store offset=192
            block ;; label = @5
              local.get 4
              i64.load offset=704
              i64.const 1
              i64.ne
              br_if 0 (;@5;)
              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 2 (;@3;)
            end
            local.get 4
            local.get 4
            i64.load offset=192
            i64.store offset=176
            local.get 4
            local.get 4
            i64.load offset=184
            i64.store offset=168
            local.get 4
            i64.const 4619567317775286272
            i64.store offset=648
            local.get 4
            i32.const 2
            i32.store8 offset=640
            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
                                local.get 4
                                i32.load8_u offset=40
                                local.tee 6
                                br_table 6 (;@8;) 6 (;@8;) 0 (;@14;) 1 (;@13;) 2 (;@12;) 3 (;@11;) 4 (;@10;) 5 (;@9;) 6 (;@8;)
                              end
                              local.get 4
                              i64.load offset=48
                              local.set 7
                              br 8 (;@5;)
                            end
                            local.get 4
                            i32.load offset=44
                            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 8 (;@4;)
                            br 6 (;@6;)
                          end
                          local.get 4
                          i32.load offset=44
                          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 7 (;@4;)
                          local.get 4
                          i64.load8_u offset=52
                          i64.const 32
                          i64.shl
                          local.get 4
                          i64.load32_u offset=48
                          i64.or
                          local.set 7
                          br 6 (;@5;)
                        end
                        local.get 4
                        i32.load offset=44
                        local.tee 3
                        local.get 3
                        i32.load
                        i32.const 1
                        i32.add
                        local.tee 5
                        i32.store
                        local.get 5
                        br_if 4 (;@6;)
                        br 6 (;@4;)
                      end
                      local.get 4
                      i32.load offset=44
                      local.tee 3
                      local.get 3
                      i32.load
                      i32.const 1
                      i32.add
                      local.tee 5
                      i32.store
                      local.get 5
                      br_if 3 (;@6;)
                      br 5 (;@4;)
                    end
                    local.get 4
                    i32.load offset=44
                    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 4 (;@4;)
                    br 1 (;@7;)
                  end
                  local.get 4
                  i32.load8_u offset=41
                  local.set 5
                end
                br 1 (;@5;)
              end
              local.get 4
              i64.load32_u offset=48
              local.set 7
            end
            local.get 4
            local.get 7
            i64.store offset=680
            local.get 4
            local.get 3
            i32.store offset=676
            local.get 4
            local.get 5
            i32.store8 offset=673
            local.get 4
            local.get 6
            i32.store8 offset=672
            local.get 4
            i64.const 0
            i64.store offset=744
            local.get 4
            i32.const 2
            i32.store8 offset=736
            local.get 4
            i32.const 544
            i32.add
            local.get 4
            i32.const 672
            i32.add
            local.get 4
            i32.const 736
            i32.add
            call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
            block ;; label = @5
              block ;; label = @6
                block ;; label = @7
                  local.get 4
                  i32.load8_u offset=544
                  i32.const 255
                  i32.ne
                  br_if 0 (;@7;)
                  local.get 0
                  local.get 4
                  i64.load offset=560
                  i64.store offset=16
                  local.get 0
                  local.get 4
                  i64.load offset=552
                  i64.store offset=8
                  local.get 0
                  i64.const 1
                  i64.store
                  local.get 4
                  i32.const 640
                  i32.add
                  call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  br 1 (;@6;)
                end
                local.get 4
                local.get 4
                i64.load offset=568
                i64.store offset=760
                local.get 4
                local.get 4
                i64.load offset=560
                i64.store offset=752
                local.get 4
                local.get 4
                i64.load offset=552
                i64.store offset=744
                local.get 4
                local.get 4
                i64.load offset=544
                i64.store offset=736
                local.get 4
                i32.const 672
                i32.add
                local.get 4
                i32.const 736
                i32.add
                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                block ;; label = @7
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=672
                    i32.const 255
                    i32.eq
                    br_if 0 (;@8;)
                    local.get 4
                    local.get 4
                    i64.load offset=680
                    i64.store offset=272
                    local.get 4
                    local.get 4
                    i64.load offset=672
                    i64.store offset=264
                    br 1 (;@7;)
                  end
                  local.get 4
                  i32.const 256
                  i32.store16 offset=264
                end
                local.get 4
                i32.const 736
                i32.add
                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                local.get 4
                i32.const 752
                i32.add
                call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                local.get 4
                i32.const 704
                i32.add
                local.get 4
                i32.const 640
                i32.add
                local.get 4
                i32.const 264
                i32.add
                call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::numeric_op::<<nanvm_lib::vm::numeric::Numeric<nanvm_lib::naive::Naive> as core::ops::arith::Rem>::rem>"
                local.get 4
                local.get 4
                i64.load offset=712
                i64.store offset=248
                local.get 4
                local.get 4
                i64.load offset=720
                i64.store offset=256
                block ;; label = @7
                  local.get 4
                  i64.load offset=704
                  i64.const 1
                  i64.ne
                  br_if 0 (;@7;)
                  local.get 0
                  local.get 4
                  i64.load offset=256
                  i64.store offset=16
                  local.get 0
                  local.get 4
                  i64.load offset=248
                  i64.store offset=8
                  local.get 0
                  i64.const 1
                  i64.store
                  br 1 (;@6;)
                end
                local.get 4
                local.get 4
                i64.load offset=256
                i64.store offset=240
                local.get 4
                local.get 4
                i64.load offset=248
                i64.store offset=232
                local.get 4
                i64.const 4611686018427387904
                i64.store offset=680
                local.get 4
                i32.const 2
                i32.store8 offset=672
                block ;; label = @7
                  block ;; label = @8
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    local.get 4
                                    i32.load8_u offset=40
                                    local.tee 6
                                    br_table 6 (;@10;) 6 (;@10;) 0 (;@16;) 1 (;@15;) 2 (;@14;) 3 (;@13;) 4 (;@12;) 5 (;@11;) 6 (;@10;)
                                  end
                                  local.get 4
                                  i64.load offset=48
                                  local.set 7
                                  br 8 (;@7;)
                                end
                                local.get 4
                                i32.load offset=44
                                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 10 (;@4;)
                                br 6 (;@8;)
                              end
                              local.get 4
                              i32.load offset=44
                              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 9 (;@4;)
                              local.get 4
                              i64.load8_u offset=52
                              i64.const 32
                              i64.shl
                              local.get 4
                              i64.load32_u offset=48
                              i64.or
                              local.set 7
                              br 6 (;@7;)
                            end
                            local.get 4
                            i32.load offset=44
                            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 8 (;@4;)
                            br 4 (;@8;)
                          end
                          local.get 4
                          i32.load offset=44
                          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 7 (;@4;)
                          br 3 (;@8;)
                        end
                        local.get 4
                        i32.load offset=44
                        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 6 (;@4;)
                        br 1 (;@9;)
                      end
                      local.get 4
                      i32.load8_u offset=41
                      local.set 5
                    end
                    br 1 (;@7;)
                  end
                  local.get 4
                  i64.load32_u offset=48
                  local.set 7
                end
                local.get 4
                local.get 7
                i64.store offset=712
                local.get 4
                local.get 3
                i32.store offset=708
                local.get 4
                local.get 5
                i32.store8 offset=705
                local.get 4
                local.get 6
                i32.store8 offset=704
                local.get 4
                i64.const 0
                i64.store offset=744
                local.get 4
                i32.const 2
                i32.store8 offset=736
                local.get 4
                i32.const 576
                i32.add
                local.get 4
                i32.const 704
                i32.add
                local.get 4
                i32.const 736
                i32.add
                call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                block ;; label = @7
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=576
                    i32.const 255
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 0
                    local.get 4
                    i64.load offset=592
                    i64.store offset=16
                    local.get 0
                    local.get 4
                    i64.load offset=584
                    i64.store offset=8
                    local.get 0
                    i64.const 1
                    i64.store
                    local.get 4
                    i32.const 672
                    i32.add
                    call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    br 1 (;@7;)
                  end
                  local.get 4
                  local.get 4
                  i64.load offset=600
                  i64.store offset=760
                  local.get 4
                  local.get 4
                  i64.load offset=592
                  i64.store offset=752
                  local.get 4
                  local.get 4
                  i64.load offset=584
                  i64.store offset=744
                  local.get 4
                  local.get 4
                  i64.load offset=576
                  i64.store offset=736
                  local.get 4
                  i32.const 704
                  i32.add
                  local.get 4
                  i32.const 736
                  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=704
                      i32.const 255
                      i32.eq
                      br_if 0 (;@9;)
                      local.get 4
                      local.get 4
                      i64.load offset=712
                      i64.store offset=328
                      local.get 4
                      local.get 4
                      i64.load offset=704
                      i64.store offset=320
                      br 1 (;@8;)
                    end
                    local.get 4
                    i32.const 256
                    i32.store16 offset=320
                  end
                  local.get 4
                  i32.const 296
                  i32.add
                  i32.const 8
                  i32.add
                  local.set 3
                  local.get 4
                  i32.const 736
                  i32.add
                  call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 752
                  i32.add
                  call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 296
                  i32.add
                  local.get 4
                  i32.const 672
                  i32.add
                  local.get 4
                  i32.const 320
                  i32.add
                  call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::numeric_op::<<nanvm_lib::vm::numeric::Numeric<nanvm_lib::naive::Naive>>::pow>
                  block ;; label = @8
                    local.get 4
                    i64.load offset=296
                    i64.const 1
                    i64.ne
                    br_if 0 (;@8;)
                    local.get 0
                    i64.const 1
                    i64.store
                    local.get 0
                    local.get 3
                    i64.load offset=8
                    i64.store offset=16
                    local.get 0
                    local.get 3
                    i64.load
                    i64.store offset=8
                    br 1 (;@7;)
                  end
                  local.get 4
                  local.get 3
                  i64.load offset=8
                  i64.store offset=288
                  local.get 4
                  local.get 3
                  i64.load
                  i64.store offset=280
                  local.get 4
                  i32.const 704
                  i32.add
                  local.get 4
                  i32.const 40
                  i32.add
                  call $"#func463 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                  local.get 4
                  i64.const 0
                  i64.store offset=744
                  local.get 4
                  i32.const 2
                  i32.store8 offset=736
                  local.get 4
                  i32.const 608
                  i32.add
                  local.get 4
                  i32.const 704
                  i32.add
                  local.get 4
                  i32.const 736
                  i32.add
                  call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                  block ;; label = @8
                    block ;; label = @9
                      local.get 4
                      i32.load8_u offset=608
                      i32.const 255
                      i32.ne
                      br_if 0 (;@9;)
                      local.get 0
                      local.get 4
                      i64.load offset=624
                      i64.store offset=16
                      local.get 0
                      local.get 4
                      i64.load offset=616
                      i64.store offset=8
                      local.get 0
                      i64.const 1
                      i64.store
                      br 1 (;@8;)
                    end
                    local.get 4
                    i32.const 352
                    i32.add
                    i32.const 8
                    i32.add
                    local.set 3
                    local.get 4
                    local.get 4
                    i64.load offset=632
                    i64.store offset=760
                    local.get 4
                    local.get 4
                    i64.load offset=624
                    i64.store offset=752
                    local.get 4
                    local.get 4
                    i64.load offset=616
                    i64.store offset=744
                    local.get 4
                    local.get 4
                    i64.load offset=608
                    i64.store offset=736
                    local.get 4
                    i32.const 376
                    i32.add
                    local.get 4
                    i32.const 736
                    i32.add
                    call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::read
                    local.get 4
                    i32.const 352
                    i32.add
                    local.get 4
                    i32.const 376
                    i32.add
                    call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::bitwise_not
                    block ;; label = @9
                      local.get 4
                      i64.load offset=352
                      i64.const 1
                      i64.ne
                      br_if 0 (;@9;)
                      local.get 0
                      i64.const 1
                      i64.store
                      local.get 0
                      local.get 3
                      i64.load offset=8
                      i64.store offset=16
                      local.get 0
                      local.get 3
                      i64.load
                      i64.store offset=8
                      br 1 (;@8;)
                    end
                    local.get 4
                    local.get 3
                    i64.load offset=8
                    i64.store offset=344
                    local.get 4
                    local.get 3
                    i64.load
                    i64.store offset=336
                    local.get 4
                    i32.const 704
                    i32.add
                    local.get 4
                    i32.const 40
                    i32.add
                    call $"#func463 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                    local.get 4
                    i64.const 0
                    i64.store offset=744
                    local.get 4
                    i32.const 2
                    i32.store8 offset=736
                    local.get 4
                    i32.const 640
                    i32.add
                    local.get 4
                    i32.const 704
                    i32.add
                    local.get 4
                    i32.const 736
                    i32.add
                    call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                    block ;; label = @9
                      local.get 4
                      i32.load8_u offset=640
                      i32.const 255
                      i32.ne
                      br_if 0 (;@9;)
                      local.get 0
                      local.get 4
                      i64.load offset=656
                      i64.store offset=16
                      local.get 0
                      local.get 4
                      i64.load offset=648
                      i64.store offset=8
                      local.get 0
                      i64.const 1
                      i64.store
                      local.get 4
                      i32.const 336
                      i32.add
                      call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                      br 1 (;@8;)
                    end
                    local.get 4
                    local.get 4
                    i64.load offset=664
                    i64.store offset=760
                    local.get 4
                    local.get 4
                    i64.load offset=656
                    i64.store offset=752
                    local.get 4
                    local.get 4
                    i64.load offset=648
                    i64.store offset=744
                    local.get 4
                    local.get 4
                    i64.load offset=640
                    i64.store offset=736
                    local.get 4
                    i32.const 408
                    i32.add
                    local.get 4
                    i32.const 736
                    i32.add
                    call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::read
                    local.get 4
                    i32.const 408
                    i32.add
                    call $<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>::dispatch::<nanvm_lib::vm::boolean_coercion::BooleanCoercion>
                    local.set 3
                    local.get 4
                    i32.const 1
                    i32.store8 offset=392
                    local.get 4
                    local.get 3
                    i32.const 1
                    i32.xor
                    i32.store8 offset=393
                    local.get 4
                    i32.const 704
                    i32.add
                    local.get 4
                    i32.const 40
                    i32.add
                    call $"#func463 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                    local.get 4
                    i64.const 0
                    i64.store offset=744
                    local.get 4
                    i32.const 2
                    i32.store8 offset=736
                    local.get 4
                    i32.const 672
                    i32.add
                    local.get 4
                    i32.const 704
                    i32.add
                    local.get 4
                    i32.const 736
                    i32.add
                    call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                    block ;; label = @9
                      block ;; label = @10
                        local.get 4
                        i32.load8_u offset=672
                        i32.const 255
                        i32.ne
                        br_if 0 (;@10;)
                        local.get 0
                        local.get 4
                        i64.load offset=688
                        i64.store offset=16
                        local.get 0
                        local.get 4
                        i64.load offset=680
                        i64.store offset=8
                        local.get 0
                        i64.const 1
                        i64.store
                        br 1 (;@9;)
                      end
                      local.get 4
                      i32.const 440
                      i32.add
                      i32.const 8
                      i32.add
                      local.set 3
                      local.get 4
                      local.get 4
                      i64.load offset=696
                      i64.store offset=760
                      local.get 4
                      local.get 4
                      i64.load offset=688
                      i64.store offset=752
                      local.get 4
                      local.get 4
                      i64.load offset=680
                      i64.store offset=744
                      local.get 4
                      local.get 4
                      i64.load offset=672
                      i64.store offset=736
                      local.get 4
                      i32.const 464
                      i32.add
                      local.get 4
                      i32.const 736
                      i32.add
                      call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::read
                      local.get 4
                      i32.const 440
                      i32.add
                      local.get 4
                      i32.const 464
                      i32.add
                      call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::typeof_
                      block ;; label = @10
                        local.get 4
                        i64.load offset=440
                        i64.const 1
                        i64.ne
                        br_if 0 (;@10;)
                        local.get 0
                        i64.const 1
                        i64.store
                        local.get 0
                        local.get 3
                        i64.load offset=8
                        i64.store offset=16
                        local.get 0
                        local.get 3
                        i64.load
                        i64.store offset=8
                        br 1 (;@9;)
                      end
                      local.get 4
                      local.get 3
                      i64.load offset=8
                      i64.store offset=432
                      local.get 4
                      local.get 3
                      i64.load
                      i64.store offset=424
                      local.get 4
                      i32.const 768
                      i32.add
                      local.get 4
                      i32.const 40
                      i32.add
                      call $"#func463 <nanvm_lib::naive::Naive as core::clone::Clone>::clone"
                      local.get 4
                      i64.const 0
                      i64.store offset=744
                      local.get 4
                      i32.const 2
                      i32.store8 offset=736
                      local.get 4
                      i32.const 704
                      i32.add
                      local.get 4
                      i32.const 768
                      i32.add
                      local.get 4
                      i32.const 736
                      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=704
                          i32.const 255
                          i32.ne
                          br_if 0 (;@11;)
                          local.get 4
                          i32.const 712
                          i32.add
                          local.set 3
                          br 1 (;@10;)
                        end
                        local.get 4
                        local.get 4
                        i64.load offset=728
                        i64.store offset=760
                        local.get 4
                        local.get 4
                        i64.load offset=720
                        i64.store offset=752
                        local.get 4
                        local.get 4
                        i64.load offset=712
                        i64.store offset=744
                        local.get 4
                        local.get 4
                        i64.load offset=704
                        i64.store offset=736
                        local.get 4
                        i32.const 480
                        i32.add
                        local.get 4
                        i32.const 736
                        i32.add
                        call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::read
                        local.get 4
                        i64.const 4607182418800017408
                        i64.store offset=504
                        local.get 4
                        i32.const 2
                        i32.store8 offset=496
                        local.get 4
                        i32.const 736
                        i32.add
                        local.get 4
                        i32.const 480
                        i32.add
                        local.get 4
                        i32.const 496
                        i32.add
                        call $nanvm_lib::vm::any::relational::compare::<nanvm_lib::naive::Naive>
                        local.get 4
                        i32.load8_u offset=737
                        local.set 6
                        local.get 4
                        i32.load8_u offset=736
                        local.tee 5
                        i32.const 255
                        i32.eq
                        br_if 5 (;@5;)
                        local.get 4
                        local.get 4
                        i64.load offset=744 align=2
                        i64.store offset=776 align=2
                        local.get 4
                        local.get 4
                        i64.load offset=738 align=2
                        i64.store offset=770 align=2
                        local.get 4
                        local.get 6
                        i32.store8 offset=769
                        local.get 4
                        local.get 5
                        i32.store8 offset=768
                        local.get 4
                        i32.const 768
                        i32.add
                        local.set 3
                      end
                      local.get 0
                      i64.const 1
                      i64.store
                      local.get 0
                      local.get 3
                      i64.load offset=8
                      i64.store offset=16
                      local.get 0
                      local.get 3
                      i64.load
                      i64.store offset=8
                      local.get 4
                      i32.const 424
                      i32.add
                      call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    end
                    local.get 4
                    i32.const 392
                    i32.add
                    call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    local.get 4
                    i32.const 336
                    i32.add
                    call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  end
                  local.get 4
                  i32.const 280
                  i32.add
                  call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                end
                local.get 4
                i32.const 232
                i32.add
                call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              end
              local.get 4
              i32.const 168
              i32.add
              call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              br 2 (;@3;)
            end
            local.get 4
            i32.const 1
            i32.store8 offset=768
            local.get 4
            local.get 6
            i32.const 255
            i32.and
            i32.const 1
            i32.eq
            i32.store8 offset=769
            block ;; label = @5
              block ;; label = @6
                local.get 4
                i32.const 768
                i32.add
                call $<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>::dispatch::<nanvm_lib::vm::boolean_coercion::BooleanCoercion>
                br_if 0 (;@6;)
                local.get 4
                i32.const 24
                i32.add
                i32.const 1063245
                i32.const 5
                call $"<nanvm_lib::vm::string::String<nanvm_lib::naive::Naive> as core::convert::From<&str>>::from"
                local.get 4
                i32.load offset=28
                local.set 6
                local.get 4
                i32.load offset=24
                local.set 5
                br 1 (;@5;)
              end
              local.get 4
              i32.const 16
              i32.add
              i32.const 1063250
              i32.const 3
              call $"<nanvm_lib::vm::string::String<nanvm_lib::naive::Naive> as core::convert::From<&str>>::from"
              local.get 4
              i32.load offset=20
              local.set 6
              local.get 4
              i32.load offset=16
              local.set 5
            end
            local.get 4
            local.get 4
            i64.load offset=176
            i64.store offset=64
            local.get 4
            local.get 4
            i64.load offset=168
            i64.store offset=56
            local.get 4
            local.get 4
            i64.load offset=232
            i64.store offset=72
            local.get 4
            local.get 4
            i64.load offset=240
            i64.store offset=80
            local.get 4
            local.get 4
            i64.load offset=280
            i64.store offset=88
            local.get 4
            local.get 4
            i64.load offset=288
            i64.store offset=96
            local.get 4
            local.get 4
            i64.load offset=336
            i64.store offset=104
            local.get 4
            local.get 4
            i64.load offset=344
            i64.store offset=112
            local.get 4
            local.get 4
            i64.load offset=400
            i64.store offset=128
            local.get 4
            local.get 4
            i64.load offset=392
            i64.store offset=120
            local.get 4
            local.get 6
            i32.store offset=160
            local.get 4
            i32.const 3
            i32.store8 offset=152
            local.get 4
            local.get 5
            i32.store offset=156
            local.get 4
            local.get 3
            i64.load offset=8
            i64.store offset=144
            local.get 4
            local.get 3
            i64.load
            i64.store offset=136
            local.get 4
            i32.const 8
            i32.add
            local.get 4
            i32.const 56
            i32.add
            call $"<nanvm_lib::naive::container::Container<(), nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>> as nanvm_lib::vm::internal::icontainer::IContainer<nanvm_lib::naive::Naive>>::new_ok::<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>; 7]>"
            local.get 0
            local.get 4
            i64.load offset=8
            i64.store offset=12 align=4
            local.get 0
            i32.const 6
            i32.store8 offset=8
            local.get 0
            i64.const 0
            i64.store
            local.get 4
            i32.const 40
            i32.add
            call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
            local.get 2
            local.get 2
            i32.load
            i32.const -1
            i32.add
            local.tee 3
            i32.store
            local.get 3
            br_if 3 (;@1;)
            br 2 (;@2;)
          end
          unreachable
        end
        local.get 4
        i32.const 40
        i32.add
        call $"#func432 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
        local.get 2
        local.get 2
        i32.load
        i32.const -1
        i32.add
        local.tee 3
        i32.store
        local.get 3
        br_if 1 (;@1;)
      end
      local.get 4
      i32.const 32
      i32.add
      call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
    end
    local.get 4
    i32.const 784
    i32.add
    global.set $__stack_pointer
  )

Emergent Testing

Idle. Press Run to start the suite.

  • ./comma/proof.f.mjs
  • ./grouping/proof.f.mjs
  • ./in/computed-key/proof.f.mjs
  • ./in/proof.f.mjs
  • ./instanceof/other-classes/proof.f.mjs
  • ./instanceof/proof.f.mjs
  • ./loose-equality/proof.f.mjs
  • ./proof.f.mjs
  • ./this/proof.f.mjs