summaryrefslogtreecommitdiff
path: root/lldb/examples
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2016-06-28 00:06:35 +0000
committerGreg Clayton <gclayton@apple.com>2016-06-28 00:06:35 +0000
commit982b4de17fcab7a24e70a53ef5b3c9b6a300fc50 (patch)
tree105db70a9936dd82a197404b5843a6aa397d8567 /lldb/examples
parent2b4394d1e5a9ccfbadb55eb2309ad8e200aa38ff (diff)
Fixup the "shadow" example command to use the function that takes an execution context now that the @lldb.command decorator does the right thing for the command function that takes 5 arguments.
A few fixes: - Check the process state to make sure it is stopped - Grab the frame from the "exe_ctx" so this will work during breakpoint callbacks - Print out the SBDeclaration objects of the variables that shadow each other so we can see the source locations of which variable declarations are shodowing each other.
Diffstat (limited to 'lldb/examples')
-rw-r--r--lldb/examples/python/shadow.py54
1 files changed, 26 insertions, 28 deletions
diff --git a/lldb/examples/python/shadow.py b/lldb/examples/python/shadow.py
index 6da2bcec9a7..d1a5878fcef 100644
--- a/lldb/examples/python/shadow.py
+++ b/lldb/examples/python/shadow.py
@@ -4,20 +4,14 @@ import lldb
import shlex
@lldb.command("shadow")
-def check_shadow_command(debugger, command, result, dict):
- target = debugger.GetSelectedTarget()
- if not target:
- print >>result, "invalid target"
- return
- process = target.GetProcess()
- if not process:
- print >>result, "invalid process"
- return
- thread = process.GetSelectedThread()
- if not thread:
- print >>result, "invalid thread"
- return
- frame = thread.GetSelectedFrame()
+def check_shadow_command(debugger, command, exe_ctx, result, dict):
+ '''Check the currently selected stack frame for shadowed variables'''
+ process = exe_ctx.GetProcess()
+ state = process.GetState()
+ if state != lldb.eStateStopped:
+ print >>result, "process must be stopped, state is %s" % lldb.SBDebugger.StateAsCString(state)
+ return
+ frame = exe_ctx.GetFrame()
if not frame:
print >>result, "invalid frame"
return
@@ -26,8 +20,9 @@ def check_shadow_command(debugger, command, result, dict):
# TODO: add support for using arguments that are passed to this command...
# Make a dictionary of variable name to "SBBlock and SBValue"
- var_dict = {}
+ shadow_dict = {}
+ num_shadowed_variables = 0
# Get the deepest most block from the current frame
block = frame.GetBlock()
# Iterate through the block and all of its parents
@@ -36,24 +31,27 @@ def check_shadow_command(debugger, command, result, dict):
block_vars = block.GetVariables(frame, True, True, True, 0)
# Iterate through all variables in the current block
for block_var in block_vars:
- # Get the variable name and see if we already have a variable by this name?
- block_var_name = block_var.GetName()
- if block_var_name in var_dict:
- # We already have seen a variable with this name, so it is shadowed
- shadow_block_and_vars = var_dict[block_var_name]
- for shadow_block_and_var in shadow_block_and_vars:
- print shadow_block_and_var[0], shadow_block_and_var[1]
- print 'is shadowed by:'
- print block, block_var
# Since we can have multiple shadowed variables, we our variable
# name dictionary to have an array or "block + variable" pairs so
# We can correctly print out all shadowed variables and whow which
# blocks they come from
- if block_var_name in var_dict:
- var_dict[block_var_name].append([block, block_var])
+ block_var_name = block_var.GetName()
+ if block_var_name in shadow_dict:
+ shadow_dict[block_var_name].append(block_var)
else:
- var_dict[block_var_name] = [[block, block_var]]
+ shadow_dict[block_var_name] = [block_var]
# Get the parent block and continue
block = block.GetParent()
-
+
+ num_shadowed_variables = 0
+ if shadow_dict:
+ for name in shadow_dict.keys():
+ shadow_vars = shadow_dict[name]
+ if len(shadow_vars) > 1:
+ print '"%s" is shadowed by the following declarations:' % (name)
+ num_shadowed_variables += 1
+ for shadow_var in shadow_vars:
+ print >>result, str(shadow_var.GetDeclaration())
+ if num_shadowed_variables == 0:
+ print >>result, 'no variables are shadowed'