instanceof

Status: implemented

export default (...a) => a[0] instanceof Array;

x instanceof Array is true when x is an array and false of every other value — null, undefined, every primitive, an object and a function included. It never throws and converts nothing. It is the one instanceof the language has: the right operand must be the word Array, bare or in parentheses, since a group vanishes (a instanceof (Array) is a instanceof Array); any other right operand — Map, an access, a literal, a function — is refused at the operator. Object and Function are not admitted and never will be: typeof x === "object" and typeof x === "function" are the spellings for those. If we add more types, like Set or RegExp, each is one more name on the right, once the language can build one.

instanceof is a relational operator, one level with < <= > >= and left-associative as they are: a instanceof Array === b is (a instanceof Array) === b, a < b instanceof Array is (a < b) instanceof Array, and !a instanceof Array is (!a) instanceof Array — JavaScript's own trap, kept rather than repaired; !(a instanceof Array) is the negation. instanceof is a reserved word, as typeof is: it names no const and no parameter, while { instanceof: 1 } and a.instanceof are a key and a property name as in JavaScript. Array is a reserved word too (numbers), so no scope binds it and the operator always means the global — before and after any const, where JavaScript would read a later const Array as a binding in its temporal dead zone and throw.

The EDAG's node is ['instanceof', exp, 'Array']: the constructor is a name from a closed list, not an operand, since no global is a value there (fjs/edag); nanvm-lib answers it with Any::instanceof_(&x, Constructor::Array). The writer spells it with spaces around the word, a instanceof Array.

Examples

The compiler demo offers the programs instanceOf 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 — instanceof Array of an array, and of a number — 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 and 1, as JavaScript and as WebAssembly, and shows what each call returned or threw.

export default (...a) => [[a[0]], a[0]][Number(a[0])] instanceof Array;

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, 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) (`instanceof`) as a function of
 * one number, for the page's WASM demo: `instanceof Array` of an array, and
 * of a number.
 *
 * @module
 */

/** @type {(...a: readonly number[]) => unknown} */
export default (...a) => [[a[0]], a[0]][Number(a[0])] instanceof Array;

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

=>lengthbody0instanceof Arrayinstanceof Arrayoperand.objidx[]01Numberoperand[]0.objidxrest0.objidxrest0.objidxrest0

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

const $0=["rest"];export default ["{}",[[":","default",["=>",0,[],["instanceof",[".",["[]",[["[]",[[".",$0,0]]],[".",$0,0]]],["Number",[".",$0,0]]],"Array"]]]]];

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

