diff options
author | Jim Ingham <jingham@apple.com> | 2019-10-25 14:05:07 -0700 |
---|---|---|
committer | Jim Ingham <jingham@apple.com> | 2019-10-25 14:05:07 -0700 |
commit | 738af7a6241c98164625b9cd1ba9f8af4e36f197 (patch) | |
tree | 35ecaeb5e79f0fe728c25e82157831b26c3f7158 /lldb/scripts/Python/python-wrapper.swig | |
parent | a6b0219fc4a78e96ff268d101b911466dedbbf2c (diff) | |
download | bcm5719-llvm-738af7a6241c98164625b9cd1ba9f8af4e36f197.tar.gz bcm5719-llvm-738af7a6241c98164625b9cd1ba9f8af4e36f197.zip |
Add the ability to pass extra args to a Python breakpoint callback.
For example, it is pretty easy to write a breakpoint command that implements "stop when my caller is Foo", and
it is pretty easy to write a breakpoint command that implements "stop when my caller is Bar". But there's no
way to write a generic "stop when my caller is..." function, and then specify the caller when you add the
command to a breakpoint.
With this patch, you can pass this data in a SBStructuredData dictionary. That will get stored in
the PythonCommandBaton for the breakpoint, and passed to the implementation function (if it has the right
signature) when the breakpoint is hit. Then in lldb, you can say:
(lldb) break com add -F caller_is -k caller_name -v Foo
More generally this will allow us to write reusable Python breakpoint commands.
Differential Revision: https://reviews.llvm.org/D68671
Diffstat (limited to 'lldb/scripts/Python/python-wrapper.swig')
-rw-r--r-- | lldb/scripts/Python/python-wrapper.swig | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lldb/scripts/Python/python-wrapper.swig b/lldb/scripts/Python/python-wrapper.swig index 8bb74647741..b7af3422193 100644 --- a/lldb/scripts/Python/python-wrapper.swig +++ b/lldb/scripts/Python/python-wrapper.swig @@ -45,7 +45,8 @@ LLDBSwigPythonBreakpointCallbackFunction const char *python_function_name, const char *session_dictionary_name, const lldb::StackFrameSP& frame_sp, - const lldb::BreakpointLocationSP& bp_loc_sp + const lldb::BreakpointLocationSP& bp_loc_sp, + lldb_private::StructuredDataImpl *args_impl ) { lldb::SBFrame sb_frame (frame_sp); @@ -62,7 +63,19 @@ LLDBSwigPythonBreakpointCallbackFunction PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc)); - PythonObject result = pfunc(frame_arg, bp_loc_arg, dict); + + PythonObject result; + // If the called function doesn't take extra_args, drop them here: + auto arg_info = pfunc.GetNumArguments(); + if (arg_info.count == 3) + result = pfunc(frame_arg, bp_loc_arg, dict); + else if (arg_info.count == 4) { + lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); + PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); + result = pfunc(frame_arg, bp_loc_arg, args_arg, dict); + } else { + return stop_at_breakpoint; + } if (result.get() == Py_False) stop_at_breakpoint = false; |