Skip to content

Commit

Permalink
py_wrap_generator: Fix handling of method name collisions
Browse files Browse the repository at this point in the history
If two methods have the same signature but for qualifiers the Python
binding doesn't care about ('const'), do not generate a mangled name for
the method.

Fixes

    .def<Wire (Module::*)(const IdString* )>("wire__YOSYS_NAMESPACE_RTLIL_IdString", &Module::wire__YOSYS_NAMESPACE_RTLIL_IdString)
    .def<Cell (Module::*)(const IdString* )>("cell__YOSYS_NAMESPACE_RTLIL_IdString", &Module::cell__YOSYS_NAMESPACE_RTLIL_IdString)

in the output after the previous change.
  • Loading branch information
povik committed Apr 5, 2023
1 parent f94f544 commit bd06338
Showing 1 changed file with 16 additions and 6 deletions.
22 changes: 16 additions & 6 deletions misc/py_wrap_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1367,10 +1367,17 @@ def from_string(str_def, containing_file, class_, line_number, namespace):
func.args.append(parsed)
return func

@property
def mangled_name(self):
mangled_typename = lambda code: code.replace("::", "_").replace("<","_").replace(">","_") \
.replace(" ","").replace("*","").replace(",","")

return self.name + "".join(
f"__{mangled_typename(arg.wtype.gen_text_cpp())}" for arg in self.args
)

def gen_alias(self):
self.alias = self.name
for arg in self.args:
self.alias += "__" + arg.wtype.gen_text_cpp().replace("::", "_").replace("<","_").replace(">","_").replace(" ","").replace("*","").replace(",","")
self.alias = self.mangled_name

def gen_decl(self):
if self.duplicate:
Expand Down Expand Up @@ -2196,12 +2203,15 @@ def clean_duplicates():
for fun in class_.found_funs:
if fun.gen_decl_hash_py() in known_decls:
debug("Multiple declarations of " + fun.gen_decl_hash_py(),3)

other = known_decls[fun.gen_decl_hash_py()]
other.gen_alias()
fun.gen_alias()
if fun.gen_decl_hash_py() == other.gen_decl_hash_py():
if fun.mangled_name == other.mangled_name:
fun.duplicate = True
debug("Disabled \"" + fun.gen_decl_hash_py() + "\"", 3)
continue

other.gen_alias()
fun.gen_alias()
else:
known_decls[fun.gen_decl_hash_py()] = fun
known_decls = []
Expand Down

0 comments on commit bd06338

Please sign in to comment.