Fix pyext routing

pull/335/head
Ibrahim Numanagić 2023-03-16 22:48:50 -07:00
parent 6734a41613
commit 31caa1d340
1 changed files with 43 additions and 52 deletions

View File

@ -1676,62 +1676,53 @@ class _PyWrap:
kwds[i] = str.__from_py__(PyTuple_GetItem(_kwds, i)) kwds[i] = str.__from_py__(PyTuple_GetItem(_kwds, i))
for fn in _S.fn_overloads(T, F): for fn in _S.fn_overloads(T, F):
args_ordered = tuple(cobj() for _ in _S.fn_args(fn)) try:
pargs = Ptr[cobj](__ptr__(args_ordered).as_byte()) args_ordered = tuple(cobj() for _ in _S.fn_args(fn))
pargs = Ptr[cobj](__ptr__(args_ordered).as_byte())
if nargs + M > len(args_ordered): if nargs + M > len(args_ordered):
continue
if M:
pargs[0] = obj
for i in range(nargs):
pargs[i + M] = args[i]
for i in range(nargs, nargs + nkw):
kw = kwds[i - nargs]
__static_print__(kw)
o = args[i]
found = False
j = M
for i, k in staticenumerate(_S.fn_args(fn)):
if M and i == 0:
continue
if kw == k:
if not pargs[j]:
pargs[j] = o
else:
raise TypeError(F + "() got multiple values for argument '" + k + "'")
found = True
break
j += 1
if not found:
raise TypeError(F + "() got an unexpected keyword argument '" + kw + "'")
for i, k in staticenumerate(_S.fn_args(fn)):
if M and i == 0:
continue continue
if M:
pargs[0] = obj
if not pargs[i]: for i in range(nargs):
if _S.fn_has_default(fn, i): pargs[i + M] = args[i]
pargs[i] = _S.fn_get_default(fn, i).__to_py__() # TODO: remove this unnecessary conversion for i in range(nargs, nargs + nkw):
else: kw = kwds[i - nargs]
raise TypeError(F + "() missing required positional argument: '" + k + "'") __static_print__(kw)
o = args[i]
def e(k): found = False
raise TypeError(F + "() missing required positional argument: '" + k + "'") j = M
ta = tuple( for i, k in staticenumerate(_S.fn_args(fn)):
0 if M and i == 0 else if M and i == 0:
(pyobj(pargs[i], steal=True) if i != cobj() else continue
(_S.fn_get_default(fn, i) if _S.fn_has_default(fn, i) else e(k))) if kw == k:
for i, k in staticenumerate(_S.fn_args(fn)) if not pargs[j]:
) pargs[j] = o
__static_print__(ta) else:
if _S.fn_can_call(fn, *ta): raise TypeError(F + "() got multiple values for argument '" + k + "'")
try: found = True
tn = _S.fn_wrap_call_args(fn, *ta) break
except PyError: j += 1
continue if not found:
return fn(*tn).__to_py__() raise TypeError(F + "() got an unexpected keyword argument '" + kw + "'")
def e(k):
raise TypeError(F + "() missing required positional argument: '" + k + "'")
ta = tuple(
(pyobj(pargs[i], steal=True) if pargs[i] != cobj() else
(_S.fn_get_default(fn, i) if _S.fn_has_default(fn, i) else e(k)))
for i, k in staticenumerate(_S.fn_args(fn))
)
if _S.fn_can_call(fn, *ta):
try:
tn = _S.fn_wrap_call_args(fn, *ta)
except PyError:
raise TypeError("cannot cast arguments")
return fn(*tn).__to_py__()
except TypeError:
pass
raise TypeError("cannot dispatch " + F) raise TypeError("cannot dispatch " + F)