[Spice-devel] [PATCH 12/33] Add new_ett function to be able to create new trees

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


Use an array to declare tree items instead of allocating it statically.
This save a bit of memory and it also generate smaller code to read.
A tree in wireshark represent an item which could be expanded.
Possibly wireshark is using these registrations to save expansion
state in the user interface.

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

diff --git a/python_modules/dissector.py b/python_modules/dissector.py
index d9d8a87..6751534 100644
--- a/python_modules/dissector.py
+++ b/python_modules/dissector.py
@@ -1,6 +1,22 @@
 
 from . import codegen
 
+
+# generate a new tree identifier
+ett_writer = None
+ett_num = 0
+def new_ett(writer):
+    global ett_writer
+    global ett_num
+
+    if ett_num and ett_num % 16 == 0:
+        ett_writer.newline()
+    name = 'etts[%u]' % ett_num
+    ett_num = ett_num + 1
+    ett_writer.write('-1, ')
+    return name
+
+
 hf_writer = None
 hf_defs = None
 
@@ -42,6 +58,10 @@ def write_protocol_definitions(writer):
     writer.newline()
     writer.function('spice_register_fields', 'void', 'int proto, expert_module_t* expert_proto')
 
+    writer.variable_def('guint', 'n');
+    writer.variable_def('gint *', 'ett[array_length(etts)]')
+    writer.newline()
+
     writer.write("static hf_register_info hf[] = ")
     writer.begin_block()
     hf_defs = writer.get_subwriter()
@@ -55,17 +75,25 @@ def write_protocol_definitions(writer):
     writer.end_block(semicolon = True)
     writer.newline()
 
+    with writer.for_loop('n', 'array_length(etts)'):
+        writer.assign('ett[n]', '&etts[n]')
+
     writer.statement('proto_register_field_array(proto, hf, array_length(hf))')
+    writer.statement('proto_register_subtree_array(ett, array_length(etts))')
     writer.statement('expert_register_field_array(expert_proto, ei, array_length(ei))')
     writer.end_block()
 
 
 def write_protocol_parser(writer, proto):
     global hf_writer
+    global ett_writer
 
     write_parser_helpers(writer)
 
     # put fields declaration first
+    with writer.block('static gint etts[] =', semicolon=True) as scope:
+        ett_writer = scope
+        writer.newline()
     hf_writer = writer.get_subwriter()
 
     # put fields definition at last
-- 
2.1.0



More information about the Spice-devel mailing list