1130d950cSDimitry Andric%header %{ 2130d950cSDimitry Andric 3130d950cSDimitry Andrictemplate <typename T> 4130d950cSDimitry AndricPyObject * 5130d950cSDimitry AndricSBTypeToSWIGWrapper (T* item); 6130d950cSDimitry Andric 7130d950cSDimitry Andricclass PyErr_Cleaner 8130d950cSDimitry Andric{ 9130d950cSDimitry Andricpublic: 10130d950cSDimitry Andric PyErr_Cleaner(bool print=false) : 11130d950cSDimitry Andric m_print(print) 12130d950cSDimitry Andric { 13130d950cSDimitry Andric } 14130d950cSDimitry Andric 15130d950cSDimitry Andric ~PyErr_Cleaner() 16130d950cSDimitry Andric { 17130d950cSDimitry Andric if (PyErr_Occurred()) 18130d950cSDimitry Andric { 19130d950cSDimitry Andric if(m_print && !PyErr_ExceptionMatches(PyExc_SystemExit)) 20130d950cSDimitry Andric PyErr_Print(); 21130d950cSDimitry Andric PyErr_Clear(); 22130d950cSDimitry Andric } 23130d950cSDimitry Andric } 24130d950cSDimitry Andric 25130d950cSDimitry Andricprivate: 26130d950cSDimitry Andric bool m_print; 27130d950cSDimitry Andric}; 28130d950cSDimitry Andric 29130d950cSDimitry Andric%} 30130d950cSDimitry Andric 31130d950cSDimitry Andric%wrapper %{ 32130d950cSDimitry Andric 33130d950cSDimitry Andric// resolve a dotted Python name in the form 34130d950cSDimitry Andric// foo.bar.baz.Foobar to an actual Python object 35130d950cSDimitry Andric// if pmodule is NULL, the __main__ module will be used 36130d950cSDimitry Andric// as the starting point for the search 37130d950cSDimitry Andric 38130d950cSDimitry Andric 39130d950cSDimitry Andric// This function is called by lldb_private::ScriptInterpreterPython::BreakpointCallbackFunction(...) 40130d950cSDimitry Andric// and is used when a script command is attached to a breakpoint for execution. 41130d950cSDimitry Andric 42130d950cSDimitry AndricSWIGEXPORT llvm::Expected<bool> 43130d950cSDimitry AndricLLDBSwigPythonBreakpointCallbackFunction 44130d950cSDimitry Andric( 45130d950cSDimitry Andric const char *python_function_name, 46130d950cSDimitry Andric const char *session_dictionary_name, 47130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp, 48130d950cSDimitry Andric const lldb::BreakpointLocationSP& bp_loc_sp, 49130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl 50130d950cSDimitry Andric) 51130d950cSDimitry Andric{ 52130d950cSDimitry Andric using namespace llvm; 53130d950cSDimitry Andric 54130d950cSDimitry Andric lldb::SBFrame sb_frame (frame_sp); 55130d950cSDimitry Andric lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp); 56130d950cSDimitry Andric 57130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 58130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 59130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 60130d950cSDimitry Andric 61130d950cSDimitry Andric unsigned max_positional_args; 62130d950cSDimitry Andric if (auto arg_info = pfunc.GetArgInfo()) 63130d950cSDimitry Andric max_positional_args = arg_info.get().max_positional_args; 64130d950cSDimitry Andric else 65130d950cSDimitry Andric return arg_info.takeError(); 66130d950cSDimitry Andric 67130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); 68130d950cSDimitry Andric PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc)); 69130d950cSDimitry Andric 70130d950cSDimitry Andric auto result = [&] () -> Expected<PythonObject> { 71130d950cSDimitry Andric // If the called function doesn't take extra_args, drop them here: 72130d950cSDimitry Andric if (max_positional_args < 4) { 73130d950cSDimitry Andric return pfunc.Call(frame_arg, bp_loc_arg, dict); 74130d950cSDimitry Andric } else { 75130d950cSDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 76130d950cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); 77130d950cSDimitry Andric return pfunc.Call(frame_arg, bp_loc_arg, args_arg, dict); 78130d950cSDimitry Andric } 79130d950cSDimitry Andric } (); 80130d950cSDimitry Andric 81130d950cSDimitry Andric if (!result) 82130d950cSDimitry Andric return result.takeError(); 83130d950cSDimitry Andric 84130d950cSDimitry Andric // Only False counts as false! 85130d950cSDimitry Andric return result.get().get() != Py_False; 86130d950cSDimitry Andric} 87130d950cSDimitry Andric 88130d950cSDimitry Andric// This function is called by lldb_private::ScriptInterpreterPython::WatchpointCallbackFunction(...) 89130d950cSDimitry Andric// and is used when a script command is attached to a watchpoint for execution. 90130d950cSDimitry Andric 91130d950cSDimitry AndricSWIGEXPORT bool 92130d950cSDimitry AndricLLDBSwigPythonWatchpointCallbackFunction 93130d950cSDimitry Andric( 94130d950cSDimitry Andric const char *python_function_name, 95130d950cSDimitry Andric const char *session_dictionary_name, 96130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp, 97130d950cSDimitry Andric const lldb::WatchpointSP& wp_sp 98130d950cSDimitry Andric) 99130d950cSDimitry Andric{ 100130d950cSDimitry Andric lldb::SBFrame sb_frame (frame_sp); 101130d950cSDimitry Andric lldb::SBWatchpoint sb_wp(wp_sp); 102130d950cSDimitry Andric 103130d950cSDimitry Andric bool stop_at_watchpoint = true; 104130d950cSDimitry Andric 105130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 106130d950cSDimitry Andric 107130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 108130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 109130d950cSDimitry Andric 110130d950cSDimitry Andric if (!pfunc.IsAllocated()) 111130d950cSDimitry Andric return stop_at_watchpoint; 112130d950cSDimitry Andric 113130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); 114130d950cSDimitry Andric PythonObject wp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_wp)); 115130d950cSDimitry Andric PythonObject result = pfunc(frame_arg, wp_arg, dict); 116130d950cSDimitry Andric 117130d950cSDimitry Andric if (result.get() == Py_False) 118130d950cSDimitry Andric stop_at_watchpoint = false; 119130d950cSDimitry Andric 120130d950cSDimitry Andric return stop_at_watchpoint; 121130d950cSDimitry Andric} 122130d950cSDimitry Andric 123130d950cSDimitry AndricSWIGEXPORT bool 124130d950cSDimitry AndricLLDBSwigPythonCallTypeScript 125130d950cSDimitry Andric( 126130d950cSDimitry Andric const char *python_function_name, 127130d950cSDimitry Andric const void *session_dictionary, 128130d950cSDimitry Andric const lldb::ValueObjectSP& valobj_sp, 129130d950cSDimitry Andric void** pyfunct_wrapper, 130130d950cSDimitry Andric const lldb::TypeSummaryOptionsSP& options_sp, 131130d950cSDimitry Andric std::string& retval 132130d950cSDimitry Andric) 133130d950cSDimitry Andric{ 134130d950cSDimitry Andric lldb::SBValue sb_value (valobj_sp); 135130d950cSDimitry Andric lldb::SBTypeSummaryOptions sb_options(options_sp.get()); 136130d950cSDimitry Andric 137130d950cSDimitry Andric retval.clear(); 138130d950cSDimitry Andric 139130d950cSDimitry Andric if (!python_function_name || !session_dictionary) 140130d950cSDimitry Andric return false; 141130d950cSDimitry Andric 142130d950cSDimitry Andric PyObject *pfunc_impl = nullptr; 143130d950cSDimitry Andric 144130d950cSDimitry Andric if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper)) 145130d950cSDimitry Andric { 146130d950cSDimitry Andric pfunc_impl = (PyObject*)(*pyfunct_wrapper); 147130d950cSDimitry Andric if (pfunc_impl->ob_refcnt == 1) 148130d950cSDimitry Andric { 149130d950cSDimitry Andric Py_XDECREF(pfunc_impl); 150130d950cSDimitry Andric pfunc_impl = NULL; 151130d950cSDimitry Andric } 152130d950cSDimitry Andric } 153130d950cSDimitry Andric 154130d950cSDimitry Andric PyObject *py_dict = (PyObject*)session_dictionary; 155130d950cSDimitry Andric if (!PythonDictionary::Check(py_dict)) 156130d950cSDimitry Andric return true; 157130d950cSDimitry Andric 158130d950cSDimitry Andric PythonDictionary dict(PyRefType::Borrowed, py_dict); 159130d950cSDimitry Andric 160130d950cSDimitry Andric PyErr_Cleaner pyerr_cleanup(true); // show Python errors 161130d950cSDimitry Andric 162130d950cSDimitry Andric PythonCallable pfunc(PyRefType::Borrowed, pfunc_impl); 163130d950cSDimitry Andric 164130d950cSDimitry Andric if (!pfunc.IsAllocated()) 165130d950cSDimitry Andric { 166130d950cSDimitry Andric pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 167130d950cSDimitry Andric if (!pfunc.IsAllocated()) 168130d950cSDimitry Andric return false; 169130d950cSDimitry Andric 170130d950cSDimitry Andric if (pyfunct_wrapper) 171130d950cSDimitry Andric { 172130d950cSDimitry Andric *pyfunct_wrapper = pfunc.get(); 173130d950cSDimitry Andric Py_XINCREF(pfunc.get()); 174130d950cSDimitry Andric } 175130d950cSDimitry Andric } 176130d950cSDimitry Andric 177130d950cSDimitry Andric PythonObject result; 178130d950cSDimitry Andric auto argc = pfunc.GetArgInfo(); 179130d950cSDimitry Andric if (!argc) { 180130d950cSDimitry Andric llvm::consumeError(argc.takeError()); 181130d950cSDimitry Andric return false; 182130d950cSDimitry Andric } 183130d950cSDimitry Andric 184130d950cSDimitry Andric PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value)); 185130d950cSDimitry Andric PythonObject options_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_options)); 186130d950cSDimitry Andric 187130d950cSDimitry Andric if (argc.get().max_positional_args < 3) 188130d950cSDimitry Andric result = pfunc(value_arg,dict); 189130d950cSDimitry Andric else 190130d950cSDimitry Andric result = pfunc(value_arg,dict,options_arg); 191130d950cSDimitry Andric 192130d950cSDimitry Andric retval = result.Str().GetString().str(); 193130d950cSDimitry Andric 194130d950cSDimitry Andric return true; 195130d950cSDimitry Andric} 196130d950cSDimitry Andric 197130d950cSDimitry AndricSWIGEXPORT void* 198130d950cSDimitry AndricLLDBSwigPythonCreateSyntheticProvider 199130d950cSDimitry Andric( 200130d950cSDimitry Andric const char *python_class_name, 201130d950cSDimitry Andric const char *session_dictionary_name, 202130d950cSDimitry Andric const lldb::ValueObjectSP& valobj_sp 203130d950cSDimitry Andric) 204130d950cSDimitry Andric{ 205130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 206130d950cSDimitry Andric Py_RETURN_NONE; 207130d950cSDimitry Andric 208130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 209130d950cSDimitry Andric 210130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 211130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name,dict); 212130d950cSDimitry Andric 213130d950cSDimitry Andric if (!pfunc.IsAllocated()) 214130d950cSDimitry Andric Py_RETURN_NONE; 215130d950cSDimitry Andric 216130d950cSDimitry Andric // I do not want the SBValue to be deallocated when going out of scope because python 217130d950cSDimitry Andric // has ownership of it and will manage memory for this object by itself 218130d950cSDimitry Andric lldb::SBValue *sb_value = new lldb::SBValue(valobj_sp); 219130d950cSDimitry Andric sb_value->SetPreferSyntheticValue(false); 220130d950cSDimitry Andric 221130d950cSDimitry Andric PythonObject val_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value)); 222130d950cSDimitry Andric if (!val_arg.IsAllocated()) 223130d950cSDimitry Andric Py_RETURN_NONE; 224130d950cSDimitry Andric 225130d950cSDimitry Andric PythonObject result = pfunc(val_arg, dict); 226130d950cSDimitry Andric 227130d950cSDimitry Andric if (result.IsAllocated()) 228130d950cSDimitry Andric return result.release(); 229130d950cSDimitry Andric 230130d950cSDimitry Andric Py_RETURN_NONE; 231130d950cSDimitry Andric} 232130d950cSDimitry Andric 233130d950cSDimitry AndricSWIGEXPORT void* 234130d950cSDimitry AndricLLDBSwigPythonCreateCommandObject 235130d950cSDimitry Andric( 236130d950cSDimitry Andric const char *python_class_name, 237130d950cSDimitry Andric const char *session_dictionary_name, 238130d950cSDimitry Andric const lldb::DebuggerSP debugger_sp 239130d950cSDimitry Andric) 240130d950cSDimitry Andric{ 241130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 242130d950cSDimitry Andric Py_RETURN_NONE; 243130d950cSDimitry Andric 244130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 245130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 246130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 247130d950cSDimitry Andric 248130d950cSDimitry Andric if (!pfunc.IsAllocated()) 249130d950cSDimitry Andric return nullptr; 250130d950cSDimitry Andric 251130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger_sp); 252130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 253130d950cSDimitry Andric PythonObject result = pfunc(debugger_arg, dict); 254130d950cSDimitry Andric 255130d950cSDimitry Andric if (result.IsAllocated()) 256130d950cSDimitry Andric return result.release(); 257130d950cSDimitry Andric 258130d950cSDimitry Andric Py_RETURN_NONE; 259130d950cSDimitry Andric} 260130d950cSDimitry Andric 261130d950cSDimitry AndricSWIGEXPORT void* 262130d950cSDimitry AndricLLDBSwigPythonCreateScriptedThreadPlan 263130d950cSDimitry Andric( 264130d950cSDimitry Andric const char *python_class_name, 265130d950cSDimitry Andric const char *session_dictionary_name, 266130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl, 267130d950cSDimitry Andric std::string &error_string, 268130d950cSDimitry Andric const lldb::ThreadPlanSP& thread_plan_sp 269130d950cSDimitry Andric) 270130d950cSDimitry Andric{ 271130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 272130d950cSDimitry Andric Py_RETURN_NONE; 273130d950cSDimitry Andric 274130d950cSDimitry Andric // I do not want the SBThreadPlan to be deallocated when going out of scope because python 275130d950cSDimitry Andric // has ownership of it and will manage memory for this object by itself 276130d950cSDimitry Andric lldb::SBThreadPlan *tp_value = new lldb::SBThreadPlan(thread_plan_sp); 277130d950cSDimitry Andric 278130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 279130d950cSDimitry Andric 280130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 281130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 282130d950cSDimitry Andric 283130d950cSDimitry Andric if (!pfunc.IsAllocated()) { 284130d950cSDimitry Andric error_string.append("could not find script class: "); 285130d950cSDimitry Andric error_string.append(python_class_name); 286130d950cSDimitry Andric return nullptr; 287130d950cSDimitry Andric } 288130d950cSDimitry Andric 289130d950cSDimitry Andric PythonObject tp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(tp_value)); 290130d950cSDimitry Andric 291130d950cSDimitry Andric if (!tp_arg.IsAllocated()) 292130d950cSDimitry Andric Py_RETURN_NONE; 293130d950cSDimitry Andric 294130d950cSDimitry Andric llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo(); 295130d950cSDimitry Andric if (!arg_info) { 296130d950cSDimitry Andric llvm::handleAllErrors( 297130d950cSDimitry Andric arg_info.takeError(), 298130d950cSDimitry Andric [&](PythonException &E) { 299130d950cSDimitry Andric error_string.append(E.ReadBacktrace()); 300130d950cSDimitry Andric }, 301130d950cSDimitry Andric [&](const llvm::ErrorInfoBase &E) { 302130d950cSDimitry Andric error_string.append(E.message()); 303130d950cSDimitry Andric }); 304130d950cSDimitry Andric Py_RETURN_NONE; 305130d950cSDimitry Andric } 306130d950cSDimitry Andric 307130d950cSDimitry Andric PythonObject result = {}; 308130d950cSDimitry Andric if (arg_info.get().max_positional_args == 2) { 309130d950cSDimitry Andric if (args_impl != nullptr) { 310130d950cSDimitry Andric error_string.assign("args passed, but __init__ does not take an args dictionary"); 311130d950cSDimitry Andric Py_RETURN_NONE; 312130d950cSDimitry Andric } 313130d950cSDimitry Andric result = pfunc(tp_arg, dict); 314130d950cSDimitry Andric } else if (arg_info.get().max_positional_args >= 3) { 315130d950cSDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 316130d950cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); 317130d950cSDimitry Andric result = pfunc(tp_arg, args_arg, dict); 318130d950cSDimitry Andric } else { 319130d950cSDimitry Andric error_string.assign("wrong number of arguments in __init__, should be 2 or 3 (not including self)"); 320130d950cSDimitry Andric Py_RETURN_NONE; 321130d950cSDimitry Andric } 322130d950cSDimitry Andric 323130d950cSDimitry Andric // FIXME: At this point we should check that the class we found supports all the methods 324130d950cSDimitry Andric // that we need. 325130d950cSDimitry Andric 326130d950cSDimitry Andric if (result.IsAllocated()) 327130d950cSDimitry Andric return result.release(); 328130d950cSDimitry Andric Py_RETURN_NONE; 329130d950cSDimitry Andric} 330130d950cSDimitry Andric 331130d950cSDimitry AndricSWIGEXPORT bool 332130d950cSDimitry AndricLLDBSWIGPythonCallThreadPlan 333130d950cSDimitry Andric( 334130d950cSDimitry Andric void *implementor, 335130d950cSDimitry Andric const char *method_name, 336130d950cSDimitry Andric lldb_private::Event *event, 337130d950cSDimitry Andric bool &got_error 338130d950cSDimitry Andric) 339130d950cSDimitry Andric{ 340130d950cSDimitry Andric got_error = false; 341130d950cSDimitry Andric 342130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 343130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 344130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(method_name); 345130d950cSDimitry Andric 346130d950cSDimitry Andric if (!pfunc.IsAllocated()) 347130d950cSDimitry Andric return false; 348130d950cSDimitry Andric 349130d950cSDimitry Andric PythonObject result; 350130d950cSDimitry Andric if (event != nullptr) 351130d950cSDimitry Andric { 352130d950cSDimitry Andric lldb::SBEvent sb_event(event); 353130d950cSDimitry Andric PythonObject event_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_event)); 354130d950cSDimitry Andric result = pfunc(event_arg); 355130d950cSDimitry Andric } 356130d950cSDimitry Andric else 357130d950cSDimitry Andric result = pfunc(); 358130d950cSDimitry Andric 359130d950cSDimitry Andric if (PyErr_Occurred()) 360130d950cSDimitry Andric { 361130d950cSDimitry Andric got_error = true; 362130d950cSDimitry Andric printf ("Return value was neither false nor true for call to %s.\n", method_name); 363130d950cSDimitry Andric PyErr_Print(); 364130d950cSDimitry Andric return false; 365130d950cSDimitry Andric } 366130d950cSDimitry Andric 367130d950cSDimitry Andric if (result.get() == Py_True) 368130d950cSDimitry Andric return true; 369130d950cSDimitry Andric else if (result.get() == Py_False) 370130d950cSDimitry Andric return false; 371130d950cSDimitry Andric 372130d950cSDimitry Andric // Somebody returned the wrong thing... 373130d950cSDimitry Andric got_error = true; 374130d950cSDimitry Andric printf ("Wrong return value type for call to %s.\n", method_name); 375130d950cSDimitry Andric return false; 376130d950cSDimitry Andric} 377130d950cSDimitry Andric 378130d950cSDimitry AndricSWIGEXPORT void * 379130d950cSDimitry AndricLLDBSwigPythonCreateScriptedBreakpointResolver 380130d950cSDimitry Andric( 381130d950cSDimitry Andric const char *python_class_name, 382130d950cSDimitry Andric const char *session_dictionary_name, 383130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl, 384130d950cSDimitry Andric lldb::BreakpointSP &breakpoint_sp 385130d950cSDimitry Andric) 386130d950cSDimitry Andric{ 387130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 388130d950cSDimitry Andric Py_RETURN_NONE; 389130d950cSDimitry Andric 390130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 391130d950cSDimitry Andric 392130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 393130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 394130d950cSDimitry Andric 395130d950cSDimitry Andric if (!pfunc.IsAllocated()) 396130d950cSDimitry Andric return nullptr; 397130d950cSDimitry Andric 398130d950cSDimitry Andric lldb::SBBreakpoint *bkpt_value = new lldb::SBBreakpoint(breakpoint_sp); 399130d950cSDimitry Andric 400130d950cSDimitry Andric PythonObject bkpt_arg(PyRefType::Owned, SBTypeToSWIGWrapper(bkpt_value)); 401130d950cSDimitry Andric 402130d950cSDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 403130d950cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); 404130d950cSDimitry Andric 405130d950cSDimitry Andric PythonObject result = pfunc(bkpt_arg, args_arg, dict); 406130d950cSDimitry Andric // FIXME: At this point we should check that the class we found supports all the methods 407130d950cSDimitry Andric // that we need. 408130d950cSDimitry Andric 409130d950cSDimitry Andric if (result.IsAllocated()) 410130d950cSDimitry Andric { 411130d950cSDimitry Andric // Check that __callback__ is defined: 412130d950cSDimitry Andric auto callback_func = result.ResolveName<PythonCallable>("__callback__"); 413130d950cSDimitry Andric if (callback_func.IsAllocated()) 414130d950cSDimitry Andric return result.release(); 415130d950cSDimitry Andric else 416130d950cSDimitry Andric result.release(); 417130d950cSDimitry Andric } 418130d950cSDimitry Andric Py_RETURN_NONE; 419130d950cSDimitry Andric} 420130d950cSDimitry Andric 421130d950cSDimitry AndricSWIGEXPORT unsigned int 422130d950cSDimitry AndricLLDBSwigPythonCallBreakpointResolver 423130d950cSDimitry Andric( 424130d950cSDimitry Andric void *implementor, 425130d950cSDimitry Andric const char *method_name, 426130d950cSDimitry Andric lldb_private::SymbolContext *sym_ctx 427130d950cSDimitry Andric) 428130d950cSDimitry Andric{ 429130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 430130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 431130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(method_name); 432130d950cSDimitry Andric 433130d950cSDimitry Andric if (!pfunc.IsAllocated()) 434130d950cSDimitry Andric return 0; 435130d950cSDimitry Andric 436130d950cSDimitry Andric PythonObject result; 437130d950cSDimitry Andric if (sym_ctx != nullptr) { 438130d950cSDimitry Andric lldb::SBSymbolContext sb_sym_ctx(sym_ctx); 439130d950cSDimitry Andric PythonObject sym_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_sym_ctx)); 440130d950cSDimitry Andric result = pfunc(sym_ctx_arg); 441130d950cSDimitry Andric } else 442130d950cSDimitry Andric result = pfunc(); 443130d950cSDimitry Andric 444130d950cSDimitry Andric if (PyErr_Occurred()) 445130d950cSDimitry Andric { 446130d950cSDimitry Andric PyErr_Print(); 447*5ffd83dbSDimitry Andric PyErr_Clear(); 448130d950cSDimitry Andric return 0; 449130d950cSDimitry Andric } 450130d950cSDimitry Andric 451130d950cSDimitry Andric // The callback will return a bool, but we're need to also return ints 452130d950cSDimitry Andric // so we're squirrelling the bool through as an int... And if you return 453130d950cSDimitry Andric // nothing, we'll continue. 454130d950cSDimitry Andric if (strcmp(method_name, "__callback__") == 0) { 455130d950cSDimitry Andric if (result.get() == Py_False) 456130d950cSDimitry Andric return 0; 457130d950cSDimitry Andric else 458130d950cSDimitry Andric return 1; 459130d950cSDimitry Andric } 460130d950cSDimitry Andric 461*5ffd83dbSDimitry Andric long long ret_val = unwrapOrSetPythonException(As<long long>(result)); 462130d950cSDimitry Andric 463*5ffd83dbSDimitry Andric if (PyErr_Occurred()) { 464*5ffd83dbSDimitry Andric PyErr_Print(); 465*5ffd83dbSDimitry Andric PyErr_Clear(); 466*5ffd83dbSDimitry Andric return 0; 467*5ffd83dbSDimitry Andric } 468130d950cSDimitry Andric 469130d950cSDimitry Andric return ret_val; 470130d950cSDimitry Andric} 471130d950cSDimitry Andric 472130d950cSDimitry Andric// wrapper that calls an optional instance member of an object taking no arguments 473130d950cSDimitry Andricstatic PyObject* 474130d950cSDimitry AndricLLDBSwigPython_CallOptionalMember 475130d950cSDimitry Andric( 476130d950cSDimitry Andric PyObject* implementor, 477130d950cSDimitry Andric char* callee_name, 478130d950cSDimitry Andric PyObject* ret_if_not_found = Py_None, 479130d950cSDimitry Andric bool* was_found = NULL 480130d950cSDimitry Andric) 481130d950cSDimitry Andric{ 482130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 483130d950cSDimitry Andric 484130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 485130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(callee_name); 486130d950cSDimitry Andric 487130d950cSDimitry Andric if (!pfunc.IsAllocated()) 488130d950cSDimitry Andric { 489130d950cSDimitry Andric if (was_found) 490130d950cSDimitry Andric *was_found = false; 491130d950cSDimitry Andric Py_XINCREF(ret_if_not_found); 492130d950cSDimitry Andric return ret_if_not_found; 493130d950cSDimitry Andric } 494130d950cSDimitry Andric 495130d950cSDimitry Andric if (was_found) 496130d950cSDimitry Andric *was_found = true; 497130d950cSDimitry Andric 498130d950cSDimitry Andric PythonObject result = pfunc(); 499130d950cSDimitry Andric return result.release(); 500130d950cSDimitry Andric} 501130d950cSDimitry Andric 502130d950cSDimitry AndricSWIGEXPORT size_t 503130d950cSDimitry AndricLLDBSwigPython_CalculateNumChildren 504130d950cSDimitry Andric( 505130d950cSDimitry Andric PyObject *implementor, 506130d950cSDimitry Andric uint32_t max 507130d950cSDimitry Andric) 508130d950cSDimitry Andric{ 509130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 510130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("num_children"); 511130d950cSDimitry Andric 512130d950cSDimitry Andric if (!pfunc.IsAllocated()) 513130d950cSDimitry Andric return 0; 514130d950cSDimitry Andric 515130d950cSDimitry Andric auto arg_info = pfunc.GetArgInfo(); 516130d950cSDimitry Andric if (!arg_info) { 517130d950cSDimitry Andric llvm::consumeError(arg_info.takeError()); 518130d950cSDimitry Andric return 0; 519130d950cSDimitry Andric } 520130d950cSDimitry Andric 521*5ffd83dbSDimitry Andric size_t ret_val; 522130d950cSDimitry Andric if (arg_info.get().max_positional_args < 1) 523*5ffd83dbSDimitry Andric ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call())); 524130d950cSDimitry Andric else 525*5ffd83dbSDimitry Andric ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call(PythonInteger(max)))); 526130d950cSDimitry Andric 527*5ffd83dbSDimitry Andric if (PyErr_Occurred()) 528130d950cSDimitry Andric { 529130d950cSDimitry Andric PyErr_Print(); 530130d950cSDimitry Andric PyErr_Clear(); 531*5ffd83dbSDimitry Andric return 0; 532130d950cSDimitry Andric } 533130d950cSDimitry Andric 534130d950cSDimitry Andric if (arg_info.get().max_positional_args < 1) 535130d950cSDimitry Andric ret_val = std::min(ret_val, static_cast<size_t>(max)); 536130d950cSDimitry Andric 537130d950cSDimitry Andric return ret_val; 538130d950cSDimitry Andric} 539130d950cSDimitry Andric 540130d950cSDimitry AndricSWIGEXPORT PyObject* 541130d950cSDimitry AndricLLDBSwigPython_GetChildAtIndex 542130d950cSDimitry Andric( 543130d950cSDimitry Andric PyObject *implementor, 544130d950cSDimitry Andric uint32_t idx 545130d950cSDimitry Andric) 546130d950cSDimitry Andric{ 547130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 548130d950cSDimitry Andric 549130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 550130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("get_child_at_index"); 551130d950cSDimitry Andric 552130d950cSDimitry Andric if (!pfunc.IsAllocated()) 553130d950cSDimitry Andric return nullptr; 554130d950cSDimitry Andric 555130d950cSDimitry Andric PythonObject result = pfunc(PythonInteger(idx)); 556130d950cSDimitry Andric 557130d950cSDimitry Andric if (!result.IsAllocated()) 558130d950cSDimitry Andric return nullptr; 559130d950cSDimitry Andric 560130d950cSDimitry Andric lldb::SBValue* sbvalue_ptr = nullptr; 561130d950cSDimitry Andric if (SWIG_ConvertPtr(result.get(), (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) 562130d950cSDimitry Andric return nullptr; 563130d950cSDimitry Andric 564130d950cSDimitry Andric if (sbvalue_ptr == nullptr) 565130d950cSDimitry Andric return nullptr; 566130d950cSDimitry Andric 567130d950cSDimitry Andric return result.release(); 568130d950cSDimitry Andric} 569130d950cSDimitry Andric 570130d950cSDimitry AndricSWIGEXPORT int 571130d950cSDimitry AndricLLDBSwigPython_GetIndexOfChildWithName 572130d950cSDimitry Andric( 573130d950cSDimitry Andric PyObject *implementor, 574130d950cSDimitry Andric const char* child_name 575130d950cSDimitry Andric) 576130d950cSDimitry Andric{ 577130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 578130d950cSDimitry Andric 579130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 580130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("get_child_index"); 581130d950cSDimitry Andric 582130d950cSDimitry Andric if (!pfunc.IsAllocated()) 583130d950cSDimitry Andric return UINT32_MAX; 584130d950cSDimitry Andric 585*5ffd83dbSDimitry Andric llvm::Expected<PythonObject> result = pfunc.Call(PythonString(child_name)); 586130d950cSDimitry Andric 587*5ffd83dbSDimitry Andric long long retval = unwrapOrSetPythonException(As<long long>(std::move(result))); 588*5ffd83dbSDimitry Andric 589*5ffd83dbSDimitry Andric if (PyErr_Occurred()) { 590*5ffd83dbSDimitry Andric PyErr_Clear(); // FIXME print this? do something else 591130d950cSDimitry Andric return UINT32_MAX; 592*5ffd83dbSDimitry Andric } 593130d950cSDimitry Andric 594130d950cSDimitry Andric if (retval >= 0) 595130d950cSDimitry Andric return (uint32_t)retval; 596130d950cSDimitry Andric 597130d950cSDimitry Andric return UINT32_MAX; 598130d950cSDimitry Andric} 599130d950cSDimitry Andric 600130d950cSDimitry AndricSWIGEXPORT bool 601130d950cSDimitry AndricLLDBSwigPython_UpdateSynthProviderInstance 602130d950cSDimitry Andric( 603130d950cSDimitry Andric PyObject *implementor 604130d950cSDimitry Andric) 605130d950cSDimitry Andric{ 606130d950cSDimitry Andric bool ret_val = false; 607130d950cSDimitry Andric 608130d950cSDimitry Andric static char callee_name[] = "update"; 609130d950cSDimitry Andric 610130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name); 611130d950cSDimitry Andric 612130d950cSDimitry Andric if (py_return == Py_True) 613130d950cSDimitry Andric ret_val = true; 614130d950cSDimitry Andric 615130d950cSDimitry Andric Py_XDECREF(py_return); 616130d950cSDimitry Andric 617130d950cSDimitry Andric return ret_val; 618130d950cSDimitry Andric} 619130d950cSDimitry Andric 620130d950cSDimitry AndricSWIGEXPORT bool 621130d950cSDimitry AndricLLDBSwigPython_MightHaveChildrenSynthProviderInstance 622130d950cSDimitry Andric( 623130d950cSDimitry Andric PyObject *implementor 624130d950cSDimitry Andric) 625130d950cSDimitry Andric{ 626130d950cSDimitry Andric bool ret_val = false; 627130d950cSDimitry Andric 628130d950cSDimitry Andric static char callee_name[] = "has_children"; 629130d950cSDimitry Andric 630130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True); 631130d950cSDimitry Andric 632130d950cSDimitry Andric if (py_return == Py_True) 633130d950cSDimitry Andric ret_val = true; 634130d950cSDimitry Andric 635130d950cSDimitry Andric Py_XDECREF(py_return); 636130d950cSDimitry Andric 637130d950cSDimitry Andric return ret_val; 638130d950cSDimitry Andric} 639130d950cSDimitry Andric 640130d950cSDimitry AndricSWIGEXPORT PyObject* 641130d950cSDimitry AndricLLDBSwigPython_GetValueSynthProviderInstance 642130d950cSDimitry Andric( 643130d950cSDimitry Andric PyObject *implementor 644130d950cSDimitry Andric) 645130d950cSDimitry Andric{ 646130d950cSDimitry Andric PyObject* ret_val = nullptr; 647130d950cSDimitry Andric 648130d950cSDimitry Andric static char callee_name[] = "get_value"; 649130d950cSDimitry Andric 650130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_None); 651130d950cSDimitry Andric 652130d950cSDimitry Andric if (py_return == Py_None || py_return == nullptr) 653130d950cSDimitry Andric ret_val = nullptr; 654130d950cSDimitry Andric 655130d950cSDimitry Andric lldb::SBValue* sbvalue_ptr = NULL; 656130d950cSDimitry Andric 657130d950cSDimitry Andric if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) 658130d950cSDimitry Andric ret_val = nullptr; 659130d950cSDimitry Andric else if (sbvalue_ptr == NULL) 660130d950cSDimitry Andric ret_val = nullptr; 661130d950cSDimitry Andric else 662130d950cSDimitry Andric ret_val = py_return; 663130d950cSDimitry Andric 664130d950cSDimitry Andric Py_XDECREF(py_return); 665130d950cSDimitry Andric return ret_val; 666130d950cSDimitry Andric} 667130d950cSDimitry Andric 668130d950cSDimitry AndricSWIGEXPORT void* 669130d950cSDimitry AndricLLDBSWIGPython_CastPyObjectToSBValue 670130d950cSDimitry Andric( 671130d950cSDimitry Andric PyObject* data 672130d950cSDimitry Andric) 673130d950cSDimitry Andric{ 674130d950cSDimitry Andric lldb::SBValue* sb_ptr = NULL; 675130d950cSDimitry Andric 676130d950cSDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0); 677130d950cSDimitry Andric 678130d950cSDimitry Andric if (valid_cast == -1) 679130d950cSDimitry Andric return NULL; 680130d950cSDimitry Andric 681130d950cSDimitry Andric return sb_ptr; 682130d950cSDimitry Andric} 683130d950cSDimitry Andric 684130d950cSDimitry AndricSWIGEXPORT bool 685130d950cSDimitry AndricLLDBSwigPythonCallCommand 686130d950cSDimitry Andric( 687130d950cSDimitry Andric const char *python_function_name, 688130d950cSDimitry Andric const char *session_dictionary_name, 689130d950cSDimitry Andric lldb::DebuggerSP& debugger, 690130d950cSDimitry Andric const char* args, 691130d950cSDimitry Andric lldb_private::CommandReturnObject& cmd_retobj, 692130d950cSDimitry Andric lldb::ExecutionContextRefSP exe_ctx_ref_sp 693130d950cSDimitry Andric) 694130d950cSDimitry Andric{ 695130d950cSDimitry Andric lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj); 696130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 697130d950cSDimitry Andric lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); 698130d950cSDimitry Andric 699130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 700130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 701130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 702130d950cSDimitry Andric 703130d950cSDimitry Andric if (!pfunc.IsAllocated()) 704130d950cSDimitry Andric return false; 705130d950cSDimitry Andric 706130d950cSDimitry Andric // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you 707130d950cSDimitry Andric // see comment above for SBCommandReturnObjectReleaser for further details 708130d950cSDimitry Andric auto argc = pfunc.GetArgInfo(); 709130d950cSDimitry Andric if (!argc) { 710130d950cSDimitry Andric llvm::consumeError(argc.takeError()); 711130d950cSDimitry Andric return false; 712130d950cSDimitry Andric } 713130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 714130d950cSDimitry Andric PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); 715130d950cSDimitry Andric PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb)); 716130d950cSDimitry Andric 717130d950cSDimitry Andric if (argc.get().max_positional_args < 5u) 718130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), cmd_retobj_arg, dict); 719130d950cSDimitry Andric else 720130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg, dict); 721130d950cSDimitry Andric 722130d950cSDimitry Andric return true; 723130d950cSDimitry Andric} 724130d950cSDimitry Andric 725130d950cSDimitry AndricSWIGEXPORT bool 726130d950cSDimitry AndricLLDBSwigPythonCallCommandObject 727130d950cSDimitry Andric( 728130d950cSDimitry Andric PyObject *implementor, 729130d950cSDimitry Andric lldb::DebuggerSP& debugger, 730130d950cSDimitry Andric const char* args, 731130d950cSDimitry Andric lldb_private::CommandReturnObject& cmd_retobj, 732130d950cSDimitry Andric lldb::ExecutionContextRefSP exe_ctx_ref_sp 733130d950cSDimitry Andric) 734130d950cSDimitry Andric{ 735130d950cSDimitry Andric lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj); 736130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 737130d950cSDimitry Andric lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); 738130d950cSDimitry Andric 739130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 740130d950cSDimitry Andric 741130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 742130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("__call__"); 743130d950cSDimitry Andric 744130d950cSDimitry Andric if (!pfunc.IsAllocated()) 745130d950cSDimitry Andric return false; 746130d950cSDimitry Andric 747130d950cSDimitry Andric // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you 748130d950cSDimitry Andric // see comment above for SBCommandReturnObjectReleaser for further details 749130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 750130d950cSDimitry Andric PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); 751130d950cSDimitry Andric PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb)); 752130d950cSDimitry Andric 753130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg); 754130d950cSDimitry Andric 755130d950cSDimitry Andric return true; 756130d950cSDimitry Andric} 757130d950cSDimitry Andric 758130d950cSDimitry AndricSWIGEXPORT void* 759130d950cSDimitry AndricLLDBSWIGPythonCreateOSPlugin 760130d950cSDimitry Andric( 761130d950cSDimitry Andric const char *python_class_name, 762130d950cSDimitry Andric const char *session_dictionary_name, 763130d950cSDimitry Andric const lldb::ProcessSP& process_sp 764130d950cSDimitry Andric) 765130d950cSDimitry Andric{ 766130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 767130d950cSDimitry Andric Py_RETURN_NONE; 768130d950cSDimitry Andric 769130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 770130d950cSDimitry Andric 771130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 772130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 773130d950cSDimitry Andric 774130d950cSDimitry Andric if (!pfunc.IsAllocated()) 775130d950cSDimitry Andric Py_RETURN_NONE; 776130d950cSDimitry Andric 777130d950cSDimitry Andric // I do not want the SBProcess to be deallocated when going out of scope because python 778130d950cSDimitry Andric // has ownership of it and will manage memory for this object by itself 779130d950cSDimitry Andric lldb::SBProcess *process_sb = new lldb::SBProcess(process_sp); 780130d950cSDimitry Andric PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb)); 781130d950cSDimitry Andric if (!process_arg.IsAllocated()) 782130d950cSDimitry Andric Py_RETURN_NONE; 783130d950cSDimitry Andric 784130d950cSDimitry Andric auto result = pfunc(process_arg); 785130d950cSDimitry Andric 786130d950cSDimitry Andric if (result.IsAllocated()) 787130d950cSDimitry Andric return result.release(); 788130d950cSDimitry Andric 789130d950cSDimitry Andric Py_RETURN_NONE; 790130d950cSDimitry Andric} 791130d950cSDimitry Andric 792130d950cSDimitry AndricSWIGEXPORT void* 793130d950cSDimitry AndricLLDBSWIGPython_CreateFrameRecognizer 794130d950cSDimitry Andric( 795130d950cSDimitry Andric const char *python_class_name, 796130d950cSDimitry Andric const char *session_dictionary_name 797130d950cSDimitry Andric) 798130d950cSDimitry Andric{ 799130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 800130d950cSDimitry Andric Py_RETURN_NONE; 801130d950cSDimitry Andric 802130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 803130d950cSDimitry Andric 804130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 805130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 806130d950cSDimitry Andric 807130d950cSDimitry Andric if (!pfunc.IsAllocated()) 808130d950cSDimitry Andric Py_RETURN_NONE; 809130d950cSDimitry Andric 810130d950cSDimitry Andric auto result = pfunc(); 811130d950cSDimitry Andric 812130d950cSDimitry Andric if (result.IsAllocated()) 813130d950cSDimitry Andric return result.release(); 814130d950cSDimitry Andric 815130d950cSDimitry Andric Py_RETURN_NONE; 816130d950cSDimitry Andric} 817130d950cSDimitry Andric 818130d950cSDimitry AndricSWIGEXPORT PyObject* 819130d950cSDimitry AndricLLDBSwigPython_GetRecognizedArguments 820130d950cSDimitry Andric( 821130d950cSDimitry Andric PyObject *implementor, 822130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp 823130d950cSDimitry Andric) 824130d950cSDimitry Andric{ 825130d950cSDimitry Andric static char callee_name[] = "get_recognized_arguments"; 826130d950cSDimitry Andric 827130d950cSDimitry Andric lldb::SBFrame frame_sb(frame_sp); 828130d950cSDimitry Andric PyObject *arg = SBTypeToSWIGWrapper(frame_sb); 829130d950cSDimitry Andric 830130d950cSDimitry Andric PythonString str(callee_name); 831130d950cSDimitry Andric PyObject* result = PyObject_CallMethodObjArgs(implementor, str.get(), arg, 832130d950cSDimitry Andric NULL); 833130d950cSDimitry Andric return result; 834130d950cSDimitry Andric} 835130d950cSDimitry Andric 836130d950cSDimitry AndricSWIGEXPORT void* 837130d950cSDimitry AndricLLDBSWIGPython_GetDynamicSetting (void* module, const char* setting, const lldb::TargetSP& target_sp) 838130d950cSDimitry Andric{ 839130d950cSDimitry Andric if (!module || !setting) 840130d950cSDimitry Andric Py_RETURN_NONE; 841130d950cSDimitry Andric 842130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 843130d950cSDimitry Andric PythonObject py_module(PyRefType::Borrowed, (PyObject *)module); 844130d950cSDimitry Andric auto pfunc = py_module.ResolveName<PythonCallable>("get_dynamic_setting"); 845130d950cSDimitry Andric 846130d950cSDimitry Andric if (!pfunc.IsAllocated()) 847130d950cSDimitry Andric Py_RETURN_NONE; 848130d950cSDimitry Andric 849130d950cSDimitry Andric lldb::SBTarget target_sb(target_sp); 850130d950cSDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb)); 851130d950cSDimitry Andric auto result = pfunc(target_arg, PythonString(setting)); 852130d950cSDimitry Andric 853130d950cSDimitry Andric return result.release(); 854130d950cSDimitry Andric} 855130d950cSDimitry Andric 856130d950cSDimitry AndricSWIGEXPORT bool 857130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordProcess 858130d950cSDimitry Andric(const char* python_function_name, 859130d950cSDimitry Andricconst char* session_dictionary_name, 860130d950cSDimitry Andriclldb::ProcessSP& process, 861130d950cSDimitry Andricstd::string& output) 862130d950cSDimitry Andric 863130d950cSDimitry Andric{ 864130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 865130d950cSDimitry Andric return false; 866130d950cSDimitry Andric 867130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 868130d950cSDimitry Andric 869130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 870130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 871130d950cSDimitry Andric 872130d950cSDimitry Andric if (!pfunc.IsAllocated()) 873130d950cSDimitry Andric return false; 874130d950cSDimitry Andric 875130d950cSDimitry Andric lldb::SBProcess process_sb(process); 876130d950cSDimitry Andric PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb)); 877130d950cSDimitry Andric auto result = pfunc(process_arg, dict); 878130d950cSDimitry Andric 879130d950cSDimitry Andric output = result.Str().GetString().str(); 880130d950cSDimitry Andric 881130d950cSDimitry Andric return true; 882130d950cSDimitry Andric} 883130d950cSDimitry Andric 884130d950cSDimitry AndricSWIGEXPORT bool 885130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordThread 886130d950cSDimitry Andric(const char* python_function_name, 887130d950cSDimitry Andricconst char* session_dictionary_name, 888130d950cSDimitry Andriclldb::ThreadSP& thread, 889130d950cSDimitry Andricstd::string& output) 890130d950cSDimitry Andric 891130d950cSDimitry Andric{ 892130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 893130d950cSDimitry Andric return false; 894130d950cSDimitry Andric 895130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 896130d950cSDimitry Andric 897130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 898130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 899130d950cSDimitry Andric 900130d950cSDimitry Andric if (!pfunc.IsAllocated()) 901130d950cSDimitry Andric return false; 902130d950cSDimitry Andric 903130d950cSDimitry Andric lldb::SBThread thread_sb(thread); 904130d950cSDimitry Andric PythonObject thread_arg(PyRefType::Owned, SBTypeToSWIGWrapper(thread_sb)); 905130d950cSDimitry Andric auto result = pfunc(thread_arg, dict); 906130d950cSDimitry Andric 907130d950cSDimitry Andric output = result.Str().GetString().str(); 908130d950cSDimitry Andric 909130d950cSDimitry Andric return true; 910130d950cSDimitry Andric} 911130d950cSDimitry Andric 912130d950cSDimitry AndricSWIGEXPORT bool 913130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordTarget 914130d950cSDimitry Andric(const char* python_function_name, 915130d950cSDimitry Andricconst char* session_dictionary_name, 916130d950cSDimitry Andriclldb::TargetSP& target, 917130d950cSDimitry Andricstd::string& output) 918130d950cSDimitry Andric 919130d950cSDimitry Andric{ 920130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 921130d950cSDimitry Andric return false; 922130d950cSDimitry Andric 923130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 924130d950cSDimitry Andric 925130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 926130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); 927130d950cSDimitry Andric 928130d950cSDimitry Andric if (!pfunc.IsAllocated()) 929130d950cSDimitry Andric return false; 930130d950cSDimitry Andric 931130d950cSDimitry Andric lldb::SBTarget target_sb(target); 932130d950cSDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb)); 933130d950cSDimitry Andric auto result = pfunc(target_arg, dict); 934130d950cSDimitry Andric 935130d950cSDimitry Andric output = result.Str().GetString().str(); 936130d950cSDimitry Andric 937130d950cSDimitry Andric return true; 938130d950cSDimitry Andric} 939130d950cSDimitry Andric 940130d950cSDimitry AndricSWIGEXPORT bool 941130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordFrame 942130d950cSDimitry Andric(const char* python_function_name, 943130d950cSDimitry Andricconst char* session_dictionary_name, 944130d950cSDimitry Andriclldb::StackFrameSP& frame, 945130d950cSDimitry Andricstd::string& output) 946130d950cSDimitry Andric 947130d950cSDimitry Andric{ 948130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 949130d950cSDimitry Andric return false; 950130d950cSDimitry Andric 951130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 952130d950cSDimitry Andric 953130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 954130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); 955130d950cSDimitry Andric 956130d950cSDimitry Andric if (!pfunc.IsAllocated()) 957130d950cSDimitry Andric return false; 958130d950cSDimitry Andric 959130d950cSDimitry Andric lldb::SBFrame frame_sb(frame); 960130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(frame_sb)); 961130d950cSDimitry Andric auto result = pfunc(frame_arg, dict); 962130d950cSDimitry Andric 963130d950cSDimitry Andric output = result.Str().GetString().str(); 964130d950cSDimitry Andric 965130d950cSDimitry Andric return true; 966130d950cSDimitry Andric} 967130d950cSDimitry Andric 968130d950cSDimitry AndricSWIGEXPORT bool 969130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordValue 970130d950cSDimitry Andric(const char* python_function_name, 971130d950cSDimitry Andricconst char* session_dictionary_name, 972130d950cSDimitry Andriclldb::ValueObjectSP& value, 973130d950cSDimitry Andricstd::string& output) 974130d950cSDimitry Andric 975130d950cSDimitry Andric{ 976130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 977130d950cSDimitry Andric return false; 978130d950cSDimitry Andric 979130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 980130d950cSDimitry Andric 981130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 982130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 983130d950cSDimitry Andric 984130d950cSDimitry Andric if (!pfunc.IsAllocated()) 985130d950cSDimitry Andric return false; 986130d950cSDimitry Andric 987130d950cSDimitry Andric lldb::SBValue value_sb(value); 988130d950cSDimitry Andric PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(value_sb)); 989130d950cSDimitry Andric auto result = pfunc(value_arg, dict); 990130d950cSDimitry Andric 991130d950cSDimitry Andric output = result.Str().GetString().str(); 992130d950cSDimitry Andric 993130d950cSDimitry Andric return true; 994130d950cSDimitry Andric} 995130d950cSDimitry Andric 996130d950cSDimitry AndricSWIGEXPORT bool 997130d950cSDimitry AndricLLDBSwigPythonCallModuleInit 998130d950cSDimitry Andric( 999130d950cSDimitry Andric const char *python_module_name, 1000130d950cSDimitry Andric const char *session_dictionary_name, 1001130d950cSDimitry Andric lldb::DebuggerSP& debugger 1002130d950cSDimitry Andric) 1003130d950cSDimitry Andric{ 1004130d950cSDimitry Andric std::string python_function_name_string = python_module_name; 1005130d950cSDimitry Andric python_function_name_string += ".__lldb_init_module"; 1006130d950cSDimitry Andric const char* python_function_name = python_function_name_string.c_str(); 1007130d950cSDimitry Andric 1008130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1009130d950cSDimitry Andric 1010130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1011130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1012130d950cSDimitry Andric 1013130d950cSDimitry Andric // This method is optional and need not exist. So if we don't find it, 1014130d950cSDimitry Andric // it's actually a success, not a failure. 1015130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1016130d950cSDimitry Andric return true; 1017130d950cSDimitry Andric 1018130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 1019130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 1020130d950cSDimitry Andric pfunc(debugger_arg, dict); 1021130d950cSDimitry Andric 1022130d950cSDimitry Andric return true; 1023130d950cSDimitry Andric} 1024130d950cSDimitry Andric%} 1025130d950cSDimitry Andric 1026130d950cSDimitry Andric 1027130d950cSDimitry Andric%runtime %{ 1028130d950cSDimitry Andric// Forward declaration to be inserted at the start of LLDBWrapPython.h 1029130d950cSDimitry Andric#include "lldb/API/SBDebugger.h" 1030130d950cSDimitry Andric#include "lldb/API/SBValue.h" 1031130d950cSDimitry Andric 1032130d950cSDimitry AndricSWIGEXPORT lldb::ValueObjectSP 1033130d950cSDimitry AndricLLDBSWIGPython_GetValueObjectSPFromSBValue (void* data) 1034130d950cSDimitry Andric{ 1035130d950cSDimitry Andric lldb::ValueObjectSP valobj_sp; 1036130d950cSDimitry Andric if (data) 1037130d950cSDimitry Andric { 1038130d950cSDimitry Andric lldb::SBValue* sb_ptr = (lldb::SBValue *)data; 1039130d950cSDimitry Andric valobj_sp = sb_ptr->GetSP(); 1040130d950cSDimitry Andric } 1041130d950cSDimitry Andric return valobj_sp; 1042130d950cSDimitry Andric} 1043130d950cSDimitry Andric 1044130d950cSDimitry Andric#ifdef __cplusplus 1045130d950cSDimitry Andricextern "C" { 1046130d950cSDimitry Andric#endif 1047130d950cSDimitry Andric 1048130d950cSDimitry Andricvoid LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton); 1049130d950cSDimitry Andric 1050130d950cSDimitry Andric#ifdef __cplusplus 1051130d950cSDimitry Andric} 1052130d950cSDimitry Andric#endif 1053130d950cSDimitry Andric%} 1054130d950cSDimitry Andric 1055130d950cSDimitry Andric%wrapper %{ 1056130d950cSDimitry Andric 1057130d950cSDimitry Andric 1058130d950cSDimitry Andric// For the LogOutputCallback functions 1059130d950cSDimitry Andricvoid LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) { 1060130d950cSDimitry Andric if (baton != Py_None) { 1061130d950cSDimitry Andric SWIG_PYTHON_THREAD_BEGIN_BLOCK; 1062130d950cSDimitry Andric PyObject *result = PyObject_CallFunction(reinterpret_cast<PyObject*>(baton), const_cast<char*>("s"), str); 1063130d950cSDimitry Andric Py_XDECREF(result); 1064130d950cSDimitry Andric SWIG_PYTHON_THREAD_END_BLOCK; 1065130d950cSDimitry Andric } 1066130d950cSDimitry Andric} 1067130d950cSDimitry Andric%} 1068