@@ -122,7 +122,8 @@ def set_function_parent_frame_ID(self, ref_obj, enclosing_frame_id):
122122
123123 # return either a primitive object or an object reference;
124124 # and as a side effect, update encoded_heap_objects
125- def encode (self , dat ):
125+ def encode (self , dat , get_parent ):
126+ """Encode a data value DAT using the GET_PARENT function for parent ids."""
126127 # primitive type
127128 if type (dat ) in (int , long , float , str , bool , type (None )):
128129 if type (dat ) is float :
@@ -159,21 +160,21 @@ def encode(self, dat):
159160 if typ == list :
160161 new_obj .append ('LIST' )
161162 for e in dat :
162- new_obj .append (self .encode (e ))
163+ new_obj .append (self .encode (e , get_parent ))
163164 elif typ == tuple :
164165 new_obj .append ('TUPLE' )
165166 for e in dat :
166- new_obj .append (self .encode (e ))
167+ new_obj .append (self .encode (e , get_parent ))
167168 elif typ == set :
168169 new_obj .append ('SET' )
169170 for e in dat :
170- new_obj .append (self .encode (e ))
171+ new_obj .append (self .encode (e , get_parent ))
171172 elif typ == dict :
172173 new_obj .append ('DICT' )
173174 for (k , v ) in dat .items ():
174175 # don't display some built-in locals ...
175176 if k not in ('__module__' , '__return__' , '__locals__' ):
176- new_obj .append ([self .encode (k ), self .encode (v )])
177+ new_obj .append ([self .encode (k , get_parent ), self .encode (v , get_parent )])
177178 elif typ in (types .FunctionType , types .MethodType ):
178179 if is_python3 :
179180 argspec = inspect .getfullargspec (dat )
@@ -195,7 +196,11 @@ def encode(self, dat):
195196
196197 func_name = get_name (dat )
197198 pretty_name = func_name + '(' + ', ' .join (printed_args ) + ')'
198- new_obj .extend (['FUNCTION' , pretty_name , None ]) # the final element will be filled in later
199+ encoded_val = ['FUNCTION' , pretty_name , None ]
200+ if get_parent :
201+ enclosing_frame_id = get_parent (dat )
202+ encoded_val [2 ] = enclosing_frame_id
203+ new_obj .extend (encoded_val )
199204 elif typ is types .BuiltinFunctionType :
200205 pretty_name = get_name (dat ) + '(...)'
201206 new_obj .extend (['FUNCTION' , pretty_name , None ])
@@ -247,5 +252,5 @@ def encode_class_or_instance(self, dat, new_obj):
247252 user_attrs = []
248253
249254 for attr in user_attrs :
250- new_obj .append ([self .encode (attr ), self .encode (dat .__dict__ [attr ])])
255+ new_obj .append ([self .encode (attr , None ), self .encode (dat .__dict__ [attr ], None )])
251256
0 commit comments