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 275130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 276130d950cSDimitry Andric 277130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 278130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 279130d950cSDimitry Andric 280130d950cSDimitry Andric if (!pfunc.IsAllocated()) { 281130d950cSDimitry Andric error_string.append("could not find script class: "); 282130d950cSDimitry Andric error_string.append(python_class_name); 283130d950cSDimitry Andric return nullptr; 284130d950cSDimitry Andric } 285130d950cSDimitry Andric 286*e8d8bef9SDimitry Andric // I do not want the SBThreadPlan to be deallocated when going out of scope 287*e8d8bef9SDimitry Andric // because python has ownership of it and will manage memory for this 288*e8d8bef9SDimitry Andric // object by itself 289*e8d8bef9SDimitry Andric PythonObject tp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBThreadPlan(thread_plan_sp))); 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) { 315*e8d8bef9SDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBStructuredData(args_impl))); 316130d950cSDimitry Andric result = pfunc(tp_arg, args_arg, dict); 317130d950cSDimitry Andric } else { 318130d950cSDimitry Andric error_string.assign("wrong number of arguments in __init__, should be 2 or 3 (not including self)"); 319130d950cSDimitry Andric Py_RETURN_NONE; 320130d950cSDimitry Andric } 321130d950cSDimitry Andric 322130d950cSDimitry Andric // FIXME: At this point we should check that the class we found supports all the methods 323130d950cSDimitry Andric // that we need. 324130d950cSDimitry Andric 325130d950cSDimitry Andric if (result.IsAllocated()) 326130d950cSDimitry Andric return result.release(); 327130d950cSDimitry Andric Py_RETURN_NONE; 328130d950cSDimitry Andric} 329130d950cSDimitry Andric 330130d950cSDimitry AndricSWIGEXPORT bool 331130d950cSDimitry AndricLLDBSWIGPythonCallThreadPlan 332130d950cSDimitry Andric( 333130d950cSDimitry Andric void *implementor, 334130d950cSDimitry Andric const char *method_name, 335130d950cSDimitry Andric lldb_private::Event *event, 336130d950cSDimitry Andric bool &got_error 337130d950cSDimitry Andric) 338130d950cSDimitry Andric{ 339130d950cSDimitry Andric got_error = false; 340130d950cSDimitry Andric 341130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 342130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 343130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(method_name); 344130d950cSDimitry Andric 345130d950cSDimitry Andric if (!pfunc.IsAllocated()) 346130d950cSDimitry Andric return false; 347130d950cSDimitry Andric 348130d950cSDimitry Andric PythonObject result; 349130d950cSDimitry Andric if (event != nullptr) 350130d950cSDimitry Andric { 351130d950cSDimitry Andric lldb::SBEvent sb_event(event); 352130d950cSDimitry Andric PythonObject event_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_event)); 353130d950cSDimitry Andric result = pfunc(event_arg); 354130d950cSDimitry Andric } 355130d950cSDimitry Andric else 356130d950cSDimitry Andric result = pfunc(); 357130d950cSDimitry Andric 358130d950cSDimitry Andric if (PyErr_Occurred()) 359130d950cSDimitry Andric { 360130d950cSDimitry Andric got_error = true; 361130d950cSDimitry Andric printf ("Return value was neither false nor true for call to %s.\n", method_name); 362130d950cSDimitry Andric PyErr_Print(); 363130d950cSDimitry Andric return false; 364130d950cSDimitry Andric } 365130d950cSDimitry Andric 366130d950cSDimitry Andric if (result.get() == Py_True) 367130d950cSDimitry Andric return true; 368130d950cSDimitry Andric else if (result.get() == Py_False) 369130d950cSDimitry Andric return false; 370130d950cSDimitry Andric 371130d950cSDimitry Andric // Somebody returned the wrong thing... 372130d950cSDimitry Andric got_error = true; 373130d950cSDimitry Andric printf ("Wrong return value type for call to %s.\n", method_name); 374130d950cSDimitry Andric return false; 375130d950cSDimitry Andric} 376130d950cSDimitry Andric 377130d950cSDimitry AndricSWIGEXPORT void * 378130d950cSDimitry AndricLLDBSwigPythonCreateScriptedBreakpointResolver 379130d950cSDimitry Andric( 380130d950cSDimitry Andric const char *python_class_name, 381130d950cSDimitry Andric const char *session_dictionary_name, 382130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl, 383130d950cSDimitry Andric lldb::BreakpointSP &breakpoint_sp 384130d950cSDimitry Andric) 385130d950cSDimitry Andric{ 386130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 387130d950cSDimitry Andric Py_RETURN_NONE; 388130d950cSDimitry Andric 389130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 390130d950cSDimitry Andric 391130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 392130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 393130d950cSDimitry Andric 394130d950cSDimitry Andric if (!pfunc.IsAllocated()) 395130d950cSDimitry Andric return nullptr; 396130d950cSDimitry Andric 397130d950cSDimitry Andric lldb::SBBreakpoint *bkpt_value = new lldb::SBBreakpoint(breakpoint_sp); 398130d950cSDimitry Andric 399130d950cSDimitry Andric PythonObject bkpt_arg(PyRefType::Owned, SBTypeToSWIGWrapper(bkpt_value)); 400130d950cSDimitry Andric 401130d950cSDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 402130d950cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); 403130d950cSDimitry Andric 404130d950cSDimitry Andric PythonObject result = pfunc(bkpt_arg, args_arg, dict); 405130d950cSDimitry Andric // FIXME: At this point we should check that the class we found supports all the methods 406130d950cSDimitry Andric // that we need. 407130d950cSDimitry Andric 408130d950cSDimitry Andric if (result.IsAllocated()) 409130d950cSDimitry Andric { 410130d950cSDimitry Andric // Check that __callback__ is defined: 411130d950cSDimitry Andric auto callback_func = result.ResolveName<PythonCallable>("__callback__"); 412130d950cSDimitry Andric if (callback_func.IsAllocated()) 413130d950cSDimitry Andric return result.release(); 414130d950cSDimitry Andric else 415130d950cSDimitry Andric result.release(); 416130d950cSDimitry Andric } 417130d950cSDimitry Andric Py_RETURN_NONE; 418130d950cSDimitry Andric} 419130d950cSDimitry Andric 420130d950cSDimitry AndricSWIGEXPORT unsigned int 421130d950cSDimitry AndricLLDBSwigPythonCallBreakpointResolver 422130d950cSDimitry Andric( 423130d950cSDimitry Andric void *implementor, 424130d950cSDimitry Andric const char *method_name, 425130d950cSDimitry Andric lldb_private::SymbolContext *sym_ctx 426130d950cSDimitry Andric) 427130d950cSDimitry Andric{ 428130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 429130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 430130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(method_name); 431130d950cSDimitry Andric 432130d950cSDimitry Andric if (!pfunc.IsAllocated()) 433130d950cSDimitry Andric return 0; 434130d950cSDimitry Andric 435130d950cSDimitry Andric PythonObject result; 436130d950cSDimitry Andric if (sym_ctx != nullptr) { 437130d950cSDimitry Andric lldb::SBSymbolContext sb_sym_ctx(sym_ctx); 438130d950cSDimitry Andric PythonObject sym_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_sym_ctx)); 439130d950cSDimitry Andric result = pfunc(sym_ctx_arg); 440130d950cSDimitry Andric } else 441130d950cSDimitry Andric result = pfunc(); 442130d950cSDimitry Andric 443130d950cSDimitry Andric if (PyErr_Occurred()) 444130d950cSDimitry Andric { 445130d950cSDimitry Andric PyErr_Print(); 4465ffd83dbSDimitry Andric PyErr_Clear(); 447130d950cSDimitry Andric return 0; 448130d950cSDimitry Andric } 449130d950cSDimitry Andric 450130d950cSDimitry Andric // The callback will return a bool, but we're need to also return ints 451130d950cSDimitry Andric // so we're squirrelling the bool through as an int... And if you return 452130d950cSDimitry Andric // nothing, we'll continue. 453130d950cSDimitry Andric if (strcmp(method_name, "__callback__") == 0) { 454130d950cSDimitry Andric if (result.get() == Py_False) 455130d950cSDimitry Andric return 0; 456130d950cSDimitry Andric else 457130d950cSDimitry Andric return 1; 458130d950cSDimitry Andric } 459130d950cSDimitry Andric 4605ffd83dbSDimitry Andric long long ret_val = unwrapOrSetPythonException(As<long long>(result)); 461130d950cSDimitry Andric 4625ffd83dbSDimitry Andric if (PyErr_Occurred()) { 4635ffd83dbSDimitry Andric PyErr_Print(); 4645ffd83dbSDimitry Andric PyErr_Clear(); 4655ffd83dbSDimitry Andric return 0; 4665ffd83dbSDimitry Andric } 467130d950cSDimitry Andric 468130d950cSDimitry Andric return ret_val; 469130d950cSDimitry Andric} 470130d950cSDimitry Andric 471*e8d8bef9SDimitry AndricSWIGEXPORT void * 472*e8d8bef9SDimitry AndricLLDBSwigPythonCreateScriptedStopHook 473*e8d8bef9SDimitry Andric( 474*e8d8bef9SDimitry Andric lldb::TargetSP target_sp, 475*e8d8bef9SDimitry Andric const char *python_class_name, 476*e8d8bef9SDimitry Andric const char *session_dictionary_name, 477*e8d8bef9SDimitry Andric lldb_private::StructuredDataImpl *args_impl, 478*e8d8bef9SDimitry Andric Status &error 479*e8d8bef9SDimitry Andric) 480*e8d8bef9SDimitry Andric{ 481*e8d8bef9SDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0') { 482*e8d8bef9SDimitry Andric error.SetErrorString("Empty class name."); 483*e8d8bef9SDimitry Andric Py_RETURN_NONE; 484*e8d8bef9SDimitry Andric } 485*e8d8bef9SDimitry Andric if (!session_dictionary_name) { 486*e8d8bef9SDimitry Andric error.SetErrorString("No session dictionary"); 487*e8d8bef9SDimitry Andric Py_RETURN_NONE; 488*e8d8bef9SDimitry Andric } 489*e8d8bef9SDimitry Andric 490*e8d8bef9SDimitry Andric PyErr_Cleaner py_err_cleaner(true); 491*e8d8bef9SDimitry Andric 492*e8d8bef9SDimitry Andric auto dict = 493*e8d8bef9SDimitry Andric PythonModule::MainModule().ResolveName<PythonDictionary>( 494*e8d8bef9SDimitry Andric session_dictionary_name); 495*e8d8bef9SDimitry Andric auto pfunc = 496*e8d8bef9SDimitry Andric PythonObject::ResolveNameWithDictionary<PythonCallable>( 497*e8d8bef9SDimitry Andric python_class_name, dict); 498*e8d8bef9SDimitry Andric 499*e8d8bef9SDimitry Andric if (!pfunc.IsAllocated()) { 500*e8d8bef9SDimitry Andric error.SetErrorStringWithFormat("Could not find class: %s.", 501*e8d8bef9SDimitry Andric python_class_name); 502*e8d8bef9SDimitry Andric return nullptr; 503*e8d8bef9SDimitry Andric } 504*e8d8bef9SDimitry Andric 505*e8d8bef9SDimitry Andric lldb::SBTarget *target_val 506*e8d8bef9SDimitry Andric = new lldb::SBTarget(target_sp); 507*e8d8bef9SDimitry Andric 508*e8d8bef9SDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_val)); 509*e8d8bef9SDimitry Andric 510*e8d8bef9SDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 511*e8d8bef9SDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); 512*e8d8bef9SDimitry Andric 513*e8d8bef9SDimitry Andric PythonObject result = pfunc(target_arg, args_arg, dict); 514*e8d8bef9SDimitry Andric 515*e8d8bef9SDimitry Andric if (result.IsAllocated()) 516*e8d8bef9SDimitry Andric { 517*e8d8bef9SDimitry Andric // Check that the handle_stop callback is defined: 518*e8d8bef9SDimitry Andric auto callback_func = result.ResolveName<PythonCallable>("handle_stop"); 519*e8d8bef9SDimitry Andric if (callback_func.IsAllocated()) { 520*e8d8bef9SDimitry Andric if (auto args_info = callback_func.GetArgInfo()) { 521*e8d8bef9SDimitry Andric size_t num_args = (*args_info).max_positional_args; 522*e8d8bef9SDimitry Andric if (num_args != 2) { 523*e8d8bef9SDimitry Andric error.SetErrorStringWithFormat("Wrong number of args for " 524*e8d8bef9SDimitry Andric "handle_stop callback, should be 2 (excluding self), got: %zu", 525*e8d8bef9SDimitry Andric num_args); 526*e8d8bef9SDimitry Andric Py_RETURN_NONE; 527*e8d8bef9SDimitry Andric } else 528*e8d8bef9SDimitry Andric return result.release(); 529*e8d8bef9SDimitry Andric } else { 530*e8d8bef9SDimitry Andric error.SetErrorString("Couldn't get num arguments for handle_stop " 531*e8d8bef9SDimitry Andric "callback."); 532*e8d8bef9SDimitry Andric Py_RETURN_NONE; 533*e8d8bef9SDimitry Andric } 534*e8d8bef9SDimitry Andric return result.release(); 535*e8d8bef9SDimitry Andric } 536*e8d8bef9SDimitry Andric else { 537*e8d8bef9SDimitry Andric error.SetErrorStringWithFormat("Class \"%s\" is missing the required " 538*e8d8bef9SDimitry Andric "handle_stop callback.", 539*e8d8bef9SDimitry Andric python_class_name); 540*e8d8bef9SDimitry Andric result.release(); 541*e8d8bef9SDimitry Andric } 542*e8d8bef9SDimitry Andric } 543*e8d8bef9SDimitry Andric Py_RETURN_NONE; 544*e8d8bef9SDimitry Andric} 545*e8d8bef9SDimitry Andric 546*e8d8bef9SDimitry AndricSWIGEXPORT bool 547*e8d8bef9SDimitry AndricLLDBSwigPythonStopHookCallHandleStop 548*e8d8bef9SDimitry Andric( 549*e8d8bef9SDimitry Andric void *implementor, 550*e8d8bef9SDimitry Andric lldb::ExecutionContextRefSP exc_ctx_sp, 551*e8d8bef9SDimitry Andric lldb::StreamSP stream 552*e8d8bef9SDimitry Andric) 553*e8d8bef9SDimitry Andric{ 554*e8d8bef9SDimitry Andric // handle_stop will return a bool with the meaning "should_stop"... 555*e8d8bef9SDimitry Andric // If you return nothing we'll assume we are going to stop. 556*e8d8bef9SDimitry Andric // Also any errors should return true, since we should stop on error. 557*e8d8bef9SDimitry Andric 558*e8d8bef9SDimitry Andric PyErr_Cleaner py_err_cleaner(false); 559*e8d8bef9SDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 560*e8d8bef9SDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("handle_stop"); 561*e8d8bef9SDimitry Andric 562*e8d8bef9SDimitry Andric if (!pfunc.IsAllocated()) 563*e8d8bef9SDimitry Andric return true; 564*e8d8bef9SDimitry Andric 565*e8d8bef9SDimitry Andric PythonObject result; 566*e8d8bef9SDimitry Andric lldb::SBExecutionContext sb_exc_ctx(exc_ctx_sp); 567*e8d8bef9SDimitry Andric PythonObject exc_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_exc_ctx)); 568*e8d8bef9SDimitry Andric lldb::SBStream sb_stream; 569*e8d8bef9SDimitry Andric PythonObject sb_stream_arg(PyRefType::Owned, 570*e8d8bef9SDimitry Andric SBTypeToSWIGWrapper(sb_stream)); 571*e8d8bef9SDimitry Andric result = pfunc(exc_ctx_arg, sb_stream_arg); 572*e8d8bef9SDimitry Andric 573*e8d8bef9SDimitry Andric if (PyErr_Occurred()) 574*e8d8bef9SDimitry Andric { 575*e8d8bef9SDimitry Andric stream->PutCString("Python error occurred handling stop-hook."); 576*e8d8bef9SDimitry Andric PyErr_Print(); 577*e8d8bef9SDimitry Andric PyErr_Clear(); 578*e8d8bef9SDimitry Andric return true; 579*e8d8bef9SDimitry Andric } 580*e8d8bef9SDimitry Andric 581*e8d8bef9SDimitry Andric // Now add the result to the output stream. SBStream only 582*e8d8bef9SDimitry Andric // makes an internally help StreamString which I can't interpose, so I 583*e8d8bef9SDimitry Andric // have to copy it over here. 584*e8d8bef9SDimitry Andric stream->PutCString(sb_stream.GetData()); 585*e8d8bef9SDimitry Andric 586*e8d8bef9SDimitry Andric if (result.get() == Py_False) 587*e8d8bef9SDimitry Andric return false; 588*e8d8bef9SDimitry Andric else 589*e8d8bef9SDimitry Andric return true; 590*e8d8bef9SDimitry Andric} 591*e8d8bef9SDimitry Andric 592130d950cSDimitry Andric// wrapper that calls an optional instance member of an object taking no arguments 593130d950cSDimitry Andricstatic PyObject* 594130d950cSDimitry AndricLLDBSwigPython_CallOptionalMember 595130d950cSDimitry Andric( 596130d950cSDimitry Andric PyObject* implementor, 597130d950cSDimitry Andric char* callee_name, 598130d950cSDimitry Andric PyObject* ret_if_not_found = Py_None, 599130d950cSDimitry Andric bool* was_found = NULL 600130d950cSDimitry Andric) 601130d950cSDimitry Andric{ 602130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 603130d950cSDimitry Andric 604130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 605130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(callee_name); 606130d950cSDimitry Andric 607130d950cSDimitry Andric if (!pfunc.IsAllocated()) 608130d950cSDimitry Andric { 609130d950cSDimitry Andric if (was_found) 610130d950cSDimitry Andric *was_found = false; 611130d950cSDimitry Andric Py_XINCREF(ret_if_not_found); 612130d950cSDimitry Andric return ret_if_not_found; 613130d950cSDimitry Andric } 614130d950cSDimitry Andric 615130d950cSDimitry Andric if (was_found) 616130d950cSDimitry Andric *was_found = true; 617130d950cSDimitry Andric 618130d950cSDimitry Andric PythonObject result = pfunc(); 619130d950cSDimitry Andric return result.release(); 620130d950cSDimitry Andric} 621130d950cSDimitry Andric 622130d950cSDimitry AndricSWIGEXPORT size_t 623130d950cSDimitry AndricLLDBSwigPython_CalculateNumChildren 624130d950cSDimitry Andric( 625130d950cSDimitry Andric PyObject *implementor, 626130d950cSDimitry Andric uint32_t max 627130d950cSDimitry Andric) 628130d950cSDimitry Andric{ 629130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 630130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("num_children"); 631130d950cSDimitry Andric 632130d950cSDimitry Andric if (!pfunc.IsAllocated()) 633130d950cSDimitry Andric return 0; 634130d950cSDimitry Andric 635130d950cSDimitry Andric auto arg_info = pfunc.GetArgInfo(); 636130d950cSDimitry Andric if (!arg_info) { 637130d950cSDimitry Andric llvm::consumeError(arg_info.takeError()); 638130d950cSDimitry Andric return 0; 639130d950cSDimitry Andric } 640130d950cSDimitry Andric 6415ffd83dbSDimitry Andric size_t ret_val; 642130d950cSDimitry Andric if (arg_info.get().max_positional_args < 1) 6435ffd83dbSDimitry Andric ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call())); 644130d950cSDimitry Andric else 6455ffd83dbSDimitry Andric ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call(PythonInteger(max)))); 646130d950cSDimitry Andric 6475ffd83dbSDimitry Andric if (PyErr_Occurred()) 648130d950cSDimitry Andric { 649130d950cSDimitry Andric PyErr_Print(); 650130d950cSDimitry Andric PyErr_Clear(); 6515ffd83dbSDimitry Andric return 0; 652130d950cSDimitry Andric } 653130d950cSDimitry Andric 654130d950cSDimitry Andric if (arg_info.get().max_positional_args < 1) 655130d950cSDimitry Andric ret_val = std::min(ret_val, static_cast<size_t>(max)); 656130d950cSDimitry Andric 657130d950cSDimitry Andric return ret_val; 658130d950cSDimitry Andric} 659130d950cSDimitry Andric 660130d950cSDimitry AndricSWIGEXPORT PyObject* 661130d950cSDimitry AndricLLDBSwigPython_GetChildAtIndex 662130d950cSDimitry Andric( 663130d950cSDimitry Andric PyObject *implementor, 664130d950cSDimitry Andric uint32_t idx 665130d950cSDimitry Andric) 666130d950cSDimitry Andric{ 667130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 668130d950cSDimitry Andric 669130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 670130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("get_child_at_index"); 671130d950cSDimitry Andric 672130d950cSDimitry Andric if (!pfunc.IsAllocated()) 673130d950cSDimitry Andric return nullptr; 674130d950cSDimitry Andric 675130d950cSDimitry Andric PythonObject result = pfunc(PythonInteger(idx)); 676130d950cSDimitry Andric 677130d950cSDimitry Andric if (!result.IsAllocated()) 678130d950cSDimitry Andric return nullptr; 679130d950cSDimitry Andric 680130d950cSDimitry Andric lldb::SBValue* sbvalue_ptr = nullptr; 681130d950cSDimitry Andric if (SWIG_ConvertPtr(result.get(), (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) 682130d950cSDimitry Andric return nullptr; 683130d950cSDimitry Andric 684130d950cSDimitry Andric if (sbvalue_ptr == nullptr) 685130d950cSDimitry Andric return nullptr; 686130d950cSDimitry Andric 687130d950cSDimitry Andric return result.release(); 688130d950cSDimitry Andric} 689130d950cSDimitry Andric 690130d950cSDimitry AndricSWIGEXPORT int 691130d950cSDimitry AndricLLDBSwigPython_GetIndexOfChildWithName 692130d950cSDimitry Andric( 693130d950cSDimitry Andric PyObject *implementor, 694130d950cSDimitry Andric const char* child_name 695130d950cSDimitry Andric) 696130d950cSDimitry Andric{ 697130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 698130d950cSDimitry Andric 699130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 700130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("get_child_index"); 701130d950cSDimitry Andric 702130d950cSDimitry Andric if (!pfunc.IsAllocated()) 703130d950cSDimitry Andric return UINT32_MAX; 704130d950cSDimitry Andric 7055ffd83dbSDimitry Andric llvm::Expected<PythonObject> result = pfunc.Call(PythonString(child_name)); 706130d950cSDimitry Andric 7075ffd83dbSDimitry Andric long long retval = unwrapOrSetPythonException(As<long long>(std::move(result))); 7085ffd83dbSDimitry Andric 7095ffd83dbSDimitry Andric if (PyErr_Occurred()) { 7105ffd83dbSDimitry Andric PyErr_Clear(); // FIXME print this? do something else 711130d950cSDimitry Andric return UINT32_MAX; 7125ffd83dbSDimitry Andric } 713130d950cSDimitry Andric 714130d950cSDimitry Andric if (retval >= 0) 715130d950cSDimitry Andric return (uint32_t)retval; 716130d950cSDimitry Andric 717130d950cSDimitry Andric return UINT32_MAX; 718130d950cSDimitry Andric} 719130d950cSDimitry Andric 720130d950cSDimitry AndricSWIGEXPORT bool 721130d950cSDimitry AndricLLDBSwigPython_UpdateSynthProviderInstance 722130d950cSDimitry Andric( 723130d950cSDimitry Andric PyObject *implementor 724130d950cSDimitry Andric) 725130d950cSDimitry Andric{ 726130d950cSDimitry Andric bool ret_val = false; 727130d950cSDimitry Andric 728130d950cSDimitry Andric static char callee_name[] = "update"; 729130d950cSDimitry Andric 730130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name); 731130d950cSDimitry Andric 732130d950cSDimitry Andric if (py_return == Py_True) 733130d950cSDimitry Andric ret_val = true; 734130d950cSDimitry Andric 735130d950cSDimitry Andric Py_XDECREF(py_return); 736130d950cSDimitry Andric 737130d950cSDimitry Andric return ret_val; 738130d950cSDimitry Andric} 739130d950cSDimitry Andric 740130d950cSDimitry AndricSWIGEXPORT bool 741130d950cSDimitry AndricLLDBSwigPython_MightHaveChildrenSynthProviderInstance 742130d950cSDimitry Andric( 743130d950cSDimitry Andric PyObject *implementor 744130d950cSDimitry Andric) 745130d950cSDimitry Andric{ 746130d950cSDimitry Andric bool ret_val = false; 747130d950cSDimitry Andric 748130d950cSDimitry Andric static char callee_name[] = "has_children"; 749130d950cSDimitry Andric 750130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True); 751130d950cSDimitry Andric 752130d950cSDimitry Andric if (py_return == Py_True) 753130d950cSDimitry Andric ret_val = true; 754130d950cSDimitry Andric 755130d950cSDimitry Andric Py_XDECREF(py_return); 756130d950cSDimitry Andric 757130d950cSDimitry Andric return ret_val; 758130d950cSDimitry Andric} 759130d950cSDimitry Andric 760130d950cSDimitry AndricSWIGEXPORT PyObject* 761130d950cSDimitry AndricLLDBSwigPython_GetValueSynthProviderInstance 762130d950cSDimitry Andric( 763130d950cSDimitry Andric PyObject *implementor 764130d950cSDimitry Andric) 765130d950cSDimitry Andric{ 766130d950cSDimitry Andric PyObject* ret_val = nullptr; 767130d950cSDimitry Andric 768130d950cSDimitry Andric static char callee_name[] = "get_value"; 769130d950cSDimitry Andric 770130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_None); 771130d950cSDimitry Andric 772130d950cSDimitry Andric if (py_return == Py_None || py_return == nullptr) 773130d950cSDimitry Andric ret_val = nullptr; 774130d950cSDimitry Andric 775130d950cSDimitry Andric lldb::SBValue* sbvalue_ptr = NULL; 776130d950cSDimitry Andric 777130d950cSDimitry Andric if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) 778130d950cSDimitry Andric ret_val = nullptr; 779130d950cSDimitry Andric else if (sbvalue_ptr == NULL) 780130d950cSDimitry Andric ret_val = nullptr; 781130d950cSDimitry Andric else 782130d950cSDimitry Andric ret_val = py_return; 783130d950cSDimitry Andric 784130d950cSDimitry Andric Py_XDECREF(py_return); 785130d950cSDimitry Andric return ret_val; 786130d950cSDimitry Andric} 787130d950cSDimitry Andric 788130d950cSDimitry AndricSWIGEXPORT void* 789130d950cSDimitry AndricLLDBSWIGPython_CastPyObjectToSBValue 790130d950cSDimitry Andric( 791130d950cSDimitry Andric PyObject* data 792130d950cSDimitry Andric) 793130d950cSDimitry Andric{ 794130d950cSDimitry Andric lldb::SBValue* sb_ptr = NULL; 795130d950cSDimitry Andric 796130d950cSDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0); 797130d950cSDimitry Andric 798130d950cSDimitry Andric if (valid_cast == -1) 799130d950cSDimitry Andric return NULL; 800130d950cSDimitry Andric 801130d950cSDimitry Andric return sb_ptr; 802130d950cSDimitry Andric} 803130d950cSDimitry Andric 804130d950cSDimitry AndricSWIGEXPORT bool 805130d950cSDimitry AndricLLDBSwigPythonCallCommand 806130d950cSDimitry Andric( 807130d950cSDimitry Andric const char *python_function_name, 808130d950cSDimitry Andric const char *session_dictionary_name, 809130d950cSDimitry Andric lldb::DebuggerSP& debugger, 810130d950cSDimitry Andric const char* args, 811130d950cSDimitry Andric lldb_private::CommandReturnObject& cmd_retobj, 812130d950cSDimitry Andric lldb::ExecutionContextRefSP exe_ctx_ref_sp 813130d950cSDimitry Andric) 814130d950cSDimitry Andric{ 815130d950cSDimitry Andric lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj); 816130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 817130d950cSDimitry Andric lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); 818130d950cSDimitry Andric 819130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 820130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 821130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 822130d950cSDimitry Andric 823130d950cSDimitry Andric if (!pfunc.IsAllocated()) 824130d950cSDimitry Andric return false; 825130d950cSDimitry Andric 826130d950cSDimitry Andric // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you 827130d950cSDimitry Andric // see comment above for SBCommandReturnObjectReleaser for further details 828130d950cSDimitry Andric auto argc = pfunc.GetArgInfo(); 829130d950cSDimitry Andric if (!argc) { 830130d950cSDimitry Andric llvm::consumeError(argc.takeError()); 831130d950cSDimitry Andric return false; 832130d950cSDimitry Andric } 833130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 834130d950cSDimitry Andric PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); 835130d950cSDimitry Andric PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb)); 836130d950cSDimitry Andric 837130d950cSDimitry Andric if (argc.get().max_positional_args < 5u) 838130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), cmd_retobj_arg, dict); 839130d950cSDimitry Andric else 840130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg, dict); 841130d950cSDimitry Andric 842130d950cSDimitry Andric return true; 843130d950cSDimitry Andric} 844130d950cSDimitry Andric 845130d950cSDimitry AndricSWIGEXPORT bool 846130d950cSDimitry AndricLLDBSwigPythonCallCommandObject 847130d950cSDimitry Andric( 848130d950cSDimitry Andric PyObject *implementor, 849130d950cSDimitry Andric lldb::DebuggerSP& debugger, 850130d950cSDimitry Andric const char* args, 851130d950cSDimitry Andric lldb_private::CommandReturnObject& cmd_retobj, 852130d950cSDimitry Andric lldb::ExecutionContextRefSP exe_ctx_ref_sp 853130d950cSDimitry Andric) 854130d950cSDimitry Andric{ 855130d950cSDimitry Andric lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj); 856130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 857130d950cSDimitry Andric lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); 858130d950cSDimitry Andric 859130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 860130d950cSDimitry Andric 861130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 862130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("__call__"); 863130d950cSDimitry Andric 864130d950cSDimitry Andric if (!pfunc.IsAllocated()) 865130d950cSDimitry Andric return false; 866130d950cSDimitry Andric 867130d950cSDimitry Andric // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you 868130d950cSDimitry Andric // see comment above for SBCommandReturnObjectReleaser for further details 869130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 870130d950cSDimitry Andric PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); 871130d950cSDimitry Andric PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb)); 872130d950cSDimitry Andric 873130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg); 874130d950cSDimitry Andric 875130d950cSDimitry Andric return true; 876130d950cSDimitry Andric} 877130d950cSDimitry Andric 878130d950cSDimitry AndricSWIGEXPORT void* 879130d950cSDimitry AndricLLDBSWIGPythonCreateOSPlugin 880130d950cSDimitry Andric( 881130d950cSDimitry Andric const char *python_class_name, 882130d950cSDimitry Andric const char *session_dictionary_name, 883130d950cSDimitry Andric const lldb::ProcessSP& process_sp 884130d950cSDimitry Andric) 885130d950cSDimitry Andric{ 886130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 887130d950cSDimitry Andric Py_RETURN_NONE; 888130d950cSDimitry Andric 889130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 890130d950cSDimitry Andric 891130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 892130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 893130d950cSDimitry Andric 894130d950cSDimitry Andric if (!pfunc.IsAllocated()) 895130d950cSDimitry Andric Py_RETURN_NONE; 896130d950cSDimitry Andric 897130d950cSDimitry Andric // I do not want the SBProcess to be deallocated when going out of scope because python 898130d950cSDimitry Andric // has ownership of it and will manage memory for this object by itself 899130d950cSDimitry Andric lldb::SBProcess *process_sb = new lldb::SBProcess(process_sp); 900130d950cSDimitry Andric PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb)); 901130d950cSDimitry Andric if (!process_arg.IsAllocated()) 902130d950cSDimitry Andric Py_RETURN_NONE; 903130d950cSDimitry Andric 904130d950cSDimitry Andric auto result = pfunc(process_arg); 905130d950cSDimitry Andric 906130d950cSDimitry Andric if (result.IsAllocated()) 907130d950cSDimitry Andric return result.release(); 908130d950cSDimitry Andric 909130d950cSDimitry Andric Py_RETURN_NONE; 910130d950cSDimitry Andric} 911130d950cSDimitry Andric 912130d950cSDimitry AndricSWIGEXPORT void* 913130d950cSDimitry AndricLLDBSWIGPython_CreateFrameRecognizer 914130d950cSDimitry Andric( 915130d950cSDimitry Andric const char *python_class_name, 916130d950cSDimitry Andric const char *session_dictionary_name 917130d950cSDimitry Andric) 918130d950cSDimitry Andric{ 919130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 920130d950cSDimitry Andric Py_RETURN_NONE; 921130d950cSDimitry Andric 922130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 923130d950cSDimitry Andric 924130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 925130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 926130d950cSDimitry Andric 927130d950cSDimitry Andric if (!pfunc.IsAllocated()) 928130d950cSDimitry Andric Py_RETURN_NONE; 929130d950cSDimitry Andric 930130d950cSDimitry Andric auto result = pfunc(); 931130d950cSDimitry Andric 932130d950cSDimitry Andric if (result.IsAllocated()) 933130d950cSDimitry Andric return result.release(); 934130d950cSDimitry Andric 935130d950cSDimitry Andric Py_RETURN_NONE; 936130d950cSDimitry Andric} 937130d950cSDimitry Andric 938130d950cSDimitry AndricSWIGEXPORT PyObject* 939130d950cSDimitry AndricLLDBSwigPython_GetRecognizedArguments 940130d950cSDimitry Andric( 941130d950cSDimitry Andric PyObject *implementor, 942130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp 943130d950cSDimitry Andric) 944130d950cSDimitry Andric{ 945130d950cSDimitry Andric static char callee_name[] = "get_recognized_arguments"; 946130d950cSDimitry Andric 947130d950cSDimitry Andric lldb::SBFrame frame_sb(frame_sp); 948130d950cSDimitry Andric PyObject *arg = SBTypeToSWIGWrapper(frame_sb); 949130d950cSDimitry Andric 950130d950cSDimitry Andric PythonString str(callee_name); 951130d950cSDimitry Andric PyObject* result = PyObject_CallMethodObjArgs(implementor, str.get(), arg, 952130d950cSDimitry Andric NULL); 953130d950cSDimitry Andric return result; 954130d950cSDimitry Andric} 955130d950cSDimitry Andric 956130d950cSDimitry AndricSWIGEXPORT void* 957130d950cSDimitry AndricLLDBSWIGPython_GetDynamicSetting (void* module, const char* setting, const lldb::TargetSP& target_sp) 958130d950cSDimitry Andric{ 959130d950cSDimitry Andric if (!module || !setting) 960130d950cSDimitry Andric Py_RETURN_NONE; 961130d950cSDimitry Andric 962130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 963130d950cSDimitry Andric PythonObject py_module(PyRefType::Borrowed, (PyObject *)module); 964130d950cSDimitry Andric auto pfunc = py_module.ResolveName<PythonCallable>("get_dynamic_setting"); 965130d950cSDimitry Andric 966130d950cSDimitry Andric if (!pfunc.IsAllocated()) 967130d950cSDimitry Andric Py_RETURN_NONE; 968130d950cSDimitry Andric 969130d950cSDimitry Andric lldb::SBTarget target_sb(target_sp); 970130d950cSDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb)); 971130d950cSDimitry Andric auto result = pfunc(target_arg, PythonString(setting)); 972130d950cSDimitry Andric 973130d950cSDimitry Andric return result.release(); 974130d950cSDimitry Andric} 975130d950cSDimitry Andric 976130d950cSDimitry AndricSWIGEXPORT bool 977130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordProcess 978130d950cSDimitry Andric(const char* python_function_name, 979130d950cSDimitry Andricconst char* session_dictionary_name, 980130d950cSDimitry Andriclldb::ProcessSP& process, 981130d950cSDimitry Andricstd::string& output) 982130d950cSDimitry Andric 983130d950cSDimitry Andric{ 984130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 985130d950cSDimitry Andric return false; 986130d950cSDimitry Andric 987130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 988130d950cSDimitry Andric 989130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 990130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 991130d950cSDimitry Andric 992130d950cSDimitry Andric if (!pfunc.IsAllocated()) 993130d950cSDimitry Andric return false; 994130d950cSDimitry Andric 995130d950cSDimitry Andric lldb::SBProcess process_sb(process); 996130d950cSDimitry Andric PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb)); 997130d950cSDimitry Andric auto result = pfunc(process_arg, dict); 998130d950cSDimitry Andric 999130d950cSDimitry Andric output = result.Str().GetString().str(); 1000130d950cSDimitry Andric 1001130d950cSDimitry Andric return true; 1002130d950cSDimitry Andric} 1003130d950cSDimitry Andric 1004130d950cSDimitry AndricSWIGEXPORT bool 1005130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordThread 1006130d950cSDimitry Andric(const char* python_function_name, 1007130d950cSDimitry Andricconst char* session_dictionary_name, 1008130d950cSDimitry Andriclldb::ThreadSP& thread, 1009130d950cSDimitry Andricstd::string& output) 1010130d950cSDimitry Andric 1011130d950cSDimitry Andric{ 1012130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1013130d950cSDimitry Andric return false; 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_function_name, dict); 1019130d950cSDimitry Andric 1020130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1021130d950cSDimitry Andric return false; 1022130d950cSDimitry Andric 1023130d950cSDimitry Andric lldb::SBThread thread_sb(thread); 1024130d950cSDimitry Andric PythonObject thread_arg(PyRefType::Owned, SBTypeToSWIGWrapper(thread_sb)); 1025130d950cSDimitry Andric auto result = pfunc(thread_arg, dict); 1026130d950cSDimitry Andric 1027130d950cSDimitry Andric output = result.Str().GetString().str(); 1028130d950cSDimitry Andric 1029130d950cSDimitry Andric return true; 1030130d950cSDimitry Andric} 1031130d950cSDimitry Andric 1032130d950cSDimitry AndricSWIGEXPORT bool 1033130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordTarget 1034130d950cSDimitry Andric(const char* python_function_name, 1035130d950cSDimitry Andricconst char* session_dictionary_name, 1036130d950cSDimitry Andriclldb::TargetSP& target, 1037130d950cSDimitry Andricstd::string& output) 1038130d950cSDimitry Andric 1039130d950cSDimitry Andric{ 1040130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1041130d950cSDimitry Andric return false; 1042130d950cSDimitry Andric 1043130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1044130d950cSDimitry Andric 1045130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1046130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); 1047130d950cSDimitry Andric 1048130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1049130d950cSDimitry Andric return false; 1050130d950cSDimitry Andric 1051130d950cSDimitry Andric lldb::SBTarget target_sb(target); 1052130d950cSDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb)); 1053130d950cSDimitry Andric auto result = pfunc(target_arg, dict); 1054130d950cSDimitry Andric 1055130d950cSDimitry Andric output = result.Str().GetString().str(); 1056130d950cSDimitry Andric 1057130d950cSDimitry Andric return true; 1058130d950cSDimitry Andric} 1059130d950cSDimitry Andric 1060130d950cSDimitry AndricSWIGEXPORT bool 1061130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordFrame 1062130d950cSDimitry Andric(const char* python_function_name, 1063130d950cSDimitry Andricconst char* session_dictionary_name, 1064130d950cSDimitry Andriclldb::StackFrameSP& frame, 1065130d950cSDimitry Andricstd::string& output) 1066130d950cSDimitry Andric 1067130d950cSDimitry Andric{ 1068130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1069130d950cSDimitry Andric return false; 1070130d950cSDimitry Andric 1071130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1072130d950cSDimitry Andric 1073130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1074130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); 1075130d950cSDimitry Andric 1076130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1077130d950cSDimitry Andric return false; 1078130d950cSDimitry Andric 1079130d950cSDimitry Andric lldb::SBFrame frame_sb(frame); 1080130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(frame_sb)); 1081130d950cSDimitry Andric auto result = pfunc(frame_arg, dict); 1082130d950cSDimitry Andric 1083130d950cSDimitry Andric output = result.Str().GetString().str(); 1084130d950cSDimitry Andric 1085130d950cSDimitry Andric return true; 1086130d950cSDimitry Andric} 1087130d950cSDimitry Andric 1088130d950cSDimitry AndricSWIGEXPORT bool 1089130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordValue 1090130d950cSDimitry Andric(const char* python_function_name, 1091130d950cSDimitry Andricconst char* session_dictionary_name, 1092130d950cSDimitry Andriclldb::ValueObjectSP& value, 1093130d950cSDimitry Andricstd::string& output) 1094130d950cSDimitry Andric 1095130d950cSDimitry Andric{ 1096130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1097130d950cSDimitry Andric return false; 1098130d950cSDimitry Andric 1099130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1100130d950cSDimitry Andric 1101130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1102130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1103130d950cSDimitry Andric 1104130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1105130d950cSDimitry Andric return false; 1106130d950cSDimitry Andric 1107130d950cSDimitry Andric lldb::SBValue value_sb(value); 1108130d950cSDimitry Andric PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(value_sb)); 1109130d950cSDimitry Andric auto result = pfunc(value_arg, dict); 1110130d950cSDimitry Andric 1111130d950cSDimitry Andric output = result.Str().GetString().str(); 1112130d950cSDimitry Andric 1113130d950cSDimitry Andric return true; 1114130d950cSDimitry Andric} 1115130d950cSDimitry Andric 1116130d950cSDimitry AndricSWIGEXPORT bool 1117130d950cSDimitry AndricLLDBSwigPythonCallModuleInit 1118130d950cSDimitry Andric( 1119130d950cSDimitry Andric const char *python_module_name, 1120130d950cSDimitry Andric const char *session_dictionary_name, 1121130d950cSDimitry Andric lldb::DebuggerSP& debugger 1122130d950cSDimitry Andric) 1123130d950cSDimitry Andric{ 1124130d950cSDimitry Andric std::string python_function_name_string = python_module_name; 1125130d950cSDimitry Andric python_function_name_string += ".__lldb_init_module"; 1126130d950cSDimitry Andric const char* python_function_name = python_function_name_string.c_str(); 1127130d950cSDimitry Andric 1128130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1129130d950cSDimitry Andric 1130130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1131130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1132130d950cSDimitry Andric 1133130d950cSDimitry Andric // This method is optional and need not exist. So if we don't find it, 1134130d950cSDimitry Andric // it's actually a success, not a failure. 1135130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1136130d950cSDimitry Andric return true; 1137130d950cSDimitry Andric 1138130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 1139130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 1140130d950cSDimitry Andric pfunc(debugger_arg, dict); 1141130d950cSDimitry Andric 1142130d950cSDimitry Andric return true; 1143130d950cSDimitry Andric} 1144130d950cSDimitry Andric%} 1145130d950cSDimitry Andric 1146130d950cSDimitry Andric 1147130d950cSDimitry Andric%runtime %{ 1148130d950cSDimitry Andric// Forward declaration to be inserted at the start of LLDBWrapPython.h 1149130d950cSDimitry Andric#include "lldb/API/SBDebugger.h" 1150130d950cSDimitry Andric#include "lldb/API/SBValue.h" 1151130d950cSDimitry Andric 1152130d950cSDimitry AndricSWIGEXPORT lldb::ValueObjectSP 1153130d950cSDimitry AndricLLDBSWIGPython_GetValueObjectSPFromSBValue (void* data) 1154130d950cSDimitry Andric{ 1155130d950cSDimitry Andric lldb::ValueObjectSP valobj_sp; 1156130d950cSDimitry Andric if (data) 1157130d950cSDimitry Andric { 1158130d950cSDimitry Andric lldb::SBValue* sb_ptr = (lldb::SBValue *)data; 1159130d950cSDimitry Andric valobj_sp = sb_ptr->GetSP(); 1160130d950cSDimitry Andric } 1161130d950cSDimitry Andric return valobj_sp; 1162130d950cSDimitry Andric} 1163130d950cSDimitry Andric 1164130d950cSDimitry Andric#ifdef __cplusplus 1165130d950cSDimitry Andricextern "C" { 1166130d950cSDimitry Andric#endif 1167130d950cSDimitry Andric 1168130d950cSDimitry Andricvoid LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton); 1169130d950cSDimitry Andric 1170130d950cSDimitry Andric#ifdef __cplusplus 1171130d950cSDimitry Andric} 1172130d950cSDimitry Andric#endif 1173130d950cSDimitry Andric%} 1174130d950cSDimitry Andric 1175130d950cSDimitry Andric%wrapper %{ 1176130d950cSDimitry Andric 1177130d950cSDimitry Andric 1178130d950cSDimitry Andric// For the LogOutputCallback functions 1179130d950cSDimitry Andricvoid LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) { 1180130d950cSDimitry Andric if (baton != Py_None) { 1181130d950cSDimitry Andric SWIG_PYTHON_THREAD_BEGIN_BLOCK; 1182130d950cSDimitry Andric PyObject *result = PyObject_CallFunction(reinterpret_cast<PyObject*>(baton), const_cast<char*>("s"), str); 1183130d950cSDimitry Andric Py_XDECREF(result); 1184130d950cSDimitry Andric SWIG_PYTHON_THREAD_END_BLOCK; 1185130d950cSDimitry Andric } 1186130d950cSDimitry Andric} 1187130d950cSDimitry Andric%} 1188