<div dir="ltr">ping<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Apr 16, 2014 at 1:55 PM, Marc-André Lureau <span dir="ltr"><<a href="mailto:marcandre.lureau@gmail.com" target="_blank">marcandre.lureau@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Avoid naming clash if parent structures have the same name<br>
<br>
<a href="https://bugzilla.redhat.com/show_bug.cgi?id=1021995" target="_blank">https://bugzilla.redhat.com/show_bug.cgi?id=1021995</a><br>
---<br>
 python_modules/demarshal.py | 47 +++++++++++++++++++++++++++++----------------<br>
 1 file changed, 30 insertions(+), 17 deletions(-)<br>
<br>
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py<br>
index cf48d74..d85539e 100644<br>
--- a/python_modules/demarshal.py<br>
+++ b/python_modules/demarshal.py<br>
@@ -138,22 +138,25 @@ class ItemInfo:<br>
         return self.position<br>
<br>
 class MemberItemInfo(ItemInfo):<br>
-    def __init__(self, member, container, start):<br>
+    def __init__(self, member, mprefix, container, start):<br>
         if not member.is_switch():<br>
             self.type = member.member_type<br>
         self.prefix = <a href="http://member.name" target="_blank">member.name</a><br>
+        if mprefix:<br>
+            mprefix = mprefix + "_"<br>
+            self.prefix = mprefix + self.prefix<br>
         self.subprefix = <a href="http://member.name" target="_blank">member.name</a><br>
-        self.position = "(%s + %s)" % (start, container.get_nw_offset(member, "", "__nw_size"))<br>
+        self.position = "(%s + %s)" % (start, container.get_nw_offset(member, mprefix or "", "__nw_size"))<br>
         self.member = member<br>
