()
| 1209 | |
| 1210 | #[test] |
| 1211 | fn div_plus_load_reported_right() -> Result<()> { |
| 1212 | let engine = Engine::default(); |
| 1213 | let mut store = Store::new(&engine, ()); |
| 1214 | let module = Module::new( |
| 1215 | &engine, |
| 1216 | r#" |
| 1217 | (module |
| 1218 | (memory (export "memory") 1) |
| 1219 | (func (export "i32.div_s") (param i32 i32) (result i32) |
| 1220 | (i32.div_s (local.get 0) (i32.load (local.get 1)))) |
| 1221 | (func (export "i32.div_u") (param i32 i32) (result i32) |
| 1222 | (i32.div_u (local.get 0) (i32.load (local.get 1)))) |
| 1223 | (func (export "i32.rem_s") (param i32 i32) (result i32) |
| 1224 | (i32.rem_s (local.get 0) (i32.load (local.get 1)))) |
| 1225 | (func (export "i32.rem_u") (param i32 i32) (result i32) |
| 1226 | (i32.rem_u (local.get 0) (i32.load (local.get 1)))) |
| 1227 | ) |
| 1228 | "#, |
| 1229 | )?; |
| 1230 | let instance = Instance::new(&mut store, &module, &[])?; |
| 1231 | let memory = instance.get_memory(&mut store, "memory").unwrap(); |
| 1232 | let i32_div_s = instance.get_typed_func::<(i32, i32), i32>(&mut store, "i32.div_s")?; |
| 1233 | let i32_div_u = instance.get_typed_func::<(u32, u32), u32>(&mut store, "i32.div_u")?; |
| 1234 | let i32_rem_s = instance.get_typed_func::<(i32, i32), i32>(&mut store, "i32.rem_s")?; |
| 1235 | let i32_rem_u = instance.get_typed_func::<(u32, u32), u32>(&mut store, "i32.rem_u")?; |
| 1236 | |
| 1237 | memory.write(&mut store, 0, &1i32.to_le_bytes()).unwrap(); |
| 1238 | memory.write(&mut store, 4, &0i32.to_le_bytes()).unwrap(); |
| 1239 | memory.write(&mut store, 8, &(-1i32).to_le_bytes()).unwrap(); |
| 1240 | |
| 1241 | assert_eq!(i32_div_s.call(&mut store, (100, 0))?, 100); |
| 1242 | assert_eq!(i32_div_u.call(&mut store, (101, 0))?, 101); |
| 1243 | assert_eq!(i32_rem_s.call(&mut store, (102, 0))?, 0); |
| 1244 | assert_eq!(i32_rem_u.call(&mut store, (103, 0))?, 0); |
| 1245 | |
| 1246 | assert_trap( |
| 1247 | i32_div_s.call(&mut store, (100, 4)), |
| 1248 | Trap::IntegerDivisionByZero, |
| 1249 | ); |
| 1250 | assert_trap( |
| 1251 | i32_div_u.call(&mut store, (100, 4)), |
| 1252 | Trap::IntegerDivisionByZero, |
| 1253 | ); |
| 1254 | assert_trap( |
| 1255 | i32_rem_s.call(&mut store, (100, 4)), |
| 1256 | Trap::IntegerDivisionByZero, |
| 1257 | ); |
| 1258 | assert_trap( |
| 1259 | i32_rem_u.call(&mut store, (100, 4)), |
| 1260 | Trap::IntegerDivisionByZero, |
| 1261 | ); |
| 1262 | |
| 1263 | assert_trap( |
| 1264 | i32_div_s.call(&mut store, (i32::MIN, 8)), |
| 1265 | Trap::IntegerOverflow, |
| 1266 | ); |
| 1267 | assert_eq!(i32_rem_s.call(&mut store, (i32::MIN, 8))?, 0); |
| 1268 |
nothing calls this directly
no test coverage detected