diff --git a/gdb-port/parser.py b/gdb-port/parser.py
index cbc97e60bc4bf81d3d7e4dd5142f3ea9001e876a..5c10d080415d47575c053fea6c738c5a255f76cd 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)