MCPcopy Index your code
hub / github.com/explodingcamera/tinywasm / run_file

Method run_file

crates/cli/src/wast_runner.rs:202–522  ·  view source on GitHub ↗
(&mut self, file: TestFile<'_>)

Source from the content-addressed store, hash-verified

200 }
201
202 pub fn run_file(&mut self, file: TestFile<'_>) -> Result<()> {
203 let test_group = self.test_group(file.name(), file.parent());
204 let wast_raw = file.raw();
205 let wast = file.wast()?;
206 let directives = wast.directives()?;
207
208 let mut store = Store::default();
209 let mut module_registry = ModuleRegistry::default();
210
211 println!("running {} tests for group: {}", directives.len(), file.name());
212 for (i, directive) in directives.into_iter().enumerate() {
213 let span = directive.span();
214 use wast::WastDirective::{
215 AssertExhaustion, AssertInvalid, AssertMalformed, AssertReturn, AssertTrap, AssertUnlinkable, Invoke,
216 Module as Wat, Register,
217 };
218
219 match directive {
220 Register { span, name, .. } => {
221 let Some(last) = module_registry.last() else {
222 test_group.add_result(
223 &format!("Register({i})"),
224 span.linecol_in(wast_raw),
225 Err(eyre!("no module to register")),
226 );
227 continue;
228 };
229 module_registry.register(name.to_string(), last);
230 test_group.add_result(&format!("Register({i})"), span.linecol_in(wast_raw), Ok(()));
231 }
232 Wat(module) => {
233 let result = catch_unwind_silent(|| {
234 let (name, bytes) = encode_quote_wat(module);
235 let module = parse_module_bytes(&bytes).expect("failed to parse module bytes");
236 let imports = Self::imports(&mut store, module_registry.modules()).unwrap();
237 let module_instance = ModuleInstance::instantiate(&mut store, &module, Some(imports))
238 .expect("failed to instantiate module");
239 (name, module_instance)
240 })
241 .map_err(|e| eyre!("failed to parse wat module: {}", try_downcast_panic(e)));
242
243 match &result {
244 Err(err) => debug!("failed to parse module: {err:?}"),
245 Ok((name, module)) => module_registry.update_last_module(module.clone(), name.clone()),
246 };
247
248 test_group.add_result(&format!("Wat({i})"), span.linecol_in(wast_raw), result.map(|_| ()));
249 }
250 AssertMalformed { span, mut module, message } => {
251 let Ok(encoded) = module.encode() else {
252 test_group.add_result(&format!("AssertMalformed({i})"), span.linecol_in(wast_raw), Ok(()));
253 continue;
254 };
255 let res = catch_unwind_silent(|| parse_module_bytes(&encoded))
256 .map_err(|e| eyre!("failed to parse module (expected): {}", try_downcast_panic(e)))
257 .and_then(|res| res);
258 test_group.add_result(
259 &format!("AssertMalformed({i})"),

Callers 2

run_pathsMethod · 0.80
run_filesMethod · 0.80

Calls 15

catch_unwind_silentFunction · 0.85
encode_quote_watFunction · 0.85
parse_module_bytesFunction · 0.85
convert_wastargsFunction · 0.85
exec_fn_instanceFunction · 0.85
convert_wastretFunction · 0.85
test_groupMethod · 0.80
nameMethod · 0.80
parentMethod · 0.80
wastMethod · 0.80
directivesMethod · 0.80
add_resultMethod · 0.80

Tested by

no test coverage detected