| 1.1 | (patrick 03-Aug-20) | 1 | : %header %{
|
| | 2 | :
|
| | 3 | : template
|
| | 4 | : PyObject *
|
| | 5 | : SBTypeToSWIGWrapper (T* item);
|
| | 6 | :
|
| | 7 | : class PyErr_Cleaner
|
| | 8 | : {
|
| | 9 | : public:
|
| | 10 | : PyErr_Cleaner(bool print=false) :
|
| | 11 | : m_print(print)
|
| | 12 | : {
|
| | 13 | : }
|
| | 14 | :
|
| | 15 | : ~PyErr_Cleaner()
|
| | 16 | : {
|
| | 17 | : if (PyErr_Occurred())
|
| | 18 | : {
|
| | 19 | : if(m_print && !PyErr_ExceptionMatches(PyExc_SystemExit))
|
| | 20 | : PyErr_Print();
|
| | 21 | : PyErr_Clear();
|
| | 22 | : }
|
| | 23 | : }
|
| | 24 | :
|
| | 25 | : private:
|
| | 26 | : bool m_print;
|
| | 27 | : };
|
| | 28 | :
|
| | 29 | : %}
|
| | 30 | :
|
| | 31 | : %wrapper %{
|
| | 32 | :
|
| | 33 | : // resolve a dotted Python name in the form
|
| | 34 | : // foo.bar.baz.Foobar to an actual Python object
|
| | 35 | : // if pmodule is NULL, the __main__ module will be used
|
| | 36 | : // as the starting point for the search
|
| | 37 | :
|
| | 38 | :
|
| | 39 | : // This function is called by lldb_private::ScriptInterpreterPython::BreakpointCallbackFunction(...)
|
| | 40 | : // and is used when a script command is attached to a breakpoint for execution.
|
| | 41 | :
|
| 1.1.1.3 | (patrick 17-Dec-21) | 42 | : #pragma clang diagnostic push
|
| | 43 | : #pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
|
| | 44 | :
|
| | 45 | : // Disable warning C4190: 'LLDBSwigPythonBreakpointCallbackFunction' has
|
| | 46 | : // C-linkage specified, but returns UDT 'llvm::Expected' which is
|
| | 47 | : // incompatible with C
|
| | 48 | : #if _MSC_VER
|
| | 49 | : #pragma warning (push)
|
| | 50 | : #pragma warning (disable : 4190)
|
| | 51 | : #endif
|
| | 52 | :
|
| 1.1 | (patrick 03-Aug-20) | 53 | : SWIGEXPORT llvm::Expected
|
| | 54 | : LLDBSwigPythonBreakpointCallbackFunction
|
| | 55 | : (
|
| | 56 | : const char *python_function_name,
|
| | 57 | : const char *session_dictionary_name,
|
| | 58 | : const lldb::StackFrameSP& frame_sp,
|
| | 59 | : const lldb::BreakpointLocationSP& bp_loc_sp,
|
| | 60 | : lldb_private::StructuredDataImpl *args_impl
|
| | 61 | : )
|
| | 62 | : {
|
| | 63 | : using namespace llvm;
|
| | 64 | :
|
| | 65 | : lldb::SBFrame sb_frame (frame_sp);
|
| | 66 | : lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);
|
| | 67 | :
|
| | 68 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 69 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 70 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name, dict);
|
| | 71 | :
|
| | 72 | : unsigned max_positional_args;
|
| | 73 | : if (auto arg_info = pfunc.GetArgInfo())
|
| | 74 | : max_positional_args = arg_info.get().max_positional_args;
|
| | 75 | : else
|
| | 76 | : return arg_info.takeError();
|
| | 77 | :
|
| | 78 | : PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame));
|
| | 79 | : PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc));
|
| | 80 | :
|
| | 81 | : auto result = [&] () -> Expected {
|
| | 82 | : // If the called function doesn't take extra_args, drop them here:
|
| | 83 | : if (max_positional_args < 4) {
|
| | 84 | : return pfunc.Call(frame_arg, bp_loc_arg, dict);
|
| | 85 | : } else {
|
| | 86 | : lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl);
|
| | 87 | : PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value));
|
| | 88 | : return pfunc.Call(frame_arg, bp_loc_arg, args_arg, dict);
|
| | 89 | : }
|
| | 90 | : } ();
|
| | 91 | :
|
| | 92 | : if (!result)
|
| | 93 | : return result.takeError();
|
| | 94 | :
|
| | 95 | : // Only False counts as false!
|
| | 96 | : return result.get().get() != Py_False;
|
| | 97 | : }
|
| | 98 | :
|
| 1.1.1.3 | (patrick 17-Dec-21) | 99 | : #if _MSC_VER
|
| | 100 | : #pragma warning (pop)
|
| | 101 | : #endif
|
| | 102 | :
|
| | 103 | : #pragma clang diagnostic pop
|
| | 104 | :
|
| 1.1 | (patrick 03-Aug-20) | 105 | : // This function is called by lldb_private::ScriptInterpreterPython::WatchpointCallbackFunction(...)
|
| | 106 | : // and is used when a script command is attached to a watchpoint for execution.
|
| | 107 | :
|
| | 108 | : SWIGEXPORT bool
|
| | 109 | : LLDBSwigPythonWatchpointCallbackFunction
|
| | 110 | : (
|
| | 111 | : const char *python_function_name,
|
| | 112 | : const char *session_dictionary_name,
|
| | 113 | : const lldb::StackFrameSP& frame_sp,
|
| | 114 | : const lldb::WatchpointSP& wp_sp
|
| | 115 | : )
|
| | 116 | : {
|
| | 117 | : lldb::SBFrame sb_frame (frame_sp);
|
| | 118 | : lldb::SBWatchpoint sb_wp(wp_sp);
|
| | 119 | :
|
| | 120 | : bool stop_at_watchpoint = true;
|
| | 121 | :
|
| | 122 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 123 | :
|
| | 124 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 125 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name, dict);
|
| | 126 | :
|
| | 127 | : if (!pfunc.IsAllocated())
|
| | 128 | : return stop_at_watchpoint;
|
| | 129 | :
|
| | 130 | : PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame));
|
| | 131 | : PythonObject wp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_wp));
|
| | 132 | : PythonObject result = pfunc(frame_arg, wp_arg, dict);
|
| | 133 | :
|
| | 134 | : if (result.get() == Py_False)
|
| | 135 | : stop_at_watchpoint = false;
|
| | 136 | :
|
| | 137 | : return stop_at_watchpoint;
|
| | 138 | : }
|
| | 139 | :
|
| | 140 | : SWIGEXPORT bool
|
| | 141 | : LLDBSwigPythonCallTypeScript
|
| | 142 | : (
|
| | 143 | : const char *python_function_name,
|
| | 144 | : const void *session_dictionary,
|
| | 145 | : const lldb::ValueObjectSP& valobj_sp,
|
| | 146 | : void** pyfunct_wrapper,
|
| | 147 | : const lldb::TypeSummaryOptionsSP& options_sp,
|
| | 148 | : std::string& retval
|
| | 149 | : )
|
| | 150 | : {
|
| | 151 | : lldb::SBValue sb_value (valobj_sp);
|
| | 152 | : lldb::SBTypeSummaryOptions sb_options(options_sp.get());
|
| | 153 | :
|
| | 154 | : retval.clear();
|
| | 155 | :
|
| | 156 | : if (!python_function_name || !session_dictionary)
|
| | 157 | : return false;
|
| | 158 | :
|
| | 159 | : PyObject *pfunc_impl = nullptr;
|
| | 160 | :
|
| | 161 | : if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper))
|
| | 162 | : {
|
| | 163 | : pfunc_impl = (PyObject*)(*pyfunct_wrapper);
|
| | 164 | : if (pfunc_impl->ob_refcnt == 1)
|
| | 165 | : {
|
| | 166 | : Py_XDECREF(pfunc_impl);
|
| | 167 | : pfunc_impl = NULL;
|
| | 168 | : }
|
| | 169 | : }
|
| | 170 | :
|
| | 171 | : PyObject *py_dict = (PyObject*)session_dictionary;
|
| | 172 | : if (!PythonDictionary::Check(py_dict))
|
| | 173 | : return true;
|
| | 174 | :
|
| | 175 | : PythonDictionary dict(PyRefType::Borrowed, py_dict);
|
| | 176 | :
|
| | 177 | : PyErr_Cleaner pyerr_cleanup(true); // show Python errors
|
| | 178 | :
|
| | 179 | : PythonCallable pfunc(PyRefType::Borrowed, pfunc_impl);
|
| | 180 | :
|
| | 181 | : if (!pfunc.IsAllocated())
|
| | 182 | : {
|
| | 183 | : pfunc = PythonObject::ResolveNameWithDictionary(python_function_name, dict);
|
| | 184 | : if (!pfunc.IsAllocated())
|
| | 185 | : return false;
|
| | 186 | :
|
| | 187 | : if (pyfunct_wrapper)
|
| | 188 | : {
|
| | 189 | : *pyfunct_wrapper = pfunc.get();
|
| | 190 | : Py_XINCREF(pfunc.get());
|
| | 191 | : }
|
| | 192 | : }
|
| | 193 | :
|
| | 194 | : PythonObject result;
|
| | 195 | : auto argc = pfunc.GetArgInfo();
|
| | 196 | : if (!argc) {
|
| | 197 | : llvm::consumeError(argc.takeError());
|
| | 198 | : return false;
|
| | 199 | : }
|
| | 200 | :
|
| | 201 | : PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value));
|
| | 202 | : PythonObject options_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_options));
|
| | 203 | :
|
| | 204 | : if (argc.get().max_positional_args < 3)
|
| | 205 | : result = pfunc(value_arg,dict);
|
| | 206 | : else
|
| | 207 | : result = pfunc(value_arg,dict,options_arg);
|
| | 208 | :
|
| | 209 | : retval = result.Str().GetString().str();
|
| | 210 | :
|
| | 211 | : return true;
|
| | 212 | : }
|
| | 213 | :
|
| | 214 | : SWIGEXPORT void*
|
| | 215 | : LLDBSwigPythonCreateSyntheticProvider
|
| | 216 | : (
|
| | 217 | : const char *python_class_name,
|
| | 218 | : const char *session_dictionary_name,
|
| | 219 | : const lldb::ValueObjectSP& valobj_sp
|
| | 220 | : )
|
| | 221 | : {
|
| | 222 | : if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
|
| | 223 | : Py_RETURN_NONE;
|
| | 224 | :
|
| | 225 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 226 | :
|
| | 227 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 228 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_class_name,dict);
|
| | 229 | :
|
| | 230 | : if (!pfunc.IsAllocated())
|
| | 231 | : Py_RETURN_NONE;
|
| | 232 | :
|
| | 233 | : // I do not want the SBValue to be deallocated when going out of scope because python
|
| | 234 | : // has ownership of it and will manage memory for this object by itself
|
| | 235 | : lldb::SBValue *sb_value = new lldb::SBValue(valobj_sp);
|
| | 236 | : sb_value->SetPreferSyntheticValue(false);
|
| | 237 | :
|
| | 238 | : PythonObject val_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value));
|
| | 239 | : if (!val_arg.IsAllocated())
|
| | 240 | : Py_RETURN_NONE;
|
| | 241 | :
|
| | 242 | : PythonObject result = pfunc(val_arg, dict);
|
| | 243 | :
|
| | 244 | : if (result.IsAllocated())
|
| | 245 | : return result.release();
|
| | 246 | :
|
| | 247 | : Py_RETURN_NONE;
|
| | 248 | : }
|
| | 249 | :
|
| | 250 | : SWIGEXPORT void*
|
| | 251 | : LLDBSwigPythonCreateCommandObject
|
| | 252 | : (
|
| | 253 | : const char *python_class_name,
|
| | 254 | : const char *session_dictionary_name,
|
| | 255 | : const lldb::DebuggerSP debugger_sp
|
| | 256 | : )
|
| | 257 | : {
|
| | 258 | : if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
|
| | 259 | : Py_RETURN_NONE;
|
| | 260 | :
|
| | 261 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 262 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 263 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_class_name, dict);
|
| | 264 | :
|
| | 265 | : if (!pfunc.IsAllocated())
|
| | 266 | : return nullptr;
|
| | 267 | :
|
| | 268 | : lldb::SBDebugger debugger_sb(debugger_sp);
|
| | 269 | : PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
|
| | 270 | : PythonObject result = pfunc(debugger_arg, dict);
|
| | 271 | :
|
| | 272 | : if (result.IsAllocated())
|
| | 273 | : return result.release();
|
| | 274 | :
|
| | 275 | : Py_RETURN_NONE;
|
| | 276 | : }
|
| | 277 | :
|
| | 278 | : SWIGEXPORT void*
|
| 1.1.1.3 | (patrick 17-Dec-21) | 279 | : LLDBSwigPythonCreateScriptedProcess
|
| | 280 | : (
|
| | 281 | : const char *python_class_name,
|
| | 282 | : const char *session_dictionary_name,
|
| | 283 | : const lldb::TargetSP& target_sp,
|
| | 284 | : lldb_private::StructuredDataImpl *args_impl,
|
| | 285 | : std::string &error_string
|
| | 286 | : )
|
| | 287 | : {
|
| | 288 | : if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
|
| | 289 | : Py_RETURN_NONE;
|
| | 290 | :
|
| | 291 | :
|
| | 292 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 293 | :
|
| | 294 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 295 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_class_name, dict);
|
| | 296 | :
|
| | 297 | : if (!pfunc.IsAllocated()) {
|
| | 298 | : error_string.append("could not find script class: ");
|
| | 299 | : error_string.append(python_class_name);
|
| | 300 | : return nullptr;
|
| | 301 | : }
|
| | 302 | :
|
| | 303 | : // I do not want the SBTarget to be deallocated when going out of scope
|
| | 304 | : // because python has ownership of it and will manage memory for this
|
| | 305 | : // object by itself
|
| | 306 | : PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBTarget(target_sp)));
|
| | 307 | :
|
| | 308 | : if (!target_arg.IsAllocated())
|
| | 309 | : Py_RETURN_NONE;
|
| | 310 | :
|
| | 311 | : llvm::Expected arg_info = pfunc.GetArgInfo();
|
| | 312 | : if (!arg_info) {
|
| | 313 | : llvm::handleAllErrors(
|
| | 314 | : arg_info.takeError(),
|
| | 315 | : [&](PythonException &E) {
|
| | 316 | : error_string.append(E.ReadBacktrace());
|
| | 317 | : },
|
| | 318 | : [&](const llvm::ErrorInfoBase &E) {
|
| | 319 | : error_string.append(E.message());
|
| | 320 | : });
|
| | 321 | : Py_RETURN_NONE;
|
| | 322 | : }
|
| | 323 | :
|
| | 324 | : PythonObject result = {};
|
| | 325 | : if (arg_info.get().max_positional_args == 2) {
|
| | 326 | : if (args_impl != nullptr) {
|
| | 327 | : error_string.assign("args passed, but __init__ does not take an args dictionary");
|
| | 328 | : Py_RETURN_NONE;
|
| | 329 | : }
|
| | 330 | : result = pfunc(target_arg, dict);
|
| | 331 | : } else if (arg_info.get().max_positional_args >= 3) {
|
| | 332 | : PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBStructuredData(args_impl)));
|
| | 333 | : result = pfunc(target_arg, args_arg, dict);
|
| | 334 | : } else {
|
| | 335 | : error_string.assign("wrong number of arguments in __init__, should be 2 or 3 (not including self)");
|
| | 336 | : Py_RETURN_NONE;
|
| | 337 | : }
|
| | 338 | :
|
| | 339 | : if (result.IsAllocated())
|
| | 340 | : return result.release();
|
| | 341 | : Py_RETURN_NONE;
|
| | 342 | : }
|
| | 343 | :
|
| | 344 | : SWIGEXPORT void*
|
| 1.1 | (patrick 03-Aug-20) | 345 | : LLDBSwigPythonCreateScriptedThreadPlan
|
| | 346 | : (
|
| | 347 | : const char *python_class_name,
|
| | 348 | : const char *session_dictionary_name,
|
| | 349 | : lldb_private::StructuredDataImpl *args_impl,
|
| | 350 | : std::string &error_string,
|
| | 351 | : const lldb::ThreadPlanSP& thread_plan_sp
|
| | 352 | : )
|
| | 353 | : {
|
| | 354 | : if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
|
| | 355 | : Py_RETURN_NONE;
|
| | 356 | :
|
| | 357 | :
|
| | 358 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 359 | :
|
| | 360 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 361 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_class_name, dict);
|
| | 362 | :
|
| | 363 | : if (!pfunc.IsAllocated()) {
|
| | 364 | : error_string.append("could not find script class: ");
|
| | 365 | : error_string.append(python_class_name);
|
| | 366 | : return nullptr;
|
| | 367 | : }
|
| | 368 | :
|
| 1.1.1.3 | (patrick 17-Dec-21) | 369 | : // I do not want the SBThreadPlan to be deallocated when going out of scope
|
| | 370 | : // because python has ownership of it and will manage memory for this
|
| | 371 | : // object by itself
|
| | 372 | : PythonObject tp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBThreadPlan(thread_plan_sp)));
|
| 1.1 | (patrick 03-Aug-20) | 373 | :
|
| | 374 | : if (!tp_arg.IsAllocated())
|
| | 375 | : Py_RETURN_NONE;
|
| | 376 | :
|
| | 377 | : llvm::Expected arg_info = pfunc.GetArgInfo();
|
| | 378 | : if (!arg_info) {
|
| | 379 | : llvm::handleAllErrors(
|
| | 380 | : arg_info.takeError(),
|
| | 381 | : [&](PythonException &E) {
|
| | 382 | : error_string.append(E.ReadBacktrace());
|
| | 383 | : },
|
| | 384 | : [&](const llvm::ErrorInfoBase &E) {
|
| | 385 | : error_string.append(E.message());
|
| | 386 | : });
|
| | 387 | : Py_RETURN_NONE;
|
| | 388 | : }
|
| | 389 | :
|
| | 390 | : PythonObject result = {};
|
| | 391 | : if (arg_info.get().max_positional_args == 2) {
|
| | 392 | : if (args_impl != nullptr) {
|
| | 393 | : error_string.assign("args passed, but __init__ does not take an args dictionary");
|
| | 394 | : Py_RETURN_NONE;
|
| | 395 | : }
|
| | 396 | : result = pfunc(tp_arg, dict);
|
| | 397 | : } else if (arg_info.get().max_positional_args >= 3) {
|
| 1.1.1.3 | (patrick 17-Dec-21) | 398 | : PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBStructuredData(args_impl)));
|
| 1.1 | (patrick 03-Aug-20) | 399 | : result = pfunc(tp_arg, args_arg, dict);
|
| | 400 | : } else {
|
| | 401 | : error_string.assign("wrong number of arguments in __init__, should be 2 or 3 (not including self)");
|
| | 402 | : Py_RETURN_NONE;
|
| | 403 | : }
|
| | 404 | :
|
| | 405 | : // FIXME: At this point we should check that the class we found supports all the methods
|
| | 406 | : // that we need.
|
| | 407 | :
|
| | 408 | : if (result.IsAllocated())
|
| | 409 | : return result.release();
|
| | 410 | : Py_RETURN_NONE;
|
| | 411 | : }
|
| | 412 | :
|
| | 413 | : SWIGEXPORT bool
|
| | 414 | : LLDBSWIGPythonCallThreadPlan
|
| | 415 | : (
|
| | 416 | : void *implementor,
|
| | 417 | : const char *method_name,
|
| | 418 | : lldb_private::Event *event,
|
| | 419 | : bool &got_error
|
| | 420 | : )
|
| | 421 | : {
|
| | 422 | : got_error = false;
|
| | 423 | :
|
| | 424 | : PyErr_Cleaner py_err_cleaner(false);
|
| | 425 | : PythonObject self(PyRefType::Borrowed, static_cast(implementor));
|
| | 426 | : auto pfunc = self.ResolveName(method_name);
|
| | 427 | :
|
| | 428 | : if (!pfunc.IsAllocated())
|
| | 429 | : return false;
|
| | 430 | :
|
| | 431 | : PythonObject result;
|
| | 432 | : if (event != nullptr)
|
| | 433 | : {
|
| | 434 | : lldb::SBEvent sb_event(event);
|
| | 435 | : PythonObject event_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_event));
|
| | 436 | : result = pfunc(event_arg);
|
| | 437 | : }
|
| | 438 | : else
|
| | 439 | : result = pfunc();
|
| | 440 | :
|
| | 441 | : if (PyErr_Occurred())
|
| | 442 | : {
|
| | 443 | : got_error = true;
|
| | 444 | : printf ("Return value was neither false nor true for call to %s.\n", method_name);
|
| | 445 | : PyErr_Print();
|
| | 446 | : return false;
|
| | 447 | : }
|
| | 448 | :
|
| | 449 | : if (result.get() == Py_True)
|
| | 450 | : return true;
|
| | 451 | : else if (result.get() == Py_False)
|
| | 452 | : return false;
|
| | 453 | :
|
| | 454 | : // Somebody returned the wrong thing...
|
| | 455 | : got_error = true;
|
| | 456 | : printf ("Wrong return value type for call to %s.\n", method_name);
|
| | 457 | : return false;
|
| | 458 | : }
|
| | 459 | :
|
| | 460 | : SWIGEXPORT void *
|
| | 461 | : LLDBSwigPythonCreateScriptedBreakpointResolver
|
| | 462 | : (
|
| | 463 | : const char *python_class_name,
|
| | 464 | : const char *session_dictionary_name,
|
| | 465 | : lldb_private::StructuredDataImpl *args_impl,
|
| | 466 | : lldb::BreakpointSP &breakpoint_sp
|
| | 467 | : )
|
| | 468 | : {
|
| | 469 | : if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
|
| | 470 | : Py_RETURN_NONE;
|
| | 471 | :
|
| | 472 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 473 | :
|
| | 474 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 475 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_class_name, dict);
|
| | 476 | :
|
| | 477 | : if (!pfunc.IsAllocated())
|
| | 478 | : return nullptr;
|
| | 479 | :
|
| | 480 | : lldb::SBBreakpoint *bkpt_value = new lldb::SBBreakpoint(breakpoint_sp);
|
| | 481 | :
|
| | 482 | : PythonObject bkpt_arg(PyRefType::Owned, SBTypeToSWIGWrapper(bkpt_value));
|
| | 483 | :
|
| | 484 | : lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl);
|
| | 485 | : PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value));
|
| | 486 | :
|
| | 487 | : PythonObject result = pfunc(bkpt_arg, args_arg, dict);
|
| | 488 | : // FIXME: At this point we should check that the class we found supports all the methods
|
| | 489 | : // that we need.
|
| | 490 | :
|
| | 491 | : if (result.IsAllocated())
|
| | 492 | : {
|
| | 493 | : // Check that __callback__ is defined:
|
| | 494 | : auto callback_func = result.ResolveName("__callback__");
|
| | 495 | : if (callback_func.IsAllocated())
|
| | 496 | : return result.release();
|
| | 497 | : else
|
| | 498 | : result.release();
|
| | 499 | : }
|
| | 500 | : Py_RETURN_NONE;
|
| | 501 | : }
|
| | 502 | :
|
| | 503 | : SWIGEXPORT unsigned int
|
| | 504 | : LLDBSwigPythonCallBreakpointResolver
|
| | 505 | : (
|
| | 506 | : void *implementor,
|
| | 507 | : const char *method_name,
|
| | 508 | : lldb_private::SymbolContext *sym_ctx
|
| | 509 | : )
|
| | 510 | : {
|
| | 511 | : PyErr_Cleaner py_err_cleaner(false);
|
| | 512 | : PythonObject self(PyRefType::Borrowed, static_cast(implementor));
|
| | 513 | : auto pfunc = self.ResolveName(method_name);
|
| | 514 | :
|
| | 515 | : if (!pfunc.IsAllocated())
|
| | 516 | : return 0;
|
| | 517 | :
|
| | 518 | : PythonObject result;
|
| | 519 | : if (sym_ctx != nullptr) {
|
| | 520 | : lldb::SBSymbolContext sb_sym_ctx(sym_ctx);
|
| | 521 | : PythonObject sym_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_sym_ctx));
|
| | 522 | : result = pfunc(sym_ctx_arg);
|
| | 523 | : } else
|
| | 524 | : result = pfunc();
|
| | 525 | :
|
| | 526 | : if (PyErr_Occurred())
|
| | 527 | : {
|
| | 528 | : PyErr_Print();
|
| 1.1.1.2 | (patrick 28-Apr-21) | 529 | : PyErr_Clear();
|
| 1.1 | (patrick 03-Aug-20) | 530 | : return 0;
|
| | 531 | : }
|
| | 532 | :
|
| | 533 | : // The callback will return a bool, but we're need to also return ints
|
| | 534 | : // so we're squirrelling the bool through as an int... And if you return
|
| | 535 | : // nothing, we'll continue.
|
| | 536 | : if (strcmp(method_name, "__callback__") == 0) {
|
| | 537 | : if (result.get() == Py_False)
|
| | 538 | : return 0;
|
| | 539 | : else
|
| | 540 | : return 1;
|
| | 541 | : }
|
| | 542 | :
|
| 1.1.1.2 | (patrick 28-Apr-21) | 543 | : long long ret_val = unwrapOrSetPythonException(As(result));
|
| 1.1 | (patrick 03-Aug-20) | 544 | :
|
| 1.1.1.2 | (patrick 28-Apr-21) | 545 | : if (PyErr_Occurred()) {
|
| | 546 | : PyErr_Print();
|
| | 547 | : PyErr_Clear();
|
| | 548 | : return 0;
|
| | 549 | : }
|
| 1.1 | (patrick 03-Aug-20) | 550 | :
|
| | 551 | : return ret_val;
|
| | 552 | : }
|
| | 553 | :
|
| 1.1.1.3 | (patrick 17-Dec-21) | 554 | : SWIGEXPORT void *
|
| | 555 | : LLDBSwigPythonCreateScriptedStopHook
|
| | 556 | : (
|
| | 557 | : lldb::TargetSP target_sp,
|
| | 558 | : const char *python_class_name,
|
| | 559 | : const char *session_dictionary_name,
|
| | 560 | : lldb_private::StructuredDataImpl *args_impl,
|
| | 561 | : Status &error
|
| | 562 | : )
|
| | 563 | : {
|
| | 564 | : if (python_class_name == NULL || python_class_name[0] == '\0') {
|
| | 565 | : error.SetErrorString("Empty class name.");
|
| | 566 | : Py_RETURN_NONE;
|
| | 567 | : }
|
| | 568 | : if (!session_dictionary_name) {
|
| | 569 | : error.SetErrorString("No session dictionary");
|
| | 570 | : Py_RETURN_NONE;
|
| | 571 | : }
|
| | 572 | :
|
| | 573 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 574 | :
|
| | 575 | : auto dict =
|
| | 576 | : PythonModule::MainModule().ResolveName(
|
| | 577 | : session_dictionary_name);
|
| | 578 | : auto pfunc =
|
| | 579 | : PythonObject::ResolveNameWithDictionary(
|
| | 580 | : python_class_name, dict);
|
| | 581 | :
|
| | 582 | : if (!pfunc.IsAllocated()) {
|
| | 583 | : error.SetErrorStringWithFormat("Could not find class: %s.",
|
| | 584 | : python_class_name);
|
| | 585 | : return nullptr;
|
| | 586 | : }
|
| | 587 | :
|
| | 588 | : lldb::SBTarget *target_val
|
| | 589 | : = new lldb::SBTarget(target_sp);
|
| | 590 | :
|
| | 591 | : PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_val));
|
| | 592 | :
|
| | 593 | : lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl);
|
| | 594 | : PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value));
|
| | 595 | :
|
| | 596 | : PythonObject result = pfunc(target_arg, args_arg, dict);
|
| | 597 | :
|
| | 598 | : if (result.IsAllocated())
|
| | 599 | : {
|
| | 600 | : // Check that the handle_stop callback is defined:
|
| | 601 | : auto callback_func = result.ResolveName("handle_stop");
|
| | 602 | : if (callback_func.IsAllocated()) {
|
| | 603 | : if (auto args_info = callback_func.GetArgInfo()) {
|
| | 604 | : size_t num_args = (*args_info).max_positional_args;
|
| | 605 | : if (num_args != 2) {
|
| | 606 | : error.SetErrorStringWithFormat("Wrong number of args for "
|
| | 607 | : "handle_stop callback, should be 2 (excluding self), got: %zu",
|
| | 608 | : num_args);
|
| | 609 | : Py_RETURN_NONE;
|
| | 610 | : } else
|
| | 611 | : return result.release();
|
| | 612 | : } else {
|
| | 613 | : error.SetErrorString("Couldn't get num arguments for handle_stop "
|
| | 614 | : "callback.");
|
| | 615 | : Py_RETURN_NONE;
|
| | 616 | : }
|
| | 617 | : return result.release();
|
| | 618 | : }
|
| | 619 | : else {
|
| | 620 | : error.SetErrorStringWithFormat("Class \"%s\" is missing the required "
|
| | 621 | : "handle_stop callback.",
|
| | 622 | : python_class_name);
|
| | 623 | : result.release();
|
| | 624 | : }
|
| | 625 | : }
|
| | 626 | : Py_RETURN_NONE;
|
| | 627 | : }
|
| | 628 | :
|
| | 629 | : SWIGEXPORT bool
|
| | 630 | : LLDBSwigPythonStopHookCallHandleStop
|
| | 631 | : (
|
| | 632 | : void *implementor,
|
| | 633 | : lldb::ExecutionContextRefSP exc_ctx_sp,
|
| | 634 | : lldb::StreamSP stream
|
| | 635 | : )
|
| | 636 | : {
|
| | 637 | : // handle_stop will return a bool with the meaning "should_stop"...
|
| | 638 | : // If you return nothing we'll assume we are going to stop.
|
| | 639 | : // Also any errors should return true, since we should stop on error.
|
| | 640 | :
|
| | 641 | : PyErr_Cleaner py_err_cleaner(false);
|
| | 642 | : PythonObject self(PyRefType::Borrowed, static_cast(implementor));
|
| | 643 | : auto pfunc = self.ResolveName("handle_stop");
|
| | 644 | :
|
| | 645 | : if (!pfunc.IsAllocated())
|
| | 646 | : return true;
|
| | 647 | :
|
| | 648 | : PythonObject result;
|
| | 649 | : lldb::SBExecutionContext sb_exc_ctx(exc_ctx_sp);
|
| | 650 | : PythonObject exc_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_exc_ctx));
|
| | 651 | : lldb::SBStream sb_stream;
|
| | 652 | : PythonObject sb_stream_arg(PyRefType::Owned,
|
| | 653 | : SBTypeToSWIGWrapper(sb_stream));
|
| | 654 | : result = pfunc(exc_ctx_arg, sb_stream_arg);
|
| | 655 | :
|
| | 656 | : if (PyErr_Occurred())
|
| | 657 | : {
|
| | 658 | : stream->PutCString("Python error occurred handling stop-hook.");
|
| | 659 | : PyErr_Print();
|
| | 660 | : PyErr_Clear();
|
| | 661 | : return true;
|
| | 662 | : }
|
| | 663 | :
|
| | 664 | : // Now add the result to the output stream. SBStream only
|
| | 665 | : // makes an internally help StreamString which I can't interpose, so I
|
| | 666 | : // have to copy it over here.
|
| | 667 | : stream->PutCString(sb_stream.GetData());
|
| | 668 | :
|
| | 669 | : if (result.get() == Py_False)
|
| | 670 | : return false;
|
| | 671 | : else
|
| | 672 | : return true;
|
| | 673 | : }
|
| | 674 | :
|
| 1.1 | (patrick 03-Aug-20) | 675 | : // wrapper that calls an optional instance member of an object taking no arguments
|
| | 676 | : static PyObject*
|
| | 677 | : LLDBSwigPython_CallOptionalMember
|
| | 678 | : (
|
| | 679 | : PyObject* implementor,
|
| | 680 | : char* callee_name,
|
| | 681 | : PyObject* ret_if_not_found = Py_None,
|
| | 682 | : bool* was_found = NULL
|
| | 683 | : )
|
| | 684 | : {
|
| | 685 | : PyErr_Cleaner py_err_cleaner(false);
|
| | 686 | :
|
| | 687 | : PythonObject self(PyRefType::Borrowed, static_cast(implementor));
|
| | 688 | : auto pfunc = self.ResolveName(callee_name);
|
| | 689 | :
|
| | 690 | : if (!pfunc.IsAllocated())
|
| | 691 | : {
|
| | 692 | : if (was_found)
|
| | 693 | : *was_found = false;
|
| | 694 | : Py_XINCREF(ret_if_not_found);
|
| | 695 | : return ret_if_not_found;
|
| | 696 | : }
|
| | 697 | :
|
| | 698 | : if (was_found)
|
| | 699 | : *was_found = true;
|
| | 700 | :
|
| | 701 | : PythonObject result = pfunc();
|
| | 702 | : return result.release();
|
| | 703 | : }
|
| | 704 | :
|
| | 705 | : SWIGEXPORT size_t
|
| | 706 | : LLDBSwigPython_CalculateNumChildren
|
| | 707 | : (
|
| | 708 | : PyObject *implementor,
|
| | 709 | : uint32_t max
|
| | 710 | : )
|
| | 711 | : {
|
| | 712 | : PythonObject self(PyRefType::Borrowed, implementor);
|
| | 713 | : auto pfunc = self.ResolveName("num_children");
|
| | 714 | :
|
| | 715 | : if (!pfunc.IsAllocated())
|
| | 716 | : return 0;
|
| | 717 | :
|
| | 718 | : auto arg_info = pfunc.GetArgInfo();
|
| | 719 | : if (!arg_info) {
|
| | 720 | : llvm::consumeError(arg_info.takeError());
|
| | 721 | : return 0;
|
| | 722 | : }
|
| | 723 | :
|
| 1.1.1.2 | (patrick 28-Apr-21) | 724 | : size_t ret_val;
|
| 1.1 | (patrick 03-Aug-20) | 725 | : if (arg_info.get().max_positional_args < 1)
|
| 1.1.1.2 | (patrick 28-Apr-21) | 726 | : ret_val = unwrapOrSetPythonException(As(pfunc.Call()));
|
| 1.1 | (patrick 03-Aug-20) | 727 | : else
|
| 1.1.1.2 | (patrick 28-Apr-21) | 728 | : ret_val = unwrapOrSetPythonException(As(pfunc.Call(PythonInteger(max))));
|
| 1.1 | (patrick 03-Aug-20) | 729 | :
|
| 1.1.1.2 | (patrick 28-Apr-21) | 730 | : if (PyErr_Occurred())
|
| 1.1 | (patrick 03-Aug-20) | 731 | : {
|
| | 732 | : PyErr_Print();
|
| | 733 | : PyErr_Clear();
|
| 1.1.1.2 | (patrick 28-Apr-21) | 734 | : return 0;
|
| 1.1 | (patrick 03-Aug-20) | 735 | : }
|
| | 736 | :
|
| | 737 | : if (arg_info.get().max_positional_args < 1)
|
| | 738 | : ret_val = std::min(ret_val, static_cast(max));
|
| | 739 | :
|
| | 740 | : return ret_val;
|
| | 741 | : }
|
| | 742 | :
|
| | 743 | : SWIGEXPORT PyObject*
|
| | 744 | : LLDBSwigPython_GetChildAtIndex
|
| | 745 | : (
|
| | 746 | : PyObject *implementor,
|
| | 747 | : uint32_t idx
|
| | 748 | : )
|
| | 749 | : {
|
| | 750 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 751 | :
|
| | 752 | : PythonObject self(PyRefType::Borrowed, implementor);
|
| | 753 | : auto pfunc = self.ResolveName("get_child_at_index");
|
| | 754 | :
|
| | 755 | : if (!pfunc.IsAllocated())
|
| | 756 | : return nullptr;
|
| | 757 | :
|
| | 758 | : PythonObject result = pfunc(PythonInteger(idx));
|
| | 759 | :
|
| | 760 | : if (!result.IsAllocated())
|
| | 761 | : return nullptr;
|
| | 762 | :
|
| | 763 | : lldb::SBValue* sbvalue_ptr = nullptr;
|
| | 764 | : if (SWIG_ConvertPtr(result.get(), (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1)
|
| | 765 | : return nullptr;
|
| | 766 | :
|
| | 767 | : if (sbvalue_ptr == nullptr)
|
| | 768 | : return nullptr;
|
| | 769 | :
|
| | 770 | : return result.release();
|
| | 771 | : }
|
| | 772 | :
|
| | 773 | : SWIGEXPORT int
|
| | 774 | : LLDBSwigPython_GetIndexOfChildWithName
|
| | 775 | : (
|
| | 776 | : PyObject *implementor,
|
| | 777 | : const char* child_name
|
| | 778 | : )
|
| | 779 | : {
|
| | 780 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 781 | :
|
| | 782 | : PythonObject self(PyRefType::Borrowed, implementor);
|
| | 783 | : auto pfunc = self.ResolveName("get_child_index");
|
| | 784 | :
|
| | 785 | : if (!pfunc.IsAllocated())
|
| | 786 | : return UINT32_MAX;
|
| | 787 | :
|
| 1.1.1.2 | (patrick 28-Apr-21) | 788 | : llvm::Expected result = pfunc.Call(PythonString(child_name));
|
| 1.1 | (patrick 03-Aug-20) | 789 | :
|
| 1.1.1.2 | (patrick 28-Apr-21) | 790 | : long long retval = unwrapOrSetPythonException(As(std::move(result)));
|
| 1.1 | (patrick 03-Aug-20) | 791 | :
|
| 1.1.1.2 | (patrick 28-Apr-21) | 792 | : if (PyErr_Occurred()) {
|
| | 793 | : PyErr_Clear(); // FIXME print this? do something else
|
| 1.1 | (patrick 03-Aug-20) | 794 | : return UINT32_MAX;
|
| 1.1.1.2 | (patrick 28-Apr-21) | 795 | : }
|
| 1.1 | (patrick 03-Aug-20) | 796 | :
|
| | 797 | : if (retval >= 0)
|
| | 798 | : return (uint32_t)retval;
|
| | 799 | :
|
| | 800 | : return UINT32_MAX;
|
| | 801 | : }
|
| | 802 | :
|
| | 803 | : SWIGEXPORT bool
|
| | 804 | : LLDBSwigPython_UpdateSynthProviderInstance
|
| | 805 | : (
|
| | 806 | : PyObject *implementor
|
| | 807 | : )
|
| | 808 | : {
|
| | 809 | : bool ret_val = false;
|
| | 810 | :
|
| | 811 | : static char callee_name[] = "update";
|
| | 812 | :
|
| | 813 | : PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name);
|
| | 814 | :
|
| | 815 | : if (py_return == Py_True)
|
| | 816 | : ret_val = true;
|
| | 817 | :
|
| | 818 | : Py_XDECREF(py_return);
|
| | 819 | :
|
| | 820 | : return ret_val;
|
| | 821 | : }
|
| | 822 | :
|
| | 823 | : SWIGEXPORT bool
|
| | 824 | : LLDBSwigPython_MightHaveChildrenSynthProviderInstance
|
| | 825 | : (
|
| | 826 | : PyObject *implementor
|
| | 827 | : )
|
| | 828 | : {
|
| | 829 | : bool ret_val = false;
|
| | 830 | :
|
| | 831 | : static char callee_name[] = "has_children";
|
| | 832 | :
|
| | 833 | : PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True);
|
| | 834 | :
|
| | 835 | : if (py_return == Py_True)
|
| | 836 | : ret_val = true;
|
| | 837 | :
|
| | 838 | : Py_XDECREF(py_return);
|
| | 839 | :
|
| | 840 | : return ret_val;
|
| | 841 | : }
|
| | 842 | :
|
| | 843 | : SWIGEXPORT PyObject*
|
| | 844 | : LLDBSwigPython_GetValueSynthProviderInstance
|
| | 845 | : (
|
| | 846 | : PyObject *implementor
|
| | 847 | : )
|
| | 848 | : {
|
| | 849 | : PyObject* ret_val = nullptr;
|
| | 850 | :
|
| | 851 | : static char callee_name[] = "get_value";
|
| | 852 | :
|
| | 853 | : PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_None);
|
| | 854 | :
|
| | 855 | : if (py_return == Py_None || py_return == nullptr)
|
| | 856 | : ret_val = nullptr;
|
| | 857 | :
|
| | 858 | : lldb::SBValue* sbvalue_ptr = NULL;
|
| | 859 | :
|
| | 860 | : if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1)
|
| | 861 | : ret_val = nullptr;
|
| | 862 | : else if (sbvalue_ptr == NULL)
|
| | 863 | : ret_val = nullptr;
|
| | 864 | : else
|
| | 865 | : ret_val = py_return;
|
| | 866 | :
|
| | 867 | : Py_XDECREF(py_return);
|
| | 868 | : return ret_val;
|
| | 869 | : }
|
| 1.1.1.3 | (patrick 17-Dec-21) | 870 | :
|
| | 871 | : SWIGEXPORT void*
|
| | 872 | : LLDBSWIGPython_CastPyObjectToSBData
|
| | 873 | : (
|
| | 874 | : PyObject* data
|
| | 875 | : )
|
| | 876 | : {
|
| | 877 | : lldb::SBData* sb_ptr = nullptr;
|
| | 878 | :
|
| | 879 | : int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBData, 0);
|
| | 880 | :
|
| | 881 | : if (valid_cast == -1)
|
| | 882 | : return NULL;
|
| | 883 | :
|
| | 884 | : return sb_ptr;
|
| | 885 | : }
|
| | 886 | :
|
| | 887 | :
|
| | 888 | : SWIGEXPORT void*
|
| | 889 | : LLDBSWIGPython_CastPyObjectToSBError
|
| | 890 | : (
|
| | 891 | : PyObject* data
|
| | 892 | : )
|
| | 893 | : {
|
| | 894 | : lldb::SBError* sb_ptr = nullptr;
|
| | 895 | :
|
| | 896 | : int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBError, 0);
|
| | 897 | :
|
| | 898 | : if (valid_cast == -1)
|
| | 899 | : return NULL;
|
| | 900 | :
|
| | 901 | : return sb_ptr;
|
| | 902 | : }
|
| | 903 | :
|
| 1.1 | (patrick 03-Aug-20) | 904 | :
|
| | 905 | : SWIGEXPORT void*
|
| | 906 | : LLDBSWIGPython_CastPyObjectToSBValue
|
| | 907 | : (
|
| | 908 | : PyObject* data
|
| | 909 | : )
|
| | 910 | : {
|
| | 911 | : lldb::SBValue* sb_ptr = NULL;
|
| | 912 | :
|
| | 913 | : int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0);
|
| | 914 | :
|
| | 915 | : if (valid_cast == -1)
|
| | 916 | : return NULL;
|
| | 917 | :
|
| | 918 | : return sb_ptr;
|
| | 919 | : }
|
| | 920 | :
|
| | 921 | : SWIGEXPORT bool
|
| | 922 | : LLDBSwigPythonCallCommand
|
| | 923 | : (
|
| | 924 | : const char *python_function_name,
|
| | 925 | : const char *session_dictionary_name,
|
| | 926 | : lldb::DebuggerSP& debugger,
|
| | 927 | : const char* args,
|
| | 928 | : lldb_private::CommandReturnObject& cmd_retobj,
|
| | 929 | : lldb::ExecutionContextRefSP exe_ctx_ref_sp
|
| | 930 | : )
|
| | 931 | : {
|
| | 932 | : lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj);
|
| | 933 | : lldb::SBDebugger debugger_sb(debugger);
|
| | 934 | : lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp);
|
| | 935 | :
|
| | 936 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 937 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 938 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name, dict);
|
| | 939 | :
|
| | 940 | : if (!pfunc.IsAllocated())
|
| | 941 | : return false;
|
| | 942 | :
|
| | 943 | : // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you
|
| | 944 | : // see comment above for SBCommandReturnObjectReleaser for further details
|
| | 945 | : auto argc = pfunc.GetArgInfo();
|
| | 946 | : if (!argc) {
|
| | 947 | : llvm::consumeError(argc.takeError());
|
| | 948 | : return false;
|
| | 949 | : }
|
| | 950 | : PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
|
| | 951 | : PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb));
|
| | 952 | : PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb));
|
| | 953 | :
|
| | 954 | : if (argc.get().max_positional_args < 5u)
|
| | 955 | : pfunc(debugger_arg, PythonString(args), cmd_retobj_arg, dict);
|
| | 956 | : else
|
| | 957 | : pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg, dict);
|
| | 958 | :
|
| | 959 | : return true;
|
| | 960 | : }
|
| | 961 | :
|
| | 962 | : SWIGEXPORT bool
|
| | 963 | : LLDBSwigPythonCallCommandObject
|
| | 964 | : (
|
| | 965 | : PyObject *implementor,
|
| | 966 | : lldb::DebuggerSP& debugger,
|
| | 967 | : const char* args,
|
| | 968 | : lldb_private::CommandReturnObject& cmd_retobj,
|
| | 969 | : lldb::ExecutionContextRefSP exe_ctx_ref_sp
|
| | 970 | : )
|
| | 971 | : {
|
| | 972 | : lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj);
|
| | 973 | : lldb::SBDebugger debugger_sb(debugger);
|
| | 974 | : lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp);
|
| | 975 | :
|
| | 976 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 977 | :
|
| | 978 | : PythonObject self(PyRefType::Borrowed, implementor);
|
| | 979 | : auto pfunc = self.ResolveName("__call__");
|
| | 980 | :
|
| | 981 | : if (!pfunc.IsAllocated())
|
| | 982 | : return false;
|
| | 983 | :
|
| | 984 | : // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you
|
| | 985 | : // see comment above for SBCommandReturnObjectReleaser for further details
|
| | 986 | : PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
|
| | 987 | : PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb));
|
| | 988 | : PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb));
|
| | 989 | :
|
| | 990 | : pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg);
|
| | 991 | :
|
| | 992 | : return true;
|
| | 993 | : }
|
| | 994 | :
|
| | 995 | : SWIGEXPORT void*
|
| | 996 | : LLDBSWIGPythonCreateOSPlugin
|
| | 997 | : (
|
| | 998 | : const char *python_class_name,
|
| | 999 | : const char *session_dictionary_name,
|
| | 1000 | : const lldb::ProcessSP& process_sp
|
| | 1001 | : )
|
| | 1002 | : {
|
| | 1003 | : if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
|
| | 1004 | : Py_RETURN_NONE;
|
| | 1005 | :
|
| | 1006 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1007 | :
|
| | 1008 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 1009 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_class_name, dict);
|
| | 1010 | :
|
| | 1011 | : if (!pfunc.IsAllocated())
|
| | 1012 | : Py_RETURN_NONE;
|
| | 1013 | :
|
| | 1014 | : // I do not want the SBProcess to be deallocated when going out of scope because python
|
| | 1015 | : // has ownership of it and will manage memory for this object by itself
|
| | 1016 | : lldb::SBProcess *process_sb = new lldb::SBProcess(process_sp);
|
| | 1017 | : PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb));
|
| | 1018 | : if (!process_arg.IsAllocated())
|
| | 1019 | : Py_RETURN_NONE;
|
| | 1020 | :
|
| | 1021 | : auto result = pfunc(process_arg);
|
| | 1022 | :
|
| | 1023 | : if (result.IsAllocated())
|
| | 1024 | : return result.release();
|
| | 1025 | :
|
| | 1026 | : Py_RETURN_NONE;
|
| | 1027 | : }
|
| | 1028 | :
|
| | 1029 | : SWIGEXPORT void*
|
| | 1030 | : LLDBSWIGPython_CreateFrameRecognizer
|
| | 1031 | : (
|
| | 1032 | : const char *python_class_name,
|
| | 1033 | : const char *session_dictionary_name
|
| | 1034 | : )
|
| | 1035 | : {
|
| | 1036 | : if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
|
| | 1037 | : Py_RETURN_NONE;
|
| | 1038 | :
|
| | 1039 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1040 | :
|
| | 1041 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 1042 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_class_name, dict);
|
| | 1043 | :
|
| | 1044 | : if (!pfunc.IsAllocated())
|
| | 1045 | : Py_RETURN_NONE;
|
| | 1046 | :
|
| | 1047 | : auto result = pfunc();
|
| | 1048 | :
|
| | 1049 | : if (result.IsAllocated())
|
| | 1050 | : return result.release();
|
| | 1051 | :
|
| | 1052 | : Py_RETURN_NONE;
|
| | 1053 | : }
|
| | 1054 | :
|
| | 1055 | : SWIGEXPORT PyObject*
|
| | 1056 | : LLDBSwigPython_GetRecognizedArguments
|
| | 1057 | : (
|
| | 1058 | : PyObject *implementor,
|
| | 1059 | : const lldb::StackFrameSP& frame_sp
|
| | 1060 | : )
|
| | 1061 | : {
|
| | 1062 | : static char callee_name[] = "get_recognized_arguments";
|
| | 1063 | :
|
| | 1064 | : lldb::SBFrame frame_sb(frame_sp);
|
| | 1065 | : PyObject *arg = SBTypeToSWIGWrapper(frame_sb);
|
| | 1066 | :
|
| | 1067 | : PythonString str(callee_name);
|
| | 1068 | : PyObject* result = PyObject_CallMethodObjArgs(implementor, str.get(), arg,
|
| | 1069 | : NULL);
|
| | 1070 | : return result;
|
| | 1071 | : }
|
| | 1072 | :
|
| | 1073 | : SWIGEXPORT void*
|
| | 1074 | : LLDBSWIGPython_GetDynamicSetting (void* module, const char* setting, const lldb::TargetSP& target_sp)
|
| | 1075 | : {
|
| | 1076 | : if (!module || !setting)
|
| | 1077 | : Py_RETURN_NONE;
|
| | 1078 | :
|
| | 1079 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1080 | : PythonObject py_module(PyRefType::Borrowed, (PyObject *)module);
|
| | 1081 | : auto pfunc = py_module.ResolveName("get_dynamic_setting");
|
| | 1082 | :
|
| | 1083 | : if (!pfunc.IsAllocated())
|
| | 1084 | : Py_RETURN_NONE;
|
| | 1085 | :
|
| | 1086 | : lldb::SBTarget target_sb(target_sp);
|
| | 1087 | : PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb));
|
| | 1088 | : auto result = pfunc(target_arg, PythonString(setting));
|
| | 1089 | :
|
| | 1090 | : return result.release();
|
| | 1091 | : }
|
| | 1092 | :
|
| | 1093 | : SWIGEXPORT bool
|
| | 1094 | : LLDBSWIGPythonRunScriptKeywordProcess
|
| | 1095 | : (const char* python_function_name,
|
| | 1096 | : const char* session_dictionary_name,
|
| | 1097 | : lldb::ProcessSP& process,
|
| | 1098 | : std::string& output)
|
| | 1099 | :
|
| | 1100 | : {
|
| | 1101 | : if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
|
| | 1102 | : return false;
|
| | 1103 | :
|
| | 1104 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1105 | :
|
| | 1106 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 1107 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name, dict);
|
| | 1108 | :
|
| | 1109 | : if (!pfunc.IsAllocated())
|
| | 1110 | : return false;
|
| | 1111 | :
|
| | 1112 | : lldb::SBProcess process_sb(process);
|
| | 1113 | : PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb));
|
| | 1114 | : auto result = pfunc(process_arg, dict);
|
| | 1115 | :
|
| | 1116 | : output = result.Str().GetString().str();
|
| | 1117 | :
|
| | 1118 | : return true;
|
| | 1119 | : }
|
| | 1120 | :
|
| | 1121 | : SWIGEXPORT bool
|
| | 1122 | : LLDBSWIGPythonRunScriptKeywordThread
|
| | 1123 | : (const char* python_function_name,
|
| | 1124 | : const char* session_dictionary_name,
|
| | 1125 | : lldb::ThreadSP& thread,
|
| | 1126 | : std::string& output)
|
| | 1127 | :
|
| | 1128 | : {
|
| | 1129 | : if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
|
| | 1130 | : return false;
|
| | 1131 | :
|
| | 1132 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1133 | :
|
| | 1134 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 1135 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name, dict);
|
| | 1136 | :
|
| | 1137 | : if (!pfunc.IsAllocated())
|
| | 1138 | : return false;
|
| | 1139 | :
|
| | 1140 | : lldb::SBThread thread_sb(thread);
|
| | 1141 | : PythonObject thread_arg(PyRefType::Owned, SBTypeToSWIGWrapper(thread_sb));
|
| | 1142 | : auto result = pfunc(thread_arg, dict);
|
| | 1143 | :
|
| | 1144 | : output = result.Str().GetString().str();
|
| | 1145 | :
|
| | 1146 | : return true;
|
| | 1147 | : }
|
| | 1148 | :
|
| | 1149 | : SWIGEXPORT bool
|
| | 1150 | : LLDBSWIGPythonRunScriptKeywordTarget
|
| | 1151 | : (const char* python_function_name,
|
| | 1152 | : const char* session_dictionary_name,
|
| | 1153 | : lldb::TargetSP& target,
|
| | 1154 | : std::string& output)
|
| | 1155 | :
|
| | 1156 | : {
|
| | 1157 | : if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
|
| | 1158 | : return false;
|
| | 1159 | :
|
| | 1160 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1161 | :
|
| | 1162 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 1163 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name,dict);
|
| | 1164 | :
|
| | 1165 | : if (!pfunc.IsAllocated())
|
| | 1166 | : return false;
|
| | 1167 | :
|
| | 1168 | : lldb::SBTarget target_sb(target);
|
| | 1169 | : PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb));
|
| | 1170 | : auto result = pfunc(target_arg, dict);
|
| | 1171 | :
|
| | 1172 | : output = result.Str().GetString().str();
|
| | 1173 | :
|
| | 1174 | : return true;
|
| | 1175 | : }
|
| | 1176 | :
|
| | 1177 | : SWIGEXPORT bool
|
| | 1178 | : LLDBSWIGPythonRunScriptKeywordFrame
|
| | 1179 | : (const char* python_function_name,
|
| | 1180 | : const char* session_dictionary_name,
|
| | 1181 | : lldb::StackFrameSP& frame,
|
| | 1182 | : std::string& output)
|
| | 1183 | :
|
| | 1184 | : {
|
| | 1185 | : if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
|
| | 1186 | : return false;
|
| | 1187 | :
|
| | 1188 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1189 | :
|
| | 1190 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 1191 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name,dict);
|
| | 1192 | :
|
| | 1193 | : if (!pfunc.IsAllocated())
|
| | 1194 | : return false;
|
| | 1195 | :
|
| | 1196 | : lldb::SBFrame frame_sb(frame);
|
| | 1197 | : PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(frame_sb));
|
| | 1198 | : auto result = pfunc(frame_arg, dict);
|
| | 1199 | :
|
| | 1200 | : output = result.Str().GetString().str();
|
| | 1201 | :
|
| | 1202 | : return true;
|
| | 1203 | : }
|
| | 1204 | :
|
| | 1205 | : SWIGEXPORT bool
|
| | 1206 | : LLDBSWIGPythonRunScriptKeywordValue
|
| | 1207 | : (const char* python_function_name,
|
| | 1208 | : const char* session_dictionary_name,
|
| | 1209 | : lldb::ValueObjectSP& value,
|
| | 1210 | : std::string& output)
|
| | 1211 | :
|
| | 1212 | : {
|
| | 1213 | : if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
|
| | 1214 | : return false;
|
| | 1215 | :
|
| | 1216 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1217 | :
|
| | 1218 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 1219 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name, dict);
|
| | 1220 | :
|
| | 1221 | : if (!pfunc.IsAllocated())
|
| | 1222 | : return false;
|
| | 1223 | :
|
| | 1224 | : lldb::SBValue value_sb(value);
|
| | 1225 | : PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(value_sb));
|
| | 1226 | : auto result = pfunc(value_arg, dict);
|
| | 1227 | :
|
| | 1228 | : output = result.Str().GetString().str();
|
| | 1229 | :
|
| | 1230 | : return true;
|
| | 1231 | : }
|
| | 1232 | :
|
| | 1233 | : SWIGEXPORT bool
|
| | 1234 | : LLDBSwigPythonCallModuleInit
|
| | 1235 | : (
|
| | 1236 | : const char *python_module_name,
|
| | 1237 | : const char *session_dictionary_name,
|
| | 1238 | : lldb::DebuggerSP& debugger
|
| | 1239 | : )
|
| | 1240 | : {
|
| | 1241 | : std::string python_function_name_string = python_module_name;
|
| | 1242 | : python_function_name_string += ".__lldb_init_module";
|
| | 1243 | : const char* python_function_name = python_function_name_string.c_str();
|
| | 1244 | :
|
| | 1245 | : PyErr_Cleaner py_err_cleaner(true);
|
| | 1246 | :
|
| | 1247 | : auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name);
|
| | 1248 | : auto pfunc = PythonObject::ResolveNameWithDictionary(python_function_name, dict);
|
| | 1249 | :
|
| | 1250 | : // This method is optional and need not exist. So if we don't find it,
|
| | 1251 | : // it's actually a success, not a failure.
|
| | 1252 | : if (!pfunc.IsAllocated())
|
| | 1253 | : return true;
|
| | 1254 | :
|
| | 1255 | : lldb::SBDebugger debugger_sb(debugger);
|
| | 1256 | : PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
|
| | 1257 | : pfunc(debugger_arg, dict);
|
| | 1258 | :
|
| | 1259 | : return true;
|
| | 1260 | : }
|
| | 1261 | : %}
|
| | 1262 | :
|
| | 1263 | :
|
| | 1264 | : %runtime %{
|
| | 1265 | : // Forward declaration to be inserted at the start of LLDBWrapPython.h
|
| | 1266 | : #include "lldb/API/SBDebugger.h"
|
| | 1267 | : #include "lldb/API/SBValue.h"
|
| | 1268 | :
|
| | 1269 | : SWIGEXPORT lldb::ValueObjectSP
|
| | 1270 | : LLDBSWIGPython_GetValueObjectSPFromSBValue (void* data)
|
| | 1271 | : {
|
| | 1272 | : lldb::ValueObjectSP valobj_sp;
|
| | 1273 | : if (data)
|
| | 1274 | : {
|
| | 1275 | : lldb::SBValue* sb_ptr = (lldb::SBValue *)data;
|
| | 1276 | : valobj_sp = sb_ptr->GetSP();
|
| | 1277 | : }
|
| | 1278 | : return valobj_sp;
|
| | 1279 | : }
|
| | 1280 | :
|
| | 1281 | : #ifdef __cplusplus
|
| | 1282 | : extern "C" {
|
| | 1283 | : #endif
|
| | 1284 | :
|
| | 1285 | : void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton);
|
| | 1286 | :
|
| | 1287 | : #ifdef __cplusplus
|
| | 1288 | : }
|
| | 1289 | : #endif
|
| | 1290 | : %}
|
| | 1291 | :
|
| | 1292 | : %wrapper %{
|
| | 1293 | :
|
| | 1294 | :
|
| | 1295 | : // For the LogOutputCallback functions
|
| | 1296 | : void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) {
|
| | 1297 | : if (baton != Py_None) {
|
| | 1298 | : SWIG_PYTHON_THREAD_BEGIN_BLOCK;
|
| | 1299 | : PyObject *result = PyObject_CallFunction(reinterpret_cast(baton), const_cast("s"), str);
|
| | 1300 | : Py_XDECREF(result);
|
| | 1301 | : SWIG_PYTHON_THREAD_END_BLOCK;
|
| | 1302 | : }
|
| | 1303 | : }
|
| | 1304 | : %}
|