[Spice-devel] [PATCH 23/33] Read array size

Frediano Ziglio fziglio at redhat.com
Wed Jul 1 10:10:15 PDT 2015


Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 python_modules/dissector.py | 50 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 48 insertions(+), 2 deletions(-)

diff --git a/python_modules/dissector.py b/python_modules/dissector.py
index cb07ab6..4db2f3c 100644
--- a/python_modules/dissector.py
+++ b/python_modules/dissector.py
@@ -176,10 +176,55 @@ def primitive_read_func(t):
     raise NotImplementedError('primitive size not supported %s %s' % (size, t))
 
 
+# Note: during parsing, byte_size types have been converted to count during validation
+def read_array_len(writer, prefix, array, dest, scope, is_ptr):
+    if is_ptr:
+        nelements = "%s__array__nelements" % prefix
+    else:
+        nelements = "%s__nelements" % prefix
+    if dest.is_toplevel() and scope.variable_defined(nelements):
+        return nelements # Already there for toplevel, need not recalculate
+    # just reuse variable, there is no problem for cast as we always store in guint32
+    if array.is_identifier_length():
+        nelements = dest.read_ref(array.size)
+        dest.write_ref(writer, dest.ref_size(array.size), prefix + '.nelements', nelements)
+        return nelements
+    element_type = array.element_type
+    scope.variable_def("guint32", nelements)
+    if array.is_constant_length():
+        writer.assign(nelements, array.size)
+    elif array.is_remaining_length():
+        if element_type.is_fixed_nw_size():
+            if element_type.get_fixed_nw_size() == 1:
+                writer.assign(nelements, "glb->message_end - offset")
+            else:
+                writer.assign(nelements, "(glb->message_end - offset) / (%s)" %(element_type.get_fixed_nw_size()))
+        else:
+            raise NotImplementedError("TODO array[] of dynamic element size not done yet")
+    elif array.is_image_size_length():
+        bpp = array.size[1]
+        width = array.size[2]
+        rows = array.size[3]
+        width_v = dest.read_ref(width)
+        rows_v = dest.read_ref(rows)
+        if bpp == 8:
+            writer.assign(nelements, "((guint32) %s * %s)" % (width_v, rows_v))
+        elif bpp == 1:
+            writer.assign(nelements, "(((guint32) %s + 7U) / 8U ) * %s" % (width_v, rows_v))
+        else:
+            writer.assign(nelements, "((%sU * (guint32) %s + 7U) / 8U ) * %s" % (bpp, width_v, rows_v))
+    elif array.is_bytes_length():
+        writer.assign(nelements, dest.read_ref(array.size[2]))
+    else:
+        raise NotImplementedError("TODO array size type not handled yet")
+    # TODO compute a better size
+    dest.write_ref(writer, 32, prefix+'.nelements', nelements)
+    return nelements
+
 def write_switch(writer, container, switch, dest, scope):
     pass
 
-def write_array(writer, container, member, array, dest, scope):
+def write_array(writer, container, member, nelements, array, dest, scope):
     assert(container and member)
 
 def write_pointer(writer, container, member, t, dest, scope):
@@ -227,7 +272,8 @@ def write_member(writer, container, member, dest, scope):
     elif t.is_primitive():
         write_member_primitive(writer, container, member, t, dest, scope)
     elif t.is_array():
-        write_array(writer, container, member, t, dest, scope)
+        nelements = read_array_len(writer, member.name, t, dest, scope, False)
+        write_array(writer, container, member, nelements, t, dest, scope)
 
     elif t.is_struct():
         write_struct(writer, member, t, '-1', dest, scope)
-- 
2.1.0



More information about the Spice-devel mailing list