summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorJeroen Demeyer <J.Demeyer@UGent.be>2019-05-29 18:31:52 (GMT)
committerPetr Viktorin <encukou@gmail.com>2019-05-29 18:31:52 (GMT)
commitaacc77fbd77640a8f03638216fa09372cc21673d (patch)
treefd64be1c4c1167a8bf708d1fd22c733cf3a9a30f /Lib/test
parentd30da5dd9a8a965cf24a22bbaff8a5b1341c2944 (diff)
downloadcpython-aacc77fbd77640a8f03638216fa09372cc21673d.zip
cpython-aacc77fbd77640a8f03638216fa09372cc21673d.tar.gz
cpython-aacc77fbd77640a8f03638216fa09372cc21673d.tar.bz2
bpo-36974: implement PEP 590 (GH-13185)
Co-authored-by: Jeroen Demeyer <J.Demeyer@UGent.be> Co-authored-by: Mark Shannon <mark@hotpy.org>
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_call.py16
-rw-r--r--Lib/test/test_capi.py47
-rw-r--r--Lib/test/test_sys.py8
3 files changed, 59 insertions, 12 deletions
diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py
index e4ab33c..9f0a75b 100644
--- a/Lib/test/test_call.py
+++ b/Lib/test/test_call.py
@@ -402,7 +402,7 @@ class FastCallTests(unittest.TestCase):
result = _testcapi.pyobject_fastcall(func, None)
self.check_result(result, expected)
- def test_fastcall_dict(self):
+ def test_vectorcall_dict(self):
# Test _PyObject_FastCallDict()
for func, args, expected in self.CALLS_POSARGS:
@@ -429,33 +429,33 @@ class FastCallTests(unittest.TestCase):
result = _testcapi.pyobject_fastcalldict(func, args, kwargs)
self.check_result(result, expected)
- def test_fastcall_keywords(self):
- # Test _PyObject_FastCallKeywords()
+ def test_vectorcall(self):
+ # Test _PyObject_Vectorcall()
for func, args, expected in self.CALLS_POSARGS:
with self.subTest(func=func, args=args):
# kwnames=NULL
- result = _testcapi.pyobject_fastcallkeywords(func, args, None)
+ result = _testcapi.pyobject_vectorcall(func, args, None)
self.check_result(result, expected)
# kwnames=()
- result = _testcapi.pyobject_fastcallkeywords(func, args, ())
+ result = _testcapi.pyobject_vectorcall(func, args, ())
self.check_result(result, expected)
if not args:
# kwnames=NULL
- result = _testcapi.pyobject_fastcallkeywords(func, None, None)
+ result = _testcapi.pyobject_vectorcall(func, None, None)
self.check_result(result, expected)
# kwnames=()
- result = _testcapi.pyobject_fastcallkeywords(func, None, ())
+ result = _testcapi.pyobject_vectorcall(func, None, ())
self.check_result(result, expected)
for func, args, kwargs, expected in self.CALLS_KWARGS:
with self.subTest(func=func, args=args, kwargs=kwargs):
kwnames = tuple(kwargs.keys())
args = args + tuple(kwargs.values())
- result = _testcapi.pyobject_fastcallkeywords(func, args, kwnames)
+ result = _testcapi.pyobject_vectorcall(func, args, kwnames)
self.check_result(result, expected)
def test_fastcall_clearing_dict(self):
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index f3d41a2..0813abb 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -34,6 +34,11 @@ def testfunction(self):
"""some doc"""
return self
+def testfunction_kw(self, *, kw):
+ """some doc"""
+ return self
+
+
class InstanceMethod:
id = _testcapi.instancemethod(id)
testfunction = _testcapi.instancemethod(testfunction)
@@ -479,6 +484,48 @@ class TestPEP590(unittest.TestCase):
pass
self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR)
+ def test_vectorcall(self):
+ # Test a bunch of different ways to call objects:
+ # 1. normal call
+ # 2. vectorcall using _PyObject_Vectorcall()
+ # 3. vectorcall using PyVectorcall_Call()
+ # 4. call as bound method
+ # 5. call using functools.partial
+
+ # A list of (function, args, kwargs, result) calls to test
+ calls = [(len, (range(42),), {}, 42),
+ (list.append, ([], 0), {}, None),
+ ([].append, (0,), {}, None),
+ (sum, ([36],), {"start":6}, 42),
+ (testfunction, (42,), {}, 42),
+ (testfunction_kw, (42,), {"kw":None}, 42)]
+
+ from _testcapi import pyobject_vectorcall, pyvectorcall_call
+ from types import MethodType
+ from functools import partial
+
+ def vectorcall(func, args, kwargs):
+ args = *args, *kwargs.values()
+ kwnames = tuple(kwargs)
+ return pyobject_vectorcall(func, args, kwnames)
+
+ for (func, args, kwargs, expected) in calls:
+ with self.subTest(str(func)):
+ args1 = args[1:]
+ meth = MethodType(func, args[0])
+ wrapped = partial(func)
+ if not kwargs:
+ self.assertEqual(expected, func(*args))
+ self.assertEqual(expected, pyobject_vectorcall(func, args, None))
+ self.assertEqual(expected, pyvectorcall_call(func, args))
+ self.assertEqual(expected, meth(*args1))
+ self.assertEqual(expected, wrapped(*args))
+ self.assertEqual(expected, func(*args, **kwargs))
+ self.assertEqual(expected, vectorcall(func, args, kwargs))
+ self.assertEqual(expected, pyvectorcall_call(func, args, kwargs))
+ self.assertEqual(expected, meth(*args1, **kwargs))
+ self.assertEqual(expected, wrapped(*args, **kwargs))
+
class SubinterpreterTest(unittest.TestCase):
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index dfe63b1..c558d11 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -1064,7 +1064,7 @@ class SizeofTest(unittest.TestCase):
# buffer
# XXX
# builtin_function_or_method
- check(len, size('4P')) # XXX check layout
+ check(len, size('5P'))
# bytearray
samples = [b'', b'u'*100000]
for sample in samples:
@@ -1095,7 +1095,7 @@ class SizeofTest(unittest.TestCase):
# complex
check(complex(0,1), size('2d'))
# method_descriptor (descriptor object)
- check(str.lower, size('3PP'))
+ check(str.lower, size('3PPP'))
# classmethod_descriptor (descriptor object)
# XXX
# member_descriptor (descriptor object)
@@ -1164,7 +1164,7 @@ class SizeofTest(unittest.TestCase):
check(x, vsize('5P2c4P3ic' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P'))
# function
def func(): pass
- check(func, size('12P'))
+ check(func, size('13P'))
class c():
@staticmethod
def foo():
@@ -1259,7 +1259,7 @@ class SizeofTest(unittest.TestCase):
check((1,2,3), vsize('') + 3*self.P)
# type
# static type: PyTypeObject
- fmt = 'P2n15Pl4Pn9Pn11PIP'
+ fmt = 'P2nPI13Pl4Pn9Pn11PIPP'
if hasattr(sys, 'getcounts'):
fmt += '3n2P'
s = vsize(fmt)