Skip to content
Snippets Groups Projects
Commit b30167aa authored by Pierre LALET's avatar Pierre LALET
Browse files

Add a static __all_slots__ attribute to improve performances

parent 44d8b52b
No related branches found
No related tags found
No related merge requests found
...@@ -181,6 +181,12 @@ class Packet_metaclass(type): ...@@ -181,6 +181,12 @@ class Packet_metaclass(type):
if "name" in dct: if "name" in dct:
dct["_name"] = dct.pop("name") dct["_name"] = dct.pop("name")
newcls = super(Packet_metaclass, cls).__new__(cls, name, bases, dct) newcls = super(Packet_metaclass, cls).__new__(cls, name, bases, dct)
newcls.__all_slots__ = set(
attr
for cls in newcls.__mro__ if hasattr(cls, "__slots__")
for attr in cls.__slots__
)
if hasattr(newcls, "aliastypes"): if hasattr(newcls, "aliastypes"):
newcls.aliastypes = [newcls] + newcls.aliastypes newcls.aliastypes = [newcls] + newcls.aliastypes
else: else:
......
...@@ -202,17 +202,9 @@ class Packet(BasePacket): ...@@ -202,17 +202,9 @@ class Packet(BasePacket):
else: else:
self.payload.setfieldval(attr,val) self.payload.setfieldval(attr,val)
def attr_in_slots(self, attr):
"""Return True iff `attr` belongs to the `__slots__` list of
this class or any parent class.
"""
return any(attr in cls.__slots__ for cls in self.__class__.__mro__
if hasattr(cls, "__slots__"))
def __setattr__(self, attr, val): def __setattr__(self, attr, val):
if isinstance(self, Packet): if isinstance(self, Packet):
if self.attr_in_slots(attr): if attr in self.__all_slots__:
return object.__setattr__(self, attr, val) return object.__setattr__(self, attr, val)
try: try:
return self.setfieldval(attr,val) return self.setfieldval(attr,val)
...@@ -237,7 +229,7 @@ class Packet(BasePacket): ...@@ -237,7 +229,7 @@ class Packet(BasePacket):
if isinstance(self, Packet): if isinstance(self, Packet):
if attr == "payload": if attr == "payload":
return self.remove_payload() return self.remove_payload()
if self.attr_in_slots(attr): if attr in self.__all_slots__:
return object.__delattr__(self, attr) return object.__delattr__(self, attr)
try: try:
return self.delfieldval(attr) return self.delfieldval(attr)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment