From b8bc0c3daea80ed936a5b1feed9badd9f767d8cb Mon Sep 17 00:00:00 2001
From: pompolic <pompolic@special-circumstanc.es>
Date: Wed, 18 Aug 2021 22:56:43 +0200
Subject: [PATCH] Add basic memory use widget

---
 gdb-port/gui.py | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gdb-port/gui.py b/gdb-port/gui.py
index 22944e3..07b915a 100644
--- a/gdb-port/gui.py
+++ b/gdb-port/gui.py
@@ -17,10 +17,13 @@ class PresentationLayer():
 
 		self.backtrace = None
 
+		self.top_parser_mem_use = None
+
 	def set_top_parser(self,parser):
 		self.top_parser = parser
 		self.top_parser_name.set(self.top_parser.name)
 		self.top_parser_address.set(hex(self.top_parser.address))
+		self.top_parser_mem_use.set(self.extract_top_parser_mem_use(self.top_parser))
 
 	def set_input_chunk(self, input_chunk):
 		self.input_chunk.set(input_chunk)
@@ -31,7 +34,15 @@ class PresentationLayer():
 	def set_backtrace(self, backtrace):
 		self.backtrace.set(backtrace)
 
+	# Helper for set_top_parser
+	def extract_top_parser_mem_use(self, parser):
+		# Join key-value pairs into a string, and put them in a list
+		mem_use_list = [": ".join((hex(k), str(v))) for k,v in parser.bytes_used.items()]
+		# Return the list as string joined by newlines
+		return "\n".join(mem_use_list)
+
 	# TODO: this is a bad reimplementation of hammer-parser-backtrace
+	# TODO: can be moved to set_backtrace
 	def parser_stack_to_backtrace_string(self, parser_stack):
 		string_stack = [str(p) for p in parser_stack.p_stack[-1:-10:-1]]
 
@@ -65,6 +76,9 @@ class PresentationLayer():
 		self.backtrace = StringVar()
 		self.backtrace.set(self.parser_stack_to_backtrace_string(top_level_parse.peek_parserstack()))
 
+		self.top_parser_mem_use = StringVar()
+		self.top_parser_mem_use.set(self.extract_top_parser_mem_use(self.top_parser))
+
 		#"Current parser" widgets
 		ttk.Label(self.frame, text="Current parser", anchor='w').grid(column=1, row=1)
 		ttk.Label(self.frame, textvariable=self.top_parser_name, anchor='w').grid(column=1, row=2)
@@ -84,6 +98,9 @@ class PresentationLayer():
 		ttk.Label(self.frame, textvariable=self.backtrace).grid(column=2, row=6)
 		#ttk.Label(self.frame, text="[Placeholder, Placeholder, Placeholder]").grid(column=2, row=6)
 
+		ttk.Label(self.frame, text="Memory use (Arena: bytes)").grid(column=3, row=1)
+		ttk.Label(self.frame, textvariable=self.top_parser_mem_use).grid(column=3, row=2)
+
 		ttk.Button(self.frame, text="Step", command=step).grid(column=1, row=4)
 
 	def mainloop(self):
-- 
GitLab