Doing virtual classes the right way
diff --git a/wireshark_gen/templates/_ofclass_dissector.lua b/wireshark_gen/templates/_ofclass_dissector.lua
index fbb9f6a..d9fb5cb 100644
--- a/wireshark_gen/templates/_ofclass_dissector.lua
+++ b/wireshark_gen/templates/_ofclass_dissector.lua
@@ -26,7 +26,7 @@
:: # under the EPL.
::
:: from loxi_ir import *
-:: from wireshark_gen import make_field_name, get_reader, get_peeker
+:: from wireshark_gen import make_field_name, get_reader
:: attrs = []
:: if ofclass.virtual: attrs.append("virtual")
:: if ofclass.superclass: attrs.append("child")
@@ -43,18 +43,25 @@
:: if ofclass.virtual:
:: discriminator_name = make_field_name(version, ofclass.name, ofclass.discriminator.name)
:: #endif
+:: offset = 0
:: for m in ofclass.members:
:: if isinstance(m, OFPadMember):
+:: if not ofclass.virtual:
reader.skip(${m.length})
+:: #endif
:: continue
:: #endif
:: field_name = make_field_name(version, ofclass.name, m.name)
:: reader_name = get_reader(version, ofclass, m)
-:: peeker_name = get_peeker(version, ofclass, m)
+:: if ofclass.virtual:
+:: var_len = m.length
:: if (field_name == discriminator_name):
- return ${peeker_name}(reader, ${version.wire_version}, subtree, '${field_name}')
+ return ${ofclass.name}_v${version.wire_version}_dissectors[reader.peek(${offset},${var_len}):uint()](reader, subtree)
:: break
:: else:
+:: offset = offset + var_len
+:: #endif
+:: else:
${reader_name}(reader, ${version.wire_version}, subtree, '${field_name}')
:: #endif
:: #endfor