@@ -136,6 +136,99 @@ TEST(capi, instantiate_imported_function)
136136 fizzy_free_instance (instance);
137137}
138138
139+ TEST (capi, resolve_instantiate_no_imports)
140+ {
141+ /* wat2wasm
142+ (module)
143+ */
144+ const auto wasm = from_hex (" 0061736d01000000" );
145+ auto module = fizzy_parse (wasm.data (), wasm.size ());
146+ ASSERT_NE (module , nullptr );
147+
148+ auto instance = fizzy_resolve_instantiate (module , nullptr , 0 );
149+ EXPECT_NE (instance, nullptr );
150+
151+ fizzy_free_instance (instance);
152+
153+ module = fizzy_parse (wasm.data (), wasm.size ());
154+ ASSERT_NE (module , nullptr );
155+
156+ FizzyImportedFunction host_funcs[] = {{" mod" , " foo" ,
157+ {{FizzyValueTypeVoid, nullptr , 0 },
158+ [](void *, FizzyInstance*, const FizzyValue*, int ) { return FizzyExecutionResult{}; },
159+ nullptr }}};
160+
161+ instance = fizzy_resolve_instantiate (module , host_funcs, 1 );
162+ EXPECT_NE (instance, nullptr );
163+
164+ fizzy_free_instance (instance);
165+ }
166+
167+ TEST (capi, resolve_instantiate)
168+ {
169+ /* wat2wasm
170+ (func (import "mod1" "foo1") (result i32))
171+ (func (import "mod1" "foo2") (result i64))
172+ (func (import "mod2" "foo1") (result f32))
173+ (func (import "mod2" "foo2") (result f64))
174+ */
175+ const auto wasm = from_hex (
176+ " 0061736d010000000111046000017f6000017e6000017d6000017c023104046d6f643104666f6f310000046d6f"
177+ " 643104666f6f320001046d6f643204666f6f310002046d6f643204666f6f320003" );
178+ auto module = fizzy_parse (wasm.data (), wasm.size ());
179+ ASSERT_NE (module , nullptr );
180+
181+ EXPECT_EQ (fizzy_instantiate (module , nullptr , 0 ), nullptr );
182+
183+ module = fizzy_parse (wasm.data (), wasm.size ());
184+ ASSERT_NE (module , nullptr );
185+
186+ FizzyExternalFn host_fn = [](void * context, FizzyInstance*, const FizzyValue*, int ) {
187+ return FizzyExecutionResult{true , false , *static_cast <FizzyValue*>(context)};
188+ };
189+
190+ FizzyValue result_int{42 };
191+ FizzyExternalFunction mod1foo1 = {{FizzyValueTypeI32, nullptr , 0 }, host_fn, &result_int};
192+ FizzyExternalFunction mod1foo2 = {{FizzyValueTypeI64, nullptr , 0 }, host_fn, &result_int};
193+ FizzyValue result_f32;
194+ result_f32.f32 = 42 ;
195+ FizzyExternalFunction mod2foo1 = {{FizzyValueTypeF32, nullptr , 0 }, host_fn, &result_f32};
196+ FizzyValue result_f64;
197+ result_f64.f64 = 42 ;
198+ FizzyExternalFunction mod2foo2 = {{FizzyValueTypeF64, nullptr , 0 }, host_fn, &result_f64};
199+
200+ FizzyImportedFunction host_funcs[] = {{" mod1" , " foo1" , mod1foo1}, {" mod1" , " foo2" , mod1foo2},
201+ {" mod2" , " foo1" , mod2foo1}, {" mod2" , " foo2" , mod2foo2}};
202+
203+ auto instance = fizzy_resolve_instantiate (module , host_funcs, 4 );
204+ EXPECT_NE (instance, nullptr );
205+ fizzy_free_instance (instance);
206+
207+ // reordered functions
208+ module = fizzy_parse (wasm.data (), wasm.size ());
209+ ASSERT_NE (module , nullptr );
210+ FizzyImportedFunction host_funcs_reordered[] = {{" mod1" , " foo2" , mod1foo2},
211+ {" mod2" , " foo1" , mod2foo1}, {" mod2" , " foo2" , mod2foo2}, {" mod1" , " foo1" , mod1foo1}};
212+ instance = fizzy_resolve_instantiate (module , host_funcs_reordered, 4 );
213+ EXPECT_NE (instance, nullptr );
214+ fizzy_free_instance (instance);
215+
216+ // extra functions
217+ module = fizzy_parse (wasm.data (), wasm.size ());
218+ ASSERT_NE (module , nullptr );
219+ FizzyImportedFunction host_funcs_extra[] = {{" mod1" , " foo1" , mod1foo1},
220+ {" mod1" , " foo2" , mod1foo2}, {" mod2" , " foo1" , mod2foo1}, {" mod2" , " foo2" , mod2foo2},
221+ {" mod3" , " foo1" , mod1foo1}};
222+ instance = fizzy_resolve_instantiate (module , host_funcs_extra, 4 );
223+ EXPECT_NE (instance, nullptr );
224+ fizzy_free_instance (instance);
225+
226+ // not enough functions
227+ module = fizzy_parse (wasm.data (), wasm.size ());
228+ ASSERT_NE (module , nullptr );
229+ EXPECT_EQ (fizzy_resolve_instantiate (module , host_funcs, 3 ), nullptr );
230+ }
231+
139232TEST (capi, free_instance_null)
140233{
141234 fizzy_free_instance (nullptr );
0 commit comments