lawrence_danna created this revision.
lawrence_danna added reviewers: labath, jingham, JDevlieghere.
Herald added a project: LLDB.
Move breakpoints from the old, bad ArgInfo::count to the new, better
ArgInfo::max_positional_args. Soon ArgInfo::count will be no more.
It looks like this functionality is already well tested by
`TestBreakpointCommandsFromPython.py`, so there's no need to write
additional tests for it.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D69468
Files:
lldb/include/lldb/Interpreter/ScriptInterpreter.h
lldb/scripts/Python/python-wrapper.swig
lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
===================================================================
--- lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
+++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
@@ -256,11 +256,10 @@
BreakpointOptions *bp_options,
std::unique_ptr<BreakpointOptions::CommandData> &data_up) override;
- Status SetBreakpointCommandCallback(
- BreakpointOptions *bp_options,
- const char *command_body_text,
- StructuredData::ObjectSP extra_args_sp,
- bool uses_extra_args);
+ Status SetBreakpointCommandCallback(BreakpointOptions *bp_options,
+ const char *command_body_text,
+ StructuredData::ObjectSP extra_args_sp,
+ bool uses_extra_args);
/// Set a one-liner as the callback for the watchpoint.
void SetWatchpointCommandCallback(WatchpointOptions *wp_options,
@@ -378,10 +377,9 @@
python::PythonDictionary &GetSessionDictionary();
python::PythonDictionary &GetSysModuleDictionary();
-
- llvm::Expected<size_t>
- GetNumFixedArgumentsForCallable(const llvm::StringRef &callable_name)
- override;
+
+ llvm::Expected<unsigned> GetMaxPositionalArgumentsForCallable(
+ const llvm::StringRef &callable_name) override;
bool GetEmbeddedInterpreterModuleObjects();
Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
===================================================================
--- lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
+++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
@@ -782,10 +782,9 @@
return m_sys_module_dict;
}
-llvm::Expected<size_t>
-ScriptInterpreterPythonImpl::GetNumFixedArgumentsForCallable(
- const llvm::StringRef &callable_name)
-{
+llvm::Expected<unsigned>
+ScriptInterpreterPythonImpl::GetMaxPositionalArgumentsForCallable(
+ const llvm::StringRef &callable_name) {
if (callable_name.empty()) {
return llvm::createStringError(
llvm::inconvertibleErrorCode(),
@@ -796,16 +795,15 @@
Locker::NoSTDIN);
auto dict = PythonModule::MainModule()
.ResolveName<PythonDictionary>(m_dictionary_name);
- auto pfunc
- = PythonObject::ResolveNameWithDictionary<PythonCallable>(callable_name,
- dict);
+ auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(
+ callable_name, dict);
if (!pfunc.IsAllocated()) {
return llvm::createStringError(
llvm::inconvertibleErrorCode(),
"can't find callable: %s", callable_name.str().c_str());
}
PythonCallable::ArgInfo arg_info = pfunc.GetNumArguments();
- return arg_info.count;
+ return arg_info.max_positional_args;
}
static std::string GenerateUniqueName(const char *base_name_wanted,
@@ -1232,22 +1230,22 @@
// For now just cons up a oneliner that calls the provided function.
std::string oneliner("return ");
oneliner += function_name;
-
- llvm::Expected<size_t> maybe_args
- = GetNumFixedArgumentsForCallable(function_name);
+
+ llvm::Expected<unsigned> maybe_args =
+ GetMaxPositionalArgumentsForCallable(function_name);
if (!maybe_args) {
- error.SetErrorStringWithFormat("could not get num args: %s",
+ error.SetErrorStringWithFormat(
+ "could not get num args: %s",
llvm::toString(maybe_args.takeError()).c_str());
return error;
}
- size_t num_args = *maybe_args;
-
+ size_t max_args = *maybe_args;
+
bool uses_extra_args = false;
- if (num_args == 4) {
+ if (max_args >= 4) {
uses_extra_args = true;
oneliner += "(frame, bp_loc, extra_args, internal_dict)";
- }
- else if (num_args == 3) {
+ } else if (max_args >= 3) {
if (extra_args_sp) {
error.SetErrorString("cannot pass extra_args to a three argument callback"
);
@@ -1257,12 +1255,12 @@
oneliner += "(frame, bp_loc, internal_dict)";
} else {
error.SetErrorStringWithFormat("expected 3 or 4 argument "
- "function, %s has %zu",
- function_name, num_args);
+ "function, %s can only take %zu",
+ function_name, max_args);
return error;
}
-
- SetBreakpointCommandCallback(bp_options, oneliner.c_str(), extra_args_sp,
+
+ SetBreakpointCommandCallback(bp_options, oneliner.c_str(), extra_args_sp,
uses_extra_args);
return error;
}
@@ -1840,8 +1838,7 @@
StructuredData::ObjectSP ScriptInterpreterPythonImpl::CreateScriptedThreadPlan(
const char *class_name, StructuredDataImpl *args_data,
- std::string &error_str,
- lldb::ThreadPlanSP thread_plan_sp) {
+ std::string &error_str, lldb::ThreadPlanSP thread_plan_sp) {
if (class_name == nullptr || class_name[0] == '\0')
return StructuredData::ObjectSP();
@@ -2145,7 +2142,7 @@
std::string auto_generated_function_name(GenerateUniqueName(
"lldb_autogen_python_bp_callback_func_", num_created_functions));
- if (has_extra_args)
+ if (has_extra_args)
sstr.Printf("def %s (frame, bp_loc, extra_args, internal_dict):",
auto_generated_function_name.c_str());
else
Index: lldb/scripts/Python/python-wrapper.swig
===================================================================
--- lldb/scripts/Python/python-wrapper.swig
+++ lldb/scripts/Python/python-wrapper.swig
@@ -61,20 +61,24 @@
if (!pfunc.IsAllocated())
return stop_at_breakpoint;
+ unsigned max_positional_args = PythonCallable::ArgInfo::UNBOUNDED;
+ if (auto arg_info = pfunc.GetArgInfo()) {
+ max_positional_args = arg_info.get().max_positional_args;
+ } else {
+ llvm::consumeError(arg_info.takeError());
+ }
+
PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame));
PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc));
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) {
+ if (max_positional_args < 4) {
+ result = pfunc(frame_arg, bp_loc_arg, dict);
+ } else {
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;
+ result = pfunc(frame_arg, bp_loc_arg, args_arg, dict);
}
if (result.get() == Py_False)
Index: lldb/include/lldb/Interpreter/ScriptInterpreter.h
===================================================================
--- lldb/include/lldb/Interpreter/ScriptInterpreter.h
+++ lldb/include/lldb/Interpreter/ScriptInterpreter.h
@@ -315,8 +315,7 @@
Status SetBreakpointCommandCallbackFunction(
std::vector<BreakpointOptions *> &bp_options_vec,
- const char *function_name,
- StructuredData::ObjectSP extra_args_sp);
+ const char *function_name, StructuredData::ObjectSP extra_args_sp);
/// Set a script function as the callback for the breakpoint.
virtual Status
@@ -472,9 +471,9 @@
const char *GetScriptInterpreterPtyName();
int GetMasterFileDescriptor();
-
- virtual llvm::Expected<size_t>
- GetNumFixedArgumentsForCallable(const llvm::StringRef &callable_name) {
+
+ virtual llvm::Expected<unsigned>
+ GetMaxPositionalArgumentsForCallable(const llvm::StringRef &callable_name) {
return llvm::createStringError(
llvm::inconvertibleErrorCode(), "Unimplemented function");
}
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits