Skip to content

Commit c789490

Browse files
committed
Fix each type's unary & ternary fields in PyNumberMethods def
Signed-off-by: snowapril <sinjihng@gmail.com>
1 parent bf2fbfc commit c789490

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

vm/src/builtins/complex.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,13 @@ impl AsNumber for PyComplex {
421421
add: Some(|a, b, vm| PyComplex::number_op(a, b, |a, b, _vm| a + b, vm)),
422422
subtract: Some(|a, b, vm| PyComplex::number_op(a, b, |a, b, _vm| a - b, vm)),
423423
multiply: Some(|a, b, vm| PyComplex::number_op(a, b, |a, b, _vm| a * b, vm)),
424-
power: Some(|a, b, vm| PyComplex::number_op(a, b, inner_pow, vm)),
424+
power: Some(|a, b, c, vm| {
425+
if vm.is_none(c) {
426+
PyComplex::number_op(a, b, inner_pow, vm)
427+
} else {
428+
Err(vm.new_value_error(String::from("complex modulo")))
429+
}
430+
}),
425431
negative: Some(|number, vm| {
426432
let value = PyComplex::number_downcast(number).value;
427433
(-value).to_pyresult(vm)

vm/src/builtins/float.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,16 @@ impl AsNumber for PyFloat {
549549
multiply: Some(|a, b, vm| PyFloat::number_op(a, b, |a, b, _vm| a * b, vm)),
550550
remainder: Some(|a, b, vm| PyFloat::number_op(a, b, inner_mod, vm)),
551551
divmod: Some(|a, b, vm| PyFloat::number_op(a, b, inner_divmod, vm)),
552-
power: Some(|a, b, vm| PyFloat::number_op(a, b, float_pow, vm)),
552+
power: Some(|a, b, c, vm| {
553+
if vm.is_none(c) {
554+
PyFloat::number_op(a, b, float_pow, vm)
555+
} else {
556+
Err(vm.new_type_error(String::from(
557+
"pow() 3rd argument not \\
558+
allowed unless all arguments are integers",
559+
)))
560+
}
561+
}),
553562
negative: Some(|num, vm| {
554563
let value = PyFloat::number_downcast(num).value;
555564
(-value).to_pyresult(vm)
@@ -562,9 +571,9 @@ impl AsNumber for PyFloat {
562571
boolean: Some(|num, _vm| Ok(PyFloat::number_downcast(num).value.is_zero())),
563572
int: Some(|num, vm| {
564573
let value = PyFloat::number_downcast(num).value;
565-
try_to_bigint(value, vm).map(|x| vm.ctx.new_int(x))
574+
try_to_bigint(value, vm).map(|x| PyInt::from(x).into_pyobject(vm))
566575
}),
567-
float: Some(|num, vm| Ok(PyFloat::number_downcast_exact(num, vm))),
576+
float: Some(|num, vm| Ok(PyFloat::number_downcast_exact(num, vm).into())),
568577
floor_divide: Some(|a, b, vm| PyFloat::number_op(a, b, inner_floordiv, vm)),
569578
true_divide: Some(|a, b, vm| PyFloat::number_op(a, b, inner_div, vm)),
570579
..PyNumberMethods::NOT_IMPLEMENTED

vm/src/builtins/int.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ 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, vm| PyInt::number_op(a, b, inner_pow, vm)),
748+
power: Some(|a, b, _c, vm| PyInt::number_op(a, b, inner_pow, vm)), // TODO(snowapril) : use modulo
749749
negative: Some(|num, vm| (&PyInt::number_downcast(num).value).neg().to_pyresult(vm)),
750750
positive: Some(|num, vm| Ok(PyInt::number_downcast_exact(num, vm).into())),
751751
absolute: Some(|num, vm| PyInt::number_downcast(num).value.abs().to_pyresult(vm)),
@@ -756,14 +756,14 @@ impl PyInt {
756756
and: Some(|a, b, vm| PyInt::number_op(a, b, |a, b, _vm| a & b, vm)),
757757
xor: Some(|a, b, vm| PyInt::number_op(a, b, |a, b, _vm| a ^ b, vm)),
758758
or: Some(|a, b, vm| PyInt::number_op(a, b, |a, b, _vm| a | b, vm)),
759-
int: Some(|num, vm| Ok(PyInt::number_downcast_exact(num, vm))),
759+
int: Some(|num, vm| PyInt::number_downcast_exact(num, vm).to_pyresult(vm)),
760760
float: Some(|num, vm| {
761761
let zelf = PyInt::number_downcast(num);
762-
try_to_float(&zelf.value, vm).map(|x| vm.ctx.new_float(x))
762+
try_to_float(&zelf.value, vm).map(|x| vm.ctx.new_float(x).into_pyobject(vm))
763763
}),
764764
floor_divide: Some(|a, b, vm| PyInt::number_op(a, b, inner_floordiv, vm)),
765765
true_divide: Some(|a, b, vm| PyInt::number_op(a, b, inner_truediv, vm)),
766-
index: Some(|num, vm| Ok(PyInt::number_downcast_exact(num, vm))),
766+
index: Some(|num, vm| PyInt::number_downcast_exact(num, vm).to_pyresult(vm)),
767767
..PyNumberMethods::NOT_IMPLEMENTED
768768
};
769769

0 commit comments

Comments
 (0)