diff --git a/non_determinism_checker/Cargo.toml b/non_determinism_checker/Cargo.toml index 57ed39b..20a8b9f 100644 --- a/non_determinism_checker/Cargo.toml +++ b/non_determinism_checker/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "wasm-pack" +name = "non_determinism_checker" version = "0.1.0" authors = ["NikVolf "] diff --git a/src/non_determinism_checker.rs b/src/non_determinism_checker.rs index e5bd10c..13777e4 100644 --- a/src/non_determinism_checker.rs +++ b/src/non_determinism_checker.rs @@ -1,11 +1,78 @@ use parity_wasm::{elements}; -use parity_wasm::elements::Section; +use parity_wasm::elements::{ Section, Opcodes }; use parity_wasm::elements::Opcode::*; -// TODO: -// fn check_code (FuncBodybody) -> bool { - -// } +fn check_opcodes (opcodes: &Opcodes) -> bool { + for opcode in opcodes.elements() { + match *opcode { + F32Abs | + F32Neg | + F32Ceil | + F32Floor | + F32Trunc | + F32Nearest | + F32Sqrt | + F32Add | + F32Sub | + F32Mul | + F32Div | + F32Min | + F32Max | + F32Copysign | + F64Abs | + F64Neg | + F64Ceil | + F64Floor | + F64Trunc | + F64Nearest | + F64Sqrt | + F64Add | + F64Sub | + F64Mul | + F64Div | + F64Min | + F64Max | + F64Copysign | + I32TruncSF32 | + I32TruncUF32 | + I32TruncSF64 | + I32TruncUF64 | + I64TruncSF32 | + I64TruncUF32 | + I64TruncSF64 | + I64TruncUF64 | + F32ConvertSI32 | + F32ConvertUI32 | + F32ConvertSI64 | + F32ConvertUI64 | + F32DemoteF64 | + F64ConvertSI32 | + F64ConvertUI32 | + F64ConvertSI64 | + F64ConvertUI64 | + F64PromoteF32 | + I32ReinterpretF32 | + I64ReinterpretF64 | + F32ReinterpretI32 | + F64ReinterpretI64 | + F32Eq | + F32Ne | + F32Lt | + F32Gt | + F32Le | + F32Ge | + F64Eq | + F64Ne | + F64Lt | + F64Gt | + F64Le | + F64Ge + => return true, + _ => continue + } + } + false +} pub fn have_non_determinism(module: elements::Module) -> bool { @@ -14,82 +81,16 @@ pub fn have_non_determinism(module: elements::Module) -> bool { match *section { Section::Code(ref cs) => { for body in cs.bodies() { - for opcode in body.code().elements() { - match *opcode { - F32Abs | - F32Neg | - F32Ceil | - F32Floor | - F32Trunc | - F32Nearest | - F32Sqrt | - F32Add | - F32Sub | - F32Mul | - F32Div | - F32Min | - F32Max | - F32Copysign | - F64Abs | - F64Neg | - F64Ceil | - F64Floor | - F64Trunc | - F64Nearest | - F64Sqrt | - F64Add | - F64Sub | - F64Mul | - F64Div | - F64Min | - F64Max | - F64Copysign | - I32TruncSF32 | - I32TruncUF32 | - I32TruncSF64 | - I32TruncUF64 | - I64TruncSF32 | - I64TruncUF32 | - I64TruncSF64 | - I64TruncUF64 | - F32ConvertSI32 | - F32ConvertUI32 | - F32ConvertSI64 | - F32ConvertUI64 | - F32DemoteF64 | - F64ConvertSI32 | - F64ConvertUI32 | - F64ConvertSI64 | - F64ConvertUI64 | - F64PromoteF32 | - I32ReinterpretF32 | - I64ReinterpretF64 | - F32ReinterpretI32 | - F64ReinterpretI64 | - F32Eq | - F32Ne | - F32Lt | - F32Gt | - F32Le | - F32Ge | - F64Eq | - F64Ne | - F64Lt | - F64Gt | - F64Le | - F64Ge - => { - return true - }, - _ => continue + if check_opcodes(body.code()) { + return true; + } else { + continue } } - }; - return false; - }, + }, _ => continue + } } - } false }