Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/tests/all/component_model/nested.rs
1692 views
1
#![cfg(not(miri))]
2
3
use super::REALLOC_AND_FREE;
4
use anyhow::Result;
5
use wasmtime::component::*;
6
use wasmtime::{Module, Store, StoreContextMut};
7
8
#[test]
9
fn top_level_instance_two_level() -> Result<()> {
10
let component = r#"
11
(component
12
(import "c" (instance $i
13
(export "c" (instance
14
(export "m" (core module
15
(export "g" (global i32))
16
))
17
))
18
))
19
(component $c1
20
(import "c" (instance $i
21
(export "c" (instance
22
(export "m" (core module
23
(export "g" (global i32))
24
))
25
))
26
))
27
(core module $verify
28
(import "" "g" (global i32))
29
(func $start
30
global.get 0
31
i32.const 101
32
i32.ne
33
if unreachable end
34
)
35
36
(start $start)
37
)
38
(core instance $m (instantiate (module $i "c" "m")))
39
(core instance (instantiate $verify (with "" (instance $m))))
40
)
41
(instance (instantiate $c1 (with "c" (instance $i))))
42
)
43
"#;
44
let module = r#"
45
(module
46
(global (export "g") i32 i32.const 101)
47
)
48
"#;
49
50
let engine = super::engine();
51
let module = Module::new(&engine, module)?;
52
let component = Component::new(&engine, component)?;
53
let mut store = Store::new(&engine, ());
54
let mut linker = Linker::new(&engine);
55
linker.instance("c")?.instance("c")?.module("m", &module)?;
56
linker.instantiate(&mut store, &component)?;
57
Ok(())
58
}
59
60
#[test]
61
fn nested_many_instantiations() -> Result<()> {
62
let component = r#"
63
(component
64
(import "count" (func $count))
65
(component $c1
66
(import "count" (func $count))
67
(core func $count_lower (canon lower (func $count)))
68
(core module $m
69
(import "" "" (func $count))
70
(start $count)
71
)
72
(core instance (instantiate $m (with "" (instance (export "" (func $count_lower))))))
73
(core instance (instantiate $m (with "" (instance (export "" (func $count_lower))))))
74
)
75
(component $c2
76
(import "count" (func $count))
77
(instance (instantiate $c1 (with "count" (func $count))))
78
(instance (instantiate $c1 (with "count" (func $count))))
79
)
80
(component $c3
81
(import "count" (func $count))
82
(instance (instantiate $c2 (with "count" (func $count))))
83
(instance (instantiate $c2 (with "count" (func $count))))
84
)
85
(component $c4
86
(import "count" (func $count))
87
(instance (instantiate $c3 (with "count" (func $count))))
88
(instance (instantiate $c3 (with "count" (func $count))))
89
)
90
91
(instance (instantiate $c4 (with "count" (func $count))))
92
)
93
"#;
94
let engine = super::engine();
95
let component = Component::new(&engine, component)?;
96
let mut store = Store::new(&engine, 0);
97
let mut linker = Linker::new(&engine);
98
linker
99
.root()
100
.func_wrap("count", |mut store: StoreContextMut<'_, u32>, _: ()| {
101
*store.data_mut() += 1;
102
Ok(())
103
})?;
104
linker.instantiate(&mut store, &component)?;
105
assert_eq!(*store.data(), 16);
106
Ok(())
107
}
108
109
#[test]
110
fn thread_options_through_inner() -> Result<()> {
111
let component = format!(
112
r#"
113
(component
114
(import "hostfn" (func $host (param "a" u32) (result string)))
115
116
(component $c
117
(import "hostfn" (func $host (param "a" u32) (result string)))
118
119
(core module $libc
120
(memory (export "memory") 1)
121
{REALLOC_AND_FREE}
122
)
123
(core instance $libc (instantiate $libc))
124
125
(core func $host_lower
126
(canon lower
127
(func $host)
128
(memory $libc "memory")
129
(realloc (func $libc "realloc"))
130
)
131
)
132
133
(core module $m
134
(import "" "host" (func $host (param i32 i32)))
135
(import "libc" "memory" (memory 1))
136
(func (export "run") (param i32) (result i32)
137
i32.const 42
138
i32.const 100
139
call $host
140
i32.const 100
141
)
142
(export "memory" (memory 0))
143
)
144
(core instance $m (instantiate $m
145
(with "" (instance (export "host" (func $host_lower))))
146
(with "libc" (instance $libc))
147
))
148
149
(func (export "run") (param "a" u32) (result string)
150
(canon lift
151
(core func $m "run")
152
(memory $m "memory")
153
)
154
)
155
)
156
(instance $c (instantiate $c (with "hostfn" (func $host))))
157
(export "run" (func $c "run"))
158
)
159
"#
160
);
161
let engine = super::engine();
162
let component = Component::new(&engine, component)?;
163
let mut store = Store::new(&engine, 0);
164
let mut linker = Linker::new(&engine);
165
linker
166
.root()
167
.func_wrap("hostfn", |_, (param,): (u32,)| Ok((param.to_string(),)))?;
168
let instance = linker.instantiate(&mut store, &component)?;
169
let result = instance
170
.get_typed_func::<(u32,), (WasmStr,)>(&mut store, "run")?
171
.call(&mut store, (43,))?
172
.0;
173
assert_eq!(result.to_str(&store)?, "42");
174
Ok(())
175
}
176
177