#[rustfmt::skip]
#[allow(clippy::if_same_then_else)]
pub fn module<A: IStaticFunction>(_runtime: Any<A>) -> Result<Any<A>, Any<A>> {
    Ok([(string_key("default"), A::static_function(|_self, _args| {
        let _b414: Any<A> = _args.rest(0).to_any();
        Any::instanceof_(&(Any::dot([[(Any::dot(_b414.clone(), f64_any(0x0000000000000000)).end())?].to_array().to_any(), (Any::dot(_b414.clone(), f64_any(0x0000000000000000)).end())?].to_array().to_any(), (Any::number((Any::dot(_b414.clone(), f64_any(0x0000000000000000)).end())?))?).end())?, Constructor::Array)
    }, 0, Array::default(), Some("(...$0)=>[[$0[0]],$0[0]][Number($0[0])] instanceof Array")).to_any())].to_object().to_any())
}

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

  (func $nanvm_demos::samples::instanceof::module::<nanvm_lib::naive::Naive> (;383;) (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 1060844
    i32.store offset=24
    local.get 2
    i32.const 1060837
    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 72
          i32.const 0
          local.get 3
          local.get 6
          i32.const 1060844
          i32.const 56
          call $"<nanvm_lib::naive::Naive as nanvm_lib::vm::internal::IVm>::static_function"
          local.set 3
          local.get 2
          i32.const 0
          i32.store8 offset=20
          local.get 2
          local.get 3
          i32.store offset=68
          local.get 2
          i32.const 7
          i32.store8 offset=64
          local.get 2
          local.get 4
          i32.store offset=60
          local.get 2
          local.get 5
          i32.store offset=56
          local.get 2
          i64.const 4294967296
          i64.store offset=48
          local.get 2
          local.get 2
          i32.const 20
          i32.add
          i32.store offset=80
          local.get 2
          local.get 2
          i32.const 48
          i32.add
          call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::array::iter::IntoIter<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>), 1>, core::result::Result<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>), ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)>>::to_rc_slice"
          local.get 2
          local.get 2
          i32.load offset=4
          local.tee 4
          i32.store offset=36
          local.get 2
          local.get 2
          i32.load
          local.tee 3
          i32.store offset=32
          block ;; label = @4
            local.get 2
            i32.load8_u offset=20
            i32.const 1
            i32.ne
            br_if 0 (;@4;)
            local.get 3
            local.get 3
            i32.load
            i32.const -1
            i32.add
            local.tee 0
            i32.store
            local.get 0
            br_if 2 (;@2;)
            local.get 2
            i32.const 32
            i32.add
            call $"<alloc::rc::Rc<[(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)]>>::drop_slow"
            br 2 (;@2;)
          end
          local.get 3
          i32.eqz
          br_if 1 (;@2;)
          local.get 0
          local.get 4
          i32.store offset=16
          local.get 0
          local.get 3
          i32.store offset=12
          local.get 0
          i32.const 5
          i32.store8 offset=8
          local.get 0
          i64.const 0
          i64.store
          local.get 1
          call $"#func379 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
          local.get 2
          i32.const 96
          i32.add
          global.set $__stack_pointer
          return
        end
        local.get 2
        local.get 2
        i32.load8_u offset=51
        i32.store8 offset=35
        local.get 2
        local.get 2
        i32.load16_u offset=49 align=1
        i32.store16 offset=33 align=1
        local.get 2
        local.get 2
        i32.load offset=60
        i32.store offset=44
        local.get 2
        local.get 2
        i64.load offset=52 align=4
        i64.store offset=36 align=4
        local.get 2
        local.get 3
        i32.store8 offset=32
        i32.const 1057960
        i32.const 43
        local.get 2
        i32.const 32
        i32.add
        i32.const 1057944
        i32.const 1058004
        call $core::result::unwrap_failed
        unreachable
      end
      i32.const 1064316
      i32.const 43
      local.get 2
      i32.const 95
      i32.add
      i32.const 1064300
      i32.const 1064360
      call $core::result::unwrap_failed
      unreachable
    end
    i32.const 1064316
    i32.const 43
    local.get 2
    i32.const 95
    i32.add
    i32.const 1064300
    i32.const 1064360
    call $core::result::unwrap_failed
    unreachable
  )
  (func $"<nanvm_demos::samples::instanceof::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" (;384;) (type 4) (param i32 i32 i32 i32)
    (local i32 i32 i32 i64)
    global.get $__stack_pointer
    i32.const 320
    i32.sub
    local.tee 4
    global.set $__stack_pointer
    local.get 4
    local.get 3
    i32.store offset=28
    local.get 4
    local.get 2
    i32.store offset=24
    local.get 2
    local.get 2
    i32.load
    local.tee 5
    i32.const 1
    i32.add
    local.tee 6
    i32.store
    block ;; label = @1
      block ;; label = @2
        local.get 6
        i32.eqz
        br_if 0 (;@2;)
        local.get 4
        local.get 3
        i32.store offset=40
        local.get 4
        local.get 2
        i32.store offset=36
        local.get 4
        i32.const 6
        i32.store8 offset=32
        local.get 2
        local.get 5
        i32.const 2
        i32.add
        local.tee 6
        i32.store
        local.get 6
        i32.eqz
        br_if 0 (;@2;)
        local.get 4
        local.get 2
        i32.store offset=220
        local.get 4
        i32.const 6
        i32.store8 offset=216
        local.get 4
        local.get 3
        i64.extend_i32_u
        i64.store offset=224
        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 120
        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 = @3
          block ;; label = @4
            block ;; label = @5
              block ;; label = @6
                block ;; label = @7
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=120
                    i32.const 255
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 0
                    local.get 4
                    i64.load offset=136
                    i64.store offset=16
                    local.get 0
                    local.get 4
                    i64.load offset=128
                    i64.store offset=8
                    local.get 0
                    i64.const 1
                    i64.store
                    br 1 (;@7;)
                  end
                  local.get 4
                  local.get 4
                  i64.load offset=144
                  i64.store offset=272
                  local.get 4
                  local.get 4
                  i64.load offset=136
                  i64.store offset=264
                  local.get 4
                  local.get 4
                  i64.load offset=128
                  i64.store offset=256
                  local.get 4
                  local.get 4
                  i64.load offset=120
                  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
                  i32.const 1
                  local.set 3
                  i32.const 0
                  local.set 6
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=216
                    local.tee 5
                    i32.const 255
                    i32.eq
                    br_if 0 (;@8;)
                    local.get 4
                    local.get 4
                    i64.load offset=218 align=2
                    i64.store offset=152
                    local.get 4
                    local.get 4
                    i64.load offset=224 align=2
                    i64.store offset=158 align=2
                    local.get 4
                    i32.load8_u offset=217
                    local.set 3
                    local.get 5
                    local.set 6
                  end
                  local.get 4
                  i32.const 248
                  i32.add
                  call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 264
                  i32.add
                  call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 0
                  i32.store8 offset=88
                  local.get 4
                  local.get 3
                  i32.store8 offset=257
                  local.get 4
                  local.get 6
                  i32.store8 offset=256
                  local.get 4
                  i64.const 4294967296
                  i64.store offset=248
                  local.get 4
                  local.get 4
                  i64.load offset=152
                  i64.store offset=258 align=2
                  local.get 4
                  local.get 4
                  i64.load offset=158 align=2
                  i64.store offset=264 align=2
                  local.get 4
                  local.get 4
                  i32.const 88
                  i32.add
                  i32.store offset=272
                  local.get 4
                  i32.const 16
                  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>, 1>, core::result::Result<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>::to_rc_slice"
                  local.get 4
                  local.get 4
                  i32.load offset=20
                  local.tee 6
                  i32.store offset=220
                  local.get 4
                  local.get 4
                  i32.load offset=16
                  local.tee 3
                  i32.store offset=216
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=88
                    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 216
                    i32.add
                    call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
                    br 7 (;@1;)
                  end
                  local.get 3
                  i32.eqz
                  br_if 6 (;@1;)
                  local.get 4
                  local.get 6
                  i32.store offset=192
                  local.get 4
                  local.get 3
                  i32.store offset=188
                  local.get 4
                  i32.const 6
                  i32.store8 offset=184
                  block ;; label = @8
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    block ;; label = @17
                                      local.get 4
                                      i32.load8_u offset=32
                                      local.tee 6
                                      br_table 6 (;@11;) 6 (;@11;) 0 (;@17;) 1 (;@16;) 2 (;@15;) 3 (;@14;) 4 (;@13;) 5 (;@12;) 6 (;@11;)
                                    end
                                    local.get 4
                                    i64.load offset=40
                                    local.set 7
                                    br 8 (;@8;)
                                  end
                                  local.get 4
                                  i32.load offset=36
                                  local.tee 3
                                  local.get 3
                                  i32.load
                                  i32.const 1
                                  i32.add
                                  local.tee 5
                                  i32.store
                                  local.get 5
                                  i32.eqz
                                  br_if 13 (;@2;)
                                  br 6 (;@9;)
                                end
                                local.get 4
                                i32.load offset=36
                                local.tee 3
                                local.get 3
                                i32.load
                                i32.const 1
                                i32.add
                                local.tee 5
                                i32.store
                                local.get 5
                                i32.eqz
                                br_if 12 (;@2;)
                                local.get 4
                                i64.load8_u offset=44
                                i64.const 32
                                i64.shl
                                local.get 4
                                i64.load32_u offset=40
                                i64.or
                                local.set 7
                                br 6 (;@8;)
                              end
                              local.get 4
                              i32.load offset=36
                              local.tee 3
                              local.get 3
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 5
                              i32.store
                              local.get 5
                              br_if 4 (;@9;)
                              br 11 (;@2;)
                            end
                            local.get 4
                            i32.load offset=36
                            local.tee 3
                            local.get 3
                            i32.load
                            i32.const 1
                            i32.add
                            local.tee 5
                            i32.store
                            local.get 5
                            br_if 3 (;@9;)
                            br 10 (;@2;)
                          end
                          local.get 4
                          i32.load offset=36
                          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 (;@2;)
                          br 1 (;@10;)
                        end
                        local.get 4
                        i32.load8_u offset=33
                        local.set 5
                      end
                      br 1 (;@8;)
                    end
                    local.get 4
                    i64.load32_u offset=40
                    local.set 7
                  end
                  local.get 4
                  local.get 7
                  i64.store offset=224
                  local.get 4
                  local.get 3
                  i32.store offset=220
                  local.get 4
                  local.get 5
                  i32.store8 offset=217
                  local.get 4
                  local.get 6
                  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 152
                  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 = @8
                    local.get 4
                    i32.load8_u offset=152
                    i32.const 255
                    i32.ne
                    br_if 0 (;@8;)
                    local.get 0
                    local.get 4
                    i64.load offset=168
                    i64.store offset=16
                    local.get 0
                    local.get 4
                    i64.load offset=160
                    i64.store offset=8
                    local.get 0
                    i64.const 1
                    i64.store
                    local.get 4
                    i32.const 184
                    i32.add
                    call $"#func379 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=176
                  i64.store offset=272
                  local.get 4
                  local.get 4
                  i64.load offset=168
                  i64.store offset=264
                  local.get 4
                  local.get 4
                  i64.load offset=160
                  i64.store offset=256
                  local.get 4
                  local.get 4
                  i64.load offset=152
                  i64.store offset=248
                  local.get 4
                  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
                  i32.const 1
                  local.set 3
                  i32.const 0
                  local.set 6
                  block ;; label = @8
                    local.get 4
                    i32.load8_u offset=216
                    local.tee 5
                    i32.const 255
                    i32.eq
                    br_if 0 (;@8;)
                    local.get 4
                    local.get 4
                    i64.load offset=218 align=2
                    i64.store offset=104
                    local.get 4
                    local.get 4
                    i64.load offset=224 align=2
                    i64.store offset=110 align=2
                    local.get 4
                    i32.load8_u offset=217
                    local.set 3
                    local.get 5
                    local.set 6
                  end
                  local.get 4
                  i32.const 248
                  i32.add
                  call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 264
                  i32.add
                  call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  local.get 4
                  i64.load offset=192
                  i64.store offset=264
                  local.get 4
                  local.get 4
                  i64.load offset=184
                  i64.store offset=256
                  local.get 4
                  i32.const 0
                  i32.store8 offset=184
                  local.get 4
                  local.get 3
                  i32.store8 offset=273
                  local.get 4
                  local.get 6
                  i32.store8 offset=272
                  local.get 4
                  i64.const 8589934592
                  i64.store offset=248
                  local.get 4
                  local.get 4
                  i64.load offset=104
                  i64.store offset=274 align=2
                  local.get 4
                  local.get 4
                  i64.load offset=110 align=2
                  i64.store offset=280 align=2
                  local.get 4
                  local.get 4
                  i32.const 184
                  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 6
                  i32.store offset=220
                  local.get 4
                  local.get 4
                  i32.load offset=8
                  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 5 (;@3;)
                    local.get 4
                    i32.const 216
                    i32.add
                    call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
                    br 5 (;@3;)
                  end
                  local.get 3
                  i32.eqz
                  br_if 4 (;@3;)
                  local.get 4
                  local.get 6
                  i32.store offset=304
                  local.get 4
                  local.get 3
                  i32.store offset=300
                  local.get 4
                  i32.const 6
                  i32.store8 offset=296
                  block ;; label = @8
                    block ;; label = @9
                      block ;; label = @10
                        block ;; label = @11
                          block ;; label = @12
                            block ;; label = @13
                              block ;; label = @14
                                block ;; label = @15
                                  block ;; label = @16
                                    block ;; label = @17
                                      local.get 4
                                      i32.load8_u offset=32
                                      local.tee 6
                                      br_table 6 (;@11;) 6 (;@11;) 0 (;@17;) 1 (;@16;) 2 (;@15;) 3 (;@14;) 4 (;@13;) 5 (;@12;) 6 (;@11;)
                                    end
                                    local.get 4
                                    i64.load offset=40
                                    local.set 7
                                    br 8 (;@8;)
                                  end
                                  local.get 4
                                  i32.load offset=36
                                  local.tee 3
                                  local.get 3
                                  i32.load
                                  i32.const 1
                                  i32.add
                                  local.tee 5
                                  i32.store
                                  local.get 5
                                  i32.eqz
                                  br_if 13 (;@2;)
                                  br 6 (;@9;)
                                end
                                local.get 4
                                i32.load offset=36
                                local.tee 3
                                local.get 3
                                i32.load
                                i32.const 1
                                i32.add
                                local.tee 5
                                i32.store
                                local.get 5
                                i32.eqz
                                br_if 12 (;@2;)
                                local.get 4
                                i64.load8_u offset=44
                                i64.const 32
                                i64.shl
                                local.get 4
                                i64.load32_u offset=40
                                i64.or
                                local.set 7
                                br 6 (;@8;)
                              end
                              local.get 4
                              i32.load offset=36
                              local.tee 3
                              local.get 3
                              i32.load
                              i32.const 1
                              i32.add
                              local.tee 5
                              i32.store
                              local.get 5
                              i32.eqz
                              br_if 11 (;@2;)
                              br 4 (;@9;)
                            end
                            local.get 4
                            i32.load offset=36
                            local.tee 3
                            local.get 3
                            i32.load
                            i32.const 1
                            i32.add
                            local.tee 5
                            i32.store
                            local.get 5
                            i32.eqz
                            br_if 10 (;@2;)
                            br 3 (;@9;)
                          end
                          local.get 4
                          i32.load offset=36
                          local.tee 3
                          local.get 3
                          i32.load
                          i32.const 1
                          i32.add
                          local.tee 5
                          i32.store
                          local.get 5
                          i32.eqz
                          br_if 9 (;@2;)
                          br 1 (;@10;)
                        end
                        local.get 4
                        i32.load8_u offset=33
                        local.set 5
                      end
                      br 1 (;@8;)
                    end
                    local.get 4
                    i64.load32_u offset=40
                    local.set 7
                  end
                  local.get 4
                  local.get 7
                  i64.store offset=224
                  local.get 4
                  local.get 3
                  i32.store offset=220
                  local.get 4
                  local.get 5
                  i32.store8 offset=217
                  local.get 4
                  local.get 6
                  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 = @8
                    local.get 4
                    i32.load8_u offset=184
                    i32.const 255
                    i32.ne
                    br_if 0 (;@8;)
                    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 296
                    i32.add
                    call $"#func379 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=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 = @8
                    block ;; label = @9
                      local.get 4
                      i32.load8_u offset=216
                      i32.const 255
                      i32.eq
                      br_if 0 (;@9;)
                      local.get 4
                      local.get 4
                      i64.load offset=224
                      i64.store offset=96
                      local.get 4
                      local.get 4
                      i64.load offset=216
                      i64.store offset=88
                      br 1 (;@8;)
                    end
                    local.get 4
                    i32.const 256
                    i32.store16 offset=88
                  end
                  local.get 4
                  i32.const 72
                  i32.add
                  local.set 3
                  local.get 4
                  i32.const 248
                  i32.add
                  call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 264
                  i32.add
                  call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                  local.get 4
                  i32.const 64
                  i32.add
                  local.get 4
                  i32.const 88
                  i32.add
                  call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::number
                  block ;; label = @8
                    local.get 4
                    i64.load offset=64
                    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
                    local.get 4
                    i32.const 296
                    i32.add
                    call $"#func379 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
                    br 1 (;@7;)
                  end
                  local.get 4
                  local.get 3
                  i64.load offset=8
                  i64.store offset=112
                  local.get 4
                  local.get 3
                  i64.load
                  i64.store offset=104
                  local.get 4
                  i32.const 216
                  i32.add
                  local.get 4
                  i32.const 296
                  i32.add
                  local.get 4
                  i32.const 104
                  i32.add
                  call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
                  local.get 4
                  i32.load8_u offset=216
                  i32.const 255
                  i32.ne
                  br_if 1 (;@6;)
                  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
                end
                local.get 4
                i32.const 32
                i32.add
                call $"#func379 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
                i32.eqz
                br_if 1 (;@5;)
                br 2 (;@4;)
              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 296
              i32.add
              local.get 4
              i32.const 248
              i32.add
              call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
              block ;; label = @6
                block ;; label = @7
                  local.get 4
                  i32.load8_u offset=296
                  i32.const 255
                  i32.eq
                  br_if 0 (;@7;)
                  local.get 4
                  local.get 4
                  i64.load offset=304
                  i64.store offset=56
                  local.get 4
                  local.get 4
                  i64.load offset=296
                  local.tee 7
                  i64.store offset=48
                  local.get 7
                  i32.wrap_i64
                  i32.const 255
                  i32.and
                  i32.const 6
                  i32.eq
                  local.set 3
                  br 1 (;@6;)
                end
                local.get 4
                i32.const 256
                i32.store16 offset=48
                i32.const 0
                local.set 3
              end
              local.get 4
              i32.const 248
              i32.add
              call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              local.get 4
              i32.const 264
              i32.add
              call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              local.get 0
              local.get 3
              i32.store8 offset=9
              local.get 0
              i32.const 1
              i32.store8 offset=8
              local.get 0
              i64.const 0
              i64.store
              local.get 4
              i32.const 48
              i32.add
              call $"#func379 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
              local.get 4
              i32.const 32
              i32.add
              call $"#func379 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 (;@4;)
            end
            local.get 4
            i32.const 24
            i32.add
            call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
          end
          local.get 4
          i32.const 320
          i32.add
          global.set $__stack_pointer
          return
        end
        i32.const 1064316
        i32.const 43
        local.get 4
        i32.const 319
        i32.add
        i32.const 1064300
        i32.const 1064360
        call $core::result::unwrap_failed
        unreachable
      end
      unreachable
    end
    i32.const 1064316
    i32.const 43
    local.get 4
    i32.const 319
    i32.add
    i32.const 1064300
    i32.const 1064360
    call $core::result::unwrap_failed
    unreachable
  )

Emergent Testing

Idle. Press Run to start the suite.

  • ./other-classes/proof.f.mjs
  • ./proof.f.mjs