in starlark/src/values/types/int.rs [165:184]
fn percent(&self, other: Value<'v>, heap: &'v Heap) -> anyhow::Result<Value<'v>> {
if let Some(Num::Float(_)) = other.unpack_num() {
return StarlarkFloat(self.get() as f64).percent(other, heap);
}
i64_arith_bin_op(self.get(), other, "%", |a, b| {
if b == 0 {
return Err(ValueError::DivisionByZero.into());
}
// In Rust `i32::min_value() % -1` is overflow, but we should eval it to zero.
if self.get() == i32::min_value() && b == -1 {
return Ok(0);
}
let r = a % b;
if r == 0 {
Ok(0)
} else {
Ok(if b.signum() != r.signum() { r + b } else { r })
}
})
}