7979_T = TypeVar ("_T" , Dict [str , Any ], Optional [Dict [str , Any ]])
8080
8181
82- def _rebuild_pkt (
83- cls , # type: Type[Packet]
84- fields , # type: Dict[str, Any]
85- payload , # type: Optional[Packet]
86- metadata , # type: Dict[str, Any]
87- ):
88- # type: (...) -> Packet
89- """Helper for unpickling Packet instances via field values."""
90- # Create the instance using the field values
91- pkt = cls (** fields )
92- if payload is not None :
93- pkt .add_payload (payload )
94- # Restore metadata
95- pkt .time = metadata ['time' ]
96- pkt .sent_time = metadata ['sent_time' ]
97- pkt .direction = metadata ['direction' ]
98- pkt .sniffed_on = metadata ['sniffed_on' ]
99- pkt .wirelen = metadata ['wirelen' ]
100- pkt .comments = metadata ['comments' ]
101- return pkt
102-
103-
10482class Packet (
10583 BasePacket ,
10684 _CanvasDumpExtended ,
@@ -256,6 +234,31 @@ def comment(self, value):
256234 else :
257235 self .comments = None
258236
237+ def _rebuild_pkt (
238+ cls , # type: Type[Packet]
239+ fields , # type: Dict[str, Any]
240+ payload , # type: Optional[Packet]
241+ metadata , # type: Dict[str, Any]
242+ extra_slots = {}, # type: Dict[str, Any]
243+ ):
244+ # type: (...) -> Packet
245+ """Helper for unpickling Packet instances via field values."""
246+ # Create the instance using the field values
247+ pkt = cls (** fields )
248+ if payload is not None :
249+ pkt .add_payload (payload )
250+ # Restore metadata
251+ pkt .time = metadata ['time' ]
252+ pkt .sent_time = metadata ['sent_time' ]
253+ pkt .direction = metadata ['direction' ]
254+ pkt .sniffed_on = metadata ['sniffed_on' ]
255+ pkt .wirelen = metadata ['wirelen' ]
256+ pkt .comments = metadata ['comments' ]
257+ # Restore any extra __slots__ defined by subclasses
258+ for attr , value in extra_slots .items ():
259+ setattr (pkt , attr , value )
260+ return pkt
261+
259262 def __reduce__ (self ):
260263 # type: () -> Tuple[Any, ...]
261264 """Used by pickling methods.
@@ -279,9 +282,14 @@ def __reduce__(self):
279282 'wirelen' : self .wirelen ,
280283 'comments' : self .comments ,
281284 }
285+ # Collect any extra __slots__ defined by subclasses
286+ extra_slots = {}
287+ for attr in type (self ).__all_slots__ - set (Packet .__slots__ ):
288+ if hasattr (self , attr ):
289+ extra_slots [attr ] = getattr (self , attr )
282290 return (
283- _rebuild_pkt ,
284- (self .__class__ , fields , payload , metadata ),
291+ self . _rebuild_pkt ,
292+ (self .__class__ , fields , payload , metadata , extra_slots ),
285293 )
286294
287295 def __deepcopy__ (self ,
0 commit comments