blob: 1ba08efc250192edb9bccc2a521478dc7591d519 [file] [log] [blame]
-- Test cases for calls using the vectorcall API (Python 3.8+)
--
-- Vectorcalls are faster than the legacy API, especially with keyword arguments,
-- since there is no need to allocate a temporary dictionary for keyword args.
[case testeVectorcallBasic_python3_8]
from typing import Any
def f(c: Any) -> None:
c()
c('x', 'y')
[out]
def f(c):
c, r0 :: object
r1, r2 :: str
r3 :: object[2]
r4 :: object_ptr
r5 :: object
L0:
r0 = _PyObject_Vectorcall(c, 0, 0, 0)
r1 = 'x'
r2 = 'y'
r3 = [r1, r2]
r4 = load_address r3
r5 = _PyObject_Vectorcall(c, r4, 2, 0)
keep_alive r1, r2
return 1
[case testVectorcallKeywords_python3_8]
from typing import Any
def f(c: Any) -> None:
c(x='a')
c('x', a='y', b='z')
[out]
def f(c):
c :: object
r0 :: str
r1 :: object[1]
r2 :: object_ptr
r3, r4 :: object
r5, r6, r7 :: str
r8 :: object[3]
r9 :: object_ptr
r10, r11 :: object
L0:
r0 = 'a'
r1 = [r0]
r2 = load_address r1
r3 = ('x',)
r4 = _PyObject_Vectorcall(c, r2, 0, r3)
keep_alive r0
r5 = 'x'
r6 = 'y'
r7 = 'z'
r8 = [r5, r6, r7]
r9 = load_address r8
r10 = ('a', 'b')
r11 = _PyObject_Vectorcall(c, r9, 1, r10)
keep_alive r5, r6, r7
return 1
[case testVectorcallMethod_python3_8]
from typing import Any
def f(o: Any) -> None:
# On Python 3.8 vectorcalls are only faster with keyword args
o.m('x')
o.m('x', a='y')
[out]
def f(o):
o :: object
r0, r1 :: str
r2 :: object
r3, r4, r5 :: str
r6 :: object
r7 :: object[2]
r8 :: object_ptr
r9, r10 :: object
L0:
r0 = 'x'
r1 = 'm'
r2 = CPyObject_CallMethodObjArgs(o, r1, r0, 0)
r3 = 'x'
r4 = 'y'
r5 = 'm'
r6 = CPyObject_GetAttr(o, r5)
r7 = [r3, r4]
r8 = load_address r7
r9 = ('a',)
r10 = _PyObject_Vectorcall(r6, r8, 1, r9)
keep_alive r3, r4
return 1
[case testVectorcallMethod_python3_9_64bit]
from typing import Any
def f(o: Any) -> None:
# Python 3.9 has a new API for calling methods
o.m('x')
o.m('x', 'y', a='z')
[out]
def f(o):
o :: object
r0, r1 :: str
r2 :: object[2]
r3 :: object_ptr
r4 :: object
r5, r6, r7, r8 :: str
r9 :: object[4]
r10 :: object_ptr
r11, r12 :: object
L0:
r0 = 'x'
r1 = 'm'
r2 = [o, r0]
r3 = load_address r2
r4 = PyObject_VectorcallMethod(r1, r3, 9223372036854775810, 0)
keep_alive o, r0
r5 = 'x'
r6 = 'y'
r7 = 'z'
r8 = 'm'
r9 = [o, r5, r6, r7]
r10 = load_address r9
r11 = ('a',)
r12 = PyObject_VectorcallMethod(r8, r10, 9223372036854775811, r11)
keep_alive o, r5, r6, r7
return 1
[case testVectorcallMethod_python3_9_32bit]
from typing import Any
def f(o: Any) -> None:
# The IR is slightly different on 32-bit platforms
o.m('x', a='y')
[out]
def f(o):
o :: object
r0, r1, r2 :: str
r3 :: object[3]
r4 :: object_ptr
r5, r6 :: object
L0:
r0 = 'x'
r1 = 'y'
r2 = 'm'
r3 = [o, r0, r1]
r4 = load_address r3
r5 = ('a',)
r6 = PyObject_VectorcallMethod(r2, r4, 2147483650, r5)
keep_alive o, r0, r1
return 1