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,32 @@ def comment(self, value):
256234 else :
257235 self .comments = None
258236
237+ @classmethod
238+ def _rebuild_pkt (
239+ cls , # type: Type[Packet]
240+ fields , # type: Dict[str, Any]
241+ payload , # type: Optional[Packet]
242+ metadata , # type: Dict[str, Any]
243+ extra_slots = {}, # type: Dict[str, Any]
244+ ):
245+ # type: (...) -> Packet
246+ """Helper for unpickling Packet instances via field values."""
247+ # Create the instance using the field values
248+ pkt = cls (** fields )
249+ if payload is not None :
250+ pkt .add_payload (payload )
251+ # Restore metadata
252+ pkt .time = metadata ['time' ]
253+ pkt .sent_time = metadata ['sent_time' ]
254+ pkt .direction = metadata ['direction' ]
255+ pkt .sniffed_on = metadata ['sniffed_on' ]
256+ pkt .wirelen = metadata ['wirelen' ]
257+ pkt .comments = metadata ['comments' ]
258+ # Restore any extra __slots__ defined by subclasses
259+ for attr , value in extra_slots .items ():
260+ setattr (pkt , attr , value )
261+ return pkt
262+
259263 def __reduce__ (self ):
260264 # type: () -> Tuple[Any, ...]
261265 """Used by pickling methods.
@@ -279,9 +283,14 @@ def __reduce__(self):
279283 'wirelen' : self .wirelen ,
280284 'comments' : self .comments ,
281285 }
286+ # Collect any extra __slots__ defined by subclasses
287+ extra_slots = {}
288+ for attr in type (self ).__all_slots__ - set (Packet .__slots__ ):
289+ if hasattr (self , attr ):
290+ extra_slots [attr ] = getattr (self , attr )
282291 return (
283- _rebuild_pkt ,
284- (self .__class__ , fields , payload , metadata ),
292+ self . _rebuild_pkt ,
293+ (self .__class__ , fields , payload , metadata , extra_slots ),
285294 )
286295
287296 def __deepcopy__ (self ,
0 commit comments