Skip to content

Commit 56f663d

Browse files
authored
Merge pull request #24 from smythi93/dev
refactor DefUseFactory to use scope_id instead of thread_id for event…
2 parents 89b8126 + 62f88e7 commit 56f663d

File tree

1 file changed

+15
-69
lines changed

1 file changed

+15
-69
lines changed

src/sflkit/analysis/factory.py

Lines changed: 15 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -174,67 +174,34 @@ def get_analysis(
174174

175175

176176
class 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

Comments
 (0)