From: Tom Tromey Date: Wed, 14 Jun 2023 14:31:21 +0000 (-0600) Subject: Fix oversights in frame decorator code X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4a1311ba0c46c673fd933375209da38e058982c6;p=binutils-gdb.git Fix oversights in frame decorator code The frame decorator "FrameVars" code misses a couple of cases, discovered when working on related DAP changes. First, fetch_frame_locals does not stop when reaching a function boundary. This means it would return locals from any enclosing functions. Second, fetch_frame_args assumes that all arguments are at the outermost scope, but this doesn't seem to be required by gdb. --- diff --git a/gdb/python/lib/gdb/FrameDecorator.py b/gdb/python/lib/gdb/FrameDecorator.py index 6773780735b..7293be86185 100644 --- a/gdb/python/lib/gdb/FrameDecorator.py +++ b/gdb/python/lib/gdb/FrameDecorator.py @@ -269,6 +269,11 @@ class FrameVars(object): if self.fetch_b(sym): lvars.append(SymValueWrapper(sym, None)) + # Stop when the function itself is seen, to avoid showing + # variables from outer functions in a nested function. + if block.function is not None: + break + block = block.superblock return lvars @@ -286,14 +291,18 @@ class FrameVars(object): block = None while block is not None: - if block.function is not None: + if block.is_global or block.is_static: break - block = block.superblock - - if block is not None: for sym in block: if not sym.is_argument: continue args.append(SymValueWrapper(sym, None)) + # Stop when the function itself is seen, to avoid showing + # variables from outer functions in a nested function. + if block.function is not None: + break + + block = block.superblock + return args