[Spice-devel] [PATCH v6 22/42] dissector: Handle switches

Frediano Ziglio fziglio at redhat.com
Thu Aug 13 06:12:01 PDT 2015


Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 python_modules/dissector.py | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/python_modules/dissector.py b/python_modules/dissector.py
index 7a816c7..4213484 100644
--- a/python_modules/dissector.py
+++ b/python_modules/dissector.py
@@ -301,8 +301,47 @@ def read_array_len(writer, prefix, array, dest, scope, is_ptr):
     dest.write_ref(writer, 32, prefix+'.nelements', nelements)
     return nelements
 
+
 def write_switch(writer, container, switch, dest, scope):
-    pass
+    var = container.lookup_member(switch.variable)
+    var_type = var.member_type
+
+    if switch.has_attr("fixedsize"):
+        scope.variable_def("guint32", "save_output")
+        writer.assign("save_output", "output")
+
+    first = True
+    for c in switch.cases:
+        check = c.get_check(dest.read_ref(switch.variable), var_type)
+        m = c.member
+        with writer.if_block(check, not first, False) as block:
+            t = m.member_type
+            if switch.has_attr("anon"):
+                dest2 = dest
+            else:
+                if t.is_struct():
+                    dest2 = dest.child_sub(switch.name + "." + m.name, block)
+                else:
+                    dest2 = dest.child_sub(switch.name, block)
+
+            if t.is_pointer():
+                write_pointer(writer, container, m, t, dest2, block)
+            elif t.is_struct():
+                write_struct(writer, m, t, '-1', dest2, scope)
+            elif t.is_primitive():
+                write_member_primitive(writer, container, m, t, dest2, scope)
+            elif t.is_array():
+                nelements = read_array_len(writer, m.name, t, dest, block, False)
+                write_array(writer, container, m, nelements, t, dest2, block)
+            else:
+                writer.todo("Can't handle type %s" % m.member_type)
+
+        first = False
+
+    writer.newline()
+
+    if switch.has_attr("fixedsize"):
+        writer.assign("output", "save_output + %s" % switch.get_fixed_nw_size())
 
 def write_array(writer, container, member, nelements, array, dest, scope):
     assert(container and member)
-- 
2.4.3



More information about the Spice-devel mailing list