Skip to content

Commit dd73273

Browse files
authored
Update capi_version for mypyc tests to 3.9 (#18546)
Followup to #18341 This PR updates the `capi_version` used for mypyc tests to `3.9` (mypy / mypyc requires `>=3.9`). For Python 3.9+ mypyc uses `PyObject_VectorcallMethod` instead of `CPyObject_CallMethodObjArgs` and select `PyObject_Vectorcall` where ever possible. Will remove the now unnecessary `use_method_vectorcall` check in a followup. https://github.com/python/mypy/blob/42e005c999d8341c0da6d7b93b10d05f2db2099c/mypyc/common.py#L114-L116
1 parent 42e005c commit dd73273

File tree

6 files changed

+134
-148
lines changed

6 files changed

+134
-148
lines changed

mypyc/test-data/irbuild-basic.test

+48-40
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ L0:
750750
r1 = b'1234'
751751
return r1
752752

753-
[case testPyMethodCall1]
753+
[case testPyMethodCall1_64bit]
754754
from typing import Any
755755
def f(x: Any) -> int:
756756
y: int = x.pop()
@@ -759,20 +759,30 @@ def f(x: Any) -> int:
759759
def f(x):
760760
x :: object
761761
r0 :: str
762-
r1 :: object
763-
r2, y :: int
764-
r3 :: str
765-
r4 :: object
766-
r5 :: int
762+
r1 :: object[1]
763+
r2 :: object_ptr
764+
r3 :: object
765+
r4, y :: int
766+
r5 :: str
767+
r6 :: object[1]
768+
r7 :: object_ptr
769+
r8 :: object
770+
r9 :: int
767771
L0:
768772
r0 = 'pop'
769-
r1 = CPyObject_CallMethodObjArgs(x, r0, 0)
770-
r2 = unbox(int, r1)
771-
y = r2
772-
r3 = 'pop'
773-
r4 = CPyObject_CallMethodObjArgs(x, r3, 0)
774-
r5 = unbox(int, r4)
775-
return r5
773+
r1 = [x]
774+
r2 = load_address r1
775+
r3 = PyObject_VectorcallMethod(r0, r2, 9223372036854775809, 0)
776+
keep_alive x
777+
r4 = unbox(int, r3)
778+
y = r4
779+
r5 = 'pop'
780+
r6 = [x]
781+
r7 = load_address r6
782+
r8 = PyObject_VectorcallMethod(r5, r7, 9223372036854775809, 0)
783+
keep_alive x
784+
r9 = unbox(int, r8)
785+
return r9
776786

777787
[case testObjectType]
778788
def g(y: object) -> None:
@@ -1167,7 +1177,7 @@ L0:
11671177
r2 = unbox(float, r1)
11681178
return r2
11691179

1170-
[case testCallableTypesWithKeywordArgs]
1180+
[case testCallableTypesWithKeywordArgs_64bit]
11711181
from typing import List
11721182

11731183
def call_python_function_with_keyword_arg(x: str) -> int:
@@ -1200,34 +1210,32 @@ def call_python_method_with_keyword_args(xs, first, second):
12001210
xs :: list
12011211
first, second :: int
12021212
r0 :: str
1203-
r1, r2, r3 :: object
1204-
r4 :: object[2]
1205-
r5 :: object_ptr
1206-
r6, r7 :: object
1207-
r8 :: str
1208-
r9, r10, r11 :: object
1209-
r12 :: object[2]
1210-
r13 :: object_ptr
1211-
r14, r15 :: object
1213+
r1, r2 :: object
1214+
r3 :: object[3]
1215+
r4 :: object_ptr
1216+
r5, r6 :: object
1217+
r7 :: str
1218+
r8, r9 :: object
1219+
r10 :: object[3]
1220+
r11 :: object_ptr
1221+
r12, r13 :: object
12121222
L0:
12131223
r0 = 'insert'
1214-
r1 = CPyObject_GetAttr(xs, r0)
1215-
r2 = object 0
1216-
r3 = box(int, first)
1217-
r4 = [r2, r3]
1218-
r5 = load_address r4
1219-
r6 = ('x',)
1220-
r7 = PyObject_Vectorcall(r1, r5, 1, r6)
1221-
keep_alive r2, r3
1222-
r8 = 'insert'
1223-
r9 = CPyObject_GetAttr(xs, r8)
1224-
r10 = box(int, second)
1225-
r11 = object 1
1226-
r12 = [r10, r11]
1227-
r13 = load_address r12
1228-
r14 = ('x', 'i')
1229-
r15 = PyObject_Vectorcall(r9, r13, 0, r14)
1230-
keep_alive r10, r11
1224+
r1 = object 0
1225+
r2 = box(int, first)
1226+
r3 = [xs, r1, r2]
1227+
r4 = load_address r3
1228+
r5 = ('x',)
1229+
r6 = PyObject_VectorcallMethod(r0, r4, 9223372036854775810, r5)
1230+
keep_alive xs, r1, r2
1231+
r7 = 'insert'
1232+
r8 = box(int, second)
1233+
r9 = object 1
1234+
r10 = [xs, r8, r9]
1235+
r11 = load_address r10
1236+
r12 = ('x', 'i')
1237+
r13 = PyObject_VectorcallMethod(r7, r11, 9223372036854775809, r12)
1238+
keep_alive xs, r8, r9
12311239
return xs
12321240

12331241
[case testObjectAsBoolean]

mypyc/test-data/irbuild-classes.test

+23-12
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ L0:
606606
r3 = CPyTagged_Add(r0, r2)
607607
return r3
608608

609-
[case testCallClassMethodViaCls]
609+
[case testCallClassMethodViaCls_64bit]
610610
class C:
611611
@classmethod
612612
def f(cls, x: int) -> int:
@@ -647,14 +647,20 @@ def D.f(cls, x):
647647
cls :: object
648648
x :: int
649649
r0 :: str
650-
r1, r2 :: object
651-
r3 :: int
650+
r1 :: object
651+
r2 :: object[2]
652+
r3 :: object_ptr
653+
r4 :: object
654+
r5 :: int
652655
L0:
653656
r0 = 'g'
654657
r1 = box(int, x)
655-
r2 = CPyObject_CallMethodObjArgs(cls, r0, r1, 0)
656-
r3 = unbox(int, r2)
657-
return r3
658+
r2 = [cls, r1]
659+
r3 = load_address r2
660+
r4 = PyObject_VectorcallMethod(r0, r3, 9223372036854775810, 0)
661+
keep_alive cls, r1
662+
r5 = unbox(int, r4)
663+
return r5
658664
def D.g(cls, x):
659665
cls :: object
660666
x :: int
@@ -904,7 +910,7 @@ L0:
904910
r1 = unbox(bool, r0)
905911
return r1
906912

907-
[case testEqDefinedLater]
913+
[case testEqDefinedLater_64bit]
908914
def f(a: 'Base', b: 'Base') -> bool:
909915
return a == b
910916

@@ -951,13 +957,18 @@ L0:
951957
def fOpt2(a, b):
952958
a, b :: __main__.Derived
953959
r0 :: str
954-
r1 :: object
955-
r2 :: bool
960+
r1 :: object[2]
961+
r2 :: object_ptr
962+
r3 :: object
963+
r4 :: bool
956964
L0:
957965
r0 = '__ne__'
958-
r1 = CPyObject_CallMethodObjArgs(a, r0, b, 0)
959-
r2 = unbox(bool, r1)
960-
return r2
966+
r1 = [a, b]
967+
r2 = load_address r1
968+
r3 = PyObject_VectorcallMethod(r0, r2, 9223372036854775810, 0)
969+
keep_alive a, b
970+
r4 = unbox(bool, r3)
971+
return r4
961972
def Derived.__eq__(self, other):
962973
self :: __main__.Derived
963974
other, r0 :: object

mypyc/test-data/irbuild-str.test

+57-58
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ L0:
189189
s4 = r13
190190
return 1
191191

192-
[case testFStrings]
192+
[case testFStrings_64bit]
193193
def f(var: str, num: int) -> None:
194194
s1 = f"Hi! I'm {var}. I am {num} years old."
195195
s2 = f'Hello {var:>{num}}'
@@ -200,11 +200,13 @@ def f(var, num):
200200
var :: str
201201
num :: int
202202
r0, r1, r2, r3, r4, s1, r5, r6, r7, r8, r9, r10, r11 :: str
203-
r12 :: object
204-
r13 :: str
205-
r14 :: list
206-
r15 :: ptr
207-
r16, s2, r17, s3, r18, s4 :: str
203+
r12 :: object[3]
204+
r13 :: object_ptr
205+
r14 :: object
206+
r15 :: str
207+
r16 :: list
208+
r17 :: ptr
209+
r18, s2, r19, s3, r20, s4 :: str
208210
L0:
209211
r0 = "Hi! I'm "
210212
r1 = '. I am '
@@ -219,19 +221,22 @@ L0:
219221
r9 = CPyTagged_Str(num)
220222
r10 = CPyStr_Build(2, r8, r9)
221223
r11 = 'format'
222-
r12 = CPyObject_CallMethodObjArgs(r7, r11, var, r10, 0)
223-
r13 = cast(str, r12)
224-
r14 = PyList_New(2)
225-
r15 = list_items r14
226-
buf_init_item r15, 0, r6
227-
buf_init_item r15, 1, r13
228-
keep_alive r14
229-
r16 = PyUnicode_Join(r5, r14)
230-
s2 = r16
231-
r17 = ''
232-
s3 = r17
233-
r18 = 'abc'
234-
s4 = r18
224+
r12 = [r7, var, r10]
225+
r13 = load_address r12
226+
r14 = PyObject_VectorcallMethod(r11, r13, 9223372036854775811, 0)
227+
keep_alive r7, var, r10
228+
r15 = cast(str, r14)
229+
r16 = PyList_New(2)
230+
r17 = list_items r16
231+
buf_init_item r17, 0, r6
232+
buf_init_item r17, 1, r15
233+
keep_alive r16
234+
r18 = PyUnicode_Join(r5, r16)
235+
s2 = r18
236+
r19 = ''
237+
s3 = r19
238+
r20 = 'abc'
239+
s4 = r20
235240
return 1
236241

237242
[case testStringFormattingCStyle]
@@ -289,7 +294,7 @@ L0:
289294
r5 = CPy_Decode(b, r3, r4)
290295
return 1
291296

292-
[case testEncode]
297+
[case testEncode_64bit]
293298
def f(s: str) -> None:
294299
s.encode()
295300
s.encode('utf-8')
@@ -321,22 +326,19 @@ def f(s):
321326
r14, errors, r15 :: str
322327
r16 :: bytes
323328
r17, r18 :: str
324-
r19 :: object
325-
r20 :: object[2]
326-
r21 :: object_ptr
327-
r22, r23 :: object
328-
r24 :: str
329-
r25 :: object
330-
r26 :: object[1]
331-
r27 :: object_ptr
332-
r28, r29 :: object
333-
r30 :: str
334-
r31 :: object
335-
r32 :: object[2]
336-
r33 :: object_ptr
337-
r34, r35 :: object
338-
r36 :: str
339-
r37 :: bytes
329+
r19 :: object[3]
330+
r20 :: object_ptr
331+
r21, r22 :: object
332+
r23 :: str
333+
r24 :: object[2]
334+
r25 :: object_ptr
335+
r26, r27 :: object
336+
r28 :: str
337+
r29 :: object[3]
338+
r30 :: object_ptr
339+
r31, r32 :: object
340+
r33 :: str
341+
r34 :: bytes
340342
L0:
341343
r0 = PyUnicode_AsUTF8String(s)
342344
r1 = PyUnicode_AsUTF8String(s)
@@ -359,28 +361,25 @@ L0:
359361
r16 = CPy_Encode(s, r15, errors)
360362
r17 = 'utf8'
361363
r18 = 'encode'
362-
r19 = CPyObject_GetAttr(s, r18)
363-
r20 = [r17, errors]
364-
r21 = load_address r20
365-
r22 = ('errors',)
366-
r23 = PyObject_Vectorcall(r19, r21, 1, r22)
367-
keep_alive r17, errors
368-
r24 = 'encode'
369-
r25 = CPyObject_GetAttr(s, r24)
370-
r26 = [errors]
371-
r27 = load_address r26
372-
r28 = ('errors',)
373-
r29 = PyObject_Vectorcall(r25, r27, 0, r28)
374-
keep_alive errors
375-
r30 = 'encode'
376-
r31 = CPyObject_GetAttr(s, r30)
377-
r32 = [encoding, errors]
378-
r33 = load_address r32
379-
r34 = ('encoding', 'errors')
380-
r35 = PyObject_Vectorcall(r31, r33, 0, r34)
381-
keep_alive encoding, errors
382-
r36 = 'latin2'
383-
r37 = CPy_Encode(s, r36, 0)
364+
r19 = [s, r17, errors]
365+
r20 = load_address r19
366+
r21 = ('errors',)
367+
r22 = PyObject_VectorcallMethod(r18, r20, 9223372036854775810, r21)
368+
keep_alive s, r17, errors
369+
r23 = 'encode'
370+
r24 = [s, errors]
371+
r25 = load_address r24
372+
r26 = ('errors',)
373+
r27 = PyObject_VectorcallMethod(r23, r25, 9223372036854775809, r26)
374+
keep_alive s, errors
375+
r28 = 'encode'
376+
r29 = [s, encoding, errors]
377+
r30 = load_address r29
378+
r31 = ('encoding', 'errors')
379+
r32 = PyObject_VectorcallMethod(r28, r30, 9223372036854775809, r31)
380+
keep_alive s, encoding, errors
381+
r33 = 'latin2'
382+
r34 = CPy_Encode(s, r33, 0)
384383
return 1
385384

386385
[case testOrd]

mypyc/test-data/irbuild-vectorcall.test

+2-34
Original file line numberDiff line numberDiff line change
@@ -60,39 +60,7 @@ L0:
6060
keep_alive r5, r6, r7
6161
return 1
6262

63-
[case testVectorcallMethod]
64-
from typing import Any
65-
66-
def f(o: Any) -> None:
67-
# On Python 3.8 vectorcalls are only faster with keyword args
68-
o.m('x')
69-
o.m('x', a='y')
70-
[out]
71-
def f(o):
72-
o :: object
73-
r0, r1 :: str
74-
r2 :: object
75-
r3, r4, r5 :: str
76-
r6 :: object
77-
r7 :: object[2]
78-
r8 :: object_ptr
79-
r9, r10 :: object
80-
L0:
81-
r0 = 'x'
82-
r1 = 'm'
83-
r2 = CPyObject_CallMethodObjArgs(o, r1, r0, 0)
84-
r3 = 'x'
85-
r4 = 'y'
86-
r5 = 'm'
87-
r6 = CPyObject_GetAttr(o, r5)
88-
r7 = [r3, r4]
89-
r8 = load_address r7
90-
r9 = ('a',)
91-
r10 = PyObject_Vectorcall(r6, r8, 1, r9)
92-
keep_alive r3, r4
93-
return 1
94-
95-
[case testVectorcallMethod_python3_9_64bit]
63+
[case testVectorcallMethod_64bit]
9664
from typing import Any
9765

9866
def f(o: Any) -> None:
@@ -128,7 +96,7 @@ L0:
12896
keep_alive o, r5, r6, r7
12997
return 1
13098

131-
[case testVectorcallMethod_python3_9_32bit]
99+
[case testVectorcallMethod_32bit]
132100
from typing import Any
133101

134102
def f(o: Any) -> None:

0 commit comments

Comments
 (0)