In FunctionalScript fjs compile accepts this module, and it runs as JavaScript and as WebAssembly alike.
A FunctionalScript module and what fjs compile makes of it: the expression graph it lowers to, the Rust it compiles to on the NaNVM runtime, and the WebAssembly that Rust builds to. Run calls its default export with 1, then 2, first as the JavaScript it already is and then as WebAssembly, and shows what each call returned or threw and how long one call takes, timed over 1000 calls.
FunctionalScript source:
/**
* The example of [`README.md`](./README.md) (Arrays) as a function of one
* number, for the page's WASM demo: an array literal, a spread into another,
* and an element read.
*
* @module
*/
/** @type {(...a: readonly number[]) => unknown} */
export default (...a ) => {
/** @type {readonly [string, number, readonly [boolean, null]]} */
const x = ["hello" , a [0 ], [true , null ]];
return [x .length , [...x , a [0 ] + 1 ], x [2 ][0 ]];
};
Expression graph (EDAG) that fjs compile lowers it to:
=> length body 0 [] [] 0 1 2 . obj key [] "length" [] ...0 1 . obj idx . 0 + left right . 1 . obj idx [] 2 [] 0 1 2 "hello" . [] . obj idx rest 0 . obj idx rest 0 [] 0 1 true null The same graph, as fjs compile writes it to a .edag.data.js file:
const $0 =["rest" ];const $1 =["[]" ,["hello" ,["." ,$0 ,0 ],["[]" ,[true ,null ]]]];export default ["{}" ,[[":" ,"default" ,["=>" ,0 ,[],["[]" ,[["." ,$1 ,"length" ],["[]" ,[["..." ,$1 ],["+" ,["." ,$0 ,0 ],1 ]]],["." ,["." ,$1 ,2 ],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 , spread_array , spread_item , string_any , string_key , value_item ,
};
use nanvm_lib ::vm ::{Any , Array , IStaticFunction , Nullish , 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 _b524 : Any <A > = _args .rest (0 ).to_any ();
let _b3 : Any <A > = [string_any ("hello" ), (Any ::dot (_b524 .clone (), f64_any (0x0000000000000000 )).end ())?, [true .to_any (), Nullish ::Null .to_any ()].to_array ().to_any ()].to_array ().to_any ();
Ok ([(Any ::dot (_b3 .clone (), string_any ("length" )).end ())?, (spread_array ([spread_item (_b3 .clone ())?, value_item (((Any ::dot (_b524 .clone (), f64_any (0x0000000000000000 )).end ())? + f64_any (0x3ff0000000000000 ))?)]))?, (Any ::dot ((Any ::dot (_b3 .clone (), f64_any (0x4000000000000000 )).end ())?, f64_any (0x0000000000000000 )).end ())?].to_array ().to_any ())
}, 0 , Array ::default (), Some ("(...$0)=>{const $1=[\"hello\",$0[0],[true,null]];return [$1.length,[...$1,$0[0]+1],$1[2][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::arrays::module::<nanvm_lib::naive::Naive> (;171;) (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 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
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 19
i32.const 0
local.get 3
local.get 6
i32.const 1055070
i32.const 92
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 $"#func152 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
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::arrays::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" (;172;) (type 4 ) (param i32 i32 i32 i32 )
(local i32 i32 i64 i32 i32 )
global.get $__stack_pointer
i32.const 560
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
i32.const 1
i32.add
local.tee 5
i32.store
block ;; label = @1
local.get 5
i32.eqz
br_if 0 (;@1;)
local.get 4
local.get 3
i32.store offset=40
local.get 4
local.get 2
i32.store offset=36
local.get 4
i32.const 6
i32.store8 offset=32
local.get 4
i32.const 0
i32.store16 offset=296
local.get 4
i32.const 1055903
i32.store offset=292
local.get 4
i32.const 1055898
i32.store offset=288
local.get 4
i32.const 472
i32.add
local.get 4
i32.const 288
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
local.get 4
i32.load8_u offset=472
local.tee 3
i32.const 255
i32.ne
br_if 0 (;@4;)
local.get 4
local.get 4
i64.load offset=476 align=4
i64.store offset=380 align=4
local.get 4
i32.const 3
i32.store8 offset=376
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=32
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 4
i64.load offset=40
local.set 6
br 9 (;@2;)
end
local.get 4
i32.load offset=36
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 4
i32.load offset=36
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 4
i64.load8_u offset=44
i64.const 32
i64.shl
local.get 4
i64.load32_u offset=40
i64.or
local.set 6
br 7 (;@2;)
end
local.get 4
i32.load offset=36
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 4
i32.load offset=36
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 4
i32.load offset=36
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 5 (;@1;)
br 1 (;@5;)
end
local.get 4
i32.load8_u offset=33
local.set 7
end
br 2 (;@2;)
end
local.get 4
local.get 4
i32.load8_u offset=475
i32.store8 offset=67
local.get 4
local.get 4
i32.load16_u offset=473 align=1
i32.store16 offset=65 align=1
local.get 4
local.get 4
i32.load offset=484
i32.store offset=76
local.get 4
local.get 4
i64.load offset=476 align=4
i64.store offset=68 align=4
local.get 4
local.get 3
i32.store8 offset=64
i32.const 1065572
i32.const 43
local.get 4
i32.const 64
i32.add
i32.const 1065556
i32.const 1065616
call $core::result::unwrap_failed
unreachable
end
local.get 4
i64.load32_u offset=40
local.set 6
end
local.get 4
local.get 6
i64.store offset=72
local.get 4
local.get 3
i32.store offset=68
local.get 4
local.get 7
i32.store8 offset=65
local.get 4
local.get 5
i32.store8 offset=64
local.get 4
i64.const 0
i64.store offset=480
local.get 4
i32.const 2
i32.store8 offset=472
local.get 4
i32.const 256
i32.add
local.get 4
i32.const 64
i32.add
local.get 4
i32.const 472
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
block ;; label = @2
block ;; label = @3
block ;; label = @4
block ;; label = @5
block ;; label = @6
block ;; label = @7
local.get 4
i32.load8_u offset=256
i32.const 255
i32.ne
br_if 0 (;@7;)
local.get 0
local.get 4
i64.load offset=272
i64.store offset=16
local.get 0
local.get 4
i64.load offset=264
i64.store offset=8
local.get 0
i64.const 1
i64.store
local.get 4
i32.const 376
i32.add
call $"#func152 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
br 1 (;@6;)
end
local.get 4
local.get 4
i64.load offset=280
i64.store offset=496
local.get 4
local.get 4
i64.load offset=272
i64.store offset=488
local.get 4
local.get 4
i64.load offset=264
i64.store offset=480
local.get 4
local.get 4
i64.load offset=256
i64.store offset=472
local.get 4
i32.const 64
i32.add
local.get 4
i32.const 472
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
i32.const 1
local.set 5
i32.const 0
local.set 7
block ;; label = @7
local.get 4
i32.load8_u offset=64
local.tee 3
i32.const 255
i32.eq
br_if 0 (;@7;)
local.get 4
local.get 4
i64.load offset=66 align=2
i64.store offset=344
local.get 4
local.get 4
i64.load offset=72 align=2
i64.store offset=350 align=2
local.get 4
i32.load8_u offset=65
local.set 5
local.get 3
local.set 7
end
local.get 4
i32.const 472
i32.add
call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 488
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=288
local.get 4
i32.const 0
i32.store16 offset=496
local.get 4
i32.const 257
i32.store16 offset=480
local.get 4
i64.const 8589934592
i64.store offset=472
local.get 4
local.get 4
i32.const 288
i32.add
i32.store offset=512
local.get 4
i32.const 16
i32.add
local.get 4
i32.const 472
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 8
i32.store offset=68
local.get 4
local.get 4
i32.load offset=16
local.tee 3
i32.store offset=64
block ;; label = @7
local.get 4
i32.load8_u offset=288
i32.const 1
i32.ne
br_if 0 (;@7;)
local.get 3
local.get 3
i32.load
i32.const -1
i32.add
local.tee 2
i32.store
local.get 2
br_if 5 (;@2;)
local.get 4
i32.const 64
i32.add
call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
br 5 (;@2;)
end
local.get 3
i32.eqz
br_if 4 (;@2;)
local.get 4
local.get 4
i64.load offset=384
i64.store offset=488
local.get 4
local.get 4
i64.load offset=376
i64.store offset=480
local.get 4
i32.const 0
i32.store8 offset=376
local.get 4
local.get 5
i32.store8 offset=497
local.get 4
local.get 7
i32.store8 offset=496
local.get 4
i64.const 12884901888
i64.store offset=472
local.get 4
local.get 4
i64.load offset=344
i64.store offset=498 align=2
local.get 4
local.get 4
i64.load offset=350 align=2
i64.store offset=504 align=2
local.get 4
local.get 8
i32.store offset=520
local.get 4
local.get 3
i32.store offset=516
local.get 4
i32.const 6
i32.store8 offset=512
local.get 4
local.get 4
i32.const 376
i32.add
i32.store offset=528
local.get 4
i32.const 8
i32.add
local.get 4
i32.const 472
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=12
local.tee 5
i32.store offset=68
local.get 4
local.get 4
i32.load offset=8
local.tee 3
i32.store offset=64
block ;; label = @7
local.get 4
i32.load8_u offset=376
i32.const 1
i32.ne
br_if 0 (;@7;)
local.get 3
local.get 3
i32.load
i32.const -1
i32.add
local.tee 2
i32.store
local.get 2
br_if 4 (;@3;)
local.get 4
i32.const 64
i32.add
call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
br 4 (;@3;)
end
local.get 3
i32.eqz
br_if 3 (;@3;)
local.get 4
local.get 5
i32.store offset=56
local.get 4
local.get 3
i32.store offset=52
local.get 4
i32.const 6
i32.store8 offset=48
local.get 3
local.get 3
i32.load
i32.const 1
i32.add
local.tee 7
i32.store
local.get 7
i32.eqz
br_if 5 (;@1;)
local.get 4
local.get 3
i32.store offset=348
local.get 4
i32.const 6
i32.store8 offset=344
local.get 4
local.get 5
i64.extend_i32_u
i64.store offset=352
local.get 4
i32.const 0
i32.store16 offset=296
local.get 4
i32.const 1055766
i32.store offset=292
local.get 4
i32.const 1055760
i32.store offset=288
local.get 4
i32.const 472
i32.add
local.get 4
i32.const 288
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 = @7
block ;; label = @8
block ;; label = @9
block ;; label = @10
block ;; label = @11
local.get 4
i32.load8_u offset=472
local.tee 3
i32.const 255
i32.ne
br_if 0 (;@11;)
local.get 4
local.get 4
i64.load offset=476 align=4
i64.store offset=380 align=4
local.get 4
i32.const 3
i32.store8 offset=376
local.get 4
i32.const 288
i32.add
local.get 4
i32.const 344
i32.add
local.get 4
i32.const 376
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
block ;; label = @12
local.get 4
i32.load8_u offset=288
i32.const 255
i32.ne
br_if 0 (;@12;)
local.get 0
local.get 4
i64.load offset=304
i64.store offset=16
local.get 0
local.get 4
i64.load offset=296
i64.store offset=8
local.get 0
i64.const 1
i64.store
br 5 (;@7;)
end
local.get 4
local.get 4
i64.load offset=312
i64.store offset=496
local.get 4
local.get 4
i64.load offset=304
i64.store offset=488
local.get 4
local.get 4
i64.load offset=296
i64.store offset=480
local.get 4
local.get 4
i64.load offset=288
i64.store offset=472
local.get 4
i32.const 376
i32.add
local.get 4
i32.const 472
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=376
i32.const 255
i32.eq
br_if 0 (;@13;)
local.get 4
local.get 4
i64.load offset=384
i64.store offset=120
local.get 4
local.get 4
i64.load offset=376
i64.store offset=112
br 1 (;@12;)
end
local.get 4
i32.const 256
i32.store16 offset=112
end
local.get 4
i32.const 472
i32.add
call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 488
i32.add
call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
block ;; label = @12
block ;; label = @13
block ;; label = @14
block ;; label = @15
block ;; label = @16
block ;; label = @17
block ;; label = @18
block ;; label = @19
block ;; label = @20
block ;; label = @21
block ;; label = @22
block ;; label = @23
block ;; label = @24
block ;; label = @25
block ;; label = @26
block ;; label = @27
block ;; label = @28
block ;; label = @29
local.get 4
i32.load8_u offset=48
local.tee 5
br_table 7 (;@22;) 7 (;@22;) 0 (;@29;) 1 (;@28;) 2 (;@27;) 3 (;@26;) 4 (;@25;) 6 (;@23;) 7 (;@22;)
end
local.get 4
i64.load offset=56
local.set 6
br 8 (;@20;)
end
local.get 4
i32.load offset=52
local.tee 5
local.get 5
i32.load
i32.const 1
i32.add
local.tee 3
i32.store
local.get 3
i32.eqz
br_if 26 (;@1;)
local.get 4
i32.load offset=56
local.set 3
local.get 4
local.get 5
i32.store offset=332
local.get 4
i64.const 1
i64.store offset=324 align=4
br 3 (;@24;)
end
local.get 4
i32.load offset=52
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 25 (;@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 6 (;@20;)
end
local.get 4
i32.load offset=52
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 24 (;@1;)
local.get 4
i64.load32_u offset=56
local.set 6
br 5 (;@20;)
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 23 (;@1;)
local.get 4
local.get 4
i32.load offset=56
i32.store offset=332
local.get 4
local.get 3
i32.store offset=328
i32.const 0
local.set 3
local.get 4
i32.const 0
i32.store offset=324
end
local.get 4
local.get 3
i32.store offset=336
local.get 4
i32.const 0
i32.store offset=320
local.get 4
local.get 4
i64.load offset=324 align=4
i64.store offset=172 align=4
local.get 4
i32.const 1
i32.store offset=168
local.get 4
local.get 4
i64.load offset=332 align=4
i64.store offset=180 align=4
local.get 4
i32.load8_u offset=32
local.tee 5
br_table 10 (;@13;) 10 (;@13;) 4 (;@19;) 5 (;@18;) 6 (;@17;) 7 (;@16;) 8 (;@15;) 9 (;@14;) 10 (;@13;)
end
local.get 4
i32.load offset=52
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 21 (;@1;)
br 1 (;@21;)
end
local.get 4
i32.load8_u offset=49
local.set 7
end
end
local.get 4
local.get 6
i64.store offset=384
local.get 4
local.get 3
i32.store offset=380
local.get 4
local.get 7
i32.store8 offset=377
local.get 4
local.get 5
i32.store8 offset=376
local.get 4
i32.const 328
i32.add
i32.const 1062284
i32.const 9
i32.const 1062293
i32.const 21
call $nanvm_lib::vm::error::thrown::<nanvm_lib::naive::Naive>
local.get 4
i32.const 376
i32.add
call $"#func344 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 0
local.get 4
i64.load offset=336
i64.store offset=16
local.get 0
local.get 4
i64.load offset=328
i64.store offset=8
local.get 0
i64.const 1
i64.store
br 11 (;@8;)
end
local.get 4
i64.load offset=40
local.set 6
br 9 (;@9;)
end
local.get 4
i32.load offset=36
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 16 (;@1;)
br 7 (;@10;)
end
local.get 4
i32.load offset=36
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 15 (;@1;)
local.get 4
i64.load8_u offset=44
i64.const 32
i64.shl
local.get 4
i64.load32_u offset=40
i64.or
local.set 6
br 7 (;@9;)
end
local.get 4
i32.load offset=36
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 14 (;@1;)
br 5 (;@10;)
end
local.get 4
i32.load offset=36
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 13 (;@1;)
br 4 (;@10;)
end
local.get 4
i32.load offset=36
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 12 (;@1;)
br 1 (;@12;)
end
local.get 4
i32.load8_u offset=33
local.set 7
end
br 2 (;@9;)
end
local.get 4
local.get 4
i32.load8_u offset=475
i32.store8 offset=379
local.get 4
local.get 4
i32.load16_u offset=473 align=1
i32.store16 offset=377 align=1
local.get 4
local.get 4
i32.load offset=484
i32.store offset=388
local.get 4
local.get 4
i64.load offset=476 align=4
i64.store offset=380 align=4
local.get 4
local.get 3
i32.store8 offset=376
i32.const 1065572
i32.const 43
local.get 4
i32.const 376
i32.add
i32.const 1065556
i32.const 1065616
call $core::result::unwrap_failed
unreachable
end
local.get 4
i64.load32_u offset=40
local.set 6
end
local.get 4
local.get 6
i64.store offset=544
local.get 4
local.get 3
i32.store offset=540
local.get 4
local.get 7
i32.store8 offset=537
local.get 4
local.get 5
i32.store8 offset=536
local.get 4
i64.const 0
i64.store offset=384
local.get 4
i32.const 2
i32.store8 offset=376
local.get 4
i32.const 344
i32.add
local.get 4
i32.const 536
i32.add
local.get 4
i32.const 376
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
block ;; label = @9
local.get 4
i32.load8_u offset=344
i32.const 255
i32.ne
br_if 0 (;@9;)
local.get 0
local.get 4
i64.load offset=360
i64.store offset=16
local.get 0
local.get 4
i64.load offset=352
i64.store offset=8
local.get 0
i64.const 1
i64.store
block ;; label = @10
local.get 4
i32.load offset=168
br_if 0 (;@10;)
local.get 4
i32.const 176
i32.add
call $"#func152 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
br 2 (;@8;)
end
block ;; label = @10
local.get 4
i32.load offset=172
br_if 0 (;@10;)
local.get 4
i32.load offset=176
local.tee 0
local.get 0
i32.load
i32.const -1
i32.add
local.tee 0
i32.store
local.get 0
br_if 2 (;@8;)
local.get 4
i32.const 176
i32.add
call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
br 2 (;@8;)
end
local.get 4
i32.load offset=180
local.tee 0
local.get 0
i32.load
i32.const -1
i32.add
local.tee 0
i32.store
local.get 0
br_if 1 (;@8;)
local.get 4
i32.const 180
i32.add
call $"<alloc::rc::Rc<[u16]>>::drop_slow"
br 1 (;@8;)
end
local.get 4
local.get 4
i64.load offset=368
i64.store offset=400
local.get 4
local.get 4
i64.load offset=360
i64.store offset=392
local.get 4
local.get 4
i64.load offset=352
i64.store offset=384
local.get 4
local.get 4
i64.load offset=344
i64.store offset=376
local.get 4
i32.const 536
i32.add
local.get 4
i32.const 376
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::own
block ;; label = @9
block ;; label = @10
local.get 4
i32.load8_u offset=536
i32.const 255
i32.eq
br_if 0 (;@10;)
local.get 4
local.get 4
i64.load offset=544
i64.store offset=248
local.get 4
local.get 4
i64.load offset=536
i64.store offset=240
br 1 (;@9;)
end
local.get 4
i32.const 256
i32.store16 offset=240
end
local.get 4
i32.const 376
i32.add
call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 392
i32.add
call $"#func562 core::ptr::drop_glue::<nanvm_lib::vm::unpacked::Unpacked<nanvm_lib::naive::Naive>>"
local.get 4
i64.const 4607182418800017408
i64.store offset=384
local.get 4
i32.const 2
i32.store8 offset=376
local.get 4
i32.const 216
i32.add
local.get 4
i32.const 240
i32.add
local.get 4
i32.const 376
i32.add
call $"<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive> as core::ops::arith::Add>::add"
local.get 4
local.get 4
i64.load offset=224
i64.store offset=536
local.get 4
local.get 4
i64.load offset=232
i64.store offset=544
block ;; label = @9
local.get 4
i64.load offset=216
i64.const 1
i64.ne
br_if 0 (;@9;)
local.get 0
local.get 4
i64.load offset=544
i64.store offset=16
local.get 0
local.get 4
i64.load offset=536
i64.store offset=8
local.get 0
i64.const 1
i64.store
block ;; label = @10
local.get 4
i32.load offset=168
br_if 0 (;@10;)
local.get 4
i32.const 176
i32.add
call $"#func152 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
br 2 (;@8;)
end
block ;; label = @10
local.get 4
i32.load offset=172
br_if 0 (;@10;)
local.get 4
i32.load offset=176
local.tee 0
local.get 0
i32.load
i32.const -1
i32.add
local.tee 0
i32.store
local.get 0
br_if 2 (;@8;)
local.get 4
i32.const 176
i32.add
call $"<alloc::rc::Rc<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>]>>::drop_slow"
br 2 (;@8;)
end
local.get 4
i32.load offset=180
local.tee 0
local.get 0
i32.load
i32.const -1
i32.add
local.tee 0
i32.store
local.get 0
br_if 1 (;@8;)
local.get 4
i32.const 180
i32.add
call $"<alloc::rc::Rc<[u16]>>::drop_slow"
br 1 (;@8;)
end
local.get 4
i32.const 144
i32.add
i32.const 8
i32.add
local.set 3
local.get 4
local.get 4
i64.load offset=536
i64.store offset=200 align=4
local.get 4
local.get 4
i64.load offset=544
i64.store offset=208 align=4
local.get 4
local.get 4
i64.load offset=168
i64.store offset=472
local.get 4
local.get 4
i64.load offset=176
i64.store offset=480
local.get 4
local.get 4
i64.load offset=184
i64.store offset=488
local.get 4
i32.const 0
i32.store offset=496
local.get 4
local.get 4
i64.load offset=196 align=4
i64.store offset=500 align=4
local.get 4
local.get 4
i64.load offset=204 align=4
i64.store offset=508 align=4
local.get 4
local.get 4
i32.load offset=212
i32.store offset=516
local.get 4
i32.const 144
i32.add
local.get 4
i32.const 472
i32.add
call $"nanvm_lib::vm::unstable::spread_array::<nanvm_lib::naive::Naive, [nanvm_lib::vm::unstable::ArrayItem<nanvm_lib::naive::Naive>; 2]>"
block ;; label = @9
local.get 4
i64.load offset=144
i64.const 1
i64.ne
br_if 0 (;@9;)
local.get 0
i64.const 1
i64.store
local.get 0
local.get 3
i64.load offset=8
i64.store offset=16
local.get 0
local.get 3
i64.load
i64.store offset=8
br 1 (;@8;)
end
local.get 4
local.get 3
i64.load offset=8
i64.store offset=136
local.get 4
local.get 3
i64.load
i64.store offset=128
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
block ;; label = @18
local.get 4
i32.load8_u offset=48
local.tee 7
br_table 6 (;@12;) 6 (;@12;) 0 (;@18;) 1 (;@17;) 2 (;@16;) 3 (;@15;) 4 (;@14;) 5 (;@13;) 6 (;@12;)
end
local.get 4
i64.load offset=56
local.set 6
br 8 (;@9;)
end
local.get 4
i32.load offset=52
local.tee 5
local.get 5
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
i32.eqz
br_if 15 (;@1;)
br 6 (;@10;)
end
local.get 4
i32.load offset=52
local.tee 5
local.get 5
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
i32.eqz
br_if 14 (;@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 6 (;@9;)
end
local.get 4
i32.load offset=52
local.tee 5
local.get 5
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
i32.eqz
br_if 13 (;@1;)
br 4 (;@10;)
end
local.get 4
i32.load offset=52
local.tee 5
local.get 5
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
i32.eqz
br_if 12 (;@1;)
br 3 (;@10;)
end
local.get 4
i32.load offset=52
local.tee 5
local.get 5
i32.load
i32.const 1
i32.add
local.tee 8
i32.store
local.get 8
i32.eqz
br_if 11 (;@1;)
br 1 (;@11;)
end
local.get 4
i32.load8_u offset=49
local.set 8
end
br 1 (;@9;)
end
local.get 4
i64.load32_u offset=56
local.set 6
end
local.get 4
local.get 6
i64.store offset=384
local.get 4
local.get 5
i32.store offset=380
local.get 4
local.get 8
i32.store8 offset=377
local.get 4
local.get 7
i32.store8 offset=376
local.get 4
i64.const 4611686018427387904
i64.store offset=480
local.get 4
i32.const 2
i32.store8 offset=472
local.get 4
i32.const 408
i32.add
local.get 4
i32.const 376
i32.add
local.get 4
i32.const 472
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
block ;; label = @9
block ;; label = @10
local.get 4
i32.load8_u offset=408
i32.const 255
i32.ne
br_if 0 (;@10;)
local.get 4
i32.const 408
i32.add
i32.const 8
i32.add
local.set 3
br 1 (;@9;)
end
local.get 4
local.get 4
i64.load offset=432
i64.store offset=496
local.get 4
local.get 4
i64.load offset=424
i64.store offset=488
local.get 4
local.get 4
i64.load offset=416
i64.store offset=480
local.get 4
local.get 4
i64.load offset=408
i64.store offset=472
local.get 4
i32.const 376
i32.add
local.get 4
i32.const 472
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::read
local.get 4
i64.const 0
i64.store offset=480
local.get 4
i32.const 2
i32.store8 offset=472
local.get 4
i32.const 440
i32.add
local.get 4
i32.const 376
i32.add
local.get 4
i32.const 472
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::new
block ;; label = @10
local.get 4
i32.load8_u offset=440
i32.const 255
i32.ne
br_if 0 (;@10;)
local.get 4
i32.const 440
i32.add
i32.const 8
i32.add
local.set 3
br 1 (;@9;)
end
local.get 4
local.get 4
i64.load offset=464
i64.store offset=496
local.get 4
local.get 4
i64.load offset=456
i64.store offset=488
local.get 4
local.get 4
i64.load offset=448
i64.store offset=480
local.get 4
local.get 4
i64.load offset=440
i64.store offset=472
local.get 4
i32.const 96
i32.add
local.get 4
i32.const 472
i32.add
call $<nanvm_lib::vm::lambda::member::Member<nanvm_lib::naive::Naive>>::read
local.get 4
local.get 4
i64.load offset=112
i64.store offset=64
local.get 4
local.get 4
i64.load offset=120
i64.store offset=72
local.get 4
local.get 3
i64.load
i64.store offset=80
local.get 4
local.get 3
i64.load offset=8
i64.store offset=88
local.get 4
local.get 4
i32.const 64
i32.add
call $"<nanvm_lib::naive::container::Container<(), nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>> as nanvm_lib::vm::internal::icontainer::IContainer<nanvm_lib::naive::Naive>>::new_ok::<[nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>; 3]>"
local.get 0
local.get 4
i64.load
i64.store offset=12 align=4
local.get 0
i32.const 6
i32.store8 offset=8
local.get 0
i64.const 0
i64.store
local.get 4
i32.const 48
i32.add
call $"#func152 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
local.get 4
i32.const 32
i32.add
call $"#func152 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 5 (;@4;)
br 4 (;@5;)
end
local.get 0
i64.const 1
i64.store
local.get 0
local.get 3
i64.load offset=8
i64.store offset=16
local.get 0
local.get 3
i64.load
i64.store offset=8
local.get 4
i32.const 128
i32.add
call $"#func152 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
end
local.get 4
i32.const 112
i32.add
call $"#func152 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
end
local.get 4
i32.const 48
i32.add
call $"#func152 core::ptr::drop_glue::<nanvm_lib::vm::any::Any<nanvm_lib::naive::Naive>>"
end
local.get 4
i32.const 32
i32.add
call $"#func152 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 (;@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 560
i32.add
global.set $__stack_pointer
return
end
i32.const 1057428
i32.const 43
local.get 4
i32.const 559
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 559
i32.add
i32.const 1057412
i32.const 1057472
call $core::result::unwrap_failed
unreachable
end
unreachable
)
Run