@@ -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 );
@@ -190,7 +283,8 @@ TEST(capi, memory_access)
190283 )
191284 */
192285 const auto wasm = from_hex (
193- " 0061736d010000000105016000017f0302010005030100010a0901070041002802000b0b08010041010b02112"
286+ " 0061736d010000000105016000017f0302010005030100010a0901070041002802000b0b08010041010b02"
287+ " 112"
194288 " 2" );
195289 auto module = fizzy_parse (wasm.data (), wasm.size ());
196290 ASSERT_NE (module , nullptr );
@@ -237,7 +331,8 @@ TEST(capi, execute)
237331 (func unreachable)
238332 */
239333 const auto wasm = from_hex (
240- " 0061736d01000000010e036000006000017f60027f7f017f030504000102000a150402000b0400412a0b070020"
334+ " 0061736d01000000010e036000006000017f60027f7f017f030504000102000a150402000b0400412a0b07"
335+ " 0020"
241336 " 0020016e0b0300000b" );
242337
243338 auto module = fizzy_parse (wasm.data (), wasm.size ());
@@ -262,7 +357,8 @@ TEST(capi, execute_with_host_function)
262357 (func (import "mod1" "foo2") (param i32 i32) (result i32))
263358 */
264359 const auto wasm = from_hex (
265- " 0061736d01000000010b026000017f60027f7f017f021902046d6f643104666f6f310000046d6f643104666f6f"
360+ " 0061736d01000000010b026000017f60027f7f017f021902046d6f643104666f6f310000046d6f64310466"
361+ " 6f6f"
266362 " 320001" );
267363 auto module = fizzy_parse (wasm.data (), wasm.size ());
268364 ASSERT_NE (module , nullptr );
@@ -378,7 +474,8 @@ TEST(capi, imported_function_from_another_module)
378474 )
379475 */
380476 const auto bin2 = from_hex (
381- " 0061736d0100000001070160027f7f017f020a01026d31037375620000030201000a0a0108002000200110000"
477+ " 0061736d0100000001070160027f7f017f020a01026d31037375620000030201000a0a0108002000200110"
478+ " 000"
382479 " b" );
383480 auto module2 = fizzy_parse (bin2.data (), bin2.size ());
384481 ASSERT_NE (module2, nullptr );
0 commit comments