1130d950cSDimitry Andric%header %{ 2130d950cSDimitry Andric 3130d950cSDimitry Andricclass PyErr_Cleaner 4130d950cSDimitry Andric{ 5130d950cSDimitry Andricpublic: 6130d950cSDimitry Andric PyErr_Cleaner(bool print=false) : 7130d950cSDimitry Andric m_print(print) 8130d950cSDimitry Andric { 9130d950cSDimitry Andric } 10130d950cSDimitry Andric 11130d950cSDimitry Andric ~PyErr_Cleaner() 12130d950cSDimitry Andric { 13130d950cSDimitry Andric if (PyErr_Occurred()) 14130d950cSDimitry Andric { 15130d950cSDimitry Andric if(m_print && !PyErr_ExceptionMatches(PyExc_SystemExit)) 16130d950cSDimitry Andric PyErr_Print(); 17130d950cSDimitry Andric PyErr_Clear(); 18130d950cSDimitry Andric } 19130d950cSDimitry Andric } 20130d950cSDimitry Andric 21130d950cSDimitry Andricprivate: 22130d950cSDimitry Andric bool m_print; 23130d950cSDimitry Andric}; 24130d950cSDimitry Andric 25*4824e7fdSDimitry Andricllvm::Expected<bool> 26*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonBreakpointCallbackFunction 27130d950cSDimitry Andric( 28130d950cSDimitry Andric const char *python_function_name, 29130d950cSDimitry Andric const char *session_dictionary_name, 30130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp, 31130d950cSDimitry Andric const lldb::BreakpointLocationSP& bp_loc_sp, 32130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl 33130d950cSDimitry Andric) 34130d950cSDimitry Andric{ 35130d950cSDimitry Andric using namespace llvm; 36130d950cSDimitry Andric 37130d950cSDimitry Andric lldb::SBFrame sb_frame (frame_sp); 38130d950cSDimitry Andric lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp); 39130d950cSDimitry Andric 40130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 41130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 42130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 43130d950cSDimitry Andric 44130d950cSDimitry Andric unsigned max_positional_args; 45130d950cSDimitry Andric if (auto arg_info = pfunc.GetArgInfo()) 46130d950cSDimitry Andric max_positional_args = arg_info.get().max_positional_args; 47130d950cSDimitry Andric else 48130d950cSDimitry Andric return arg_info.takeError(); 49130d950cSDimitry Andric 50130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); 51130d950cSDimitry Andric PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc)); 52130d950cSDimitry Andric 53130d950cSDimitry Andric auto result = [&] () -> Expected<PythonObject> { 54130d950cSDimitry Andric // If the called function doesn't take extra_args, drop them here: 55130d950cSDimitry Andric if (max_positional_args < 4) { 56130d950cSDimitry Andric return pfunc.Call(frame_arg, bp_loc_arg, dict); 57130d950cSDimitry Andric } else { 58349cc55cSDimitry Andric // FIXME: SBStructuredData leaked here 59130d950cSDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 60349cc55cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*args_value)); 61130d950cSDimitry Andric return pfunc.Call(frame_arg, bp_loc_arg, args_arg, dict); 62130d950cSDimitry Andric } 63130d950cSDimitry Andric } (); 64130d950cSDimitry Andric 65130d950cSDimitry Andric if (!result) 66130d950cSDimitry Andric return result.takeError(); 67130d950cSDimitry Andric 68130d950cSDimitry Andric // Only False counts as false! 69130d950cSDimitry Andric return result.get().get() != Py_False; 70130d950cSDimitry Andric} 71130d950cSDimitry Andric 72*4824e7fdSDimitry Andric// resolve a dotted Python name in the form 73*4824e7fdSDimitry Andric// foo.bar.baz.Foobar to an actual Python object 74*4824e7fdSDimitry Andric// if pmodule is NULL, the __main__ module will be used 75*4824e7fdSDimitry Andric// as the starting point for the search 76fe6060f1SDimitry Andric 77*4824e7fdSDimitry Andric 78*4824e7fdSDimitry Andric// This function is called by lldb_private::ScriptInterpreterPython::BreakpointCallbackFunction(...) 79*4824e7fdSDimitry Andric// and is used when a script command is attached to a breakpoint for execution. 80fe6060f1SDimitry Andric 81130d950cSDimitry Andric// This function is called by lldb_private::ScriptInterpreterPython::WatchpointCallbackFunction(...) 82130d950cSDimitry Andric// and is used when a script command is attached to a watchpoint for execution. 83130d950cSDimitry Andric 84*4824e7fdSDimitry Andricbool 85*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonWatchpointCallbackFunction 86130d950cSDimitry Andric( 87130d950cSDimitry Andric const char *python_function_name, 88130d950cSDimitry Andric const char *session_dictionary_name, 89130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp, 90130d950cSDimitry Andric const lldb::WatchpointSP& wp_sp 91130d950cSDimitry Andric) 92130d950cSDimitry Andric{ 93130d950cSDimitry Andric lldb::SBFrame sb_frame (frame_sp); 94130d950cSDimitry Andric lldb::SBWatchpoint sb_wp(wp_sp); 95130d950cSDimitry Andric 96130d950cSDimitry Andric bool stop_at_watchpoint = true; 97130d950cSDimitry Andric 98130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 99130d950cSDimitry Andric 100130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 101130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 102130d950cSDimitry Andric 103130d950cSDimitry Andric if (!pfunc.IsAllocated()) 104130d950cSDimitry Andric return stop_at_watchpoint; 105130d950cSDimitry Andric 106130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); 107130d950cSDimitry Andric PythonObject wp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_wp)); 108130d950cSDimitry Andric PythonObject result = pfunc(frame_arg, wp_arg, dict); 109130d950cSDimitry Andric 110130d950cSDimitry Andric if (result.get() == Py_False) 111130d950cSDimitry Andric stop_at_watchpoint = false; 112130d950cSDimitry Andric 113130d950cSDimitry Andric return stop_at_watchpoint; 114130d950cSDimitry Andric} 115130d950cSDimitry Andric 116*4824e7fdSDimitry Andricbool 117*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCallTypeScript 118130d950cSDimitry Andric( 119130d950cSDimitry Andric const char *python_function_name, 120130d950cSDimitry Andric const void *session_dictionary, 121130d950cSDimitry Andric const lldb::ValueObjectSP& valobj_sp, 122130d950cSDimitry Andric void** pyfunct_wrapper, 123130d950cSDimitry Andric const lldb::TypeSummaryOptionsSP& options_sp, 124130d950cSDimitry Andric std::string& retval 125130d950cSDimitry Andric) 126130d950cSDimitry Andric{ 127130d950cSDimitry Andric lldb::SBTypeSummaryOptions sb_options(options_sp.get()); 128130d950cSDimitry Andric 129130d950cSDimitry Andric retval.clear(); 130130d950cSDimitry Andric 131130d950cSDimitry Andric if (!python_function_name || !session_dictionary) 132130d950cSDimitry Andric return false; 133130d950cSDimitry Andric 134130d950cSDimitry Andric PyObject *pfunc_impl = nullptr; 135130d950cSDimitry Andric 136130d950cSDimitry Andric if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper)) 137130d950cSDimitry Andric { 138130d950cSDimitry Andric pfunc_impl = (PyObject*)(*pyfunct_wrapper); 139130d950cSDimitry Andric if (pfunc_impl->ob_refcnt == 1) 140130d950cSDimitry Andric { 141130d950cSDimitry Andric Py_XDECREF(pfunc_impl); 142130d950cSDimitry Andric pfunc_impl = NULL; 143130d950cSDimitry Andric } 144130d950cSDimitry Andric } 145130d950cSDimitry Andric 146130d950cSDimitry Andric PyObject *py_dict = (PyObject*)session_dictionary; 147130d950cSDimitry Andric if (!PythonDictionary::Check(py_dict)) 148130d950cSDimitry Andric return true; 149130d950cSDimitry Andric 150130d950cSDimitry Andric PythonDictionary dict(PyRefType::Borrowed, py_dict); 151130d950cSDimitry Andric 152130d950cSDimitry Andric PyErr_Cleaner pyerr_cleanup(true); // show Python errors 153130d950cSDimitry Andric 154130d950cSDimitry Andric PythonCallable pfunc(PyRefType::Borrowed, pfunc_impl); 155130d950cSDimitry Andric 156130d950cSDimitry Andric if (!pfunc.IsAllocated()) 157130d950cSDimitry Andric { 158130d950cSDimitry Andric pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 159130d950cSDimitry Andric if (!pfunc.IsAllocated()) 160130d950cSDimitry Andric return false; 161130d950cSDimitry Andric 162130d950cSDimitry Andric if (pyfunct_wrapper) 163130d950cSDimitry Andric { 164130d950cSDimitry Andric *pyfunct_wrapper = pfunc.get(); 165130d950cSDimitry Andric Py_XINCREF(pfunc.get()); 166130d950cSDimitry Andric } 167130d950cSDimitry Andric } 168130d950cSDimitry Andric 169130d950cSDimitry Andric PythonObject result; 170130d950cSDimitry Andric auto argc = pfunc.GetArgInfo(); 171130d950cSDimitry Andric if (!argc) { 172130d950cSDimitry Andric llvm::consumeError(argc.takeError()); 173130d950cSDimitry Andric return false; 174130d950cSDimitry Andric } 175130d950cSDimitry Andric 176*4824e7fdSDimitry Andric PythonObject value_arg = ToSWIGWrapper(valobj_sp); 177130d950cSDimitry Andric PythonObject options_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_options)); 178130d950cSDimitry Andric 179130d950cSDimitry Andric if (argc.get().max_positional_args < 3) 180130d950cSDimitry Andric result = pfunc(value_arg,dict); 181130d950cSDimitry Andric else 182130d950cSDimitry Andric result = pfunc(value_arg,dict,options_arg); 183130d950cSDimitry Andric 184130d950cSDimitry Andric retval = result.Str().GetString().str(); 185130d950cSDimitry Andric 186130d950cSDimitry Andric return true; 187130d950cSDimitry Andric} 188130d950cSDimitry Andric 189*4824e7fdSDimitry Andricvoid* 190*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCreateSyntheticProvider 191130d950cSDimitry Andric( 192130d950cSDimitry Andric const char *python_class_name, 193130d950cSDimitry Andric const char *session_dictionary_name, 194130d950cSDimitry Andric const lldb::ValueObjectSP& valobj_sp 195130d950cSDimitry Andric) 196130d950cSDimitry Andric{ 197130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 198130d950cSDimitry Andric Py_RETURN_NONE; 199130d950cSDimitry Andric 200130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 201130d950cSDimitry Andric 202130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 203130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name,dict); 204130d950cSDimitry Andric 205130d950cSDimitry Andric if (!pfunc.IsAllocated()) 206130d950cSDimitry Andric Py_RETURN_NONE; 207130d950cSDimitry Andric 208*4824e7fdSDimitry Andric auto sb_value = std::make_unique<lldb::SBValue>(valobj_sp); 209130d950cSDimitry Andric sb_value->SetPreferSyntheticValue(false); 210130d950cSDimitry Andric 211*4824e7fdSDimitry Andric PythonObject val_arg = ToSWIGWrapper(std::move(sb_value)); 212130d950cSDimitry Andric if (!val_arg.IsAllocated()) 213130d950cSDimitry Andric Py_RETURN_NONE; 214130d950cSDimitry Andric 215130d950cSDimitry Andric PythonObject result = pfunc(val_arg, dict); 216130d950cSDimitry Andric 217130d950cSDimitry Andric if (result.IsAllocated()) 218130d950cSDimitry Andric return result.release(); 219130d950cSDimitry Andric 220130d950cSDimitry Andric Py_RETURN_NONE; 221130d950cSDimitry Andric} 222130d950cSDimitry Andric 223*4824e7fdSDimitry Andricvoid* 224*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCreateCommandObject 225130d950cSDimitry Andric( 226130d950cSDimitry Andric const char *python_class_name, 227130d950cSDimitry Andric const char *session_dictionary_name, 228130d950cSDimitry Andric const lldb::DebuggerSP debugger_sp 229130d950cSDimitry Andric) 230130d950cSDimitry Andric{ 231130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 232130d950cSDimitry Andric Py_RETURN_NONE; 233130d950cSDimitry Andric 234130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 235130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 236130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 237130d950cSDimitry Andric 238130d950cSDimitry Andric if (!pfunc.IsAllocated()) 239130d950cSDimitry Andric return nullptr; 240130d950cSDimitry Andric 241130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger_sp); 242130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 243130d950cSDimitry Andric PythonObject result = pfunc(debugger_arg, dict); 244130d950cSDimitry Andric 245130d950cSDimitry Andric if (result.IsAllocated()) 246130d950cSDimitry Andric return result.release(); 247130d950cSDimitry Andric 248130d950cSDimitry Andric Py_RETURN_NONE; 249130d950cSDimitry Andric} 250130d950cSDimitry Andric 251*4824e7fdSDimitry Andricvoid* 252*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCreateScriptedProcess 253fe6060f1SDimitry Andric( 254fe6060f1SDimitry Andric const char *python_class_name, 255fe6060f1SDimitry Andric const char *session_dictionary_name, 256fe6060f1SDimitry Andric const lldb::TargetSP& target_sp, 257fe6060f1SDimitry Andric lldb_private::StructuredDataImpl *args_impl, 258fe6060f1SDimitry Andric std::string &error_string 259fe6060f1SDimitry Andric) 260fe6060f1SDimitry Andric{ 261fe6060f1SDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 262fe6060f1SDimitry Andric Py_RETURN_NONE; 263fe6060f1SDimitry Andric 264fe6060f1SDimitry Andric PyErr_Cleaner py_err_cleaner(true); 265fe6060f1SDimitry Andric 266fe6060f1SDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 267fe6060f1SDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 268fe6060f1SDimitry Andric 269fe6060f1SDimitry Andric if (!pfunc.IsAllocated()) { 270fe6060f1SDimitry Andric error_string.append("could not find script class: "); 271fe6060f1SDimitry Andric error_string.append(python_class_name); 272fe6060f1SDimitry Andric return nullptr; 273fe6060f1SDimitry Andric } 274fe6060f1SDimitry Andric 275*4824e7fdSDimitry Andric PythonObject target_arg = ToSWIGWrapper(target_sp); 276fe6060f1SDimitry Andric 277fe6060f1SDimitry Andric llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo(); 278fe6060f1SDimitry Andric if (!arg_info) { 279fe6060f1SDimitry Andric llvm::handleAllErrors( 280fe6060f1SDimitry Andric arg_info.takeError(), 281fe6060f1SDimitry Andric [&](PythonException &E) { 282fe6060f1SDimitry Andric error_string.append(E.ReadBacktrace()); 283fe6060f1SDimitry Andric }, 284fe6060f1SDimitry Andric [&](const llvm::ErrorInfoBase &E) { 285fe6060f1SDimitry Andric error_string.append(E.message()); 286fe6060f1SDimitry Andric }); 287fe6060f1SDimitry Andric Py_RETURN_NONE; 288fe6060f1SDimitry Andric } 289fe6060f1SDimitry Andric 290fe6060f1SDimitry Andric PythonObject result = {}; 291fe6060f1SDimitry Andric if (arg_info.get().max_positional_args == 2) { 292349cc55cSDimitry Andric // FIXME: SBStructuredData leaked here 293349cc55cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*new lldb::SBStructuredData(args_impl))); 294349cc55cSDimitry Andric result = pfunc(target_arg, args_arg); 295349cc55cSDimitry Andric } else { 296349cc55cSDimitry Andric error_string.assign("wrong number of arguments in __init__, should be 2 (not including self)"); 297fe6060f1SDimitry Andric Py_RETURN_NONE; 298fe6060f1SDimitry Andric } 299349cc55cSDimitry Andric 300349cc55cSDimitry Andric if (result.IsAllocated()) 301349cc55cSDimitry Andric return result.release(); 302349cc55cSDimitry Andric Py_RETURN_NONE; 303349cc55cSDimitry Andric} 304349cc55cSDimitry Andric 305*4824e7fdSDimitry Andricvoid* 306*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCreateScriptedThread 307349cc55cSDimitry Andric( 308349cc55cSDimitry Andric const char *python_class_name, 309349cc55cSDimitry Andric const char *session_dictionary_name, 310349cc55cSDimitry Andric const lldb::ProcessSP& process_sp, 311349cc55cSDimitry Andric lldb_private::StructuredDataImpl *args_impl, 312349cc55cSDimitry Andric std::string &error_string 313349cc55cSDimitry Andric) 314349cc55cSDimitry Andric{ 315349cc55cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 316349cc55cSDimitry Andric Py_RETURN_NONE; 317349cc55cSDimitry Andric 318349cc55cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 319349cc55cSDimitry Andric 320349cc55cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 321349cc55cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 322349cc55cSDimitry Andric 323349cc55cSDimitry Andric if (!pfunc.IsAllocated()) { 324349cc55cSDimitry Andric error_string.append("could not find script class: "); 325349cc55cSDimitry Andric error_string.append(python_class_name); 326349cc55cSDimitry Andric return nullptr; 327349cc55cSDimitry Andric } 328349cc55cSDimitry Andric 329349cc55cSDimitry Andric llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo(); 330349cc55cSDimitry Andric if (!arg_info) { 331349cc55cSDimitry Andric llvm::handleAllErrors( 332349cc55cSDimitry Andric arg_info.takeError(), 333349cc55cSDimitry Andric [&](PythonException &E) { 334349cc55cSDimitry Andric error_string.append(E.ReadBacktrace()); 335349cc55cSDimitry Andric }, 336349cc55cSDimitry Andric [&](const llvm::ErrorInfoBase &E) { 337349cc55cSDimitry Andric error_string.append(E.message()); 338349cc55cSDimitry Andric }); 339349cc55cSDimitry Andric Py_RETURN_NONE; 340349cc55cSDimitry Andric } 341349cc55cSDimitry Andric 342349cc55cSDimitry Andric PythonObject result = {}; 343349cc55cSDimitry Andric if (arg_info.get().max_positional_args == 2) { 344349cc55cSDimitry Andric // FIXME: SBStructuredData leaked here 345349cc55cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*new lldb::SBStructuredData(args_impl))); 346*4824e7fdSDimitry Andric result = pfunc(ToSWIGWrapper(process_sp), args_arg); 347fe6060f1SDimitry Andric } else { 348349cc55cSDimitry Andric error_string.assign("wrong number of arguments in __init__, should be 2 (not including self)"); 349fe6060f1SDimitry Andric Py_RETURN_NONE; 350fe6060f1SDimitry Andric } 351fe6060f1SDimitry Andric 352fe6060f1SDimitry Andric if (result.IsAllocated()) 353fe6060f1SDimitry Andric return result.release(); 354fe6060f1SDimitry Andric Py_RETURN_NONE; 355fe6060f1SDimitry Andric} 356fe6060f1SDimitry Andric 357*4824e7fdSDimitry Andricvoid* 358*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCreateScriptedThreadPlan 359130d950cSDimitry Andric( 360130d950cSDimitry Andric const char *python_class_name, 361130d950cSDimitry Andric const char *session_dictionary_name, 362130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl, 363130d950cSDimitry Andric std::string &error_string, 364130d950cSDimitry Andric const lldb::ThreadPlanSP& thread_plan_sp 365130d950cSDimitry Andric) 366130d950cSDimitry Andric{ 367130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 368130d950cSDimitry Andric Py_RETURN_NONE; 369130d950cSDimitry Andric 370130d950cSDimitry Andric 371130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 372130d950cSDimitry Andric 373130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 374130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 375130d950cSDimitry Andric 376130d950cSDimitry Andric if (!pfunc.IsAllocated()) { 377130d950cSDimitry Andric error_string.append("could not find script class: "); 378130d950cSDimitry Andric error_string.append(python_class_name); 379130d950cSDimitry Andric return nullptr; 380130d950cSDimitry Andric } 381130d950cSDimitry Andric 382*4824e7fdSDimitry Andric PythonObject tp_arg = ToSWIGWrapper(thread_plan_sp); 383130d950cSDimitry Andric 384130d950cSDimitry Andric llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo(); 385130d950cSDimitry Andric if (!arg_info) { 386130d950cSDimitry Andric llvm::handleAllErrors( 387130d950cSDimitry Andric arg_info.takeError(), 388130d950cSDimitry Andric [&](PythonException &E) { 389130d950cSDimitry Andric error_string.append(E.ReadBacktrace()); 390130d950cSDimitry Andric }, 391130d950cSDimitry Andric [&](const llvm::ErrorInfoBase &E) { 392130d950cSDimitry Andric error_string.append(E.message()); 393130d950cSDimitry Andric }); 394130d950cSDimitry Andric Py_RETURN_NONE; 395130d950cSDimitry Andric } 396130d950cSDimitry Andric 397130d950cSDimitry Andric PythonObject result = {}; 398130d950cSDimitry Andric if (arg_info.get().max_positional_args == 2) { 399130d950cSDimitry Andric if (args_impl != nullptr) { 400130d950cSDimitry Andric error_string.assign("args passed, but __init__ does not take an args dictionary"); 401130d950cSDimitry Andric Py_RETURN_NONE; 402130d950cSDimitry Andric } 403130d950cSDimitry Andric result = pfunc(tp_arg, dict); 404130d950cSDimitry Andric } else if (arg_info.get().max_positional_args >= 3) { 405349cc55cSDimitry Andric // FIXME: SBStructuredData leaked here 406349cc55cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*new lldb::SBStructuredData(args_impl))); 407130d950cSDimitry Andric result = pfunc(tp_arg, args_arg, dict); 408130d950cSDimitry Andric } else { 409130d950cSDimitry Andric error_string.assign("wrong number of arguments in __init__, should be 2 or 3 (not including self)"); 410130d950cSDimitry Andric Py_RETURN_NONE; 411130d950cSDimitry Andric } 412130d950cSDimitry Andric 413130d950cSDimitry Andric // FIXME: At this point we should check that the class we found supports all the methods 414130d950cSDimitry Andric // that we need. 415130d950cSDimitry Andric 416130d950cSDimitry Andric if (result.IsAllocated()) 417130d950cSDimitry Andric return result.release(); 418130d950cSDimitry Andric Py_RETURN_NONE; 419130d950cSDimitry Andric} 420130d950cSDimitry Andric 421*4824e7fdSDimitry Andricbool 422*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPythonCallThreadPlan 423130d950cSDimitry Andric( 424130d950cSDimitry Andric void *implementor, 425130d950cSDimitry Andric const char *method_name, 426130d950cSDimitry Andric lldb_private::Event *event, 427130d950cSDimitry Andric bool &got_error 428130d950cSDimitry Andric) 429130d950cSDimitry Andric{ 430130d950cSDimitry Andric got_error = false; 431130d950cSDimitry Andric 432130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 433130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 434130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(method_name); 435130d950cSDimitry Andric 436130d950cSDimitry Andric if (!pfunc.IsAllocated()) 437130d950cSDimitry Andric return false; 438130d950cSDimitry Andric 439130d950cSDimitry Andric PythonObject result; 440130d950cSDimitry Andric if (event != nullptr) 441130d950cSDimitry Andric { 442130d950cSDimitry Andric lldb::SBEvent sb_event(event); 443130d950cSDimitry Andric PythonObject event_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_event)); 444130d950cSDimitry Andric result = pfunc(event_arg); 445130d950cSDimitry Andric } 446130d950cSDimitry Andric else 447130d950cSDimitry Andric result = pfunc(); 448130d950cSDimitry Andric 449130d950cSDimitry Andric if (PyErr_Occurred()) 450130d950cSDimitry Andric { 451130d950cSDimitry Andric got_error = true; 452130d950cSDimitry Andric printf ("Return value was neither false nor true for call to %s.\n", method_name); 453130d950cSDimitry Andric PyErr_Print(); 454130d950cSDimitry Andric return false; 455130d950cSDimitry Andric } 456130d950cSDimitry Andric 457130d950cSDimitry Andric if (result.get() == Py_True) 458130d950cSDimitry Andric return true; 459130d950cSDimitry Andric else if (result.get() == Py_False) 460130d950cSDimitry Andric return false; 461130d950cSDimitry Andric 462130d950cSDimitry Andric // Somebody returned the wrong thing... 463130d950cSDimitry Andric got_error = true; 464130d950cSDimitry Andric printf ("Wrong return value type for call to %s.\n", method_name); 465130d950cSDimitry Andric return false; 466130d950cSDimitry Andric} 467130d950cSDimitry Andric 468*4824e7fdSDimitry Andricvoid *lldb_private::LLDBSwigPythonCreateScriptedBreakpointResolver( 469*4824e7fdSDimitry Andric const char *python_class_name, const char *session_dictionary_name, 470130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl, 471*4824e7fdSDimitry Andric const lldb::BreakpointSP &breakpoint_sp) { 472*4824e7fdSDimitry Andric 473130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 474130d950cSDimitry Andric Py_RETURN_NONE; 475130d950cSDimitry Andric 476130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 477130d950cSDimitry Andric 478130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 479130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 480130d950cSDimitry Andric 481130d950cSDimitry Andric if (!pfunc.IsAllocated()) 482130d950cSDimitry Andric return nullptr; 483130d950cSDimitry Andric 484349cc55cSDimitry Andric // FIXME: SBStructuredData leaked here 485130d950cSDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 486349cc55cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*args_value)); 487130d950cSDimitry Andric 488*4824e7fdSDimitry Andric PythonObject result = pfunc(ToSWIGWrapper(breakpoint_sp), args_arg, dict); 489130d950cSDimitry Andric // FIXME: At this point we should check that the class we found supports all the methods 490130d950cSDimitry Andric // that we need. 491130d950cSDimitry Andric 492130d950cSDimitry Andric if (result.IsAllocated()) 493130d950cSDimitry Andric { 494130d950cSDimitry Andric // Check that __callback__ is defined: 495130d950cSDimitry Andric auto callback_func = result.ResolveName<PythonCallable>("__callback__"); 496130d950cSDimitry Andric if (callback_func.IsAllocated()) 497130d950cSDimitry Andric return result.release(); 498130d950cSDimitry Andric else 499130d950cSDimitry Andric result.release(); 500130d950cSDimitry Andric } 501130d950cSDimitry Andric Py_RETURN_NONE; 502130d950cSDimitry Andric} 503130d950cSDimitry Andric 504*4824e7fdSDimitry Andricunsigned int 505*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCallBreakpointResolver 506130d950cSDimitry Andric( 507130d950cSDimitry Andric void *implementor, 508130d950cSDimitry Andric const char *method_name, 509130d950cSDimitry Andric lldb_private::SymbolContext *sym_ctx 510130d950cSDimitry Andric) 511130d950cSDimitry Andric{ 512130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 513130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 514130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(method_name); 515130d950cSDimitry Andric 516130d950cSDimitry Andric if (!pfunc.IsAllocated()) 517130d950cSDimitry Andric return 0; 518130d950cSDimitry Andric 519130d950cSDimitry Andric PythonObject result; 520130d950cSDimitry Andric if (sym_ctx != nullptr) { 521130d950cSDimitry Andric lldb::SBSymbolContext sb_sym_ctx(sym_ctx); 522130d950cSDimitry Andric PythonObject sym_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_sym_ctx)); 523130d950cSDimitry Andric result = pfunc(sym_ctx_arg); 524130d950cSDimitry Andric } else 525130d950cSDimitry Andric result = pfunc(); 526130d950cSDimitry Andric 527130d950cSDimitry Andric if (PyErr_Occurred()) 528130d950cSDimitry Andric { 529130d950cSDimitry Andric PyErr_Print(); 5305ffd83dbSDimitry Andric PyErr_Clear(); 531130d950cSDimitry Andric return 0; 532130d950cSDimitry Andric } 533130d950cSDimitry Andric 534130d950cSDimitry Andric // The callback will return a bool, but we're need to also return ints 535130d950cSDimitry Andric // so we're squirrelling the bool through as an int... And if you return 536130d950cSDimitry Andric // nothing, we'll continue. 537130d950cSDimitry Andric if (strcmp(method_name, "__callback__") == 0) { 538130d950cSDimitry Andric if (result.get() == Py_False) 539130d950cSDimitry Andric return 0; 540130d950cSDimitry Andric else 541130d950cSDimitry Andric return 1; 542130d950cSDimitry Andric } 543130d950cSDimitry Andric 5445ffd83dbSDimitry Andric long long ret_val = unwrapOrSetPythonException(As<long long>(result)); 545130d950cSDimitry Andric 5465ffd83dbSDimitry Andric if (PyErr_Occurred()) { 5475ffd83dbSDimitry Andric PyErr_Print(); 5485ffd83dbSDimitry Andric PyErr_Clear(); 5495ffd83dbSDimitry Andric return 0; 5505ffd83dbSDimitry Andric } 551130d950cSDimitry Andric 552130d950cSDimitry Andric return ret_val; 553130d950cSDimitry Andric} 554130d950cSDimitry Andric 555*4824e7fdSDimitry Andricvoid * 556*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCreateScriptedStopHook 557e8d8bef9SDimitry Andric( 558e8d8bef9SDimitry Andric lldb::TargetSP target_sp, 559e8d8bef9SDimitry Andric const char *python_class_name, 560e8d8bef9SDimitry Andric const char *session_dictionary_name, 561e8d8bef9SDimitry Andric lldb_private::StructuredDataImpl *args_impl, 562e8d8bef9SDimitry Andric Status &error 563e8d8bef9SDimitry Andric) 564e8d8bef9SDimitry Andric{ 565e8d8bef9SDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0') { 566e8d8bef9SDimitry Andric error.SetErrorString("Empty class name."); 567e8d8bef9SDimitry Andric Py_RETURN_NONE; 568e8d8bef9SDimitry Andric } 569e8d8bef9SDimitry Andric if (!session_dictionary_name) { 570e8d8bef9SDimitry Andric error.SetErrorString("No session dictionary"); 571e8d8bef9SDimitry Andric Py_RETURN_NONE; 572e8d8bef9SDimitry Andric } 573e8d8bef9SDimitry Andric 574e8d8bef9SDimitry Andric PyErr_Cleaner py_err_cleaner(true); 575e8d8bef9SDimitry Andric 576e8d8bef9SDimitry Andric auto dict = 577e8d8bef9SDimitry Andric PythonModule::MainModule().ResolveName<PythonDictionary>( 578e8d8bef9SDimitry Andric session_dictionary_name); 579e8d8bef9SDimitry Andric auto pfunc = 580e8d8bef9SDimitry Andric PythonObject::ResolveNameWithDictionary<PythonCallable>( 581e8d8bef9SDimitry Andric python_class_name, dict); 582e8d8bef9SDimitry Andric 583e8d8bef9SDimitry Andric if (!pfunc.IsAllocated()) { 584e8d8bef9SDimitry Andric error.SetErrorStringWithFormat("Could not find class: %s.", 585e8d8bef9SDimitry Andric python_class_name); 586e8d8bef9SDimitry Andric return nullptr; 587e8d8bef9SDimitry Andric } 588e8d8bef9SDimitry Andric 589349cc55cSDimitry Andric // FIXME: SBStructuredData leaked here 590e8d8bef9SDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 591349cc55cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*args_value)); 592e8d8bef9SDimitry Andric 593*4824e7fdSDimitry Andric PythonObject result = pfunc(ToSWIGWrapper(target_sp), args_arg, dict); 594e8d8bef9SDimitry Andric 595e8d8bef9SDimitry Andric if (result.IsAllocated()) 596e8d8bef9SDimitry Andric { 597e8d8bef9SDimitry Andric // Check that the handle_stop callback is defined: 598e8d8bef9SDimitry Andric auto callback_func = result.ResolveName<PythonCallable>("handle_stop"); 599e8d8bef9SDimitry Andric if (callback_func.IsAllocated()) { 600e8d8bef9SDimitry Andric if (auto args_info = callback_func.GetArgInfo()) { 601e8d8bef9SDimitry Andric size_t num_args = (*args_info).max_positional_args; 602e8d8bef9SDimitry Andric if (num_args != 2) { 603e8d8bef9SDimitry Andric error.SetErrorStringWithFormat("Wrong number of args for " 604e8d8bef9SDimitry Andric "handle_stop callback, should be 2 (excluding self), got: %zu", 605e8d8bef9SDimitry Andric num_args); 606e8d8bef9SDimitry Andric Py_RETURN_NONE; 607e8d8bef9SDimitry Andric } else 608e8d8bef9SDimitry Andric return result.release(); 609e8d8bef9SDimitry Andric } else { 610e8d8bef9SDimitry Andric error.SetErrorString("Couldn't get num arguments for handle_stop " 611e8d8bef9SDimitry Andric "callback."); 612e8d8bef9SDimitry Andric Py_RETURN_NONE; 613e8d8bef9SDimitry Andric } 614e8d8bef9SDimitry Andric return result.release(); 615e8d8bef9SDimitry Andric } 616e8d8bef9SDimitry Andric else { 617e8d8bef9SDimitry Andric error.SetErrorStringWithFormat("Class \"%s\" is missing the required " 618e8d8bef9SDimitry Andric "handle_stop callback.", 619e8d8bef9SDimitry Andric python_class_name); 620e8d8bef9SDimitry Andric result.release(); 621e8d8bef9SDimitry Andric } 622e8d8bef9SDimitry Andric } 623e8d8bef9SDimitry Andric Py_RETURN_NONE; 624e8d8bef9SDimitry Andric} 625e8d8bef9SDimitry Andric 626*4824e7fdSDimitry Andricbool 627*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonStopHookCallHandleStop 628e8d8bef9SDimitry Andric( 629e8d8bef9SDimitry Andric void *implementor, 630e8d8bef9SDimitry Andric lldb::ExecutionContextRefSP exc_ctx_sp, 631e8d8bef9SDimitry Andric lldb::StreamSP stream 632e8d8bef9SDimitry Andric) 633e8d8bef9SDimitry Andric{ 634e8d8bef9SDimitry Andric // handle_stop will return a bool with the meaning "should_stop"... 635e8d8bef9SDimitry Andric // If you return nothing we'll assume we are going to stop. 636e8d8bef9SDimitry Andric // Also any errors should return true, since we should stop on error. 637e8d8bef9SDimitry Andric 638e8d8bef9SDimitry Andric PyErr_Cleaner py_err_cleaner(false); 639e8d8bef9SDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 640e8d8bef9SDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("handle_stop"); 641e8d8bef9SDimitry Andric 642e8d8bef9SDimitry Andric if (!pfunc.IsAllocated()) 643e8d8bef9SDimitry Andric return true; 644e8d8bef9SDimitry Andric 645e8d8bef9SDimitry Andric PythonObject result; 646e8d8bef9SDimitry Andric lldb::SBExecutionContext sb_exc_ctx(exc_ctx_sp); 647e8d8bef9SDimitry Andric PythonObject exc_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_exc_ctx)); 648e8d8bef9SDimitry Andric lldb::SBStream sb_stream; 649e8d8bef9SDimitry Andric PythonObject sb_stream_arg(PyRefType::Owned, 650e8d8bef9SDimitry Andric SBTypeToSWIGWrapper(sb_stream)); 651e8d8bef9SDimitry Andric result = pfunc(exc_ctx_arg, sb_stream_arg); 652e8d8bef9SDimitry Andric 653e8d8bef9SDimitry Andric if (PyErr_Occurred()) 654e8d8bef9SDimitry Andric { 655e8d8bef9SDimitry Andric stream->PutCString("Python error occurred handling stop-hook."); 656e8d8bef9SDimitry Andric PyErr_Print(); 657e8d8bef9SDimitry Andric PyErr_Clear(); 658e8d8bef9SDimitry Andric return true; 659e8d8bef9SDimitry Andric } 660e8d8bef9SDimitry Andric 661e8d8bef9SDimitry Andric // Now add the result to the output stream. SBStream only 662e8d8bef9SDimitry Andric // makes an internally help StreamString which I can't interpose, so I 663e8d8bef9SDimitry Andric // have to copy it over here. 664e8d8bef9SDimitry Andric stream->PutCString(sb_stream.GetData()); 665e8d8bef9SDimitry Andric 666e8d8bef9SDimitry Andric if (result.get() == Py_False) 667e8d8bef9SDimitry Andric return false; 668e8d8bef9SDimitry Andric else 669e8d8bef9SDimitry Andric return true; 670e8d8bef9SDimitry Andric} 671e8d8bef9SDimitry Andric 672130d950cSDimitry Andric// wrapper that calls an optional instance member of an object taking no arguments 673130d950cSDimitry Andricstatic PyObject* 674130d950cSDimitry AndricLLDBSwigPython_CallOptionalMember 675130d950cSDimitry Andric( 676130d950cSDimitry Andric PyObject* implementor, 677130d950cSDimitry Andric char* callee_name, 678130d950cSDimitry Andric PyObject* ret_if_not_found = Py_None, 679130d950cSDimitry Andric bool* was_found = NULL 680130d950cSDimitry Andric) 681130d950cSDimitry Andric{ 682130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 683130d950cSDimitry Andric 684130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 685130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(callee_name); 686130d950cSDimitry Andric 687130d950cSDimitry Andric if (!pfunc.IsAllocated()) 688130d950cSDimitry Andric { 689130d950cSDimitry Andric if (was_found) 690130d950cSDimitry Andric *was_found = false; 691130d950cSDimitry Andric Py_XINCREF(ret_if_not_found); 692130d950cSDimitry Andric return ret_if_not_found; 693130d950cSDimitry Andric } 694130d950cSDimitry Andric 695130d950cSDimitry Andric if (was_found) 696130d950cSDimitry Andric *was_found = true; 697130d950cSDimitry Andric 698130d950cSDimitry Andric PythonObject result = pfunc(); 699130d950cSDimitry Andric return result.release(); 700130d950cSDimitry Andric} 701130d950cSDimitry Andric 702*4824e7fdSDimitry Andricsize_t 703*4824e7fdSDimitry Andriclldb_private::LLDBSwigPython_CalculateNumChildren 704130d950cSDimitry Andric( 705130d950cSDimitry Andric PyObject *implementor, 706130d950cSDimitry Andric uint32_t max 707130d950cSDimitry Andric) 708130d950cSDimitry Andric{ 709130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 710130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("num_children"); 711130d950cSDimitry Andric 712130d950cSDimitry Andric if (!pfunc.IsAllocated()) 713130d950cSDimitry Andric return 0; 714130d950cSDimitry Andric 715130d950cSDimitry Andric auto arg_info = pfunc.GetArgInfo(); 716130d950cSDimitry Andric if (!arg_info) { 717130d950cSDimitry Andric llvm::consumeError(arg_info.takeError()); 718130d950cSDimitry Andric return 0; 719130d950cSDimitry Andric } 720130d950cSDimitry Andric 7215ffd83dbSDimitry Andric size_t ret_val; 722130d950cSDimitry Andric if (arg_info.get().max_positional_args < 1) 7235ffd83dbSDimitry Andric ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call())); 724130d950cSDimitry Andric else 7255ffd83dbSDimitry Andric ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call(PythonInteger(max)))); 726130d950cSDimitry Andric 7275ffd83dbSDimitry Andric if (PyErr_Occurred()) 728130d950cSDimitry Andric { 729130d950cSDimitry Andric PyErr_Print(); 730130d950cSDimitry Andric PyErr_Clear(); 7315ffd83dbSDimitry Andric return 0; 732130d950cSDimitry Andric } 733130d950cSDimitry Andric 734130d950cSDimitry Andric if (arg_info.get().max_positional_args < 1) 735130d950cSDimitry Andric ret_val = std::min(ret_val, static_cast<size_t>(max)); 736130d950cSDimitry Andric 737130d950cSDimitry Andric return ret_val; 738130d950cSDimitry Andric} 739130d950cSDimitry Andric 740*4824e7fdSDimitry AndricPyObject* 741*4824e7fdSDimitry Andriclldb_private::LLDBSwigPython_GetChildAtIndex 742130d950cSDimitry Andric( 743130d950cSDimitry Andric PyObject *implementor, 744130d950cSDimitry Andric uint32_t idx 745130d950cSDimitry Andric) 746130d950cSDimitry Andric{ 747130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 748130d950cSDimitry Andric 749130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 750130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("get_child_at_index"); 751130d950cSDimitry Andric 752130d950cSDimitry Andric if (!pfunc.IsAllocated()) 753130d950cSDimitry Andric return nullptr; 754130d950cSDimitry Andric 755130d950cSDimitry Andric PythonObject result = pfunc(PythonInteger(idx)); 756130d950cSDimitry Andric 757130d950cSDimitry Andric if (!result.IsAllocated()) 758130d950cSDimitry Andric return nullptr; 759130d950cSDimitry Andric 760130d950cSDimitry Andric lldb::SBValue* sbvalue_ptr = nullptr; 761130d950cSDimitry Andric if (SWIG_ConvertPtr(result.get(), (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) 762130d950cSDimitry Andric return nullptr; 763130d950cSDimitry Andric 764130d950cSDimitry Andric if (sbvalue_ptr == nullptr) 765130d950cSDimitry Andric return nullptr; 766130d950cSDimitry Andric 767130d950cSDimitry Andric return result.release(); 768130d950cSDimitry Andric} 769130d950cSDimitry Andric 770*4824e7fdSDimitry Andricint 771*4824e7fdSDimitry Andriclldb_private::LLDBSwigPython_GetIndexOfChildWithName 772130d950cSDimitry Andric( 773130d950cSDimitry Andric PyObject *implementor, 774130d950cSDimitry Andric const char* child_name 775130d950cSDimitry Andric) 776130d950cSDimitry Andric{ 777130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 778130d950cSDimitry Andric 779130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 780130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("get_child_index"); 781130d950cSDimitry Andric 782130d950cSDimitry Andric if (!pfunc.IsAllocated()) 783130d950cSDimitry Andric return UINT32_MAX; 784130d950cSDimitry Andric 7855ffd83dbSDimitry Andric llvm::Expected<PythonObject> result = pfunc.Call(PythonString(child_name)); 786130d950cSDimitry Andric 7875ffd83dbSDimitry Andric long long retval = unwrapOrSetPythonException(As<long long>(std::move(result))); 7885ffd83dbSDimitry Andric 7895ffd83dbSDimitry Andric if (PyErr_Occurred()) { 7905ffd83dbSDimitry Andric PyErr_Clear(); // FIXME print this? do something else 791130d950cSDimitry Andric return UINT32_MAX; 7925ffd83dbSDimitry Andric } 793130d950cSDimitry Andric 794130d950cSDimitry Andric if (retval >= 0) 795130d950cSDimitry Andric return (uint32_t)retval; 796130d950cSDimitry Andric 797130d950cSDimitry Andric return UINT32_MAX; 798130d950cSDimitry Andric} 799130d950cSDimitry Andric 800*4824e7fdSDimitry Andricbool 801*4824e7fdSDimitry Andriclldb_private::LLDBSwigPython_UpdateSynthProviderInstance 802130d950cSDimitry Andric( 803130d950cSDimitry Andric PyObject *implementor 804130d950cSDimitry Andric) 805130d950cSDimitry Andric{ 806130d950cSDimitry Andric bool ret_val = false; 807130d950cSDimitry Andric 808130d950cSDimitry Andric static char callee_name[] = "update"; 809130d950cSDimitry Andric 810130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name); 811130d950cSDimitry Andric 812130d950cSDimitry Andric if (py_return == Py_True) 813130d950cSDimitry Andric ret_val = true; 814130d950cSDimitry Andric 815130d950cSDimitry Andric Py_XDECREF(py_return); 816130d950cSDimitry Andric 817130d950cSDimitry Andric return ret_val; 818130d950cSDimitry Andric} 819130d950cSDimitry Andric 820*4824e7fdSDimitry Andricbool 821*4824e7fdSDimitry Andriclldb_private::LLDBSwigPython_MightHaveChildrenSynthProviderInstance 822130d950cSDimitry Andric( 823130d950cSDimitry Andric PyObject *implementor 824130d950cSDimitry Andric) 825130d950cSDimitry Andric{ 826130d950cSDimitry Andric bool ret_val = false; 827130d950cSDimitry Andric 828130d950cSDimitry Andric static char callee_name[] = "has_children"; 829130d950cSDimitry Andric 830130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True); 831130d950cSDimitry Andric 832130d950cSDimitry Andric if (py_return == Py_True) 833130d950cSDimitry Andric ret_val = true; 834130d950cSDimitry Andric 835130d950cSDimitry Andric Py_XDECREF(py_return); 836130d950cSDimitry Andric 837130d950cSDimitry Andric return ret_val; 838130d950cSDimitry Andric} 839130d950cSDimitry Andric 840*4824e7fdSDimitry AndricPyObject* 841*4824e7fdSDimitry Andriclldb_private::LLDBSwigPython_GetValueSynthProviderInstance 842130d950cSDimitry Andric( 843130d950cSDimitry Andric PyObject *implementor 844130d950cSDimitry Andric) 845130d950cSDimitry Andric{ 846130d950cSDimitry Andric PyObject* ret_val = nullptr; 847130d950cSDimitry Andric 848130d950cSDimitry Andric static char callee_name[] = "get_value"; 849130d950cSDimitry Andric 850130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_None); 851130d950cSDimitry Andric 852130d950cSDimitry Andric if (py_return == Py_None || py_return == nullptr) 853130d950cSDimitry Andric ret_val = nullptr; 854130d950cSDimitry Andric 855130d950cSDimitry Andric lldb::SBValue* sbvalue_ptr = NULL; 856130d950cSDimitry Andric 857130d950cSDimitry Andric if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) 858130d950cSDimitry Andric ret_val = nullptr; 859130d950cSDimitry Andric else if (sbvalue_ptr == NULL) 860130d950cSDimitry Andric ret_val = nullptr; 861130d950cSDimitry Andric else 862130d950cSDimitry Andric ret_val = py_return; 863130d950cSDimitry Andric 864130d950cSDimitry Andric Py_XDECREF(py_return); 865130d950cSDimitry Andric return ret_val; 866130d950cSDimitry Andric} 867130d950cSDimitry Andric 868*4824e7fdSDimitry Andricvoid* 869*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPython_CastPyObjectToSBData 870fe6060f1SDimitry Andric( 871fe6060f1SDimitry Andric PyObject* data 872fe6060f1SDimitry Andric) 873fe6060f1SDimitry Andric{ 874fe6060f1SDimitry Andric lldb::SBData* sb_ptr = nullptr; 875fe6060f1SDimitry Andric 876fe6060f1SDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBData, 0); 877fe6060f1SDimitry Andric 878fe6060f1SDimitry Andric if (valid_cast == -1) 879fe6060f1SDimitry Andric return NULL; 880fe6060f1SDimitry Andric 881fe6060f1SDimitry Andric return sb_ptr; 882fe6060f1SDimitry Andric} 883fe6060f1SDimitry Andric 884fe6060f1SDimitry Andric 885*4824e7fdSDimitry Andricvoid* 886*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPython_CastPyObjectToSBError 887fe6060f1SDimitry Andric( 888fe6060f1SDimitry Andric PyObject* data 889fe6060f1SDimitry Andric) 890fe6060f1SDimitry Andric{ 891fe6060f1SDimitry Andric lldb::SBError* sb_ptr = nullptr; 892fe6060f1SDimitry Andric 893fe6060f1SDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBError, 0); 894fe6060f1SDimitry Andric 895fe6060f1SDimitry Andric if (valid_cast == -1) 896fe6060f1SDimitry Andric return NULL; 897fe6060f1SDimitry Andric 898fe6060f1SDimitry Andric return sb_ptr; 899fe6060f1SDimitry Andric} 900fe6060f1SDimitry Andric 901fe6060f1SDimitry Andric 902*4824e7fdSDimitry Andricvoid* 903*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPython_CastPyObjectToSBValue 904130d950cSDimitry Andric( 905130d950cSDimitry Andric PyObject* data 906130d950cSDimitry Andric) 907130d950cSDimitry Andric{ 908130d950cSDimitry Andric lldb::SBValue* sb_ptr = NULL; 909130d950cSDimitry Andric 910130d950cSDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0); 911130d950cSDimitry Andric 912130d950cSDimitry Andric if (valid_cast == -1) 913130d950cSDimitry Andric return NULL; 914130d950cSDimitry Andric 915130d950cSDimitry Andric return sb_ptr; 916130d950cSDimitry Andric} 917130d950cSDimitry Andric 918*4824e7fdSDimitry Andricvoid* 919*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo 920349cc55cSDimitry Andric( 921349cc55cSDimitry Andric PyObject* data 922349cc55cSDimitry Andric) 923349cc55cSDimitry Andric{ 924349cc55cSDimitry Andric lldb::SBMemoryRegionInfo* sb_ptr = NULL; 925349cc55cSDimitry Andric 926349cc55cSDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0); 927349cc55cSDimitry Andric 928349cc55cSDimitry Andric if (valid_cast == -1) 929349cc55cSDimitry Andric return NULL; 930349cc55cSDimitry Andric 931349cc55cSDimitry Andric return sb_ptr; 932349cc55cSDimitry Andric} 933349cc55cSDimitry Andric 934*4824e7fdSDimitry Andricbool 935*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCallCommand 936130d950cSDimitry Andric( 937130d950cSDimitry Andric const char *python_function_name, 938130d950cSDimitry Andric const char *session_dictionary_name, 939130d950cSDimitry Andric lldb::DebuggerSP& debugger, 940130d950cSDimitry Andric const char* args, 941130d950cSDimitry Andric lldb_private::CommandReturnObject& cmd_retobj, 942130d950cSDimitry Andric lldb::ExecutionContextRefSP exe_ctx_ref_sp 943130d950cSDimitry Andric) 944130d950cSDimitry Andric{ 945130d950cSDimitry Andric lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj); 946130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 947130d950cSDimitry Andric lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); 948130d950cSDimitry Andric 949130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 950130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 951130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 952130d950cSDimitry Andric 953130d950cSDimitry Andric if (!pfunc.IsAllocated()) 954130d950cSDimitry Andric return false; 955130d950cSDimitry Andric 956130d950cSDimitry Andric auto argc = pfunc.GetArgInfo(); 957130d950cSDimitry Andric if (!argc) { 958130d950cSDimitry Andric llvm::consumeError(argc.takeError()); 959130d950cSDimitry Andric return false; 960130d950cSDimitry Andric } 961130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 962130d950cSDimitry Andric PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); 963349cc55cSDimitry Andric PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(cmd_retobj_sb)); 964130d950cSDimitry Andric 965130d950cSDimitry Andric if (argc.get().max_positional_args < 5u) 966130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), cmd_retobj_arg, dict); 967130d950cSDimitry Andric else 968130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg, dict); 969130d950cSDimitry Andric 970130d950cSDimitry Andric return true; 971130d950cSDimitry Andric} 972130d950cSDimitry Andric 973*4824e7fdSDimitry Andricbool 974*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCallCommandObject 975130d950cSDimitry Andric( 976130d950cSDimitry Andric PyObject *implementor, 977130d950cSDimitry Andric lldb::DebuggerSP& debugger, 978130d950cSDimitry Andric const char* args, 979130d950cSDimitry Andric lldb_private::CommandReturnObject& cmd_retobj, 980130d950cSDimitry Andric lldb::ExecutionContextRefSP exe_ctx_ref_sp 981130d950cSDimitry Andric) 982130d950cSDimitry Andric{ 983130d950cSDimitry Andric lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj); 984130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 985130d950cSDimitry Andric lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); 986130d950cSDimitry Andric 987130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 988130d950cSDimitry Andric 989130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 990130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("__call__"); 991130d950cSDimitry Andric 992130d950cSDimitry Andric if (!pfunc.IsAllocated()) 993130d950cSDimitry Andric return false; 994130d950cSDimitry Andric 995130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 996130d950cSDimitry Andric PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); 997349cc55cSDimitry Andric PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(cmd_retobj_sb)); 998130d950cSDimitry Andric 999130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg); 1000130d950cSDimitry Andric 1001130d950cSDimitry Andric return true; 1002130d950cSDimitry Andric} 1003130d950cSDimitry Andric 1004*4824e7fdSDimitry Andricvoid* 1005*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPythonCreateOSPlugin 1006130d950cSDimitry Andric( 1007130d950cSDimitry Andric const char *python_class_name, 1008130d950cSDimitry Andric const char *session_dictionary_name, 1009130d950cSDimitry Andric const lldb::ProcessSP& process_sp 1010130d950cSDimitry Andric) 1011130d950cSDimitry Andric{ 1012130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 1013130d950cSDimitry Andric Py_RETURN_NONE; 1014130d950cSDimitry Andric 1015130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1016130d950cSDimitry Andric 1017130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1018130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 1019130d950cSDimitry Andric 1020130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1021130d950cSDimitry Andric Py_RETURN_NONE; 1022130d950cSDimitry Andric 1023*4824e7fdSDimitry Andric auto result = pfunc(ToSWIGWrapper(process_sp)); 1024130d950cSDimitry Andric 1025130d950cSDimitry Andric if (result.IsAllocated()) 1026130d950cSDimitry Andric return result.release(); 1027130d950cSDimitry Andric 1028130d950cSDimitry Andric Py_RETURN_NONE; 1029130d950cSDimitry Andric} 1030130d950cSDimitry Andric 1031*4824e7fdSDimitry Andricvoid* 1032*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPython_CreateFrameRecognizer 1033130d950cSDimitry Andric( 1034130d950cSDimitry Andric const char *python_class_name, 1035130d950cSDimitry Andric const char *session_dictionary_name 1036130d950cSDimitry Andric) 1037130d950cSDimitry Andric{ 1038130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 1039130d950cSDimitry Andric Py_RETURN_NONE; 1040130d950cSDimitry Andric 1041130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1042130d950cSDimitry Andric 1043130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1044130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 1045130d950cSDimitry Andric 1046130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1047130d950cSDimitry Andric Py_RETURN_NONE; 1048130d950cSDimitry Andric 1049130d950cSDimitry Andric auto result = pfunc(); 1050130d950cSDimitry Andric 1051130d950cSDimitry Andric if (result.IsAllocated()) 1052130d950cSDimitry Andric return result.release(); 1053130d950cSDimitry Andric 1054130d950cSDimitry Andric Py_RETURN_NONE; 1055130d950cSDimitry Andric} 1056130d950cSDimitry Andric 1057*4824e7fdSDimitry AndricPyObject* 1058*4824e7fdSDimitry Andriclldb_private::LLDBSwigPython_GetRecognizedArguments 1059130d950cSDimitry Andric( 1060130d950cSDimitry Andric PyObject *implementor, 1061130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp 1062130d950cSDimitry Andric) 1063130d950cSDimitry Andric{ 1064130d950cSDimitry Andric static char callee_name[] = "get_recognized_arguments"; 1065130d950cSDimitry Andric 1066130d950cSDimitry Andric lldb::SBFrame frame_sb(frame_sp); 1067130d950cSDimitry Andric PyObject *arg = SBTypeToSWIGWrapper(frame_sb); 1068130d950cSDimitry Andric 1069130d950cSDimitry Andric PythonString str(callee_name); 1070130d950cSDimitry Andric PyObject* result = PyObject_CallMethodObjArgs(implementor, str.get(), arg, 1071130d950cSDimitry Andric NULL); 1072130d950cSDimitry Andric return result; 1073130d950cSDimitry Andric} 1074130d950cSDimitry Andric 1075*4824e7fdSDimitry Andricvoid* 1076*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPython_GetDynamicSetting (void* module, const char* setting, const lldb::TargetSP& target_sp) 1077130d950cSDimitry Andric{ 1078130d950cSDimitry Andric if (!module || !setting) 1079130d950cSDimitry Andric Py_RETURN_NONE; 1080130d950cSDimitry Andric 1081130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1082130d950cSDimitry Andric PythonObject py_module(PyRefType::Borrowed, (PyObject *)module); 1083130d950cSDimitry Andric auto pfunc = py_module.ResolveName<PythonCallable>("get_dynamic_setting"); 1084130d950cSDimitry Andric 1085130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1086130d950cSDimitry Andric Py_RETURN_NONE; 1087130d950cSDimitry Andric 1088*4824e7fdSDimitry Andric auto result = pfunc(ToSWIGWrapper(target_sp), PythonString(setting)); 1089130d950cSDimitry Andric 1090130d950cSDimitry Andric return result.release(); 1091130d950cSDimitry Andric} 1092130d950cSDimitry Andric 1093*4824e7fdSDimitry Andricbool lldb_private::LLDBSWIGPythonRunScriptKeywordProcess( 1094*4824e7fdSDimitry Andric const char *python_function_name, const char *session_dictionary_name, 1095*4824e7fdSDimitry Andric const lldb::ProcessSP &process, std::string &output) { 1096130d950cSDimitry Andric 1097130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1098130d950cSDimitry Andric return false; 1099130d950cSDimitry Andric 1100130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1101130d950cSDimitry Andric 1102130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1103130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1104130d950cSDimitry Andric 1105130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1106130d950cSDimitry Andric return false; 1107130d950cSDimitry Andric 1108*4824e7fdSDimitry Andric auto result = pfunc(ToSWIGWrapper(process), dict); 1109130d950cSDimitry Andric 1110130d950cSDimitry Andric output = result.Str().GetString().str(); 1111130d950cSDimitry Andric 1112130d950cSDimitry Andric return true; 1113130d950cSDimitry Andric} 1114130d950cSDimitry Andric 1115*4824e7fdSDimitry Andricbool 1116*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPythonRunScriptKeywordThread 1117130d950cSDimitry Andric(const char* python_function_name, 1118130d950cSDimitry Andricconst char* session_dictionary_name, 1119130d950cSDimitry Andriclldb::ThreadSP& thread, 1120130d950cSDimitry Andricstd::string& output) 1121130d950cSDimitry Andric 1122130d950cSDimitry Andric{ 1123130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1124130d950cSDimitry Andric return false; 1125130d950cSDimitry Andric 1126130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1127130d950cSDimitry Andric 1128130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1129130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1130130d950cSDimitry Andric 1131130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1132130d950cSDimitry Andric return false; 1133130d950cSDimitry Andric 1134130d950cSDimitry Andric lldb::SBThread thread_sb(thread); 1135130d950cSDimitry Andric PythonObject thread_arg(PyRefType::Owned, SBTypeToSWIGWrapper(thread_sb)); 1136130d950cSDimitry Andric auto result = pfunc(thread_arg, dict); 1137130d950cSDimitry Andric 1138130d950cSDimitry Andric output = result.Str().GetString().str(); 1139130d950cSDimitry Andric 1140130d950cSDimitry Andric return true; 1141130d950cSDimitry Andric} 1142130d950cSDimitry Andric 1143*4824e7fdSDimitry Andricbool lldb_private::LLDBSWIGPythonRunScriptKeywordTarget( 1144*4824e7fdSDimitry Andric const char *python_function_name, const char *session_dictionary_name, 1145*4824e7fdSDimitry Andric const lldb::TargetSP &target, std::string &output) { 1146130d950cSDimitry Andric 1147130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1148130d950cSDimitry Andric return false; 1149130d950cSDimitry Andric 1150130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1151130d950cSDimitry Andric 1152130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1153130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); 1154130d950cSDimitry Andric 1155130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1156130d950cSDimitry Andric return false; 1157130d950cSDimitry Andric 1158*4824e7fdSDimitry Andric auto result = pfunc(ToSWIGWrapper(target), dict); 1159130d950cSDimitry Andric 1160130d950cSDimitry Andric output = result.Str().GetString().str(); 1161130d950cSDimitry Andric 1162130d950cSDimitry Andric return true; 1163130d950cSDimitry Andric} 1164130d950cSDimitry Andric 1165*4824e7fdSDimitry Andricbool 1166*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPythonRunScriptKeywordFrame 1167130d950cSDimitry Andric(const char* python_function_name, 1168130d950cSDimitry Andricconst char* session_dictionary_name, 1169130d950cSDimitry Andriclldb::StackFrameSP& frame, 1170130d950cSDimitry Andricstd::string& output) 1171130d950cSDimitry Andric 1172130d950cSDimitry Andric{ 1173130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1174130d950cSDimitry Andric return false; 1175130d950cSDimitry Andric 1176130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1177130d950cSDimitry Andric 1178130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1179130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); 1180130d950cSDimitry Andric 1181130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1182130d950cSDimitry Andric return false; 1183130d950cSDimitry Andric 1184130d950cSDimitry Andric lldb::SBFrame frame_sb(frame); 1185130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(frame_sb)); 1186130d950cSDimitry Andric auto result = pfunc(frame_arg, dict); 1187130d950cSDimitry Andric 1188130d950cSDimitry Andric output = result.Str().GetString().str(); 1189130d950cSDimitry Andric 1190130d950cSDimitry Andric return true; 1191130d950cSDimitry Andric} 1192130d950cSDimitry Andric 1193*4824e7fdSDimitry Andricbool lldb_private::LLDBSWIGPythonRunScriptKeywordValue( 1194*4824e7fdSDimitry Andric const char *python_function_name, const char *session_dictionary_name, 1195*4824e7fdSDimitry Andric const lldb::ValueObjectSP &value, std::string &output) { 1196130d950cSDimitry Andric 1197130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1198130d950cSDimitry Andric return false; 1199130d950cSDimitry Andric 1200130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1201130d950cSDimitry Andric 1202130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1203130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1204130d950cSDimitry Andric 1205130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1206130d950cSDimitry Andric return false; 1207130d950cSDimitry Andric 1208*4824e7fdSDimitry Andric auto result = pfunc(ToSWIGWrapper(value), dict); 1209130d950cSDimitry Andric 1210130d950cSDimitry Andric output = result.Str().GetString().str(); 1211130d950cSDimitry Andric 1212130d950cSDimitry Andric return true; 1213130d950cSDimitry Andric} 1214130d950cSDimitry Andric 1215*4824e7fdSDimitry Andricbool 1216*4824e7fdSDimitry Andriclldb_private::LLDBSwigPythonCallModuleInit 1217130d950cSDimitry Andric( 1218130d950cSDimitry Andric const char *python_module_name, 1219130d950cSDimitry Andric const char *session_dictionary_name, 1220130d950cSDimitry Andric lldb::DebuggerSP& debugger 1221130d950cSDimitry Andric) 1222130d950cSDimitry Andric{ 1223130d950cSDimitry Andric std::string python_function_name_string = python_module_name; 1224130d950cSDimitry Andric python_function_name_string += ".__lldb_init_module"; 1225130d950cSDimitry Andric const char* python_function_name = python_function_name_string.c_str(); 1226130d950cSDimitry Andric 1227130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1228130d950cSDimitry Andric 1229130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1230130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1231130d950cSDimitry Andric 1232130d950cSDimitry Andric // This method is optional and need not exist. So if we don't find it, 1233130d950cSDimitry Andric // it's actually a success, not a failure. 1234130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1235130d950cSDimitry Andric return true; 1236130d950cSDimitry Andric 1237130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 1238130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 1239130d950cSDimitry Andric pfunc(debugger_arg, dict); 1240130d950cSDimitry Andric 1241130d950cSDimitry Andric return true; 1242130d950cSDimitry Andric} 1243130d950cSDimitry Andric 1244*4824e7fdSDimitry Andriclldb::ValueObjectSP 1245*4824e7fdSDimitry Andriclldb_private::LLDBSWIGPython_GetValueObjectSPFromSBValue (void* data) 1246130d950cSDimitry Andric{ 1247130d950cSDimitry Andric lldb::ValueObjectSP valobj_sp; 1248130d950cSDimitry Andric if (data) 1249130d950cSDimitry Andric { 1250130d950cSDimitry Andric lldb::SBValue* sb_ptr = (lldb::SBValue *)data; 1251130d950cSDimitry Andric valobj_sp = sb_ptr->GetSP(); 1252130d950cSDimitry Andric } 1253130d950cSDimitry Andric return valobj_sp; 1254130d950cSDimitry Andric} 1255130d950cSDimitry Andric 1256130d950cSDimitry Andric// For the LogOutputCallback functions 1257*4824e7fdSDimitry Andricstatic void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) { 1258130d950cSDimitry Andric if (baton != Py_None) { 1259130d950cSDimitry Andric SWIG_PYTHON_THREAD_BEGIN_BLOCK; 1260130d950cSDimitry Andric PyObject *result = PyObject_CallFunction(reinterpret_cast<PyObject*>(baton), const_cast<char*>("s"), str); 1261130d950cSDimitry Andric Py_XDECREF(result); 1262130d950cSDimitry Andric SWIG_PYTHON_THREAD_END_BLOCK; 1263130d950cSDimitry Andric } 1264130d950cSDimitry Andric} 1265130d950cSDimitry Andric%} 1266