Skip to content

Commit 96af524

Browse files
committed
Fix PyInt PyNubmerMethods pow
Signed-off-by: snowapril <sinjihng@gmail.com>
1 parent 3a9a1c9 commit 96af524

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

vm/src/builtins/float.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub struct PyFloat {
3030
}
3131

3232
impl PyFloat {
33-
pub fn to_f64(self) -> f64 {
33+
pub fn to_f64(&self) -> f64 {
3434
self.value
3535
}
3636
}

vm/src/builtins/int.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,24 @@ impl PyInt {
745745
multiply: Some(|a, b, vm| PyInt::number_op(a, b, |a, b, _vm| a * b, vm)),
746746
remainder: Some(|a, b, vm| PyInt::number_op(a, b, inner_mod, vm)),
747747
divmod: Some(|a, b, vm| PyInt::number_op(a, b, inner_divmod, vm)),
748-
power: Some(|a, b, _c, vm| PyInt::number_op(a, b, inner_pow, vm)), // TODO(snowapril) : use modulo
748+
power: Some(|a, b, c, vm| {
749+
if let (Some(a), Some(b)) = (
750+
a.payload::<Self>(),
751+
if b.payload_is::<Self>() {
752+
Some(b)
753+
} else {
754+
None
755+
},
756+
) {
757+
if vm.is_none(c) {
758+
a.general_op(b.to_owned(), |a, b| inner_pow(a, b, vm), vm)
759+
} else {
760+
a.modpow(b.to_owned(), c.to_owned(), vm)
761+
}
762+
} else {
763+
Ok(vm.ctx.not_implemented())
764+
}
765+
}),
749766
negative: Some(|num, vm| (&PyInt::number_downcast(num).value).neg().to_pyresult(vm)),
750767
positive: Some(|num, vm| Ok(PyInt::number_downcast_exact(num, vm).into())),
751768
absolute: Some(|num, vm| PyInt::number_downcast(num).value.abs().to_pyresult(vm)),
@@ -756,14 +773,14 @@ impl PyInt {
756773
and: Some(|a, b, vm| PyInt::number_op(a, b, |a, b, _vm| a & b, vm)),
757774
xor: Some(|a, b, vm| PyInt::number_op(a, b, |a, b, _vm| a ^ b, vm)),
758775
or: Some(|a, b, vm| PyInt::number_op(a, b, |a, b, _vm| a | b, vm)),
759-
int: Some(|num, vm| PyInt::number_downcast_exact(num, vm).to_pyresult(vm)),
776+
int: Some(|num, vm| Ok(PyInt::number_downcast_exact(num, vm).into())),
760777
float: Some(|num, vm| {
761778
let zelf = PyInt::number_downcast(num);
762-
try_to_float(&zelf.value, vm).map(|x| vm.ctx.new_float(x).into_pyobject(vm))
779+
try_to_float(&zelf.value, vm).map(|x| vm.ctx.new_float(x).into())
763780
}),
764781
floor_divide: Some(|a, b, vm| PyInt::number_op(a, b, inner_floordiv, vm)),
765782
true_divide: Some(|a, b, vm| PyInt::number_op(a, b, inner_truediv, vm)),
766-
index: Some(|num, vm| PyInt::number_downcast_exact(num, vm).to_pyresult(vm)),
783+
index: Some(|num, vm| Ok(PyInt::number_downcast_exact(num, vm).into())),
767784
..PyNumberMethods::NOT_IMPLEMENTED
768785
};
769786

0 commit comments

Comments
 (0)