def build_id_class(orig_name, base_name): name = base_name + '_id' + orig_name[len(base_name):] if name in name_classes: return name_classes[name] orig_fe, _ = name_frontend_classes[orig_name] if orig_fe.superclass: superclass_name = base_name + '_id' + orig_fe.superclass[ len(base_name):] superclass = build_id_class(orig_fe.superclass, base_name) else: superclass_name = None superclass = None ofc_members = [] for m in orig_fe.members: if not isinstance(m, frontend_ir.OFDataMember) and not isinstance( m, frontend_ir.OFPadMember): ofc_members.append(m) fe = frontend_ir.OFClass(name=name, superclass=superclass_name, members=ofc_members, virtual=orig_fe.virtual, params={}) base_length, is_fixed_length, member_lengths = \ ir_offset.calc_lengths(version, fe, name_classes, name_enums) assert fe.virtual or is_fixed_length members = [] c = OFClass(name=fe.name, superclass=superclass, members=members, virtual=fe.virtual, params=fe.params, is_fixed_length=is_fixed_length, base_length=base_length) members.extend( build_member(c, fe_member, member_lengths[fe_member]) for fe_member in fe.members) name_classes[name] = c return c
def build_class(name): if name in name_classes: return name_classes[name] if name in build_touch_classes: raise DependencyCycleException("Dependency cycle: {}".format( " -> ".join(list(build_touch_classes) + [name]))) if not name in name_frontend_classes: raise ClassNotFoundException("Class not found: {}".format(name)) build_touch_classes.add(name) fe, _ = name_frontend_classes[name] superclass = build_class(fe.superclass) if fe.superclass else None # make sure members on which we depend are built first (for calc_length) for m in fe.members: if not hasattr(m, "oftype"): continue for m_name in re.sub(r'_t$', '', m.oftype), m.oftype: logger.debug("Checking {}".format(m_name)) if m_name in name_frontend_classes: build_class(m_name) base_length, is_fixed_length, member_lengths = \ ir_offset.calc_lengths(version, fe, name_classes, name_enums) members = [] c = OFClass(name=fe.name, superclass=superclass, members=members, virtual=fe.virtual, params=fe.params, is_fixed_length=is_fixed_length, base_length=base_length) members.extend( build_member(c, fe_member, member_lengths[fe_member]) for fe_member in fe.members) name_classes[name] = c build_touch_classes.remove(name) return c
def build_class(name): if name in name_classes: return name_classes[name] if name in build_touch_classes: raise DependencyCycleException( "Dependency cycle: {}".format(" -> ".join(list(build_touch_classes) + [name])) ) if not name in name_frontend_classes: raise ClassNotFoundException("Class not found: {}".format(name)) build_touch_classes.add(name) fe, _ = name_frontend_classes[name] superclass = build_class(fe.superclass) if fe.superclass else None # make sure members on which we depend are built first (for calc_length) for m in fe.members: if not hasattr(m, "oftype"): continue for m_name in re.sub(r"_t$", "", m.oftype), m.oftype: logger.debug("Checking {}".format(m_name)) if m_name in name_frontend_classes: build_class(m_name) base_length, is_fixed_length, member_lengths = ir_offset.calc_lengths(version, fe, name_classes, name_enums) members = [] c = OFClass( name=fe.name, superclass=superclass, members=members, virtual=fe.virtual, params=fe.params, is_fixed_length=is_fixed_length, base_length=base_length, ) members.extend(build_member(c, fe_member, member_lengths[fe_member]) for fe_member in fe.members) name_classes[name] = c build_touch_classes.remove(name) return c
def build_id_class(orig_name, base_name): name = base_name + '_id' + orig_name[len(base_name):] if name in name_classes: return name_classes[name] orig_fe, _ = name_frontend_classes[orig_name] if orig_fe.superclass: superclass_name = base_name + '_id' + orig_fe.superclass[len(base_name):] superclass = build_id_class(orig_fe.superclass, base_name) else: superclass_name = None superclass = None ofc_members = [] for m in orig_fe.members: if not isinstance(m, frontend_ir.OFDataMember) and not isinstance(m, frontend_ir.OFPadMember): ofc_members.append(m) fe = frontend_ir.OFClass( name=name, superclass=superclass_name, members=ofc_members, virtual=orig_fe.virtual, params={}) base_length, is_fixed_length, member_lengths = \ ir_offset.calc_lengths(version, fe, name_classes, name_enums) assert fe.virtual or is_fixed_length members = [] c = OFClass(name=fe.name, superclass=superclass, members=members, virtual=fe.virtual, params=fe.params, is_fixed_length=is_fixed_length, base_length=base_length) members.extend( build_member(c, fe_member, member_lengths[fe_member]) for fe_member in fe.members) name_classes[name] = c return c