aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py9
-rw-r--r--sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py9
2 files changed, 15 insertions, 3 deletions
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
index 6fc8ff1b3..d07c8d8c6 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/layout.py
@@ -182,9 +182,12 @@ def create_signature(props, key):
# empty signatures string
return
if isinstance(props["multi"], list):
- # multi sig: call recursively
- return list(create_signature(elem, key)
- for elem in props["multi"])
+ # multi sig: call recursively.
+ # PYSIDE-2846: Fold duplicate signatures away
+ res = list(set(list(create_signature(elem, key)
+ for elem in props["multi"])))
+ return res if len(res) > 1 else res[0]
+
if type(key) is tuple:
_, modifier = key
else:
diff --git a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
index f3cf6ed51..896afe0f9 100644
--- a/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
+++ b/sources/shiboken6/shibokenmodule/files.dir/shibokensupport/signature/parser.py
@@ -410,6 +410,11 @@ def handle_retvar(obj):
return _handle_generic(obj, typing.List)
+class Hashabledict(dict):
+ def __hash__(self):
+ return hash(frozenset(self))
+
+
def calculate_props(line):
parsed = SimpleNamespace(**_parse_line(line.strip()))
arglist = parsed.arglist
@@ -426,6 +431,10 @@ def calculate_props(line):
annotations[name] = _resolve_type(ann, line, 0, handle_argvar, parsed.funcname)
if len(tup) == 3:
default = _resolve_value(tup[2], ann, line)
+ # PYSIDE-2846: When creating signatures, the defaults should be hashable.
+ # For that to work, we use `Hashabledict`.
+ if type(default) is dict:
+ default = Hashabledict(default)
_defaults.append(default)
defaults = tuple(_defaults)
returntype = parsed.returntype