loci: move per-obj function pointers to global tables
This saves 32 bytes per of_object.
diff --git a/c_gen/c_code_gen.py b/c_gen/c_code_gen.py
index 81f5a1a..e26ef93 100644
--- a/c_gen/c_code_gen.py
+++ b/c_gen/c_code_gen.py
@@ -803,6 +803,7 @@
#include <loci/of_match.h>
#include <loci/of_object.h>
#include <loci/loci_classes.h>
+#include <loci/loci_class_metadata.h>
/****************************************************************
*
@@ -1752,9 +1753,7 @@
elif m_type not in ["of_match_t", "of_octets_t"]:
out.write("""
/* @fixme Shouldn't this precede copying value's data to buffer? */
- if (%(m_name)s->wire_length_set != NULL) {
- %(m_name)s->wire_length_set((of_object_t *)%(m_name)s, %(m_name)s->length);
- }
+ of_object_wire_length_set((of_object_t *)%(m_name)s, %(m_name)s->length);
""" % dict(m_name=m_name))
out.write("""
/* Not scalar, update lengths if needed */
@@ -2058,7 +2057,6 @@
obj->length = bytes;
obj->object_id = %(enum)s;
""" % dict(cls=cls, enum=enum_name(cls)))
- gen_coerce_ops(out, cls)
out.write("""
/* Grow the wire buffer */
@@ -2117,7 +2115,7 @@
if loxi_utils.class_is_u16_len(cls) or cls == "of_packet_queue":
out.write("""
- obj->wire_length_set((of_object_t *)obj, obj->length);
+ of_object_wire_length_set((of_object_t *)obj, obj->length);
""")
if cls == "of_meter_stats":
@@ -2329,99 +2327,6 @@
****************************************************************/
""")
-#
-# @fixme Not clear that these should all be set for virtual fns
-#
-# @fixme Clean up. should have a (language specific) map from class
-# to length and type get/set functions
-#
-
-def gen_coerce_ops(out, cls):
- out.write("""
- /* Set up the object's function pointers */
-""")
-
- uclass = loxi_globals.unified.class_by_name(cls)
- if uclass and not uclass.virtual and uclass.has_type_members:
- out.write("""
- obj->wire_type_set = %(cls)s_push_wire_types;
-""" % dict(cls=cls))
-
- if loxi_utils.class_is_message(cls):
- out.write("""
- obj->wire_length_get = of_object_message_wire_length_get;
- obj->wire_length_set = of_object_message_wire_length_set;
-""")
- else:
- if loxi_utils.class_is_tlv16(cls):
- if not (cls in type_maps.inheritance_map): # Don't set for super
- out.write("""
- obj->wire_length_set = of_tlv16_wire_length_set;
-""")
- out.write("""
- obj->wire_length_get = of_tlv16_wire_length_get;
-""")
- if loxi_utils.class_is_action(cls):
- out.write("""
- obj->wire_type_get = of_action_wire_object_id_get;
-""")
- if loxi_utils.class_is_action_id(cls):
- out.write("""
- obj->wire_type_get = of_action_id_wire_object_id_get;
-""")
- if loxi_utils.class_is_instruction(cls):
- out.write("""
- obj->wire_type_get = of_instruction_wire_object_id_get;
-""")
- if loxi_utils.class_is_instruction_id(cls):
- out.write("""
- obj->wire_type_get = of_instruction_id_wire_object_id_get;
-""")
- if loxi_utils.class_is_queue_prop(cls):
- out.write("""
- obj->wire_type_get = of_queue_prop_wire_object_id_get;
-""")
- if loxi_utils.class_is_table_feature_prop(cls):
- out.write("""
- obj->wire_type_get = of_table_feature_prop_wire_object_id_get;
-""")
- if loxi_utils.class_is_meter_band(cls):
- out.write("""
- obj->wire_type_get = of_meter_band_wire_object_id_get;
-""")
- if loxi_utils.class_is_hello_elem(cls):
- out.write("""
- obj->wire_type_get = of_hello_elem_wire_object_id_get;
-""")
- if loxi_utils.class_is_bsn_tlv(cls):
- out.write("""
- obj->wire_type_get = of_bsn_tlv_wire_object_id_get;
-""")
- if loxi_utils.class_is_oxm(cls):
- out.write("""
- obj->wire_length_get = of_oxm_wire_length_get;
- obj->wire_type_get = of_oxm_wire_object_id_get;
-""")
- if loxi_utils.class_is_u16_len(cls):
- out.write("""
- obj->wire_length_get = of_u16_len_wire_length_get;
- obj->wire_length_set = of_u16_len_wire_length_set;
-""")
- if cls == "of_packet_queue":
- out.write("""
- obj->wire_length_get = of_packet_queue_wire_length_get;
- obj->wire_length_set = of_packet_queue_wire_length_set;
-""")
-# if cls == "of_list_meter_band_stats":
-# out.write("""
-# obj->wire_length_get = of_list_meter_band_stats_wire_length_get;
-#""")
- if cls == "of_meter_stats":
- out.write("""
- obj->wire_length_get = of_meter_stats_wire_length_get;
- obj->wire_length_set = of_meter_stats_wire_length_set;
-""")
-
def gen_new_function_definitions(out, cls):
"""
Generate the new operator for all classes