diff --git a/spec/src/fixtures.rs b/spec/src/fixtures.rs index 39ef26b..814535c 100644 --- a/spec/src/fixtures.rs +++ b/spec/src/fixtures.rs @@ -101,7 +101,7 @@ run_test!("loop", wasm_loop); run_test!("memory_redundancy", wasm_memory_redundancy); run_test!("memory_trap", wasm_memory_trap); run_test!("memory", wasm_memory); -// TODO: fix comparison??? run_test!("names", wasm_names); +run_test!("names", wasm_names); run_test!("nop", wasm_nop); run_test!("of_string-overflow-hex-u32.fail", wasm_of_string_overflow_hex_u32_fail, fail); run_test!("of_string-overflow-hex-u64.fail", wasm_of_string_overflow_hex_u64_fail, fail); diff --git a/spec/src/run.rs b/spec/src/run.rs index bd4c968..ef18589 100644 --- a/spec/src/run.rs +++ b/spec/src/run.rs @@ -97,12 +97,13 @@ fn run_action(program: &ProgramInstance, action: &test::Action) let module = module.clone().unwrap_or("wasm_test".into()); let module = module.trim_left_matches('$'); let module = program.module(&module).expect(&format!("Expected program to have loaded module {}", module)); - module.execute_export(field, runtime_values(args).into()) + module.execute_export(&jstring_to_rstring(field), runtime_values(args).into()) }, test::Action::Get { ref module, ref field, .. } => { let module = module.clone().unwrap_or("wasm_test".into()); let module = module.trim_left_matches('$'); let module = program.module(&module).expect(&format!("Expected program to have loaded module {}", module)); + let field = jstring_to_rstring(&field); module.export_entry(field.as_ref(), &ExportEntryType::Any) .and_then(|i| match i { @@ -280,3 +281,13 @@ pub fn spec(name: &str) { } } } + +// Convert json string to correct rust UTF8 string. +// The reason is that, for example, rust character "\u{FEEF}" (3-byte UTF8 BOM) is represented as "\u00ef\u00bb\u00bf" in json. +// It is incorrect. Correct "\uFEFF" => we need to do a double utf8 parse here. +// This conversion is incorrect in general case (casting char to u8)!!! +fn jstring_to_rstring(jstring: &str) -> String { + let jstring_chars: Vec = jstring.chars().map(|c| c as u8).collect(); + let rstring = String::from_utf8(jstring_chars).unwrap(); + rstring +}