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.
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
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