From f5528954b603f442122f32d449bb7358ab168828 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Sat, 13 May 2023 22:35:30 +0200
Subject: [PATCH] Propagate alloc data up to TopLevelParse, then back down to
 individual parsers

---
 gdb-port/parser.py          |  9 ++++++++-
 gdb-port/top-level-parse.py | 10 +++++-----
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/gdb-port/parser.py b/gdb-port/parser.py
index d8d53dc..3af1f56 100644
--- a/gdb-port/parser.py
+++ b/gdb-port/parser.py
@@ -81,7 +81,7 @@ class ParserStack:
 		self.parse_state = parse_state
 		self.parse_state_gdbval = parse_state
 		self.arena = arena
-		self.arena_int = int(arena)
+		self.arena_int = 0
 		# TODO: remove?
 		self.arena_gdbval = arena
 		# self.parse_state and self.arena is expected to be an int by TopLevelParse and is ultimately used to index into the memory usage dict
@@ -181,6 +181,13 @@ class ParserStack:
 			retval = None
 		return retval
 
+	def set_arena(self, arena):
+		self.arena = arena
+		try:
+			self.arena_int = int(arena)
+		except TypeError:
+			self.arena_int = 0
+
 	def set_state(self, state):
 		self.parse_state = state
 	# Shortcut for setting the name property of the parser on the top of stack
diff --git a/gdb-port/top-level-parse.py b/gdb-port/top-level-parse.py
index ee40a1c..ff2af3b 100644
--- a/gdb-port/top-level-parse.py
+++ b/gdb-port/top-level-parse.py
@@ -68,8 +68,8 @@ class TopLevelParse:
 		parser_stack.push(parser_obj, arena, stopping_at_bp)
 		if stopping_at_bp:
 			profiler.enable()
-			self.gather_all_allocations_in_parserstacks()
-			self.commit_pending_allocations(self.pending_allocations)
+			self.gather_allocations_in_parser_stacks()
+			self.commit_pending_allocations()
 			profiler.disable()
 		parser_obj.increment_apply_count(int(arena))
 		if parser_stack.parse_state is None and parser_stack.parse_state != parse_state_int:
@@ -89,7 +89,7 @@ class TopLevelParse:
 	def first_h_do_parse_after_packrat_parse(self, parse_state, arena):
 		parser_stack = self.peek_parserstack()
 		if arena and not parser_stack.arena:
-			parser_stack.arena = arena
+			parser_stack.set_arena(arena)
 		parser_stack.set_state(parse_state)
 
 	# Popping the stack of stack of parsers
@@ -277,7 +277,7 @@ class TopLevelParse:
 			new_allocs_by_arena = ps.get_pending_allocations()
 			new_allocs = new_allocs_by_arena.get(ps.arena_int, {})
 			pending_allocs = self.pending_allocs.get(ps.arena_int, {})
-			for addr, alloc in new_allocs:
+			for addr, alloc in new_allocs.items():
 				pending_allocs[addr] = pending_allocs.get(addr, 0) + alloc
 			self.pending_allocs[ps.arena_int] = pending_allocs
 
@@ -289,7 +289,7 @@ class TopLevelParse:
 	def commit_pending_allocations(self):
 		for arena, allocs in self.pending_allocs.items():
 			for addr, alloc in allocs.items():
-				parser_objs[addr].add_mem_use(arena, alloc)
+				self.parser_by_address(addr).add_mem_use(arena, alloc)
 		self.pending_allocs = {}
 
 top_level_parse = TopLevelParse()
-- 
GitLab