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) (`in`) as a function of one
* number, for the page's WASM demo: `"x" in` an object that owns the
* entry, and one that does not.
*
* @module
*/
/** @type {(...a: readonly number[]) => boolean} */
export default (...a ) => "x" in [{ x : 1 }, {}][Number (a [0 ])];
Expression graph (EDAG) that fjs compile lowers it to:
=> length body 0 "x" in "x" in operand . obj idx [] 0 1 Number operand {} x 1 {} . obj idx rest 0 The same graph, as fjs compile writes it to a .edag.data.js file:
export default ["{}" ,[[":" ,"default" ,["=>" ,0 ,[],["in" ,"x" ,["." ,["[]" ,[["{}" ,[[":" ,"x" ,1 ]]],["{}" ,[]]]],["Number" ,["." ,["rest" ],0 ]]]]]]]];Rust that fjs compile writes from it, on the NaNVM runtime:
// @generated by `fjs compile`. Do not edit: recompile the source module instead.
use nanvm_lib ::vm ::unstable ::{f64_any , string_any , string_key };
use nanvm_lib ::vm ::{Any , IStaticFunction , Object , 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 ();
Any ::call ((Any ::dot (A ::frame (_self )[0 ].clone (), string_any ("in" )).end ())?, [string_any ("x" ), (Any ::dot ([[(string_key ("x" ), f64_any (0x3ff0000000000000 ))].to_object ().to_any (), Object ::default ().to_any ()].to_array ().to_any (), (Any ::number ((Any ::dot (_b362 .clone (), f64_any (0x0000000000000000 )).end ())?))?).end ())?].to_array ().to_any ())
}, 0 , [runtime .clone ()].to_array (), Some ("(...$0)=>\"x\" in [{\"x\":1},{}][Number($0[0])]" )).to_any ())].to_object ().to_any ())
}
WebAssembly text (WAT) of the functions compiled from this source, without the NaNVM runtime:
(func $nanvm_demos::samples::in_operator::module::<nanvm_lib::naive::Naive> (;158;) (type 1 ) (param i32 i32 )
(local i32 i32 i32 i32 i32 i64 i32 )
global.get $__stack_pointer
i32.const 96
i32.sub
local.tee 2
global.set $__stack_pointer
local.get 2
i32.const 0
i32.store16 offset=28
local.get 2
i32.const 1053797
i32.store offset=24
local.get 2
i32.const 1053790
i32.store offset=20
local.get 2
i32.const 48
i32.add
local.get 2
i32.const 20
i32.add
call $"core::iter::adapters::try_process::<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>, u16, core::result::Result<core::convert::Infallible, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>, <core::result::Result<alloc::rc::Rc<[u16]>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>> as core::iter::traits::collect::FromIterator<core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>>::from_iter<core::iter::adapters::map::Map<core::str::iter::EncodeUtf16, core::result::Result<u16, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::Ok>>::{closure#0}, alloc::rc::Rc<[u16]>>"
block ;; label = @1
block ;; label = @2
block ;; label = @3
block ;; label = @4
local.get 2
i32.load8_u offset=48
local.tee 3
i32.const 255
i32.ne
br_if 0 (;@4;)
local.get 2
i32.load offset=56
local.set 4
local.get 2
i32.load offset=52
local.set 5
block ;; label = @5
block ;; label = @6
block ;; label = @7
block ;; label = @8
block ;; label = @9
block ;; label = @10
block ;; label = @11
block ;; label = @12
local.get 1
i32.load8_u
local.tee 6
br_table 6 (;@6;) 6 (;@6;) 0 (;@12;) 1 (;@11;) 2 (;@10;) 3 (;@9;) 4 (;@8;) 5 (;@7;) 6 (;@6;)
end
local.get 1
i64.load offset=8
local.set 7
br 10 (;@1;)
end
local.get 1
i32.load offset=4
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
i32.eqz
br_if 7 (;@3;)
br 8 (;@2;)
end
local.get 1
i32.load offset=4
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
i32.eqz
br_if 6 (;@3;)
local.get 1
i64.load8_u offset=12
i64.const 32
i64.shl
local.get 1
i64.load32_u offset=8
i64.or
local.set 7
br 8 (;@1;)
end
local.get 1
i32.load offset=4
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
br_if 6 (;@2;)
br 5 (;@3;)
end
local.get 1
i32.load offset=4
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
br_if 5 (;@2;)
br 4 (;@3;)
end
local.get 1
i32.load offset=4
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
i32.eqz
br_if 3 (;@3;)
br 1 (;@5;)
end
local.get 1
i32.load8_u offset=1
local.set 8
end
br 3 (;@1;)
end
local.get 2
local.get 2
i32.load8_u offset=51
i32.store8 offset=35
local.get 2
local.get 2
i32.load16_u offset=49 align=1
i32.store16 offset=33 align=1
local.get 2
local.get 2
i32.load offset=60
i32.store offset=44
local.get 2
local.get 2
i64.load offset=52 align=4
i64.store offset=36 align=4
local.get 2
local.get 3
i32.store8 offset=32
i32.const 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
unreachable
end
local.get 1
i64.load32_u offset=8
local.set 7
end
local.get 2
i32.const 0
i32.store8 offset=20
local.get 2
local.get 7
i64.store offset=64
local.get 2
local.get 3
i32.store offset=60
local.get 2
local.get 8
i32.store8 offset=57
local.get 2
local.get 6
i32.store8 offset=56
local.get 2
i64.const 4294967296
i64.store offset=48
local.get 2
local.get 2
i32.const 20
i32.add
i32.store offset=72
local.get 2
i32.const 8
i32.add
local.get 2
i32.const 48
i32.add
call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::array::iter::IntoIter<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, 1>, core::result::Result<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>::to_rc_slice"
local.get 2
local.get 2
i32.load offset=12
local.tee 6
i32.store offset=36
local.get 2
local.get 2
i32.load offset=8
local.tee 3
i32.store offset=32
block ;; label = @1
block ;; label = @2
local.get 2
i32.load8_u offset=20
i32.const 1
i32.ne
br_if 0 (;@2;)
local.get 3
local.get 3
i32.load
i32.const -1
i32.add
local.tee 0
i32.store
local.get 0
br_if 1 (;@1;)
local.get 2
i32.const 32
i32.add
call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
br 1 (;@1;)
end
local.get 3
i32.eqz
br_if 0 (;@1;)
i32.const 4
i32.const 0
local.get 3
local.get 6
i32.const 1053834
i32.const 43
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 6
i32.store offset=36
local.get 2
local.get 2
i32.load
local.tee 3
i32.store offset=32
block ;; label = @2
block ;; label = @3
local.get 2
i32.load8_u offset=20
i32.const 1
i32.ne
br_if 0 (;@3;)
local.get 3
local.get 3
i32.load
i32.const -1
i32.add
local.tee 0
i32.store
local.get 0
br_if 1 (;@2;)
local.get 2
i32.const 32
i32.add
call $"<alloc::rc::Rc<[(nanvm_lib::vm::string::String<nanvm_lib::naive::Naive>, nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>)]>>::drop_slow"
br 1 (;@2;)
end
local.get 3
i32.eqz
br_if 0 (;@2;)
local.get 0
local.get 6
i32.store offset=16
local.get 0
local.get 3
i32.store offset=12
local.get 0
i32.const 5
i32.store8 offset=8
local.get 0
i64.const 0
i64.store
local.get 1
call $"#func153 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
local.get 2
i32.const 96
i32.add
global.set $__stack_pointer
return
end
i32.const 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::in_operator::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" (;159;) (type 4 ) (param i32 i32 i32 i32 )
(local i32 i32 i64 i32 )
global.get $__stack_pointer
i32.const 352
i32.sub
local.tee 4
global.set $__stack_pointer
local.get 1
i32.load
local.set 1
local.get 4
local.get 3
i32.store offset=44
local.get 4
local.get 2
i32.store offset=40
local.get 2
local.get 2
i32.load
i32.const 1
i32.add
local.tee 5
i32.store
block ;; label = @1
local.get 5
i32.eqz
br_if 0 (;@1;)
local.get 4
local.get 3
i32.store offset=56
local.get 4
local.get 2
i32.store offset=52
local.get 4
i32.const 6
i32.store8 offset=48
block ;; label = @2
block ;; label = @3
block ;; label = @4
local.get 1
i32.load offset=16
i32.eqz
br_if 0 (;@4;)
block ;; label = @5
block ;; label = @6
block ;; label = @7
block ;; label = @8
block ;; label = @9
block ;; label = @10
block ;; label = @11
block ;; label = @12
local.get 1
i32.load offset=12
local.tee 1
i32.load8_u offset=8
local.tee 5
br_table 6 (;@6;) 6 (;@6;) 0 (;@12;) 1 (;@11;) 2 (;@10;) 3 (;@9;) 4 (;@8;) 5 (;@7;) 6 (;@6;)
end
local.get 1
i64.load offset=16
local.set 6
br 9 (;@2;)
end
local.get 1
i32.load offset=12
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 7
i32.store
local.get 7
i32.eqz
br_if 9 (;@1;)
br 7 (;@3;)
end
local.get 1
i32.load offset=12
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 7
i32.store
local.get 7
i32.eqz
br_if 8 (;@1;)
local.get 1
i64.load8_u offset=20
i64.const 32
i64.shl
local.get 1
i64.load32_u offset=16
i64.or
local.set 6
br 7 (;@2;)
end
local.get 1
i32.load offset=12
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 7
i32.store
local.get 7
br_if 5 (;@3;)
br 7 (;@1;)
end
local.get 1
i32.load offset=12
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 7
i32.store
local.get 7
br_if 4 (;@3;)
br 6 (;@1;)
end
local.get 1
i32.load offset=12
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 1
i32.store
local.get 1
i32.eqz
br_if 5 (;@1;)
br 1 (;@5;)
end
local.get 1
i32.load8_u offset=9
local.set 1
end
br 2 (;@2;)
end
i32.const 0
i32.const 0
i32.const 1069140
call $core::panicking::panic_bounds_check
unreachable
end
local.get 1
i64.load32_u offset=16
local.set 6
end
local.get 4
local.get 6
i64.store offset=224
local.get 4
local.get 3
i32.store offset=220
local.get 4
local.get 1
i32.store8 offset=217
local.get 4
local.get 5
i32.store8 offset=216
local.get 4
i32.const 0
i32.store16 offset=192
local.get 4
i32.const 1055438
i32.store offset=188
local.get 4
i32.const 1055436
i32.store offset=184
local.get 4
i32.const 296
i32.add
local.get 4
i32.const 184
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 = @2
block ;; label = @3
block ;; label = @4
block ;; label = @5
block ;; label = @6
block ;; label = @7
block ;; label = @8
block ;; label = @9
block ;; label = @10
block ;; label = @11
block ;; label = @12
block ;; label = @13
block ;; label = @14
local.get 4
i32.load8_u offset=296
local.tee 3
i32.const 255
i32.ne
br_if 0 (;@14;)
local.get 4
local.get 4
i64.load offset=300 align=4
i64.store offset=252 align=4
local.get 4
i32.const 3
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 = @15
local.get 4
i32.load8_u offset=184
i32.const 255
i32.ne
br_if 0 (;@15;)
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
br 6 (;@9;)
end
local.get 4
local.get 4
i64.load offset=208
i64.store offset=320
local.get 4
local.get 4
i64.load offset=200
i64.store offset=312
local.get 4
local.get 4
i64.load offset=192
i64.store offset=304
local.get 4
local.get 4
i64.load offset=184
i64.store offset=296
local.get 4
i32.const 248
i32.add
local.get 4
i32.const 296
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
block ;; label = @15
block ;; label = @16
local.get 4
i32.load8_u offset=248
i32.const 255
i32.eq
br_if 0 (;@16;)
local.get 4
local.get 4
i64.load offset=256
i64.store offset=72
local.get 4
local.get 4
i64.load offset=248
i64.store offset=64
br 1 (;@15;)
end
local.get 4
i32.const 256
i32.store16 offset=64
end
local.get 4
i32.const 296
i32.add
call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 312
i32.add
call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 0
i32.store16 offset=224
local.get 4
i32.const 1055439
i32.store offset=220
local.get 4
i32.const 1055438
i32.store offset=216
local.get 4
i32.const 296
i32.add
local.get 4
i32.const 216
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=296
local.tee 3
i32.const 255
i32.ne
br_if 1 (;@13;)
local.get 4
local.get 4
i64.load offset=300 align=4
i64.store offset=116 align=4
local.get 4
i32.const 3
i32.store8 offset=112
local.get 4
i32.const 0
i32.store16 offset=224
local.get 4
i32.const 1055439
i32.store offset=220
local.get 4
i32.const 1055438
i32.store offset=216
local.get 4
i32.const 296
i32.add
local.get 4
i32.const 216
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=296
local.tee 3
i32.const 255
i32.ne
br_if 2 (;@12;)
local.get 4
i64.load offset=300 align=4
local.set 6
local.get 4
i32.const 0
i32.store8 offset=216
local.get 4
i64.const 4607182418800017408
i64.store offset=320
local.get 4
i32.const 2
i32.store8 offset=312
local.get 4
local.get 6
i64.store offset=304
local.get 4
i64.const 4294967296
i64.store offset=296
local.get 4
local.get 4
i32.const 216
i32.add
i32.store offset=328
local.get 4
i32.const 32
i32.add
local.get 4
i32.const 296
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 4
local.get 4
i32.load offset=36
local.tee 5
i32.store offset=252
local.get 4
local.get 4
i32.load offset=32
local.tee 3
i32.store offset=248
block ;; label = @15
local.get 4
i32.load8_u offset=216
i32.const 1
i32.ne
br_if 0 (;@15;)
local.get 3
local.get 3
i32.load
i32.const -1
i32.add
local.tee 2
i32.store
local.get 2
br_if 13 (;@2;)
local.get 4
i32.const 248
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 13 (;@2;)
end
local.get 3
i32.eqz
br_if 12 (;@2;)
local.get 4
i32.const 0
i32.store8 offset=248
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::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=28
local.tee 7
i32.store offset=300
local.get 4
local.get 4
i32.load offset=24
local.tee 1
i32.store offset=296
block ;; label = @15
local.get 4
i32.load8_u offset=248
i32.const 1
i32.ne
br_if 0 (;@15;)
local.get 1
local.get 1
i32.load
i32.const -1
i32.add
local.tee 2
i32.store
local.get 2
br_if 12 (;@3;)
local.get 4
i32.const 296
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 12 (;@3;)
end
local.get 1
i32.eqz
br_if 11 (;@3;)
local.get 4
i32.const 0
i32.store8 offset=216
local.get 4
local.get 7
i32.store offset=328
local.get 4
local.get 1
i32.store offset=324
local.get 4
i32.const 5
i32.store8 offset=320
local.get 4
local.get 5
i32.store offset=312
local.get 4
local.get 3
i32.store offset=308
local.get 4
i32.const 5
i32.store8 offset=304
local.get 4
i64.const 8589934592
i64.store offset=296
local.get 4
local.get 4
i32.const 216
i32.add
i32.store offset=336
local.get 4
i32.const 16
i32.add
local.get 4
i32.const 296
i32.add
call $"<core::iter::adapters::GenericShunt<core::iter::adapters::map::Map<core::array::iter::IntoIter<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, 2>, core::result::Result<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>, ()>::Ok>, core::result::Result<core::convert::Infallible, ()>> as alloc::rc::ToRcSlice<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>>::to_rc_slice"
local.get 4
local.get 4
i32.load offset=20
local.tee 1
i32.store offset=252
local.get 4
local.get 4
i32.load offset=16
local.tee 3
i32.store offset=248
block ;; label = @15
local.get 4
i32.load8_u offset=216
i32.const 1
i32.ne
br_if 0 (;@15;)
local.get 3
local.get 3
i32.load
i32.const -1
i32.add
local.tee 2
i32.store
local.get 2
br_if 11 (;@4;)
local.get 4
i32.const 248
i32.add
call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
br 11 (;@4;)
end
local.get 3
i32.eqz
br_if 10 (;@4;)
local.get 4
local.get 1
i32.store offset=288
local.get 4
local.get 3
i32.store offset=284
local.get 4
i32.const 6
i32.store8 offset=280
block ;; label = @15
block ;; label = @16
block ;; label = @17
block ;; label = @18
block ;; label = @19
block ;; label = @20
block ;; label = @21
block ;; label = @22
local.get 4
i32.load8_u offset=48
local.tee 1
br_table 6 (;@16;) 6 (;@16;) 0 (;@22;) 1 (;@21;) 2 (;@20;) 3 (;@19;) 4 (;@18;) 5 (;@17;) 6 (;@16;)
end
local.get 4
i64.load offset=56
local.set 6
br 11 (;@10;)
end
local.get 4
i32.load offset=52
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 5
i32.store
local.get 5
i32.eqz
br_if 19 (;@1;)
br 9 (;@11;)
end
local.get 4
i32.load offset=52
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 5
i32.store
local.get 5
i32.eqz
br_if 18 (;@1;)
local.get 4
i64.load8_u offset=60
i64.const 32
i64.shl
local.get 4
i64.load32_u offset=56
i64.or
local.set 6
br 9 (;@10;)
end
local.get 4
i32.load offset=52
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 5
i32.store
local.get 5
i32.eqz
br_if 17 (;@1;)
br 7 (;@11;)
end
local.get 4
i32.load offset=52
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 5
i32.store
local.get 5
i32.eqz
br_if 16 (;@1;)
br 6 (;@11;)
end
local.get 4
i32.load offset=52
local.tee 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 5
i32.store
local.get 5
i32.eqz
br_if 15 (;@1;)
br 1 (;@15;)
end
local.get 4
i32.load8_u offset=49
local.set 5
end
br 4 (;@10;)
end
local.get 4
local.get 4
i32.load8_u offset=299
i32.store8 offset=251
local.get 4
local.get 4
i32.load16_u offset=297 align=1
i32.store16 offset=249 align=1
local.get 4
local.get 4
i32.load offset=308
i32.store offset=260
local.get 4
local.get 4
i64.load offset=300 align=4
i64.store offset=252 align=4
local.get 4
local.get 3
i32.store8 offset=248
i32.const 1057960
i32.const 43
local.get 4
i32.const 248
i32.add
i32.const 1057944
i32.const 1058004
call $core::result::unwrap_failed
unreachable
end
local.get 4
local.get 4
i32.load8_u offset=299
i32.store8 offset=251
local.get 4
local.get 4
i32.load16_u offset=297 align=1
i32.store16 offset=249 align=1
local.get 4
local.get 4
i32.load offset=308
i32.store offset=260
local.get 4
local.get 4
i64.load offset=300 align=4
i64.store offset=252 align=4
local.get 4
local.get 3
i32.store8 offset=248
i32.const 1057960
i32.const 43
local.get 4
i32.const 248
i32.add
i32.const 1057944
i32.const 1058004
call $core::result::unwrap_failed
unreachable
end
local.get 4
local.get 4
i32.load8_u offset=299
i32.store8 offset=251
local.get 4
local.get 4
i32.load16_u offset=297 align=1
i32.store16 offset=249 align=1
local.get 4
local.get 4
i32.load offset=308
i32.store offset=260
local.get 4
local.get 4
i64.load offset=300 align=4
i64.store offset=252 align=4
local.get 4
local.get 3
i32.store8 offset=248
i32.const 1057960
i32.const 43
local.get 4
i32.const 248
i32.add
i32.const 1057944
i32.const 1058004
call $core::result::unwrap_failed
unreachable
end
local.get 4
i64.load32_u offset=56
local.set 6
end
local.get 4
local.get 6
i64.store offset=256
local.get 4
local.get 3
i32.store offset=252
local.get 4
local.get 5
i32.store8 offset=249
local.get 4
local.get 1
i32.store8 offset=248
local.get 4
i64.const 0
i64.store offset=304
local.get 4
i32.const 2
i32.store8 offset=296
local.get 4
i32.const 216
i32.add
local.get 4
i32.const 248
i32.add
local.get 4
i32.const 296
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
block ;; label = @10
block ;; label = @11
local.get 4
i32.load8_u offset=216
i32.const 255
i32.ne
br_if 0 (;@11;)
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
local.get 4
i32.const 280
i32.add
call $"#func153 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
br 1 (;@10;)
end
local.get 4
local.get 4
i64.load offset=240
i64.store offset=320
local.get 4
local.get 4
i64.load offset=232
i64.store offset=312
local.get 4
local.get 4
i64.load offset=224
i64.store offset=304
local.get 4
local.get 4
i64.load offset=216
i64.store offset=296
local.get 4
i32.const 248
i32.add
local.get 4
i32.const 296
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
block ;; label = @11
block ;; label = @12
local.get 4
i32.load8_u offset=248
i32.const 255
i32.eq
br_if 0 (;@12;)
local.get 4
local.get 4
i64.load offset=256
i64.store offset=160
local.get 4
local.get 4
i64.load offset=248
i64.store offset=152
br 1 (;@11;)
end
local.get 4
i32.const 256
i32.store16 offset=152
end
local.get 4
i32.const 136
i32.add
local.set 3
local.get 4
i32.const 296
i32.add
call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 312
i32.add
call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 128
i32.add
local.get 4
i32.const 152
i32.add
call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::number
block ;; label = @11
local.get 4
i64.load offset=128
i64.const 1
i64.ne
br_if 0 (;@11;)
local.get 0
i64.const 1
i64.store
local.get 0
local.get 3
i64.load offset=8
i64.store offset=16
local.get 0
local.get 3
i64.load
i64.store offset=8
local.get 4
i32.const 280
i32.add
call $"#func153 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
br 1 (;@10;)
end
local.get 4
local.get 3
i64.load offset=8
i64.store offset=176
local.get 4
local.get 3
i64.load
i64.store offset=168
local.get 4
i32.const 248
i32.add
local.get 4
i32.const 280
i32.add
local.get 4
i32.const 168
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
local.get 4
i32.load8_u offset=248
i32.const 255
i32.ne
br_if 2 (;@8;)
local.get 0
local.get 4
i64.load offset=264
i64.store offset=16
local.get 0
local.get 4
i64.load offset=256
i64.store offset=8
local.get 0
i64.const 1
i64.store
end
local.get 4
i32.const 112
i32.add
call $"#func153 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 64
i32.add
call $"#func153 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
end
local.get 4
i32.const 48
i32.add
call $"#func153 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
local.get 2
local.get 2
i32.load
i32.const -1
i32.add
local.tee 0
i32.store
local.get 0
i32.eqz
br_if 1 (;@7;)
br 2 (;@6;)
end
local.get 4
local.get 4
i64.load offset=272
i64.store offset=320
local.get 4
local.get 4
i64.load offset=264
i64.store offset=312
local.get 4
local.get 4
i64.load offset=256
i64.store offset=304
local.get 4
local.get 4
i64.load offset=248
i64.store offset=296
local.get 4
i32.const 280
i32.add
local.get 4
i32.const 296
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 1
block ;; label = @8
local.get 4
i32.load8_u offset=280
local.tee 5
i32.const 255
i32.eq
br_if 0 (;@8;)
local.get 4
local.get 4
i64.load offset=282 align=2
i64.store offset=96
local.get 4
local.get 4
i64.load offset=288 align=2
i64.store offset=102 align=2
local.get 4
i32.load8_u offset=281
local.set 3
local.get 5
local.set 1
end
local.get 4
i32.const 296
i32.add
call $"#func693 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 312
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=120
i64.store offset=312
local.get 4
local.get 4
i64.load offset=112
i64.store offset=304
local.get 4
i32.const 0
i32.store8 offset=112
local.get 4
local.get 3
i32.store8 offset=321
local.get 4
local.get 1
i32.store8 offset=320
local.get 4
i64.const 8589934592
i64.store offset=296
local.get 4
local.get 4
i64.load offset=96
i64.store offset=322 align=2
local.get 4
local.get 4
i64.load offset=102 align=2
i64.store offset=328 align=2
local.get 4
local.get 4
i32.const 112
i32.add
i32.store offset=336
local.get 4
i32.const 8
i32.add
local.get 4
i32.const 296
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 1
i32.store offset=284
local.get 4
local.get 4
i32.load offset=8
local.tee 3
i32.store offset=280
block ;; label = @8
local.get 4
i32.load8_u offset=112
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 3 (;@5;)
local.get 4
i32.const 280
i32.add
call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
br 3 (;@5;)
end
local.get 3
i32.eqz
br_if 2 (;@5;)
local.get 4
local.get 1
i32.store offset=88
local.get 4
local.get 3
i32.store offset=84
local.get 4
i32.const 6
i32.store8 offset=80
local.get 0
local.get 4
i32.const 64
i32.add
local.get 4
i32.const 80
i32.add
call $<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>::call
local.get 4
i32.const 48
i32.add
call $"#func153 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
local.get 2
local.get 2
i32.load
i32.const -1
i32.add
local.tee 0
i32.store
local.get 0
br_if 1 (;@6;)
end
local.get 4
i32.const 40
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 1064316
i32.const 43
local.get 4
i32.const 351
i32.add
i32.const 1064300
i32.const 1064360
call $core::result::unwrap_failed
unreachable
end
i32.const 1064316
i32.const 43
local.get 4
i32.const 351
i32.add
i32.const 1064300
i32.const 1064360
call $core::result::unwrap_failed
unreachable
end
i32.const 1064316
i32.const 43
local.get 4
i32.const 351
i32.add
i32.const 1064300
i32.const 1064360
call $core::result::unwrap_failed
unreachable
end
i32.const 1064316
i32.const 43
local.get 4
i32.const 351
i32.add
i32.const 1064300
i32.const 1064360
call $core::result::unwrap_failed
unreachable
end
unreachable
)
Run