Bigints

Status: implemented

A bigint is written as a number's integer part — 0, or digits not starting with 0 — followed directly by a lowercase n: 0n, 34n, 123456789012345678901234567890n. Like a number it is unsigned: -34n is the unary minus applied to 34n, which lowering folds into the leaf -34n as it folds a negated number, and -0n is 0n, since a bigint has no negative zero, as in JavaScript.

export default [0n, 34n, -34n];

A hexadecimal integer part, as a number writes it, takes the n too: 0x10n is 16n and 0XFFn is 255n, exact at any width, and -0x8000000000000000n folds into the leaf -9223372036854775808n. An output writes 0x10n exactly as it writes 16n, and one that refuses a bigint refuses it whatever its spelling: .json refuses every one.

export default [0x10n, 0XFFn, -0x8000000000000000n];

A binary integer part also takes n: 0b101n and 0B101n are 5n. Numeric separators may occur between digits in every admitted base, 1_000n, 0xFF_FFn and 0b1010_0011n, under the same separator rules as numbers. Values remain exact at any width and outputs use decimal.

The syntax is those integer parts and the n, so the JavaScript spellings it leaves out are not recognized: no octal prefix (0o7n). A fraction or an exponent (1.5n, 1e3n), a leading zero (01n) and an uppercase N are errors in both languages. JSON has no spelling for a bigint, so a .json output refuses one (output).

Examples

The compiler demo has no programs for this page yet: its accepted and refused examples are a follow-up.

The demo on this page runs sample.f.js, this page's example as a function of one number — bigint literals, arithmetic on one, and its typeof — 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 0, 1 and 2, as JavaScript and as WebAssembly, and shows what each call returned or threw.

export default (...a) => [[0n, 34n, -34n][Number(a[0])] * 2n, typeof 34n];

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 0, then 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) (Bigints) as a function of one
 * number, for the page's WASM demo: `bigint` literals, arithmetic on one,
 * and its `typeof`.
 *
 * @module
 */

/** @type {(...a: readonly number[]) => unknown} */
export default (...a) => [[0n, 34n, -34n][Number(a[0])] * 2n, typeof 34n];

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

=>lengthbody0[][]01*leftright.2ntypeofoperand34n.objidx[]0120n34n-34nNumberoperand.objidxrest0

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

