9#ifndef LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDPYTHONINTERFACE_H
10#define LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDPYTHONINTERFACE_H
54 std::variant<std::monostate, InvalidArgumentCountPayload, std::string>
66 return llvm::createStringError(
"scripted Interface has invalid object");
69 PythonObject(PyRefType::Borrowed,
72 if (!py_obj.IsAllocated())
73 return llvm::createStringError(
74 "scripted Interface has invalid python object");
76 PythonObject py_obj_class = py_obj.GetAttributeValue(
"__class__");
77 if (!py_obj_class.IsValid())
78 return llvm::createStringError(
79 "scripted Interface python object is missing '__class__' attribute");
81 PythonObject py_obj_module = py_obj_class.GetAttributeValue(
"__module__");
82 if (!py_obj_module.IsValid())
83 return llvm::createStringError(
84 "scripted Interface python object '__class__' is missing "
85 "'__module__' attribute");
87 PythonString py_obj_module_str = py_obj_module.Str();
88 if (!py_obj_module_str.IsValid())
89 return llvm::createStringError(
90 "scripted Interface python object '__class__.__module__' attribute "
98 static llvm::Expected<FileSpec>
GetModuleFile(llvm::StringRef module_name) {
101 PythonModule py_module = PythonModule::AddModule(module_name);
102 if (!py_module.IsValid())
103 return llvm::createStringError(
104 llvm::formatv(
"failed to import '{0}' module", module_name).str());
106 PythonObject py_module_file = py_module.GetAttributeValue(
"__file__");
107 if (!py_module_file.IsValid())
108 return llvm::createStringError(
109 llvm::formatv(
"module '{0}' is missing '__file__' attribute",
113 PythonString py_module_file_str = py_module_file.Str();
114 if (!py_module_file_str.IsValid())
115 return llvm::createStringError(
116 llvm::formatv(
"module '{0}.__file__' attribute is not a string",
120 return FileSpec(py_module_file_str.GetString());
123 llvm::Expected<std::map<llvm::StringLiteral, AbstractMethodCheckerPayload>>
129 std::map<llvm::StringLiteral, AbstractMethodCheckerPayload> checker;
130#define SET_CASE_AND_CONTINUE(method_name, case) \
132 checker[method_name] = {case, {}}; \
138 llvm::StringLiteral method_name = requirement.name;
145 if (!attr.IsAllocated())
149 PythonCallable callable = attr.
AsType<PythonCallable>();
154 if (!requirement.min_arg_count)
157 auto arg_info_or_err = callable.GetArgInfo();
158 if (!arg_info_or_err) {
159 checker[method_name] = {
165 PythonCallable::ArgInfo arg_info = *arg_info_or_err;
166 if (requirement.min_arg_count <= arg_info.max_positional_args) {
169 checker[method_name] = {
172 requirement.min_arg_count, arg_info.max_positional_args)};
176#undef SET_CASE_AND_CONTINUE
188 llvm::StringRef qualified_class_name)
const {
194 llvm::StringRef class_name = obj_class_name.
IsValid()
196 : qualified_class_name;
197 auto create_error = [](llvm::StringLiteral format,
auto &&...ts) {
198 return llvm::createStringError(
199 llvm::formatv(format.data(), std::forward<
decltype(ts)>(ts)...)
205 return checker_or_err.takeError();
207 llvm::Error abstract_method_errors = llvm::Error::success();
208 for (
const auto &method_checker : *checker_or_err)
209 switch (method_checker.second.checker_case) {
211 abstract_method_errors = llvm::joinErrors(
212 std::move(abstract_method_errors),
213 create_error(
"abstract method {0}.{1} not implemented", class_name,
214 method_checker.first));
217 abstract_method_errors = llvm::joinErrors(
218 std::move(abstract_method_errors),
219 create_error(
"abstract method {0}.{1} not allocated", class_name,
220 method_checker.first));
223 abstract_method_errors = llvm::joinErrors(
224 std::move(abstract_method_errors),
225 create_error(
"abstract method {0}.{1} not callable", class_name,
226 method_checker.first));
229 const std::string *py_error =
230 std::get_if<std::string>(&method_checker.second.payload);
231 abstract_method_errors = llvm::joinErrors(
232 std::move(abstract_method_errors),
234 "abstract method {0}.{1} has unknown argument count: {2}",
235 class_name, method_checker.first,
236 py_error ? *py_error :
"<no further information>"));
239 auto &payload_variant = method_checker.second.payload;
240 if (!std::holds_alternative<
243 abstract_method_errors = llvm::joinErrors(
244 std::move(abstract_method_errors),
246 "abstract method {0}.{1} has unexpected argument count",
247 class_name, method_checker.first));
249 auto payload = std::get<
252 abstract_method_errors = llvm::joinErrors(
253 std::move(abstract_method_errors),
254 create_error(
"abstract method {0}.{1} has unexpected "
255 "argument count (expected {2} but has {3})",
256 class_name, method_checker.first,
257 payload.required_argument_count,
258 payload.actual_argument_count));
262 LLDB_LOG(log,
"Abstract method {0}.{1} implemented & valid.",
263 class_name, method_checker.first);
267 if (abstract_method_errors) {
269 LLDB_LOG(log,
"Abstract method error in {0}:\n{1}", qualified_class_name,
271 return error.ToError();
274 return llvm::Error::success();
277 template <
typename...
Args>
278 llvm::Expected<StructuredData::GenericSP>
284 auto create_error = [](llvm::StringLiteral format,
auto &&...ts) {
285 return llvm::createStringError(
286 llvm::formatv(format.data(), std::forward<
decltype(ts)>(ts)...)
291 llvm::StringRef class_name = scripted_metadata.
GetClassName();
292 bool has_class_name = !class_name.empty();
293 bool has_interpreter_dict =
294 !(llvm::StringRef(
m_interpreter.GetDictionaryName()).empty());
295 if (!has_class_name && !has_interpreter_dict && !script_obj) {
297 return create_error(
"missing script class name");
298 else if (!has_interpreter_dict)
299 return create_error(
"invalid script interpreter dictionary");
301 return create_error(
"missing scripting object");
304 std::optional<PolicyStack::Guard> policy_guard;
311 PythonObject result = {};
314 result = PythonObject(PyRefType::Borrowed,
315 static_cast<PyObject *
>(script_obj->
GetValue()));
320 if (!dict.IsAllocated())
321 return create_error(
"could not find interpreter dictionary: {0}",
325 PythonObject::ResolveNameWithDictionary<python::PythonCallable>(
327 if (!init.IsAllocated())
328 return create_error(
"could not find script class: {0}",
331 std::tuple<
Args...> original_args = std::forward_as_tuple(args...);
334 std::string error_string;
335 llvm::Expected<PythonCallable::ArgInfo> arg_info = init.GetArgInfo();
337 llvm::handleAllErrors(
338 arg_info.takeError(),
339 [&](PythonException &E) { error_string.append(E.ReadBacktrace()); },
340 [&](
const llvm::ErrorInfoBase &E) {
341 error_string.append(E.message());
343 return llvm::createStringError(llvm::inconvertibleErrorCode(),
348 return std::move(
error);
350 llvm::Expected<PythonObject> expected_return_object =
351 create_error(
"resulting object is not initialized");
365 size_t num_args =
sizeof...(Args);
366 if (arg_info->max_positional_args != PythonCallable::ArgInfo::UNBOUNDED &&
367 num_args != arg_info->max_positional_args) {
368 if (num_args != arg_info->max_positional_args - 1) {
372 llvm::consumeError(expected_return_object.takeError());
373 return create_error(
"passed arguments ({0}) doesn't match the number "
374 "of expected arguments ({1})",
375 num_args, arg_info->max_positional_args);
379 [&init, &expected_return_object](
auto &&...args) {
380 if (!expected_return_object)
381 llvm::consumeError(expected_return_object.takeError());
382 expected_return_object = init.Call(args...);
384 std::tuple_cat(transformed_args, std::make_tuple(dict)));
387 [&init, &expected_return_object](
auto &&...args) {
388 if (!expected_return_object)
389 llvm::consumeError(expected_return_object.takeError());
390 expected_return_object = init.Call(args...);
395 if (!expected_return_object)
400 return llvm::createStringError(
402 result = expected_return_object.get();
405 if (!result.IsValid())
406 return create_error(
"resulting object is not a valid Python Object");
407 if (!result.HasAttribute(
"__class__"))
408 return create_error(
"resulting object doesn't have '__class__' member");
410 PythonObject obj_class = result.GetAttributeValue(
"__class__");
411 if (!obj_class.IsValid())
412 return create_error(
"resulting class object is not a valid");
413 if (!obj_class.HasAttribute(
"__name__"))
415 "resulting object class doesn't have '__name__' member");
416 PythonString obj_class_name =
417 obj_class.GetAttributeValue(
"__name__").AsType<PythonString>();
422 if (llvm::Error
error =
424 return std::move(
error);
427 new StructuredPythonObject(std::move(result)));
432 std::string qualified_class_name = script_obj ?
"" : class_name.str();
433 PythonString obj_module_name =
434 obj_class.GetAttributeValue(
"__module__").AsType<PythonString>();
435 if (qualified_class_name.empty() && obj_module_name.IsValid())
436 qualified_class_name =
437 llvm::formatv(
"{0}.{1}", obj_module_name.GetString(),
438 obj_class_name.GetString())
444 if (obj_module_name.IsValid()) {
445 if (llvm::Expected<FileSpec> path_or_err =
447 source_path = *path_or_err;
450 "failed to find the file defining {1}: {0}",
451 qualified_class_name);
456 std::move(qualified_class_name), std::move(source_path),
475 llvm::StringRef method_name,
480 std::string caller_signature =
481 llvm::Twine(LLVM_PRETTY_FUNCTION + llvm::Twine(
" (") +
482 llvm::Twine(class_name) + llvm::Twine(
".") +
483 llvm::Twine(method_name) + llvm::Twine(
")"))
486 if (class_name.empty())
487 return LogAndError(caller_signature,
"missing script class name");
489 std::optional<PolicyStack::Guard> policy_guard;
500 if (!dict.IsAllocated())
502 "could not find interpreter dictionary: {0}",
507 PythonObject::ResolveNameWithDictionary<python::PythonCallable>(
509 if (!class_obj.IsAllocated())
510 return LogAndError(caller_signature,
"could not find script class: {0}",
514 if (!class_obj.HasAttribute(method_name))
515 return llvm::make_error<UnimplementedError>(
516 llvm::formatv(
"{0}.{1}", class_name, method_name).str());
518 PythonCallable method =
519 class_obj.GetAttributeValue(method_name).AsType<PythonCallable>();
520 if (!method.IsAllocated())
521 return LogAndError(caller_signature,
"method {0}.{1} is not callable",
522 class_name, method_name);
525 std::tuple<
Args...> original_args = std::forward_as_tuple(args...);
529 llvm::Expected<PythonObject> expected_return_object =
530 llvm::createStringError(
"not initialized");
532 [&method, &expected_return_object](
auto &&...args) {
533 if (!expected_return_object)
534 llvm::consumeError(expected_return_object.takeError());
535 expected_return_object = method.Call(args...);
539 if (llvm::Error e = expected_return_object.takeError()) {
546 caller_signature,
"python exception in {0} method '{1}': {2}",
550 PythonObject py_return = std::move(expected_return_object.get());
553 if (
sizeof...(
Args) > 0)
557 "couldn't re-assign reference and pointer arguments");
560 if (!py_return.IsAllocated())
575 std::string error_msg;
576 llvm::handleAllErrors(
579 [&](
const llvm::ErrorInfoBase &E) { error_msg = E.message(); });
588 template <
typename... Ts>
590 const char *format, Ts &&...ts) {
591 std::string message = llvm::formatv(format, std::forward<Ts>(ts)...).str();
594 return llvm::createStringError(message);
607 template <
typename T>
609 llvm::StringRef caller) {
611 return std::move(*value_or_err);
616 std::string message = llvm::toString(value_or_err.takeError());
629 llvm::Expected<std::optional<T>>
633 LLVM_PRETTY_FUNCTION,
634 "method '{0}' is not declared optional: list it in "
635 "GetOptionalMethods(), or dispatch it with Dispatch(), "
636 "where a missing method is an error",
639 llvm::Expected<T> value_or_err =
640 Dispatch<T>(method_name, std::forward<Args>(args)...);
642 return std::move(*value_or_err);
644 if (value_or_err.template errorIsA<UnimplementedError>()) {
645 llvm::consumeError(value_or_err.takeError());
648 return value_or_err.takeError();
651 template <
typename T = StructuredData::ObjectSP>
667 llvm::Expected<T>
Dispatch(llvm::StringRef method_name,
Args &&...args) {
671 std::string caller_signature =
672 llvm::Twine(LLVM_PRETTY_FUNCTION + llvm::Twine(
" (") +
673 llvm::Twine(method_name) + llvm::Twine(
")"))
676 return LogAndError(caller_signature,
"python object ill-formed");
678 std::optional<PolicyStack::Guard> policy_guard;
685 PythonObject implementor(PyRefType::Borrowed,
688 if (!implementor.IsAllocated())
689 return LogAndError(caller_signature,
"python implementor not allocated");
691 PythonObject py_method = implementor.GetAttributeValue(method_name);
692 if (!py_method.IsAllocated())
693 return llvm::make_error<UnimplementedError>(
694 llvm::formatv(
"{0}.{1}",
701 std::tuple<
Args...> original_args = std::forward_as_tuple(args...);
707 size_t call_arity =
sizeof...(Args);
708 if (PythonCallable callable = py_method.AsType<PythonCallable>();
709 callable.IsAllocated()) {
710 if (llvm::Expected<PythonCallable::ArgInfo> arg_info =
711 callable.GetArgInfo()) {
712 if (arg_info->max_positional_args !=
713 PythonCallable::ArgInfo::UNBOUNDED &&
714 arg_info->max_positional_args < call_arity)
715 call_arity = arg_info->max_positional_args;
717 llvm::consumeError(arg_info.takeError());
721 llvm::Expected<PythonObject> expected_return_object =
722 llvm::createStringError(
"not initialized");
724 std::make_index_sequence<
sizeof...(
Args) + 1>{},
725 [&implementor, &method_name,
726 &expected_return_object](
auto &&...call_args) {
727 if (!expected_return_object)
728 llvm::consumeError(expected_return_object.takeError());
729 expected_return_object = implementor.CallMethod(
730 method_name.data(), call_args...);
733 if (llvm::Error e = expected_return_object.takeError()) {
744 caller_signature,
"python exception in {0} method '{1}': {2}",
750 PythonObject py_return = std::move(expected_return_object.get());
756 if (
sizeof...(
Args) > 0)
760 "couldn't re-assign reference and pointer arguments");
762 if (!py_return.IsAllocated())
770 template <
typename...
Args>
772 llvm::Expected<Status> status_or_err =
777 return std::move(*status_or_err);
802 template <
typename T,
typename = std::enable_if_t<
803 std::is_base_of_v<StructuredData::Object, T>>>
886 for (
const std::string &s : arg)
900 template <
typename T,
typename U>
905 template <
typename T>
908 llvm::Expected<T> value_or_err =
914 original_arg = std::move(*value_or_err);
921 template <
typename T>
930 original_arg = boolean_arg.
GetValue();
933 "{}: Invalid boolean argument.", LLVM_PRETTY_FUNCTION);
936 template <std::size_t... I,
typename...
Args>
938 std::index_sequence<I...>) {
939 return std::make_tuple(
Transform(std::get<I>(args))...);
944 template <
typename...
Args>
950 template <std::size_t N,
typename Tuple,
typename Fn, std::size_t... I>
952 std::forward<Fn>(fn)(std::get<I>(std::forward<Tuple>(t))...);
955 template <std::
size_t N,
typename Tuple,
typename Fn>
958 std::make_index_sequence<N>{});
964 template <
typename Tuple, std::size_t... Is,
typename Fn>
966 std::index_sequence<Is...>, Fn &&fn) {
967 (void)std::initializer_list<int>{(
973 template <
typename T,
typename U>
982 template <
typename T,
typename SB>
987 template <std::size_t... I,
typename... Ts,
typename... Us>
989 std::tuple<Us...> &transformed_args,
990 std::index_sequence<I...>) {
992 (
TransformBack(std::get<I>(original_args), std::get<I>(transformed_args),
995 return error.Success();
998 template <
typename... Ts,
typename... Us>
1000 std::tuple<Us...> &transformed_args) {
1001 if (
sizeof...(Ts) !=
sizeof...(Us))
1005 std::make_index_sequence<
sizeof...(Ts)>());
1008 template <
typename T,
typename...
Args>
1014 template <
typename T>
void FormatArgs(std::string &fmt, T arg)
const {
1025llvm::Expected<StructuredData::ArraySP>
1030llvm::Expected<StructuredData::DictionarySP>
1035llvm::Expected<Status>
1040llvm::Expected<Event *>
1045llvm::Expected<SymbolContext>
1050llvm::Expected<lldb::StreamSP>
1055llvm::Expected<lldb::ThreadSP>
1060llvm::Expected<lldb::StackFrameSP>
1065llvm::Expected<lldb::BreakpointSP>
1070llvm::Expected<lldb::BreakpointLocationSP>
1075llvm::Expected<lldb::ProcessAttachInfoSP>
1080llvm::Expected<lldb::ProcessLaunchInfoSP>
1085llvm::Expected<lldb::DataExtractorSP>
1090llvm::Expected<lldb::ThreadPlanSP>
1095llvm::Expected<std::optional<MemoryRegionInfo>>
1100llvm::Expected<lldb::ExecutionContextRefSP>
1105llvm::Expected<lldb::DescriptionLevel>
1110llvm::Expected<lldb::StepType>
1115llvm::Expected<lldb::StackFrameListSP>
1120llvm::Expected<lldb::ValueObjectSP>
1125llvm::Expected<lldb::TargetSP>
1130llvm::Expected<lldb::ValueObjectListSP>
1135llvm::Expected<std::optional<lldb::ValueType>>
1140llvm::Expected<lldb::DebuggerSP>
1145llvm::Expected<std::vector<std::string>>
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
ScriptInterpreterPythonImpl::Locker Locker
#define SET_CASE_AND_CONTINUE(method_name, case)
A command line argument class.
Guard PushScriptedExtensionCall()
static PolicyStack & Get()
std::optional< ScriptedMetadata > m_scripted_metadata
virtual llvm::SmallVector< AbstractMethodRequirement > GetAbstractMethodRequirements() const =0
virtual bool UserCanRunDirectly() const
Whether the user can invoke this extension directly, the way a scripted command can.
ScriptedInterface()=default
void RegisterInstance(const lldb::ScriptedInstanceRegistrySP ®istry_sp, std::string class_name, FileSpec source_path, StructuredData::DictionarySP args_sp)
virtual llvm::SmallVector< llvm::StringLiteral > GetOptionalMethods() const
Methods a script may legitimately leave out, for which LLDB has a documented answer.
const std::optional< ScriptedMetadata > & GetScriptedMetadata() const
StructuredData::GenericSP m_object_instance_sp
python::ScopedPythonObject< lldb::SBCommandReturnObject > Transform(CommandReturnObject *arg)
python::PythonObject Transform(lldb::StackFrameListSP arg)
python::PythonObject Transform(lldb::ThreadPlanSP arg)
Status GetStatusFromMethod(llvm::StringRef method_name, Args &&...args)
Call method_name and fold both failure channels into one Status: a failure to call the method at all,...
python::PythonObject Transform(lldb::ProcessSP arg)
static llvm::Expected< FileSpec > GetModuleFile(llvm::StringRef module_name)
The file the already imported module_name was loaded from, read from its __file__.
static void ApplyPrefix(Tuple &&t, Fn &&fn)
void TransformBack(T &original_arg, U transformed_arg, Status &error)
ScriptInterpreterPythonImpl & m_interpreter
python::PythonObject Transform(Event *arg)
python::PythonObject Transform(lldb::StepType arg)
auto TransformArgs(const std::tuple< Args... > &args)
python::PythonObject Transform(lldb::ExecutionContextRefSP arg)
python::PythonObject Transform(lldb::ThreadSP arg)
static T LogAndDefault(llvm::Expected< T > value_or_err, llvm::StringRef caller)
Log the failure in value_or_err and fall back to a default-constructed T.
python::PythonObject Transform(const StructuredDataImpl &arg)
llvm::Expected< T > ExtractValueFromPythonObject(python::PythonObject &p)
llvm::Error CheckAbstractMethods(const python::PythonObject &obj_class, llvm::StringRef qualified_class_name) const
Diagnose every abstract-method violation on obj_class at once.
~ScriptedPythonInterface() override=default
static void CallWithArity(size_t call_arity, Tuple &&t, std::index_sequence< Is... >, Fn &&fn)
python::PythonObject Transform(const TypeSummaryOptions &arg)
llvm::Expected< FileSpec > GetScriptedModulePath() override
python::PythonObject Transform(lldb::DescriptionLevel arg)
python::PythonObject Transform(const Status &arg)
python::PythonObject Transform(const SymbolContext &arg)
llvm::Expected< std::map< llvm::StringLiteral, AbstractMethodCheckerPayload > > CheckAbstractMethodImplementation(const python::PythonObject &obj_class) const
void ReverseTransform(T &original_arg, python::PythonObject transformed_arg, Status &error)
void FormatArgs(std::string &fmt, T arg, Args... args) const
python::PythonObject Transform(lldb::BreakpointSP arg)
void FormatArgs(std::string &fmt, T arg) const
python::PythonObject Transform(lldb::DebuggerSP arg)
static std::string ExtractPythonError(llvm::Error error)
Extract detailed error message including Python backtrace if available.
ScriptedPythonInterface(ScriptInterpreterPythonImpl &interpreter)
python::PythonObject Transform(const std::vector< std::string > &arg)
void ReverseTransform(T &original_arg, U transformed_arg, Status &error)
llvm::Expected< T > CallStaticMethod(llvm::StringRef class_name, llvm::StringRef method_name, Args &&...args)
Call a static method on a Python class without creating an instance.
void FormatArgs(std::string &fmt) const
static llvm::Error LogAndError(llvm::StringRef caller_name, const char *format, Ts &&...ts)
Log message against caller_name and return it as an error.
llvm::Expected< T > Dispatch(llvm::StringRef method_name, Args &&...args)
Call method_name on the scripted object.
llvm::Expected< std::optional< T > > DispatchToOptional(llvm::StringRef method_name, Args &&...args)
Call an optional method_name, reporting "the script doesn't implementit" as std::nullopt rather than ...
python::PythonObject Transform(lldb::BreakpointLocationSP arg)
python::PythonObject Transform(std::shared_ptr< T > arg)
bool ReassignPtrsOrRefsArgs(std::tuple< Ts... > &original_args, std::tuple< Us... > &transformed_args)
python::PythonObject Transform(lldb::StreamSP arg)
python::PythonObject Transform(Status &&arg)
python::PythonObject Transform(lldb::DataExtractorSP arg)
python::PythonObject Transform(lldb::StackFrameSP arg)
bool ReassignPtrsOrRefsArgs(std::tuple< Ts... > &original_args, std::tuple< Us... > &transformed_args, std::index_sequence< I... >)
python::PythonObject Transform(lldb::ProcessLaunchInfoSP arg)
llvm::Expected< StructuredData::GenericSP > CreatePluginObject(const ScriptedMetadata &scripted_metadata, StructuredData::Generic *script_obj, Args... args)
python::PythonObject Transform(lldb::TargetSP arg)
void TransformBack(T &original_arg, python::ScopedPythonObject< SB > &transformed_arg, Status &error)
auto TransformTuple(const std::tuple< Args... > &args, std::index_sequence< I... >)
static void ApplyPrefixImpl(Tuple &&t, Fn &&fn, std::index_sequence< I... >)
AbstractMethodCheckerCases
void ReverseTransform(bool &original_arg, python::PythonObject transformed_arg, Status &error)
python::PythonObject Transform(lldb::ValueObjectSP arg)
void ReverseTransform(const T &original_arg, python::PythonObject transformed_arg, Status &error)
python::PythonObject Transform(lldb::ProcessAttachInfoSP arg)
python::PythonObject Transform(bool arg)
Status Clone() const
Don't call this function in new code.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
std::shared_ptr< Generic > GenericSP
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
Defines a symbol context baton that can be handed other debug core functions.
std::string ReadBacktrace() const
void AppendItem(const PythonObject &object)
StructuredData::ObjectSP CreateStructuredObject() const
PythonObject GetAttributeValue(llvm::StringRef attribute) const
bool HasAttribute(llvm::StringRef attribute) const
llvm::StringRef GetString() const
static PythonObject ToSWIGWrapper(std::unique_ptr< lldb::SBValue > value_sb)
A class that automatically clears an SB object when it goes out of scope.
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::ThreadPlan > ThreadPlanSP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::BreakpointLocation > BreakpointLocationSP
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::ProcessAttachInfo > ProcessAttachInfoSP
std::shared_ptr< lldb_private::Stream > StreamSP
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Debugger > DebuggerSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
std::shared_ptr< lldb_private::ProcessLaunchInfo > ProcessLaunchInfoSP
std::shared_ptr< lldb_private::StackFrameList > StackFrameListSP
std::shared_ptr< lldb_private::ExecutionContextRef > ExecutionContextRefSP
InvalidArgumentCountPayload(size_t required, size_t actual)
size_t actual_argument_count
size_t required_argument_count
std::variant< std::monostate, InvalidArgumentCountPayload, std::string > payload
AbstractMethodCheckerCases checker_case