From dbecef1977ca96b8acb2cf6dd696dd04ab65d4ff Mon Sep 17 00:00:00 2001 From: nikto_b Date: Sun, 14 Sep 2025 01:55:47 +0300 Subject: [PATCH] Fix renderer `deduplicate_callseq` duplicates slips --- pyproject.toml | 2 +- src/breakshaft/renderer.py | 5 ++++- src/breakshaft/util.py | 20 ++++++++++++++++---- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2cf8e0e..561b382 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "breakshaft" -version = "0.1.6.post3" +version = "0.1.6.post4" description = "Library for in-time codegen for type conversion" authors = [ { name = "nikto_b", email = "niktob560@yandex.ru" } diff --git a/src/breakshaft/renderer.py b/src/breakshaft/renderer.py index 947dd67..4a38f0f 100644 --- a/src/breakshaft/renderer.py +++ b/src/breakshaft/renderer.py @@ -88,9 +88,11 @@ class ConversionArgRenderData: def deduplicate_callseq(conversion_models: list[ConversionRenderData]) -> list[ConversionRenderData]: deduplicated_conv_models: list[ConversionRenderData] = [] + deduplicated_hashes = set() for conv_model in conversion_models: - if conv_model not in deduplicated_conv_models: + if hash((conv_model.inj_hash, conv_model.funchash)) not in deduplicated_hashes: deduplicated_conv_models.append(conv_model) + deduplicated_hashes.add(hash((conv_model.inj_hash, conv_model.funchash))) continue argnames = list(map(lambda x: x[1], conv_model.funcargs)) @@ -105,6 +107,7 @@ def deduplicate_callseq(conversion_models: list[ConversionRenderData]) -> list[C break if argument_changed: deduplicated_conv_models.append(conv_model) + deduplicated_hashes.add(hash((conv_model.inj_hash, conv_model.funchash))) return deduplicated_conv_models diff --git a/src/breakshaft/util.py b/src/breakshaft/util.py index b0a0938..b547ab8 100644 --- a/src/breakshaft/util.py +++ b/src/breakshaft/util.py @@ -134,9 +134,21 @@ def is_basic_type_annot(type_annot) -> bool: def universal_qualname(any: Any) -> str: + ret = '' if hasattr(any, '__qualname__'): - return any.__qualname__ - if hasattr(any, '__name__'): - return any.__name__ + ret = any.__qualname__ + elif hasattr(any, '__name__'): + ret = any.__name__ + else: + ret = str(any) - return str(any) + ret = (ret + .replace('.', '_') + .replace('[', '_of_') + .replace(']', '_of_') + .replace(',', '_and_') + .replace(' ', '_') + .replace('\'', '') + .replace('<', '') + .replace('>', '')) + return ret