From 9e6cf99c62f5754db6ed10715678ede8db608f27 Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 27 Apr 2022 20:09:34 +0200
Subject: [PATCH] Remove TopLevelParse from parser-name-instrumentation

It has been moved to top-level-parse.py
---
 gdb-port/parser-name-instrumentation-gdb.py | 171 --------------------
 1 file changed, 171 deletions(-)

diff --git a/gdb-port/parser-name-instrumentation-gdb.py b/gdb-port/parser-name-instrumentation-gdb.py
index 95bcbcb..c142441 100644
--- a/gdb-port/parser-name-instrumentation-gdb.py
+++ b/gdb-port/parser-name-instrumentation-gdb.py
@@ -126,177 +126,6 @@ class ParserStack:
 # This corresponds to the ParserStack above. TopLevelParse keeps track of all these.
 # Subsequent h_do_parse()s with the same parser state are considered to belong to the same parse
 
-class TopLevelParse:
-	def __init__(self):
-		self.parser_stacks = []
-		self.parser_objs = {}
-		self.unclaimed_mem_use = 0
-		# Holds 32 characters starting at state->input_stream[index], used by the GUI
-		self.current_input_chunk = ''
-		self.current_parser_env = ''
-		# We save/push in perform_lowlevel_parse, but this is used to display them ahead of time
-		self.h_do_parse_parser = None
-		self.vt_types = None
-		self.parser_decombinator = None
-
-	def init_parser(self):
-		self.vt_types = VTTypes()
-		self.parser_decombinator = ParserDecombinator(self.vt_types)
-
-	# Called from h_packrat_parse()'s handler, where the parse state and arena get initialized
-	def enter_h_packrat_parse(self, parser):
-		# TODO: add a parser stack or something?
-		parser_stack = ParserStack(None, None)
-		self.parser_stacks.append(parser_stack)
-		return 0
-
-	# TODO: arena parameter is useless
-	def enter_h_do_parse(self, parse_state, arena, parser):
-		parser_stack = self.peek_parserstack()
-		try:
-			parser_obj = self.parser_objs[parser]
-		except KeyError:
-			parser_obj = Parser(None, parser)
-			self.parser_objs[parser] = parser_obj
-		self.h_do_parse_parser = parser_obj # TODO: current_parser_env should be set here instead too
-		if parser_stack.parse_state is None and parser_stack.parse_state != parse_state:
-			self.first_h_do_parse_after_packrat_parse(parse_state, arena)
-
-	# Called from h_do_parse()'s handler, at which point we know the addresses of the state and arena
-	def first_h_do_parse_after_packrat_parse(self, parse_state, arena):
-		parser_stack = self.peek_parserstack()
-		parser_stack.set_state(parse_state)
-
-	# Popping the stack of stack of parsers
-	def return_from_h_packrat_parse(self):
-		old_stack = self.parser_stacks.pop()
-		if old_stack.depth() > 0:
-			print("Warning: parser stack not empty but parse is successful?")
-
-	# Memoize the parser object for this particular address, then push it on the stack
-	# Returns the parser object we just initalized (or the one already existing)
-	#TODO: memoize_parser method
-	def enter_perform_lowlevel_parse(self, parser_addr):
-		try:
-			parser_obj = self.parser_objs[parser_addr]
-		except KeyError:
-			# Create a parser object with no name and the address of the parser
-			parser_obj = Parser(None, parser_addr)
-			self.parser_objs[parser_addr] = parser_obj
-
-		parser_stack = self.peek_parserstack()
-		parser_stack.push(parser_obj)
-		if self.parser_decombinator:
-			p_env = self.parser_decombinator.decompose_parser(parser_obj, self)
-			self.set_parser_env(type(p_env).__name__ + " - " + str(p_env)) # TODO: pass this as data structure to frontend
-		return parser_obj
-
-	def return_from_perform_lowlevel_parse(self):
-		parser_stack = self.peek_parserstack()
-		parser_obj = parser_stack.pop()
-		# debug print here
-
-	def enter_h_arena_malloc_raw(self, alloc_size):
-		parser_obj = self.peek_parser()
-		parser_stack = self.peek_parserstack()
-		# This is probably the slowest part of the code, or maybe the overhead adds up over many calls to h_arena_malloc_raw()
-		if parser_obj is not None:
-			# Caveat: parser_stack is assumed not to be None if we could get a parser_obj
-			parser_obj.add_mem_use(parser_stack.parse_state, alloc_size)
-		elif parser_stack is not None:
-			#print("Allocation of " + str(alloc_size) + " bytes without a parser on the stack. (Happens before first call perform_lowlevel_parse to or after return from that call)")
-			parser_stack.unclaimed_mem_use += alloc_size
-		else:
-			#print("Allocation of " + str(alloc_size) + " bytes without a parser stack. (This happens before and after parse)")
-			self.unclaimed_mem_use += alloc_size
-
-	def parse_virtual(self, parser_name):
-		parser_obj = self.peek_parser()
-		if parser_obj.name is None:
-			parser_obj.name_parser(parser_name)
-		#else:
-			#print("Warning: parser already named! This is a bug. old name: %s, new name: %s" % (parser_obj.name, parser_name))
-
-	def peek_parserstack(self):
-		try:
-			retval = self.parser_stacks[-1]
-		except IndexError:
-			retval = None
-		return retval
-
-	def peek_parser(self):
-		try: 
-			retval = self.peek_parserstack().peek()
-		except AttributeError:
-			# print("Parser stack of stacks empty!")
-			retval = None
-
-		# retval will also be None when parser stack is empty (while parser stack of stacks isn't)
-		return retval
-
-	def parser_by_address(self, parser_addr):
-		try:
-			return self.parser_objs[int(parser_addr)]
-		except KeyError:
-			print("Parser with address " + str(hex(parser_addr)) + " not found!")
-
-	def parsers_by_name(self, parser_name):
-		results = [v for k,v in self.parser_objs.items() if v.name == parser_name]
-		if len(results) > 0:
-			return results
-		else:
-			return None
-
-	def set_input_chunk(self, chunk):
-		self.input_chunk = chunk
-
-	def get_input_chunk(self):
-		return self.input_chunk
-
-	def set_parser_env(self, parser_env):
-		self.current_parser_env = parser_env
-
-	def get_parser_env(self):
-		return self.current_parser_env
-
-	def add_or_get_parser(self, parser_addr):
-		try:
-			parser_obj = self.parser_objs[int(parser_addr)]
-		except KeyError:
-			# Create a parser object with no name and the address of the parser
-			parser_obj = Parser(None, int(parser_addr))
-			self.parser_objs[int(parser_addr)] = parser_obj
-
-		return parser_obj
-
-	def get_parser_top_per_arena_mem(self):
-		return sorted(self.parser_objs.values(), key=Parser.get_arenamax, reverse=True)[0]
-
-	def get_parser_top_total_arena_mem(self):
-		return sorted(self.parser_objs.values(), key=Parser.get_arenasum, reverse=True)[0]
-
-	def get_avg_mem_use_per_arena(self):
-		avg_mem_use = {}
-		arena_counts = {}
-		# Accumulate byte counts and counts of parsers using that arena
-		for p in self.parser_objs.values():
-			for arena,mem in p.bytes_used.items():
-				if arena in arena_counts.keys():
-					arena_counts[arena] += 1
-				else:
-					arena_counts[arena] = 1
-
-				if arena in avg_mem_use.keys():
-					avg_mem_use[arena] += mem
-				else:
-					avg_mem_use[arena] = mem
-
-		averages = {arena: mem/arena_counts[arena] for arena,mem in avg_mem_use.items()}
-
-		return averages
-
-	# TODO: get_avg_mem_use_all_arenas, get_total_mem_use
-
 print(": Initializing TopLevelParse")
 top_level_parse = TopLevelParse()
 # Approach 1: load the application, set breakpoints, execute stack commands on breakpoint hit, continue
-- 
GitLab