@@ -174,67 +174,34 @@ def get_analysis(
174174
175175
176176class DefUseFactory (AnalysisFactory ):
177- class DefScope :
178- def __init__ (self , parent : "DefUseFactory.DefScope" = None ):
179- self .parent : "DefUseFactory.DefScope" = parent
180- self .def_events : dict [tuple [str , int ], DefEvent ] = dict ()
181-
182- def enter (self ):
183- return DefUseFactory .DefScope (self )
184-
185- def exit (self ):
186- return self .parent or self
187-
188- def add (self , var_name : str , var_id : int , def_event : DefEvent ):
189- self .def_events [(var_name , var_id )] = def_event
190-
191- def event (self , var_name : str , var_id : int ) -> DefEvent :
192- current = self
193- while current is not None :
194- if (var_name , var_id ) in current .def_events :
195- return current .def_events [(var_name , var_id )]
196- current = current .parent
197- return None
198-
199177 def __init__ (self ):
200178 super ().__init__ ()
201179 self .id_to_def : dict [EventFile , dict [tuple [str , int ], DefEvent ]] = dict ()
202- self .id_to_def_thread : dict [
203- EventFile , dict [int , dict [tuple [str , int ], DefEvent ]]
204- ] = dict ()
205- self .def_stack : dict [EventFile , dict [int , DefUseFactory .DefScope ]] = dict ()
180+ self .def_stack : dict [EventFile , dict [int , dict [tuple [str , int ], DefEvent ]]] = (
181+ dict ()
182+ )
206183
207184 def reset (self , event_file : EventFile ):
208185 if event_file in self .id_to_def :
209186 del self .id_to_def [event_file ]
210- if event_file in self .id_to_def_thread :
211- del self .id_to_def_thread [event_file ]
212187 if event_file in self .def_stack :
213188 del self .def_stack [event_file ]
214189
215190 def _find_def_event (
216191 self ,
217192 event_file : EventFile ,
218- thread_id : int ,
193+ scope_id : int ,
219194 var_name : str ,
220195 var_id : int ,
221196 ) -> DefEvent :
222- # Strategy 1: Check in scope stack (from innermost to outermost)
197+ # Strategy 1: Check in scope
223198 def_event = None
224- if event_file in self .def_stack and thread_id in self .def_stack [event_file ]:
225- def_event = self .def_stack [event_file ][thread_id ].event (var_name , var_id )
226-
227- # Strategy 2: Look up in the thread-specific DEF stack
228- if def_event is None :
229- if (
230- event_file in self .id_to_def_thread
231- and thread_id in self .id_to_def_thread [event_file ]
232- ):
233- def_event = self .id_to_def_thread [event_file ][thread_id ].get (
234- (var_name , var_id ), None
235- )
199+ if event_file in self .def_stack and scope_id in self .def_stack [event_file ]:
200+ def_event = self .def_stack [event_file ][scope_id ].get (
201+ (var_name , var_id ), None
202+ )
236203
237- # Strategy 3 : Look up in the global DEF stack (other threads)
204+ # Strategy 2 : Look up in the global DEF stack (other threads)
238205 if def_event is None :
239206 if event_file in self .id_to_def :
240207 def_event = self .id_to_def [event_file ].get ((var_name , var_id ), None )
@@ -245,30 +212,26 @@ def get_analysis(
245212 self , event , event_file : EventFile , scope : Scope = None
246213 ) -> List [AnalysisObject ]:
247214 thread_id = event .thread_id
215+ scope_id = scope .id if scope else 0
248216
249217 if event .event_type == EventType .DEF :
250218 key = (event .var , event .var_id )
251219
252220 # Initialize structures if needed
253221 if event_file not in self .id_to_def :
254222 self .id_to_def [event_file ] = dict ()
255- if event_file not in self .id_to_def_thread :
256- self .id_to_def_thread [event_file ] = dict ()
257- if thread_id not in self .id_to_def_thread [event_file ]:
258- self .id_to_def_thread [event_file ][thread_id ] = dict ()
259223 if event_file not in self .def_stack :
260224 self .def_stack [event_file ] = dict ()
261- if thread_id not in self .def_stack [event_file ]:
262- self .def_stack [event_file ][thread_id ] = DefUseFactory . DefScope ()
225+ if scope_id not in self .def_stack [event_file ]:
226+ self .def_stack [event_file ][scope_id ] = dict ()
263227
264228 # Store the DEF event
265229 self .id_to_def [event_file ][key ] = event
266- self .id_to_def_thread [event_file ][thread_id ][key ] = event
267- self .def_stack [event_file ][thread_id ].add (event .var , event .var_id , event )
230+ self .def_stack [event_file ][scope_id ][key ] = event
268231
269232 elif event .event_type == EventType .USE :
270233 def_event = self ._find_def_event (
271- event_file , thread_id , event .var , event .var_id
234+ event_file , scope_id , event .var , event .var_id
272235 )
273236
274237 if def_event :
@@ -284,23 +247,6 @@ def get_analysis(
284247 if key not in self .objects :
285248 self .objects [key ] = DefUse (def_event , event )
286249 return [self .objects [key ]]
287- elif event .event_type == EventType .FUNCTION_ENTER :
288- if event_file not in self .def_stack :
289- self .def_stack [event_file ] = dict ()
290- if thread_id not in self .def_stack [event_file ]:
291- self .def_stack [event_file ][thread_id ] = DefUseFactory .DefScope ()
292- else :
293- self .def_stack [event_file ][thread_id ] = self .def_stack [event_file ][
294- thread_id
295- ].enter ()
296- elif (
297- event .event_type == EventType .FUNCTION_EXIT
298- or event .event_type == EventType .FUNCTION_ERROR
299- ):
300- if event_file in self .def_stack and thread_id in self .def_stack [event_file ]:
301- self .def_stack [event_file ][thread_id ] = self .def_stack [event_file ][
302- thread_id
303- ].exit ()
304250 return []
305251
306252
0 commit comments