Skip to content

Commit a92ea63

Browse files
gh-86069: Add more PyNumber_InPlacePower() tests
1 parent 9d1e668 commit a92ea63

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

Lib/test/test_capi/test_number.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,9 @@ def test_misc_multiply(self):
205205
self.assertRaises(MemoryError, inplacemultiply, [1, 2], PY_SSIZE_T_MAX//2 + 1)
206206

207207
def test_misc_power(self):
208-
# PyNumber_Power()
208+
# PyNumber_Power(), PyNumber_InPlacePower()
209209
power = _testcapi.number_power
210+
inplacepower = _testcapi.number_inplacepower
210211

211212
class HasPow(WithDunder):
212213
methname = '__pow__'
@@ -216,6 +217,39 @@ class HasPow(WithDunder):
216217
self.assertRaises(TypeError, power, 4, 11, 1.25)
217218
self.assertRaises(TypeError, power, 4, 11, HasPow.with_val(NotImplemented))
218219
self.assertRaises(TypeError, power, 4, 11, object())
220+
self.assertEqual(inplacepower(4, 11, 5), pow(4, 11, 5))
221+
self.assertRaises(TypeError, inplacepower, 4, 11, 1.25)
222+
self.assertRaises(TypeError, inplacepower, 4, 11, object())
223+
224+
class X:
225+
def __pow__(*args):
226+
return args
227+
228+
x = X()
229+
self.assertEqual(power(x, 11), (x, 11))
230+
self.assertEqual(inplacepower(x, 11), (x, 11))
231+
self.assertEqual(power(x, 11, 5), (x, 11, 5))
232+
self.assertEqual(inplacepower(x, 11, 5), (x, 11, 5))
233+
234+
class X:
235+
def __rpow__(*args):
236+
return args
237+
238+
x = X()
239+
self.assertEqual(power(4, x), (x, 4))
240+
self.assertEqual(inplacepower(4, x), (x, 4))
241+
# XXX: Three-arg power doesn't use __rpow__.
242+
self.assertRaises(TypeError, power, 4, x, 5)
243+
self.assertRaises(TypeError, inplacepower, 4, x, 5)
244+
245+
class X:
246+
def __ipow__(*args):
247+
return args
248+
249+
x = X()
250+
self.assertEqual(inplacepower(x, 11), (x, 11))
251+
# XXX: In-place power doesn't pass the third arg to __ipow__.
252+
self.assertEqual(inplacepower(x, 11, 5), (x, 11))
219253

220254
def test_long(self):
221255
# Test PyNumber_Long()

Objects/typeobject.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9906,8 +9906,14 @@ SLOT1(slot_nb_inplace_remainder, __imod__, PyObject *)
99069906
static PyObject *
99079907
slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
99089908
{
9909-
PyObject *stack[2] = {self, arg1};
9910-
return vectorcall_method(&_Py_ID(__ipow__), stack, 2);
9909+
if (1||arg2 == Py_None) {
9910+
PyObject *stack[2] = {self, arg1};
9911+
return vectorcall_method(&_Py_ID(__ipow__), stack, 2);
9912+
}
9913+
else {
9914+
PyObject *stack[3] = {self, arg1, arg2};
9915+
return vectorcall_method(&_Py_ID(__ipow__), stack, 3);
9916+
}
99119917
}
99129918
SLOT1(slot_nb_inplace_lshift, __ilshift__, PyObject *)
99139919
SLOT1(slot_nb_inplace_rshift, __irshift__, PyObject *)

0 commit comments

Comments
 (0)