export default ["{}",[[":","default",["=>",0,[],["[]",[["*",[".",["[]",[0n,34n,-34n]],["Number",[".",["rest"],0]]],2n],["typeof",34n]]]]]]];

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::{bigint_any, f64_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 _b362: Any<A> = _args.rest(0).to_any();
        Ok([((Any::dot([bigint_any(0), bigint_any(34), bigint_any(-34)].to_array().to_any(), (Any::number((Any::dot(_b362.clone(), f64_any(0x0000000000000000)).end())?))?).end())? * bigint_any(2))?, (Any::typeof_(bigint_any(34)))?].to_array().to_any())
    }, 0, Array::default(), Some("(...$0)=>[[0n,34n,-34n][Number($0[0])]*2n,typeof 34n]")).to_any())].to_object().to_any())
}

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

  (func $nanvm_demos::samples::bigints::module::<nanvm_lib::naive::Naive> (;722;) (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 1068586
    i32.store offset=24
    local.get 2
    i32.const 1068579
    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 212
          i32.const 0
          local.get 3
          local.get 6
          i32.const 1068586
          i32.const 53
          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 $"#func697 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::bigints::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" (;723;) (type 4) (param i32 i32 i32 i32)
    (local i32 i32 i32 i32 i32 i32 i64 f64)
    global.get $__stack_pointer
    i32.const 352
    i32.sub
    local.tee 4
    global.set $__stack_pointer
    local.get 4
    local.get 3
    i32.store offset=76
    local.get 4
    local.get 2
    i32.store offset=72
    local.get 2
    local.get 2
    i32.load
    i32.const 1
    i32.add
    local.tee 5
    i32.store
    block ;; label = @1
      block ;; label = @2
        block ;; label = @3
          block ;; label = @4
            block ;; label = @5
              block ;; label = @6
                block ;; label = @7
                  local.get 5
                  i32.eqz
                  br_if 0 (;@7;)
                  local.get 4
                  local.get 3
                  i32.store offset=88
                  local.get 4
                  local.get 2
                  i32.store offset=84
                  local.get 4
                  i32.const 6
                  i32.store8 offset=80
                  local.get 4
                  i32.const 0
                  i32.store8 offset=216
                  local.get 4
                  i32.const 64
                  i32.add
                  local.get 4
                  i32.const 216
                  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 4
                  local.get 4
                  i32.load offset=68
                  local.tee 6
                  i32.store offset=252
                  local.get 4
                  local.get 4
                  i32.load offset=64
                  local.tee 3
                  i32.store offset=248
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=216
                    i32.const 1
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 3
                    local.get 3
                    i32.load
                    i32.const -1
                    i32.add
                    local.tee 2
                    i32.store
                    local.get 2
                    br_if 7 (;@1;)
                    local.get 4
                    i32.const 248
                    i32.add
                    call $"<alloc::rc::Rc<[u64]>>::drop_slow"
                    br 7 (;@1;)
                  end
                  local.get 3
                  i32.eqz
                  br_if 6 (;@1;)
                  local.get 4
                  i32.const 0
                  i32.store8 offset=184
                  local.get 4
                  i64.const 34
                  i64.store offset=256
                  local.get 4
                  i64.const 1
                  i64.store offset=248
                  local.get 4
                  local.get 4
                  i32.const 184
                  i32.add
                  i32.store offset=264
                  local.get 4
                  i32.const 56
                  i32.add
                  local.get 4
                  i32.const 248
                  i32.add
                  call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::iter::sources::once::Once<u64>, core::result::Result<u64, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<u64>>::to_rc_slice"
                  local.get 4
                  local.get 4
                  i32.load offset=60
                  local.tee 7
                  i32.store offset=220
                  local.get 4
                  local.get 4
                  i32.load offset=56
                  local.tee 5
                  i32.store offset=216
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=184
                    i32.const 1
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 5
                    local.get 5
                    i32.load
                    i32.const -1
                    i32.add
                    local.tee 2
                    i32.store
                    local.get 2
                    br_if 6 (;@2;)
                    local.get 4
                    i32.const 216
                    i32.add
                    call $"<alloc::rc::Rc<[u64]>>::drop_slow"
                    br 6 (;@2;)
                  end
                  local.get 5
                  i32.eqz
                  br_if 5 (;@2;)
                  local.get 4
                  i32.const 0
                  i32.store8 offset=184
                  local.get 4
                  i64.const 34
                  i64.store offset=256
                  local.get 4
                  i64.const 1
                  i64.store offset=248
                  local.get 4
                  local.get 4
                  i32.const 184
                  i32.add
                  i32.store offset=264
                  local.get 4
                  i32.const 48
                  i32.add
                  local.get 4
                  i32.const 248
                  i32.add
                  call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::iter::sources::once::Once<u64>, core::result::Result<u64, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<u64>>::to_rc_slice"
                  local.get 4
                  local.get 4
                  i32.load offset=52
                  local.tee 8
                  i32.store offset=220
                  local.get 4
                  local.get 4
                  i32.load offset=48
                  local.tee 9
                  i32.store offset=216
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=184
                    i32.const 1
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 9
                    local.get 9
                    i32.load
                    i32.const -1
                    i32.add
                    local.tee 2
                    i32.store
                    local.get 2
                    br_if 5 (;@3;)
                    local.get 4
                    i32.const 216
                    i32.add
                    call $"<alloc::rc::Rc<[u64]>>::drop_slow"
                    br 5 (;@3;)
                  end
                  local.get 9
                  i32.eqz
                  br_if 4 (;@3;)
                  local.get 4
                  i32.const 0
                  i32.store8 offset=184
                  local.get 4
                  i32.const 255
                  i32.store8 offset=300
                  local.get 4
                  local.get 8
                  i32.store offset=296
                  local.get 4
                  local.get 9
                  i32.store offset=292
                  local.get 4
                  i32.const 4
                  i32.store8 offset=288
                  local.get 4
                  i32.const 1
                  i32.store8 offset=284
                  local.get 4
                  local.get 7
                  i32.store offset=280
                  local.get 4
                  local.get 5
                  i32.store offset=276
                  local.get 4
                  i32.const 4
                  i32.store8 offset=272
                  local.get 4
                  i32.const 1
                  i32.store8 offset=268
                  local.get 4
                  local.get 6
                  i32.store offset=264
                  local.get 4
                  local.get 3
                  i32.store offset=260
                  local.get 4
                  i32.const 4
                  i32.store8 offset=256
                  local.get 4
                  i64.const 12884901888
                  i64.store offset=248
                  local.get 4
                  local.get 4
                  i32.const 184
                  i32.add
                  i32.store offset=304
                  local.get 4
                  i32.const 40
                  i32.add
                  local.get 4
                  i32.const 248
                  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>, 3>, 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=44
                  local.tee 5
                  i32.store offset=220
                  local.get 4
                  local.get 4
                  i32.load offset=40
                  local.tee 3
                  i32.store offset=216
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=184
                    i32.const 1
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 3
                    local.get 3
                    i32.load
                    i32.const -1
                    i32.add
                    local.tee 2
                    i32.store
                    local.get 2
                    br_if 4 (;@4;)
                    local.get 4
                    i32.const 216
                    i32.add
                    call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
                    br 4 (;@4;)
                  end
                  local.get 3
                  i32.eqz
                  br_if 3 (;@4;)
                  local.get 4
                  local.get 5
                  i32.store offset=336
                  local.get 4
                  local.get 3
                  i32.store offset=332
                  local.get 4
                  i32.const 6
                  i32.store8 offset=328
                  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 4
                                  i32.load8_u offset=80
                                  local.tee 5
                                  br_table 6 (;@9;) 6 (;@9;) 0 (;@15;) 1 (;@14;) 2 (;@13;) 3 (;@12;) 4 (;@11;) 5 (;@10;) 6 (;@9;)
                                end
                                local.get 4
                                i64.load offset=88
                                local.set 10
                                br 9 (;@5;)
                              end
                              local.get 4
                              i32.load offset=84
                              local.tee 3
                              local.get 3
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 9
                              i32.store
                              local.get 9
                              i32.eqz
                              br_if 6 (;@7;)
                              br 7 (;@6;)
                            end
                            local.get 4
                            i32.load offset=84
                            local.tee 3
                            local.get 3
                            i32.load
                            i32.const 1
                            i32.add
                            local.tee 9
                            i32.store
                            local.get 9
                            i32.eqz
                            br_if 5 (;@7;)
                            local.get 4
                            i64.load8_u offset=92
                            i64.const 32
                            i64.shl
                            local.get 4
                            i64.load32_u offset=88
                            i64.or
                            local.set 10
                            br 7 (;@5;)
                          end
                          local.get 4
                          i32.load offset=84
                          local.tee 3
                          local.get 3
                          i32.load
                          i32.const 1
                          i32.add
                          local.tee 9
                          i32.store
                          local.get 9
                          br_if 5 (;@6;)
                          br 4 (;@7;)
                        end
                        local.get 4
                        i32.load offset=84
                        local.tee 3
                        local.get 3
                        i32.load
                        i32.const 1
                        i32.add
                        local.tee 9
                        i32.store
                        local.get 9
                        br_if 4 (;@6;)
                        br 3 (;@7;)
                      end
                      local.get 4
                      i32.load offset=84
                      local.tee 3
                      local.get 3
                      i32.load
                      i32.const 1
                      i32.add
                      local.tee 9
                      i32.store
                      local.get 9
                      i32.eqz
                      br_if 2 (;@7;)
                      br 1 (;@8;)
                    end
                    local.get 4
                    i32.load8_u offset=81
                    local.set 9
                  end
                  br 2 (;@5;)
                end
                unreachable
              end
              local.get 4
              i64.load32_u offset=88
              local.set 10
            end
            local.get 4
            local.get 10
            i64.store offset=224
            local.get 4
            local.get 3
            i32.store offset=220
            local.get 4
            local.get 9
            i32.store8 offset=217
            local.get 4
            local.get 5
            i32.store8 offset=216
            local.get 4
            i64.const 0
            i64.store offset=256
            local.get 4
            i32.const 2
            i32.store8 offset=248
            local.get 4
            i32.const 184
            i32.add
            local.get 4
            i32.const 216
            i32.add
            local.get 4
            i32.const 248
            i32.add
            call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
            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 4
                            i32.load8_u offset=184
                            i32.const 255
                            i32.ne
                            br_if 0 (;@12;)
                            local.get 0
                            local.get 4
                            i64.load offset=200
                            i64.store offset=16
                            local.get 0
                            local.get 4
                            i64.load offset=192
                            i64.store offset=8
                            local.get 0
                            i64.const 1
                            i64.store
                            local.get 4
                            i32.const 328
                            i32.add
                            call $"#func697 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                            br 1 (;@11;)
                          end
                          local.get 4
                          local.get 4
                          i64.load offset=208
                          i64.store offset=272
                          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
                          i32.const 216
                          i32.add
                          local.get 4
                          i32.const 248
                          i32.add
                          call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                          block ;; label = @12
                            block ;; label = @13
                              local.get 4
                              i32.load8_u offset=216
                              i32.const 255
                              i32.eq
                              br_if 0 (;@13;)
                              local.get 4
                              local.get 4
                              i64.load offset=224
                              i64.store offset=128
                              local.get 4
                              local.get 4
                              i64.load offset=216
                              i64.store offset=120
                              br 1 (;@12;)
                            end
                            local.get 4
                            i32.const 256
                            i32.store16 offset=120
                          end
                          local.get 4
                          i32.const 248
                          i32.add
                          call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 264
                          i32.add
                          call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                          local.get 4
                          i32.const 248
                          i32.add
                          local.get 4
                          i32.const 120
                          i32.add
                          call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::to_numeric
                          local.get 4
                          f64.load offset=264
                          local.set 11
                          local.get 4
                          i32.load offset=260
                          local.set 3
                          local.get 4
                          i32.load offset=256
                          local.set 5
                          block ;; label = @12
                            local.get 4
                            i32.load offset=248
                            br_if 0 (;@12;)
                            block ;; label = @13
                              local.get 5
                              i32.const 1
                              i32.ne
                              br_if 0 (;@13;)
                              local.get 4
                              local.get 11
                              f64.store offset=252 align=4
                              local.get 4
                              local.get 3
                              i32.store offset=248
                              local.get 4
                              i32.const 248
                              i32.add
                              call $<nanvm_lib::vm::bigint::BigInt<nanvm_lib::naive::Naive>>::to_number
                              local.set 11
                              local.get 3
                              local.get 3
                              i32.load
                              i32.const -1
                              i32.add
                              local.tee 5
                              i32.store
                              local.get 5
                              br_if 0 (;@13;)
                              local.get 4
                              i32.const 248
                              i32.add
                              call $"<alloc::rc::Rc<[u64]>>::drop_slow"
                            end
                            local.get 4
                            local.get 11
                            f64.store offset=144
                            local.get 4
                            i32.const 2
                            i32.store offset=136
                            local.get 4
                            i32.const 216
                            i32.add
                            local.get 4
                            i32.const 328
                            i32.add
                            local.get 4
                            i32.const 136
                            i32.add
                            call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                            block ;; label = @13
                              local.get 4
                              i32.load8_u offset=216
                              i32.const 255
                              i32.ne
                              br_if 0 (;@13;)
                              local.get 0
                              local.get 4
                              i64.load offset=232
                              i64.store offset=16
                              local.get 0
                              local.get 4
                              i64.load offset=224
                              i64.store offset=8
                              local.get 0
                              i64.const 1
                              i64.store
                              br 2 (;@11;)
                            end
                            local.get 4
                            local.get 4
                            i64.load offset=240
                            i64.store offset=272
                            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
                            i32.const 328
                            i32.add
                            local.get 4
                            i32.const 248
                            i32.add
                            call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
                            block ;; label = @13
                              block ;; label = @14
                                local.get 4
                                i32.load8_u offset=328
                                i32.const 255
                                i32.eq
                                br_if 0 (;@14;)
                                local.get 4
                                local.get 4
                                i64.load offset=336
                                i64.store offset=160
                                local.get 4
                                local.get 4
                                i64.load offset=328
                                i64.store offset=152
                                br 1 (;@13;)
                              end
                              local.get 4
                              i32.const 256
                              i32.store16 offset=152
                            end
                            local.get 4
                            i32.const 248
                            i32.add
                            call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                            local.get 4
                            i32.const 264
                            i32.add
                            call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                            local.get 4
                            i32.const 0
                            i32.store8 offset=168
                            local.get 4
                            i64.const 2
                            i64.store offset=256
                            local.get 4
                            i64.const 1
                            i64.store offset=248
                            local.get 4
                            local.get 4
                            i32.const 168
                            i32.add
                            i32.store offset=264
                            local.get 4
                            i32.const 32
                            i32.add
                            local.get 4
                            i32.const 248
                            i32.add
                            call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::iter::sources::once::Once<u64>, core::result::Result<u64, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<u64>>::to_rc_slice"
                            local.get 4
                            local.get 4
                            i32.load offset=36
                            local.tee 9
                            i32.store offset=332
                            local.get 4
                            local.get 4
                            i32.load offset=32
                            local.tee 3
                            i32.store offset=328
                            block ;; label = @13
                              local.get 4
                              i32.load8_u offset=168
                              i32.const 1
                              i32.ne
                              br_if 0 (;@13;)
                              local.get 3
                              local.get 3
                              i32.load
                              i32.const -1
                              i32.add
                              local.tee 2
                              i32.store
                              local.get 2
                              br_if 8 (;@5;)
                              local.get 4
                              i32.const 328
                              i32.add
                              call $"<alloc::rc::Rc<[u64]>>::drop_slow"
                              br 8 (;@5;)
                            end
                            local.get 3
                            i32.eqz
                            br_if 7 (;@5;)
                            local.get 4
                            i32.const 104
                            i32.add
                            local.set 5
                            local.get 4
                            i32.const 1
                            i32.store8 offset=260
                            local.get 4
                            local.get 9
                            i32.store offset=256
                            local.get 4
                            local.get 3
                            i32.store offset=252
                            local.get 4
                            i32.const 4
                            i32.store8 offset=248
                            local.get 4
                            i32.const 96
                            i32.add
                            local.get 4
                            i32.const 152
                            i32.add
                            local.get 4
                            i32.const 248
                            i32.add
                            call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::numeric_op::<<nanvm_lib::vm::numeric::Numeric<nanvm_lib::naive::Naive> as core::ops::arith::Mul>::mul>"
                            block ;; label = @13
                              local.get 4
                              i64.load offset=96
                              i64.const 1
                              i64.ne
                              br_if 0 (;@13;)
                              local.get 0
                              i64.const 1
                              i64.store
                              local.get 0
                              local.get 5
                              i64.load offset=8
                              i64.store offset=16
                              local.get 0
                              local.get 5
                              i64.load
                              i64.store offset=8
                              br 2 (;@11;)
                            end
                            local.get 4
                            i32.const 0
                            i32.store8 offset=168
                            local.get 4
                            i64.const 34
                            i64.store offset=256
                            local.get 4
                            i64.const 1
                            i64.store offset=248
                            local.get 4
                            local.get 4
                            i32.const 168
                            i32.add
                            i32.store offset=264
                            local.get 4
                            i32.const 24
                            i32.add
                            local.get 4
                            i32.const 248
                            i32.add
                            call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::iter::sources::once::Once<u64>, core::result::Result<u64, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<u64>>::to_rc_slice"
                            local.get 4
                            local.get 4
                            i32.load offset=28
                            local.tee 9
                            i32.store offset=332
                            local.get 4
                            local.get 4
                            i32.load offset=24
                            local.tee 3
                            i32.store offset=328
                            block ;; label = @13
                              local.get 4
                              i32.load8_u offset=168
                              i32.const 1
                              i32.ne
                              br_if 0 (;@13;)
                              local.get 3
                              local.get 3
                              i32.load
                              i32.const -1
                              i32.add
                              local.tee 2
                              i32.store
                              local.get 2
                              br_if 7 (;@6;)
                              local.get 4
                              i32.const 328
                              i32.add
                              call $"<alloc::rc::Rc<[u64]>>::drop_slow"
                              br 7 (;@6;)
                            end
                            local.get 3
                            i32.eqz
                            br_if 6 (;@6;)
                            local.get 4
                            i32.const 1
                            i32.store8 offset=180
                            local.get 4
                            local.get 9
                            i32.store offset=176
                            local.get 4
                            local.get 3
                            i32.store offset=172
                            local.get 4
                            i32.const 4
                            i32.store8 offset=168
                            local.get 4
                            i32.const 16
                            i32.add
                            local.get 4
                            i32.const 168
                            i32.add
                            call $<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>::dispatch::<nanvm_lib::vm::any::typeof_::TypeOf>
                            local.get 4
                            i32.load offset=20
                            local.set 9
                            local.get 4
                            i32.load offset=16
                            local.set 3
                            local.get 4
                            i32.const 0
                            i32.store16 offset=324
                            local.get 4
                            local.get 3
                            local.get 9
                            i32.add
                            i32.store offset=320
                            local.get 4
                            local.get 3
                            i32.store offset=316
                            local.get 4
                            i32.const 248
                            i32.add
                            local.get 4
                            i32.const 316
                            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=248
                            local.tee 3
                            i32.const 255
                            i32.ne
                            br_if 2 (;@10;)
                            local.get 4
                            i64.load offset=252 align=4
                            local.set 10
                            local.get 4
                            local.get 5
                            i64.load offset=8
                            i64.store offset=264
                            local.get 4
                            local.get 5
                            i64.load
                            i64.store offset=256
                            local.get 4
                            i32.const 0
                            i32.store8 offset=168
                            local.get 4
                            local.get 10
                            i64.store offset=276 align=4
                            local.get 4
                            i32.const 3
                            i32.store8 offset=272
                            local.get 4
                            i64.const 8589934592
                            i64.store offset=248
                            local.get 4
                            local.get 4
                            i32.const 168
                            i32.add
                            i32.store offset=288
                            local.get 4
                            i32.const 8
                            i32.add
                            local.get 4
                            i32.const 248
                            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=12
                            local.tee 5
                            i32.store offset=332
                            local.get 4
                            local.get 4
                            i32.load offset=8
                            local.tee 3
                            i32.store offset=328
                            block ;; label = @13
                              local.get 4
                              i32.load8_u offset=168
                              i32.const 1
                              i32.ne
                              br_if 0 (;@13;)
                              local.get 3
                              local.get 3
                              i32.load
                              i32.const -1
                              i32.add
                              local.tee 2
                              i32.store
                              local.get 2
                              br_if 6 (;@7;)
                              local.get 4
                              i32.const 328
                              i32.add
                              call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
                              br 6 (;@7;)
                            end
                            local.get 3
                            i32.eqz
                            br_if 5 (;@7;)
                            local.get 0
                            local.get 5
                            i32.store offset=16
                            local.get 0
                            local.get 3
                            i32.store offset=12
                            local.get 0
                            i32.const 6
                            i32.store8 offset=8
                            local.get 0
                            i64.const 0
                            i64.store
                            local.get 4
                            i32.const 80
                            i32.add
                            call $"#func697 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                            local.get 2
                            local.get 2
                            i32.load
                            i32.const -1
                            i32.add
                            local.tee 0
                            i32.store
                            local.get 0
                            br_if 4 (;@8;)
                            br 3 (;@9;)
                          end
                          local.get 0
                          local.get 11
                          f64.store offset=16
                          local.get 0
                          local.get 3
                          i32.store offset=12
                          local.get 0
                          local.get 5
                          i32.store offset=8
                          local.get 0
                          i64.const 1
                          i64.store
                          local.get 4
                          i32.const 328
                          i32.add
                          call $"#func697 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                        end
                        local.get 4
                        i32.const 80
                        i32.add
                        call $"#func697 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                        local.get 2
                        local.get 2
                        i32.load
                        i32.const -1
                        i32.add
                        local.tee 0
                        i32.store
                        local.get 0
                        i32.eqz
                        br_if 1 (;@9;)
                        br 2 (;@8;)
                      end
                      local.get 4
                      local.get 4
                      i32.load8_u offset=251
                      i32.store8 offset=331
                      local.get 4
                      local.get 4
                      i32.load16_u offset=249 align=1
                      i32.store16 offset=329 align=1
                      local.get 4
                      local.get 4
                      i32.load offset=260
                      i32.store offset=340
                      local.get 4
                      local.get 4
                      i64.load offset=252 align=4
                      i64.store offset=332 align=4
                      local.get 4
                      local.get 3
                      i32.store8 offset=328
                      i32.const 1065572
                      i32.const 43
                      local.get 4
                      i32.const 328
                      i32.add
                      i32.const 1065556
                      i32.const 1065616
                      call $core::result::unwrap_failed
                      unreachable
                    end
                    local.get 4
                    i32.const 72
                    i32.add
                    call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
                  end
                  local.get 4
                  i32.const 352
                  i32.add
                  global.set $__stack_pointer
                  return
                end
                i32.const 1057428
                i32.const 43
                local.get 4
                i32.const 351
                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 351
              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 351
            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 351
          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 351
        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 351
      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 351
    i32.add
    i32.const 1057412
    i32.const 1057472
    call $core::result::unwrap_failed
    unreachable
  )

Emergent Testing

Idle. Press Run to start the suite.

  • ./proof.f.mjs