6baeded322
The reallocation trigger for unpacking star args with unknown length did not take into account the number of fixed args remaining. So it was possible that the unpacked iterators could take up exactly the memory allocated then nothing would be left for fixed args after the star args. This causes a segfault crash. This is fixed by taking into account the remaining number of fixed args in the check to decide whether to realloc yet or not. Signed-off-by: David Lechner <david@pybricks.com>
44 lines
1.0 KiB
Python
44 lines
1.0 KiB
Python
# test calling a function with *tuple and **dict
|
|
|
|
def f(a, b, c, d):
|
|
print(a, b, c, d)
|
|
|
|
f(*(1, 2), **{'c':3, 'd':4})
|
|
f(*(1, 2), **{['c', 'd'][i]:(3 + i) for i in range(2)})
|
|
|
|
try:
|
|
eval("f(**{'a': 1}, *(2, 3, 4))")
|
|
except SyntaxError:
|
|
print("SyntaxError")
|
|
|
|
# test calling a method with *tuple and **dict
|
|
|
|
class A:
|
|
def f(self, a, b, c, d):
|
|
print(a, b, c, d)
|
|
|
|
a = A()
|
|
a.f(*(1, 2), **{'c':3, 'd':4})
|
|
a.f(*(1, 2), **{['c', 'd'][i]:(3 + i) for i in range(2)})
|
|
|
|
try:
|
|
eval("a.f(**{'a': 1}, *(2, 3, 4))")
|
|
except SyntaxError:
|
|
print("SyntaxError")
|
|
|
|
|
|
# coverage test for arg allocation corner case
|
|
|
|
def f2(*args, **kwargs):
|
|
print(len(args), len(kwargs))
|
|
|
|
|
|
f2(*iter(range(4)), **{'a': 1})
|
|
|
|
# case where *args is not a tuple/list and takes up most of the memory allocated for **kwargs
|
|
f2(*iter(range(100)), **{str(i): i for i in range(100)})
|
|
|
|
# regression test - iterable with unknown len() was exactly using preallocated
|
|
# memory causing args 4 and 5 to overflow the allocated arg array
|
|
print(1, *iter((1, 2, 3)), *iter((1, 2, 3)), 4, 5, sep=",")
|