<br>
-def write_validate_switch_member(writer, container, switch_member, scope, parent_scope, start,<br>
+def write_validate_switch_member(writer, mprefix, container, switch_member, scope, parent_scope, start,<br>
                                  want_nw_size, want_mem_size, want_extra_size):<br>
     var = container.lookup_member(switch_member.variable)<br>
     var_type = var.member_type<br>
<br>
     v = write_read_primitive(writer, start, container, switch_member.variable, parent_scope)<br>
<br>
-    item = MemberItemInfo(switch_member, container, start)<br>
+    item = MemberItemInfo(switch_member, mprefix, container, start)<br>
<br>
     first = True<br>
     for c in switch_member.cases:<br>
@@ -487,7 +490,7 @@ def write_validate_item(writer, container, item, scope, parent_scope, start,<br>
         writer.add_function_variable("uint32_t", saved_size + " = 0")<br>
         writer.assign(saved_size, item.nw_size())<br>
<br>
-def write_validate_member(writer, container, member, parent_scope, start,<br>
+def write_validate_member(writer, mprefix, container, member, parent_scope, start,<br>
                           want_nw_size, want_mem_size, want_extra_size):<br>
     if member.has_attr("virtual"):<br>
         return<br>
@@ -498,10 +501,10 @@ def write_validate_member(writer, container, member, parent_scope, start,<br>
     else:<br>
         prefix = ""<br>
         newline = True<br>
-    item = MemberItemInfo(member, container, start)<br>
+    item = MemberItemInfo(member, mprefix, container, start)<br>
     with writer.block(prefix, newline=newline, comment=<a href="http://member.name" target="_blank">member.name</a>) as scope:<br>
         if member.is_switch():<br>
-            write_validate_switch_member(writer, container, member, scope, parent_scope, start,<br>
+            write_validate_switch_member(writer, mprefix, container, member, scope, parent_scope, start,<br>
                                          want_nw_size, want_mem_size, want_extra_size)<br>
         else:<br>
             write_validate_item(writer, container, item, scope, parent_scope, start,<br>
@@ -526,22 +529,29 @@ def write_validate_member(writer, container, member, parent_scope, start,<br>
             assert not want_extra_size<br>
<br>
 def write_validate_container(writer, prefix, container, start, parent_scope, want_nw_size, want_mem_size, want_extra_size):<br>
+    def prefix_m(prefix, m):<br>
+        name = <a href="http://m.name" target="_blank">m.name</a><br>
+        if prefix:<br>
+            name = prefix + "_" + name<br>
+        return name<br>
+<br>
     for m in container.members:<br>
         sub_want_nw_size = want_nw_size and not m.is_fixed_nw_size()<br>
         sub_want_mem_size = m.is_extra_size() and want_mem_size<br>
         sub_want_extra_size = not m.is_extra_size() and m.contains_extra_size()<br>
-<br>
         defs = ["size_t"]<br>
+        name = prefix_m(prefix, m)<br>
         if sub_want_nw_size:<br>
-            defs.append (<a href="http://m.name" target="_blank">m.name</a> + "__nw_size")<br>
+<br>
+            defs.append (name + "__nw_size")<br>
         if sub_want_mem_size:<br>
-            defs.append (<a href="http://m.name" target="_blank">m.name</a> + "__mem_size")<br>
+            defs.append (name + "__mem_size")<br>
         if sub_want_extra_size:<br>
-            defs.append (<a href="http://m.name" target="_blank">m.name</a> + "__extra_size")<br>
+            defs.append (name + "__extra_size")<br>
<br>
         if sub_want_nw_size or sub_want_mem_size or sub_want_extra_size:<br>
             parent_scope.variable_def(*defs)<br>
-            write_validate_member(writer, container, m, parent_scope, start,<br>
+            write_validate_member(writer, prefix, container, m, parent_scope, start,<br>
                                   sub_want_nw_size, sub_want_mem_size, sub_want_extra_size)<br>
             writer.newline()<br>
<br>
@@ -558,8 +568,9 @@ def write_validate_container(writer, prefix, container, start, parent_scope, wan<br>
<br>
         nm_sum = str(size)<br>
         for m in container.members:<br>
+            name = prefix_m(prefix, m)<br>
             if not m.is_fixed_nw_size():<br>
-                nm_sum = nm_sum + " + " + <a href="http://m.name" target="_blank">m.name</a> + "__nw_size"<br>
+                nm_sum = nm_sum + " + " + name + "__nw_size"<br>
<br>
         writer.assign(nw_size, nm_sum)<br>
<br>
@@ -571,10 +582,11 @@ def write_validate_container(writer, prefix, container, start, parent_scope, wan<br>
<br>
         mem_sum = container.sizeof()<br>
         for m in container.members:<br>
+            name = prefix_m(prefix, m)<br>
             if m.is_extra_size():<br>
-                mem_sum = mem_sum + " + " + <a href="http://m.name" target="_blank">m.name</a> + "__mem_size"<br>
+                mem_sum = mem_sum + " + " + name + "__mem_size"<br>
             elif m.contains_extra_size():<br>
-                mem_sum = mem_sum + " + " + <a href="http://m.name" target="_blank">m.name</a> + "__extra_size"<br>
+                mem_sum = mem_sum + " + " + name + "__extra_size"<br>
<br>
         writer.assign(mem_size, mem_sum)<br>
<br>
@@ -586,10 +598,11 @@ def write_validate_container(writer, prefix, container, start, parent_scope, wan<br>
<br>
         extra_sum = []<br>
         for m in container.members:<br>
+            name = prefix_m(prefix, m)<br>
             if m.is_extra_size():<br>
-                extra_sum.append(<a href="http://m.name" target="_blank">m.name</a> + "__mem_size")<br>
+                extra_sum.append(name + "__mem_size")<br>
             elif m.contains_extra_size():<br>
-                extra_sum.append(<a href="http://m.name" target="_blank">m.name</a> + "__extra_size")<br>
+                extra_sum.append(name + "__extra_size")<br>
         writer.assign(extra_size, codegen.sum_array(extra_sum))<br>
<br>
 class DemarshallingDestination:<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.5.3<br>
<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br>Marc-André Lureau
</div>