From af5a9eec9a364519123b050bdef0675f1564b031 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Sun, 14 May 2023 21:21:02 +0200
Subject: [PATCH] (WIP) Update ParserStack.push() and .pop()

---
 gdb-port/parser.py | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/gdb-port/parser.py b/gdb-port/parser.py
index cbc97e6..5c10d08 100644
--- a/gdb-port/parser.py
+++ b/gdb-port/parser.py
@@ -148,10 +148,9 @@ class ParserStack:
 			# TODO: where should commit_at_push() be called? HDoParseBreakpoint determines whether to stop, which ParserStack doesn't know about. could be a bool parameter to push()
 			if should_commit:
 				allocs = self.commit_at_push()
-				pending_allocs = self.pending_allocs.get(self.arena_int, {})
-				for addr, alloc in allocs.items():
-					pending_allocs[addr] = pending_allocs.get(addr, 0) + alloc
-				self.pending_allocs[self.arena_int] = pending_allocs
+				for parser, allocs_by_arena in allocs.items():
+					updated_allocs = { k : v + allocs_by_arena.get(self.arena_int, 0) for k,v in self.pending_allocs.get(parser, {}).items() }
+					self.pending_allocs[parser] = allocs_by_arena | updated_allocs
 
 	def pop(self):
 		parser_obj = self.peek()
@@ -163,11 +162,10 @@ class ParserStack:
 			self.stack_events.append((StackEvent.POP, int(self.parse_state_gdbval['arena']['arena_malloc_bytes']), parser_obj))
 
 			allocs = self.commit_at_pop()
-			pending_allocs = self.pending_allocs.get(self.arena_int, {})
 			# TODO: where do we commit unclaimed allocs in a parserstack?
-			for addr, alloc in allocs.items():
-				pending_allocs[addr] = pending_allocs.get(addr, 0) + alloc
-			self.pending_allocs[self.arena_int] = pending_allocs
+			for parser, allocs_by_arena in allocs.items():
+				updated_allocs = { k : v + allocs_by_arena.get(self.arena_int, 0) for k,v in self.pending_allocs.get(parser, {}).items() }
+				self.pending_allocs[parser] = allocs_by_arena | updated_allocs
 			#print("adding mem use: parser:", str(parser_obj), "arena:", hex(int(self.arena)), "bytes:", allocated_bytes) # DEBUG
 			#print("adding mem use (alternate): parser:", str(parser_obj), "arena:", hex(int(self.arena)), "bytes:", allocs) # DEBUG
 			#parser_obj.add_mem_use(int(self.arena), allocs)
-- 
GitLab