[PATCH v4 22/41] dissector: Implement ws_inline attribute

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This attribute allows the structure parsing code to be inlined instead
of being contained in a separate function.
This is helpful as variable are declared in the function so allows
other members to access to a nested structure.

For instance in this example MouseState structure text (ws_txt) access
pt member fields and needs the ws_inline attribute:

struct Point {
  int32 x;
  int32 y;
};

struct MouseState {
  Point pt @ws_inline;
  int32 buttons;
} @ws_txt("Mouse at (%u,%u) buttons %u", pt.x, pt.y, buttons);

Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx>
---
 python_modules/dissector.py | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/python_modules/dissector.py b/python_modules/dissector.py
index 2d96283..0456ab8 100644
--- a/python_modules/dissector.py
+++ b/python_modules/dissector.py
@@ -379,9 +379,14 @@ def write_struct_func(writer, t, func_name, index):
 def write_struct(writer, member, t, index, dest, scope):
     assert(t.is_struct())
 
-    func_name = 'dissect_spice_struct_' + t.name
-    write_struct_func(writer, t, func_name, index)
-    writer.assign('offset', '%s(glb, %s, offset, %s)' % (func_name, dest.level.tree, index))
+    if member.has_attr('ws_inline'):
+        dest = dest.child_sub(member.name, scope)
+        with writer.block() as scope:
+            write_container_parser(writer, t, dest)
+    else:
+        func_name = 'dissect_spice_struct_' + t.name
+        write_struct_func(writer, t, func_name, index)
+        writer.assign('offset', '%s(glb, %s, offset, %s)' % (func_name, dest.level.tree, index))
 
 def write_member_primitive(writer, container, member, t, dest, scope):
     assert(t.is_primitive())
-- 
2.1.0

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]