Skip to content

Commit

Permalink
Fix TODO field for recursive structs
Browse files Browse the repository at this point in the history
  • Loading branch information
RafaelTupynamba committed Mar 7, 2022
1 parent 3a356ef commit 7dce914
Showing 1 changed file with 28 additions and 25 deletions.
53 changes: 28 additions & 25 deletions pfp/interp.py
Original file line number Diff line number Diff line change
Expand Up @@ -691,12 +691,27 @@ def add_decl(self, classname, classnode, node, is_union):
else:
if classname not in self._to_define:
self._to_define[classname] = []
self._to_define[classname].append((node.name, node, len(self._call_stack) > 1 and not self._call_stack[-1]))
node.cpp = "/*TODO field " + node.name + "("
is_var = len(self._call_stack) > 1 and not self._call_stack[-1]
self._to_define[classname].append((node.name, node, is_var))

name = node.name
if hasattr(node, "originalname"):
name = node.originalname
node.cpp = "GENERATE"
if is_var:
node.cpp += "_VAR"
self._variable_types[node.name] = classname
node.cpp += "(" + name + ", ::g->" + node.name + ".generate("
arg_num = 0
if hasattr(node.type, "args") and node.type.args:
for arg in node.type.args.exprs:
arg_num += 1
node.cpp += arg.cpp + ", "
node.cpp += ")*/"
if arg_num > 0:
node.cpp = node.cpp[:-2]
node.cpp += "/*TODO class " + classname + "*/"
node.cpp += "))"

node.type.cpp = classname
if not self._incomplete:
self.add_class(classname, classnode, is_union)
Expand Down Expand Up @@ -982,33 +997,21 @@ def add_class(self, classname, classnode, is_union=False):
self._defined[field_name] = classname
self._globals.append((field_name, classname + " " + node.name + "(" + classname + "_" + node.name + "_instances);\n"))
self._instances += "std::vector<" + classname + "*> " + classname + "_" + node.name + "_instances;\n"
name = field_name
if hasattr(node, "originalname"):
name = node.originalname
node.cpp = "GENERATE"
if is_var:
node.cpp += "_VAR"
self._variable_types[field_name] = classname
node.cpp += "(" + name + ", ::g->" + field_name + ".generate("

arg_num = 0
todofield = "/*TODO field " + field_name + "("
if hasattr(node.type, "args") and node.type.args:
for arg in node.type.args.exprs:
arg_num += 1
node.cpp += arg.cpp + ", "
todofield += arg.cpp + ", "
todofield += ")*/"
arg_num = len(node.type.args.exprs)
todoclass = ", " if arg_num else ""
if hasattr(classnode, "args") and classnode.args is not None:
for i in range(arg_num, len(classnode.args.params)):
arg_num += 1
node.cpp += classnode.args.params[i].name + ", "
if arg_num > 0:
node.cpp = node.cpp[:-2]
node.cpp += "))"
todoclass += classnode.args.params[i].name + ", "
if todoclass:
todoclass = todoclass[:-2]
todo = "/*TODO class " + classname + "*/"
node.cpp = node.cpp.replace(todo, todoclass)
for decl in classnode.decls:
decl.cpp = decl.cpp.replace(todofield, node.cpp)
self._to_replace.append((todofield, node.cpp))
node.type.cpp = classname
decl.cpp = decl.cpp.replace(todo, todoclass)
self._to_replace.append((todo, todoclass))

def add_class_generate(self, classname, classnode, is_union=False):
if classname + "::generate" in self._defined:
Expand Down

0 comments on commit 7dce914

Please sign in to comment.