diff options
author | Christian Tismer <tismer@stackless.com> | 2020-11-18 18:25:07 +0100 |
---|---|---|
committer | Christian Tismer <tismer@stackless.com> | 2020-11-30 23:48:23 +0000 |
commit | fca3aada26d4ec3f9431d2983bf7135ecb0cb547 (patch) | |
tree | 22e2b4b88dfc25c7154f19be598e7a2c6c66344c /sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py | |
parent | 3d137f78105fe71bffeabfd6dd763b5502c58cf5 (diff) |
cppgenerator: rework keyword handling regarding unknown keywords
PySide has a distinction between functions with simple arguments and
functions with keyword arguments for optional keywords.
When a function has keywords specified in one or more signature
branch, it gets the METH_KEYWORDS flag. In this case, it is checked
that no argument is given positional and per keyword at the same time.
Completely forgotten was to check which keywords are allowed in that
branch, if at all. The problem was much complicated because
constructors can contain extra signals and properties.
At the same time, all further error messages are generated with Python.
This adds necessary flexibility when features are active.
All PyBuildValue objects were refcount leaking. That has been replaced
by static createStaticString expressions.
The `argNames` structure is no longer needed by the improved algorithm.
Change-Id: Ic297912c47231720f61c7d4b79b46a1e376a9941
Fixes: PYSIDE-1305
Task-number: PYSIDE-1019
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
(cherry picked from commit b6e57864e5f4d470196f7425c631981de6d1aeb4)
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py')
-rw-r--r-- | sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py index 6ed4c0edd..352644f7a 100644 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py +++ b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py @@ -95,15 +95,33 @@ def matched_type(args, sigs): return None -def seterror_argument(args, func_name): - update_mapping() +def seterror_argument(args, func_name, info): func = None try: func = eval(func_name, namespace) except Exception as e: - msg = "Internal error evaluating " + func_name + " :" + str(e) + msg = "Internal error evaluating {func_name}: {e}".format(**locals()) return TypeError, msg + if info and type(info) is str: + err = TypeError + if info == "<": + msg = "{func_name}(): not enough arguments".format(**locals()) + elif info == ">": + msg = "{func_name}(): too many arguments".format(**locals()) + elif info.isalnum(): + msg = "{func_name}(): got multiple values for keyword argument '{info}'".format(**locals()) + else: + msg = "{func_name}(): {info}".format(**locals()) + err = AttributeError + return err, msg + if info and type(info) is dict: + keyword = tuple(info)[0] + msg = "{func_name}(): unsupported keyword '{keyword}'".format(**locals()) + return AttributeError, msg sigs = get_signature(func, "typeerror") + if not sigs: + msg = "{func_name}({args}) is wrong (missing signature)".format(**locals()) + return TypeError, msg if type(sigs) != list: sigs = [sigs] if type(args) != tuple: @@ -144,7 +162,7 @@ def make_helptext(func): sigs = [sigs] try: func_name = func.__name__ - except AttribureError: + except AttributeError: func_name = func.__func__.__name__ sigtext = "\n".join(func_name + str(sig) for sig in sigs) msg = sigtext + "\n\n" + existing_doc if check_string_type(existing_doc) else sigtext |