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 42*5f7ddb14SDimitry Andric#pragma clang diagnostic push 43*5f7ddb14SDimitry Andric#pragma clang diagnostic ignored "-Wreturn-type-c-linkage" 44*5f7ddb14SDimitry Andric 45*5f7ddb14SDimitry Andric// Disable warning C4190: 'LLDBSwigPythonBreakpointCallbackFunction' has 46*5f7ddb14SDimitry Andric// C-linkage specified, but returns UDT 'llvm::Expected<bool>' which is 47*5f7ddb14SDimitry Andric// incompatible with C 48*5f7ddb14SDimitry Andric#if _MSC_VER 49*5f7ddb14SDimitry Andric#pragma warning (push) 50*5f7ddb14SDimitry Andric#pragma warning (disable : 4190) 51*5f7ddb14SDimitry Andric#endif 52*5f7ddb14SDimitry Andric 53130d950cSDimitry AndricSWIGEXPORT llvm::Expected<bool> 54130d950cSDimitry AndricLLDBSwigPythonBreakpointCallbackFunction 55130d950cSDimitry Andric( 56130d950cSDimitry Andric const char *python_function_name, 57130d950cSDimitry Andric const char *session_dictionary_name, 58130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp, 59130d950cSDimitry Andric const lldb::BreakpointLocationSP& bp_loc_sp, 60130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl 61130d950cSDimitry Andric) 62130d950cSDimitry Andric{ 63130d950cSDimitry Andric using namespace llvm; 64130d950cSDimitry Andric 65130d950cSDimitry Andric lldb::SBFrame sb_frame (frame_sp); 66130d950cSDimitry Andric lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp); 67130d950cSDimitry Andric 68130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 69130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 70130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 71130d950cSDimitry Andric 72130d950cSDimitry Andric unsigned max_positional_args; 73130d950cSDimitry Andric if (auto arg_info = pfunc.GetArgInfo()) 74130d950cSDimitry Andric max_positional_args = arg_info.get().max_positional_args; 75130d950cSDimitry Andric else 76130d950cSDimitry Andric return arg_info.takeError(); 77130d950cSDimitry Andric 78130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); 79130d950cSDimitry Andric PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc)); 80130d950cSDimitry Andric 81130d950cSDimitry Andric auto result = [&] () -> Expected<PythonObject> { 82130d950cSDimitry Andric // If the called function doesn't take extra_args, drop them here: 83130d950cSDimitry Andric if (max_positional_args < 4) { 84130d950cSDimitry Andric return pfunc.Call(frame_arg, bp_loc_arg, dict); 85130d950cSDimitry Andric } else { 86130d950cSDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 87130d950cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); 88130d950cSDimitry Andric return pfunc.Call(frame_arg, bp_loc_arg, args_arg, dict); 89130d950cSDimitry Andric } 90130d950cSDimitry Andric } (); 91130d950cSDimitry Andric 92130d950cSDimitry Andric if (!result) 93130d950cSDimitry Andric return result.takeError(); 94130d950cSDimitry Andric 95130d950cSDimitry Andric // Only False counts as false! 96130d950cSDimitry Andric return result.get().get() != Py_False; 97130d950cSDimitry Andric} 98130d950cSDimitry Andric 99*5f7ddb14SDimitry Andric#if _MSC_VER 100*5f7ddb14SDimitry Andric#pragma warning (pop) 101*5f7ddb14SDimitry Andric#endif 102*5f7ddb14SDimitry Andric 103*5f7ddb14SDimitry Andric#pragma clang diagnostic pop 104*5f7ddb14SDimitry Andric 105130d950cSDimitry Andric// This function is called by lldb_private::ScriptInterpreterPython::WatchpointCallbackFunction(...) 106130d950cSDimitry Andric// and is used when a script command is attached to a watchpoint for execution. 107130d950cSDimitry Andric 108130d950cSDimitry AndricSWIGEXPORT bool 109130d950cSDimitry AndricLLDBSwigPythonWatchpointCallbackFunction 110130d950cSDimitry Andric( 111130d950cSDimitry Andric const char *python_function_name, 112130d950cSDimitry Andric const char *session_dictionary_name, 113130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp, 114130d950cSDimitry Andric const lldb::WatchpointSP& wp_sp 115130d950cSDimitry Andric) 116130d950cSDimitry Andric{ 117130d950cSDimitry Andric lldb::SBFrame sb_frame (frame_sp); 118130d950cSDimitry Andric lldb::SBWatchpoint sb_wp(wp_sp); 119130d950cSDimitry Andric 120130d950cSDimitry Andric bool stop_at_watchpoint = true; 121130d950cSDimitry Andric 122130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 123130d950cSDimitry Andric 124130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 125130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 126130d950cSDimitry Andric 127130d950cSDimitry Andric if (!pfunc.IsAllocated()) 128130d950cSDimitry Andric return stop_at_watchpoint; 129130d950cSDimitry Andric 130130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); 131130d950cSDimitry Andric PythonObject wp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_wp)); 132130d950cSDimitry Andric PythonObject result = pfunc(frame_arg, wp_arg, dict); 133130d950cSDimitry Andric 134130d950cSDimitry Andric if (result.get() == Py_False) 135130d950cSDimitry Andric stop_at_watchpoint = false; 136130d950cSDimitry Andric 137130d950cSDimitry Andric return stop_at_watchpoint; 138130d950cSDimitry Andric} 139130d950cSDimitry Andric 140130d950cSDimitry AndricSWIGEXPORT bool 141130d950cSDimitry AndricLLDBSwigPythonCallTypeScript 142130d950cSDimitry Andric( 143130d950cSDimitry Andric const char *python_function_name, 144130d950cSDimitry Andric const void *session_dictionary, 145130d950cSDimitry Andric const lldb::ValueObjectSP& valobj_sp, 146130d950cSDimitry Andric void** pyfunct_wrapper, 147130d950cSDimitry Andric const lldb::TypeSummaryOptionsSP& options_sp, 148130d950cSDimitry Andric std::string& retval 149130d950cSDimitry Andric) 150130d950cSDimitry Andric{ 151130d950cSDimitry Andric lldb::SBValue sb_value (valobj_sp); 152130d950cSDimitry Andric lldb::SBTypeSummaryOptions sb_options(options_sp.get()); 153130d950cSDimitry Andric 154130d950cSDimitry Andric retval.clear(); 155130d950cSDimitry Andric 156130d950cSDimitry Andric if (!python_function_name || !session_dictionary) 157130d950cSDimitry Andric return false; 158130d950cSDimitry Andric 159130d950cSDimitry Andric PyObject *pfunc_impl = nullptr; 160130d950cSDimitry Andric 161130d950cSDimitry Andric if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper)) 162130d950cSDimitry Andric { 163130d950cSDimitry Andric pfunc_impl = (PyObject*)(*pyfunct_wrapper); 164130d950cSDimitry Andric if (pfunc_impl->ob_refcnt == 1) 165130d950cSDimitry Andric { 166130d950cSDimitry Andric Py_XDECREF(pfunc_impl); 167130d950cSDimitry Andric pfunc_impl = NULL; 168130d950cSDimitry Andric } 169130d950cSDimitry Andric } 170130d950cSDimitry Andric 171130d950cSDimitry Andric PyObject *py_dict = (PyObject*)session_dictionary; 172130d950cSDimitry Andric if (!PythonDictionary::Check(py_dict)) 173130d950cSDimitry Andric return true; 174130d950cSDimitry Andric 175130d950cSDimitry Andric PythonDictionary dict(PyRefType::Borrowed, py_dict); 176130d950cSDimitry Andric 177130d950cSDimitry Andric PyErr_Cleaner pyerr_cleanup(true); // show Python errors 178130d950cSDimitry Andric 179130d950cSDimitry Andric PythonCallable pfunc(PyRefType::Borrowed, pfunc_impl); 180130d950cSDimitry Andric 181130d950cSDimitry Andric if (!pfunc.IsAllocated()) 182130d950cSDimitry Andric { 183130d950cSDimitry Andric pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 184130d950cSDimitry Andric if (!pfunc.IsAllocated()) 185130d950cSDimitry Andric return false; 186130d950cSDimitry Andric 187130d950cSDimitry Andric if (pyfunct_wrapper) 188130d950cSDimitry Andric { 189130d950cSDimitry Andric *pyfunct_wrapper = pfunc.get(); 190130d950cSDimitry Andric Py_XINCREF(pfunc.get()); 191130d950cSDimitry Andric } 192130d950cSDimitry Andric } 193130d950cSDimitry Andric 194130d950cSDimitry Andric PythonObject result; 195130d950cSDimitry Andric auto argc = pfunc.GetArgInfo(); 196130d950cSDimitry Andric if (!argc) { 197130d950cSDimitry Andric llvm::consumeError(argc.takeError()); 198130d950cSDimitry Andric return false; 199130d950cSDimitry Andric } 200130d950cSDimitry Andric 201130d950cSDimitry Andric PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value)); 202130d950cSDimitry Andric PythonObject options_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_options)); 203130d950cSDimitry Andric 204130d950cSDimitry Andric if (argc.get().max_positional_args < 3) 205130d950cSDimitry Andric result = pfunc(value_arg,dict); 206130d950cSDimitry Andric else 207130d950cSDimitry Andric result = pfunc(value_arg,dict,options_arg); 208130d950cSDimitry Andric 209130d950cSDimitry Andric retval = result.Str().GetString().str(); 210130d950cSDimitry Andric 211130d950cSDimitry Andric return true; 212130d950cSDimitry Andric} 213130d950cSDimitry Andric 214130d950cSDimitry AndricSWIGEXPORT void* 215130d950cSDimitry AndricLLDBSwigPythonCreateSyntheticProvider 216130d950cSDimitry Andric( 217130d950cSDimitry Andric const char *python_class_name, 218130d950cSDimitry Andric const char *session_dictionary_name, 219130d950cSDimitry Andric const lldb::ValueObjectSP& valobj_sp 220130d950cSDimitry Andric) 221130d950cSDimitry Andric{ 222130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 223130d950cSDimitry Andric Py_RETURN_NONE; 224130d950cSDimitry Andric 225130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 226130d950cSDimitry Andric 227130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 228130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name,dict); 229130d950cSDimitry Andric 230130d950cSDimitry Andric if (!pfunc.IsAllocated()) 231130d950cSDimitry Andric Py_RETURN_NONE; 232130d950cSDimitry Andric 233130d950cSDimitry Andric // I do not want the SBValue to be deallocated when going out of scope because python 234130d950cSDimitry Andric // has ownership of it and will manage memory for this object by itself 235130d950cSDimitry Andric lldb::SBValue *sb_value = new lldb::SBValue(valobj_sp); 236130d950cSDimitry Andric sb_value->SetPreferSyntheticValue(false); 237130d950cSDimitry Andric 238130d950cSDimitry Andric PythonObject val_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value)); 239130d950cSDimitry Andric if (!val_arg.IsAllocated()) 240130d950cSDimitry Andric Py_RETURN_NONE; 241130d950cSDimitry Andric 242130d950cSDimitry Andric PythonObject result = pfunc(val_arg, dict); 243130d950cSDimitry Andric 244130d950cSDimitry Andric if (result.IsAllocated()) 245130d950cSDimitry Andric return result.release(); 246130d950cSDimitry Andric 247130d950cSDimitry Andric Py_RETURN_NONE; 248130d950cSDimitry Andric} 249130d950cSDimitry Andric 250130d950cSDimitry AndricSWIGEXPORT void* 251130d950cSDimitry AndricLLDBSwigPythonCreateCommandObject 252130d950cSDimitry Andric( 253130d950cSDimitry Andric const char *python_class_name, 254130d950cSDimitry Andric const char *session_dictionary_name, 255130d950cSDimitry Andric const lldb::DebuggerSP debugger_sp 256130d950cSDimitry Andric) 257130d950cSDimitry Andric{ 258130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 259130d950cSDimitry Andric Py_RETURN_NONE; 260130d950cSDimitry Andric 261130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 262130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 263130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 264130d950cSDimitry Andric 265130d950cSDimitry Andric if (!pfunc.IsAllocated()) 266130d950cSDimitry Andric return nullptr; 267130d950cSDimitry Andric 268130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger_sp); 269130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 270130d950cSDimitry Andric PythonObject result = pfunc(debugger_arg, dict); 271130d950cSDimitry Andric 272130d950cSDimitry Andric if (result.IsAllocated()) 273130d950cSDimitry Andric return result.release(); 274130d950cSDimitry Andric 275130d950cSDimitry Andric Py_RETURN_NONE; 276130d950cSDimitry Andric} 277130d950cSDimitry Andric 278130d950cSDimitry AndricSWIGEXPORT void* 279*5f7ddb14SDimitry AndricLLDBSwigPythonCreateScriptedProcess 280*5f7ddb14SDimitry Andric( 281*5f7ddb14SDimitry Andric const char *python_class_name, 282*5f7ddb14SDimitry Andric const char *session_dictionary_name, 283*5f7ddb14SDimitry Andric const lldb::TargetSP& target_sp, 284*5f7ddb14SDimitry Andric lldb_private::StructuredDataImpl *args_impl, 285*5f7ddb14SDimitry Andric std::string &error_string 286*5f7ddb14SDimitry Andric) 287*5f7ddb14SDimitry Andric{ 288*5f7ddb14SDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 289*5f7ddb14SDimitry Andric Py_RETURN_NONE; 290*5f7ddb14SDimitry Andric 291*5f7ddb14SDimitry Andric 292*5f7ddb14SDimitry Andric PyErr_Cleaner py_err_cleaner(true); 293*5f7ddb14SDimitry Andric 294*5f7ddb14SDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 295*5f7ddb14SDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 296*5f7ddb14SDimitry Andric 297*5f7ddb14SDimitry Andric if (!pfunc.IsAllocated()) { 298*5f7ddb14SDimitry Andric error_string.append("could not find script class: "); 299*5f7ddb14SDimitry Andric error_string.append(python_class_name); 300*5f7ddb14SDimitry Andric return nullptr; 301*5f7ddb14SDimitry Andric } 302*5f7ddb14SDimitry Andric 303*5f7ddb14SDimitry Andric // I do not want the SBTarget to be deallocated when going out of scope 304*5f7ddb14SDimitry Andric // because python has ownership of it and will manage memory for this 305*5f7ddb14SDimitry Andric // object by itself 306*5f7ddb14SDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBTarget(target_sp))); 307*5f7ddb14SDimitry Andric 308*5f7ddb14SDimitry Andric if (!target_arg.IsAllocated()) 309*5f7ddb14SDimitry Andric Py_RETURN_NONE; 310*5f7ddb14SDimitry Andric 311*5f7ddb14SDimitry Andric llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo(); 312*5f7ddb14SDimitry Andric if (!arg_info) { 313*5f7ddb14SDimitry Andric llvm::handleAllErrors( 314*5f7ddb14SDimitry Andric arg_info.takeError(), 315*5f7ddb14SDimitry Andric [&](PythonException &E) { 316*5f7ddb14SDimitry Andric error_string.append(E.ReadBacktrace()); 317*5f7ddb14SDimitry Andric }, 318*5f7ddb14SDimitry Andric [&](const llvm::ErrorInfoBase &E) { 319*5f7ddb14SDimitry Andric error_string.append(E.message()); 320*5f7ddb14SDimitry Andric }); 321*5f7ddb14SDimitry Andric Py_RETURN_NONE; 322*5f7ddb14SDimitry Andric } 323*5f7ddb14SDimitry Andric 324*5f7ddb14SDimitry Andric PythonObject result = {}; 325*5f7ddb14SDimitry Andric if (arg_info.get().max_positional_args == 2) { 326*5f7ddb14SDimitry Andric if (args_impl != nullptr) { 327*5f7ddb14SDimitry Andric error_string.assign("args passed, but __init__ does not take an args dictionary"); 328*5f7ddb14SDimitry Andric Py_RETURN_NONE; 329*5f7ddb14SDimitry Andric } 330*5f7ddb14SDimitry Andric result = pfunc(target_arg, dict); 331*5f7ddb14SDimitry Andric } else if (arg_info.get().max_positional_args >= 3) { 332*5f7ddb14SDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBStructuredData(args_impl))); 333*5f7ddb14SDimitry Andric result = pfunc(target_arg, args_arg, dict); 334*5f7ddb14SDimitry Andric } else { 335*5f7ddb14SDimitry Andric error_string.assign("wrong number of arguments in __init__, should be 2 or 3 (not including self)"); 336*5f7ddb14SDimitry Andric Py_RETURN_NONE; 337*5f7ddb14SDimitry Andric } 338*5f7ddb14SDimitry Andric 339*5f7ddb14SDimitry Andric if (result.IsAllocated()) 340*5f7ddb14SDimitry Andric return result.release(); 341*5f7ddb14SDimitry Andric Py_RETURN_NONE; 342*5f7ddb14SDimitry Andric} 343*5f7ddb14SDimitry Andric 344*5f7ddb14SDimitry AndricSWIGEXPORT void* 345130d950cSDimitry AndricLLDBSwigPythonCreateScriptedThreadPlan 346130d950cSDimitry Andric( 347130d950cSDimitry Andric const char *python_class_name, 348130d950cSDimitry Andric const char *session_dictionary_name, 349130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl, 350130d950cSDimitry Andric std::string &error_string, 351130d950cSDimitry Andric const lldb::ThreadPlanSP& thread_plan_sp 352130d950cSDimitry Andric) 353130d950cSDimitry Andric{ 354130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 355130d950cSDimitry Andric Py_RETURN_NONE; 356130d950cSDimitry Andric 357130d950cSDimitry Andric 358130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 359130d950cSDimitry Andric 360130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 361130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 362130d950cSDimitry Andric 363130d950cSDimitry Andric if (!pfunc.IsAllocated()) { 364130d950cSDimitry Andric error_string.append("could not find script class: "); 365130d950cSDimitry Andric error_string.append(python_class_name); 366130d950cSDimitry Andric return nullptr; 367130d950cSDimitry Andric } 368130d950cSDimitry Andric 369af732203SDimitry Andric // I do not want the SBThreadPlan to be deallocated when going out of scope 370af732203SDimitry Andric // because python has ownership of it and will manage memory for this 371af732203SDimitry Andric // object by itself 372af732203SDimitry Andric PythonObject tp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBThreadPlan(thread_plan_sp))); 373130d950cSDimitry Andric 374130d950cSDimitry Andric if (!tp_arg.IsAllocated()) 375130d950cSDimitry Andric Py_RETURN_NONE; 376130d950cSDimitry Andric 377130d950cSDimitry Andric llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo(); 378130d950cSDimitry Andric if (!arg_info) { 379130d950cSDimitry Andric llvm::handleAllErrors( 380130d950cSDimitry Andric arg_info.takeError(), 381130d950cSDimitry Andric [&](PythonException &E) { 382130d950cSDimitry Andric error_string.append(E.ReadBacktrace()); 383130d950cSDimitry Andric }, 384130d950cSDimitry Andric [&](const llvm::ErrorInfoBase &E) { 385130d950cSDimitry Andric error_string.append(E.message()); 386130d950cSDimitry Andric }); 387130d950cSDimitry Andric Py_RETURN_NONE; 388130d950cSDimitry Andric } 389130d950cSDimitry Andric 390130d950cSDimitry Andric PythonObject result = {}; 391130d950cSDimitry Andric if (arg_info.get().max_positional_args == 2) { 392130d950cSDimitry Andric if (args_impl != nullptr) { 393130d950cSDimitry Andric error_string.assign("args passed, but __init__ does not take an args dictionary"); 394130d950cSDimitry Andric Py_RETURN_NONE; 395130d950cSDimitry Andric } 396130d950cSDimitry Andric result = pfunc(tp_arg, dict); 397130d950cSDimitry Andric } else if (arg_info.get().max_positional_args >= 3) { 398af732203SDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(new lldb::SBStructuredData(args_impl))); 399130d950cSDimitry Andric result = pfunc(tp_arg, args_arg, dict); 400130d950cSDimitry Andric } else { 401130d950cSDimitry Andric error_string.assign("wrong number of arguments in __init__, should be 2 or 3 (not including self)"); 402130d950cSDimitry Andric Py_RETURN_NONE; 403130d950cSDimitry Andric } 404130d950cSDimitry Andric 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 return result.release(); 410130d950cSDimitry Andric Py_RETURN_NONE; 411130d950cSDimitry Andric} 412130d950cSDimitry Andric 413130d950cSDimitry AndricSWIGEXPORT bool 414130d950cSDimitry AndricLLDBSWIGPythonCallThreadPlan 415130d950cSDimitry Andric( 416130d950cSDimitry Andric void *implementor, 417130d950cSDimitry Andric const char *method_name, 418130d950cSDimitry Andric lldb_private::Event *event, 419130d950cSDimitry Andric bool &got_error 420130d950cSDimitry Andric) 421130d950cSDimitry Andric{ 422130d950cSDimitry Andric got_error = false; 423130d950cSDimitry Andric 424130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 425130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 426130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(method_name); 427130d950cSDimitry Andric 428130d950cSDimitry Andric if (!pfunc.IsAllocated()) 429130d950cSDimitry Andric return false; 430130d950cSDimitry Andric 431130d950cSDimitry Andric PythonObject result; 432130d950cSDimitry Andric if (event != nullptr) 433130d950cSDimitry Andric { 434130d950cSDimitry Andric lldb::SBEvent sb_event(event); 435130d950cSDimitry Andric PythonObject event_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_event)); 436130d950cSDimitry Andric result = pfunc(event_arg); 437130d950cSDimitry Andric } 438130d950cSDimitry Andric else 439130d950cSDimitry Andric result = pfunc(); 440130d950cSDimitry Andric 441130d950cSDimitry Andric if (PyErr_Occurred()) 442130d950cSDimitry Andric { 443130d950cSDimitry Andric got_error = true; 444130d950cSDimitry Andric printf ("Return value was neither false nor true for call to %s.\n", method_name); 445130d950cSDimitry Andric PyErr_Print(); 446130d950cSDimitry Andric return false; 447130d950cSDimitry Andric } 448130d950cSDimitry Andric 449130d950cSDimitry Andric if (result.get() == Py_True) 450130d950cSDimitry Andric return true; 451130d950cSDimitry Andric else if (result.get() == Py_False) 452130d950cSDimitry Andric return false; 453130d950cSDimitry Andric 454130d950cSDimitry Andric // Somebody returned the wrong thing... 455130d950cSDimitry Andric got_error = true; 456130d950cSDimitry Andric printf ("Wrong return value type for call to %s.\n", method_name); 457130d950cSDimitry Andric return false; 458130d950cSDimitry Andric} 459130d950cSDimitry Andric 460130d950cSDimitry AndricSWIGEXPORT void * 461130d950cSDimitry AndricLLDBSwigPythonCreateScriptedBreakpointResolver 462130d950cSDimitry Andric( 463130d950cSDimitry Andric const char *python_class_name, 464130d950cSDimitry Andric const char *session_dictionary_name, 465130d950cSDimitry Andric lldb_private::StructuredDataImpl *args_impl, 466130d950cSDimitry Andric lldb::BreakpointSP &breakpoint_sp 467130d950cSDimitry Andric) 468130d950cSDimitry Andric{ 469130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 470130d950cSDimitry Andric Py_RETURN_NONE; 471130d950cSDimitry Andric 472130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 473130d950cSDimitry Andric 474130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 475130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 476130d950cSDimitry Andric 477130d950cSDimitry Andric if (!pfunc.IsAllocated()) 478130d950cSDimitry Andric return nullptr; 479130d950cSDimitry Andric 480130d950cSDimitry Andric lldb::SBBreakpoint *bkpt_value = new lldb::SBBreakpoint(breakpoint_sp); 481130d950cSDimitry Andric 482130d950cSDimitry Andric PythonObject bkpt_arg(PyRefType::Owned, SBTypeToSWIGWrapper(bkpt_value)); 483130d950cSDimitry Andric 484130d950cSDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 485130d950cSDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); 486130d950cSDimitry Andric 487130d950cSDimitry Andric PythonObject result = pfunc(bkpt_arg, args_arg, dict); 488130d950cSDimitry Andric // FIXME: At this point we should check that the class we found supports all the methods 489130d950cSDimitry Andric // that we need. 490130d950cSDimitry Andric 491130d950cSDimitry Andric if (result.IsAllocated()) 492130d950cSDimitry Andric { 493130d950cSDimitry Andric // Check that __callback__ is defined: 494130d950cSDimitry Andric auto callback_func = result.ResolveName<PythonCallable>("__callback__"); 495130d950cSDimitry Andric if (callback_func.IsAllocated()) 496130d950cSDimitry Andric return result.release(); 497130d950cSDimitry Andric else 498130d950cSDimitry Andric result.release(); 499130d950cSDimitry Andric } 500130d950cSDimitry Andric Py_RETURN_NONE; 501130d950cSDimitry Andric} 502130d950cSDimitry Andric 503130d950cSDimitry AndricSWIGEXPORT unsigned int 504130d950cSDimitry AndricLLDBSwigPythonCallBreakpointResolver 505130d950cSDimitry Andric( 506130d950cSDimitry Andric void *implementor, 507130d950cSDimitry Andric const char *method_name, 508130d950cSDimitry Andric lldb_private::SymbolContext *sym_ctx 509130d950cSDimitry Andric) 510130d950cSDimitry Andric{ 511130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 512130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 513130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(method_name); 514130d950cSDimitry Andric 515130d950cSDimitry Andric if (!pfunc.IsAllocated()) 516130d950cSDimitry Andric return 0; 517130d950cSDimitry Andric 518130d950cSDimitry Andric PythonObject result; 519130d950cSDimitry Andric if (sym_ctx != nullptr) { 520130d950cSDimitry Andric lldb::SBSymbolContext sb_sym_ctx(sym_ctx); 521130d950cSDimitry Andric PythonObject sym_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_sym_ctx)); 522130d950cSDimitry Andric result = pfunc(sym_ctx_arg); 523130d950cSDimitry Andric } else 524130d950cSDimitry Andric result = pfunc(); 525130d950cSDimitry Andric 526130d950cSDimitry Andric if (PyErr_Occurred()) 527130d950cSDimitry Andric { 528130d950cSDimitry Andric PyErr_Print(); 5295ffd83dbSDimitry Andric PyErr_Clear(); 530130d950cSDimitry Andric return 0; 531130d950cSDimitry Andric } 532130d950cSDimitry Andric 533130d950cSDimitry Andric // The callback will return a bool, but we're need to also return ints 534130d950cSDimitry Andric // so we're squirrelling the bool through as an int... And if you return 535130d950cSDimitry Andric // nothing, we'll continue. 536130d950cSDimitry Andric if (strcmp(method_name, "__callback__") == 0) { 537130d950cSDimitry Andric if (result.get() == Py_False) 538130d950cSDimitry Andric return 0; 539130d950cSDimitry Andric else 540130d950cSDimitry Andric return 1; 541130d950cSDimitry Andric } 542130d950cSDimitry Andric 5435ffd83dbSDimitry Andric long long ret_val = unwrapOrSetPythonException(As<long long>(result)); 544130d950cSDimitry Andric 5455ffd83dbSDimitry Andric if (PyErr_Occurred()) { 5465ffd83dbSDimitry Andric PyErr_Print(); 5475ffd83dbSDimitry Andric PyErr_Clear(); 5485ffd83dbSDimitry Andric return 0; 5495ffd83dbSDimitry Andric } 550130d950cSDimitry Andric 551130d950cSDimitry Andric return ret_val; 552130d950cSDimitry Andric} 553130d950cSDimitry Andric 554af732203SDimitry AndricSWIGEXPORT void * 555af732203SDimitry AndricLLDBSwigPythonCreateScriptedStopHook 556af732203SDimitry Andric( 557af732203SDimitry Andric lldb::TargetSP target_sp, 558af732203SDimitry Andric const char *python_class_name, 559af732203SDimitry Andric const char *session_dictionary_name, 560af732203SDimitry Andric lldb_private::StructuredDataImpl *args_impl, 561af732203SDimitry Andric Status &error 562af732203SDimitry Andric) 563af732203SDimitry Andric{ 564af732203SDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0') { 565af732203SDimitry Andric error.SetErrorString("Empty class name."); 566af732203SDimitry Andric Py_RETURN_NONE; 567af732203SDimitry Andric } 568af732203SDimitry Andric if (!session_dictionary_name) { 569af732203SDimitry Andric error.SetErrorString("No session dictionary"); 570af732203SDimitry Andric Py_RETURN_NONE; 571af732203SDimitry Andric } 572af732203SDimitry Andric 573af732203SDimitry Andric PyErr_Cleaner py_err_cleaner(true); 574af732203SDimitry Andric 575af732203SDimitry Andric auto dict = 576af732203SDimitry Andric PythonModule::MainModule().ResolveName<PythonDictionary>( 577af732203SDimitry Andric session_dictionary_name); 578af732203SDimitry Andric auto pfunc = 579af732203SDimitry Andric PythonObject::ResolveNameWithDictionary<PythonCallable>( 580af732203SDimitry Andric python_class_name, dict); 581af732203SDimitry Andric 582af732203SDimitry Andric if (!pfunc.IsAllocated()) { 583af732203SDimitry Andric error.SetErrorStringWithFormat("Could not find class: %s.", 584af732203SDimitry Andric python_class_name); 585af732203SDimitry Andric return nullptr; 586af732203SDimitry Andric } 587af732203SDimitry Andric 588af732203SDimitry Andric lldb::SBTarget *target_val 589af732203SDimitry Andric = new lldb::SBTarget(target_sp); 590af732203SDimitry Andric 591af732203SDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_val)); 592af732203SDimitry Andric 593af732203SDimitry Andric lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); 594af732203SDimitry Andric PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); 595af732203SDimitry Andric 596af732203SDimitry Andric PythonObject result = pfunc(target_arg, args_arg, dict); 597af732203SDimitry Andric 598af732203SDimitry Andric if (result.IsAllocated()) 599af732203SDimitry Andric { 600af732203SDimitry Andric // Check that the handle_stop callback is defined: 601af732203SDimitry Andric auto callback_func = result.ResolveName<PythonCallable>("handle_stop"); 602af732203SDimitry Andric if (callback_func.IsAllocated()) { 603af732203SDimitry Andric if (auto args_info = callback_func.GetArgInfo()) { 604af732203SDimitry Andric size_t num_args = (*args_info).max_positional_args; 605af732203SDimitry Andric if (num_args != 2) { 606af732203SDimitry Andric error.SetErrorStringWithFormat("Wrong number of args for " 607af732203SDimitry Andric "handle_stop callback, should be 2 (excluding self), got: %zu", 608af732203SDimitry Andric num_args); 609af732203SDimitry Andric Py_RETURN_NONE; 610af732203SDimitry Andric } else 611af732203SDimitry Andric return result.release(); 612af732203SDimitry Andric } else { 613af732203SDimitry Andric error.SetErrorString("Couldn't get num arguments for handle_stop " 614af732203SDimitry Andric "callback."); 615af732203SDimitry Andric Py_RETURN_NONE; 616af732203SDimitry Andric } 617af732203SDimitry Andric return result.release(); 618af732203SDimitry Andric } 619af732203SDimitry Andric else { 620af732203SDimitry Andric error.SetErrorStringWithFormat("Class \"%s\" is missing the required " 621af732203SDimitry Andric "handle_stop callback.", 622af732203SDimitry Andric python_class_name); 623af732203SDimitry Andric result.release(); 624af732203SDimitry Andric } 625af732203SDimitry Andric } 626af732203SDimitry Andric Py_RETURN_NONE; 627af732203SDimitry Andric} 628af732203SDimitry Andric 629af732203SDimitry AndricSWIGEXPORT bool 630af732203SDimitry AndricLLDBSwigPythonStopHookCallHandleStop 631af732203SDimitry Andric( 632af732203SDimitry Andric void *implementor, 633af732203SDimitry Andric lldb::ExecutionContextRefSP exc_ctx_sp, 634af732203SDimitry Andric lldb::StreamSP stream 635af732203SDimitry Andric) 636af732203SDimitry Andric{ 637af732203SDimitry Andric // handle_stop will return a bool with the meaning "should_stop"... 638af732203SDimitry Andric // If you return nothing we'll assume we are going to stop. 639af732203SDimitry Andric // Also any errors should return true, since we should stop on error. 640af732203SDimitry Andric 641af732203SDimitry Andric PyErr_Cleaner py_err_cleaner(false); 642af732203SDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 643af732203SDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("handle_stop"); 644af732203SDimitry Andric 645af732203SDimitry Andric if (!pfunc.IsAllocated()) 646af732203SDimitry Andric return true; 647af732203SDimitry Andric 648af732203SDimitry Andric PythonObject result; 649af732203SDimitry Andric lldb::SBExecutionContext sb_exc_ctx(exc_ctx_sp); 650af732203SDimitry Andric PythonObject exc_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_exc_ctx)); 651af732203SDimitry Andric lldb::SBStream sb_stream; 652af732203SDimitry Andric PythonObject sb_stream_arg(PyRefType::Owned, 653af732203SDimitry Andric SBTypeToSWIGWrapper(sb_stream)); 654af732203SDimitry Andric result = pfunc(exc_ctx_arg, sb_stream_arg); 655af732203SDimitry Andric 656af732203SDimitry Andric if (PyErr_Occurred()) 657af732203SDimitry Andric { 658af732203SDimitry Andric stream->PutCString("Python error occurred handling stop-hook."); 659af732203SDimitry Andric PyErr_Print(); 660af732203SDimitry Andric PyErr_Clear(); 661af732203SDimitry Andric return true; 662af732203SDimitry Andric } 663af732203SDimitry Andric 664af732203SDimitry Andric // Now add the result to the output stream. SBStream only 665af732203SDimitry Andric // makes an internally help StreamString which I can't interpose, so I 666af732203SDimitry Andric // have to copy it over here. 667af732203SDimitry Andric stream->PutCString(sb_stream.GetData()); 668af732203SDimitry Andric 669af732203SDimitry Andric if (result.get() == Py_False) 670af732203SDimitry Andric return false; 671af732203SDimitry Andric else 672af732203SDimitry Andric return true; 673af732203SDimitry Andric} 674af732203SDimitry Andric 675130d950cSDimitry Andric// wrapper that calls an optional instance member of an object taking no arguments 676130d950cSDimitry Andricstatic PyObject* 677130d950cSDimitry AndricLLDBSwigPython_CallOptionalMember 678130d950cSDimitry Andric( 679130d950cSDimitry Andric PyObject* implementor, 680130d950cSDimitry Andric char* callee_name, 681130d950cSDimitry Andric PyObject* ret_if_not_found = Py_None, 682130d950cSDimitry Andric bool* was_found = NULL 683130d950cSDimitry Andric) 684130d950cSDimitry Andric{ 685130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(false); 686130d950cSDimitry Andric 687130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); 688130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>(callee_name); 689130d950cSDimitry Andric 690130d950cSDimitry Andric if (!pfunc.IsAllocated()) 691130d950cSDimitry Andric { 692130d950cSDimitry Andric if (was_found) 693130d950cSDimitry Andric *was_found = false; 694130d950cSDimitry Andric Py_XINCREF(ret_if_not_found); 695130d950cSDimitry Andric return ret_if_not_found; 696130d950cSDimitry Andric } 697130d950cSDimitry Andric 698130d950cSDimitry Andric if (was_found) 699130d950cSDimitry Andric *was_found = true; 700130d950cSDimitry Andric 701130d950cSDimitry Andric PythonObject result = pfunc(); 702130d950cSDimitry Andric return result.release(); 703130d950cSDimitry Andric} 704130d950cSDimitry Andric 705130d950cSDimitry AndricSWIGEXPORT size_t 706130d950cSDimitry AndricLLDBSwigPython_CalculateNumChildren 707130d950cSDimitry Andric( 708130d950cSDimitry Andric PyObject *implementor, 709130d950cSDimitry Andric uint32_t max 710130d950cSDimitry Andric) 711130d950cSDimitry Andric{ 712130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 713130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("num_children"); 714130d950cSDimitry Andric 715130d950cSDimitry Andric if (!pfunc.IsAllocated()) 716130d950cSDimitry Andric return 0; 717130d950cSDimitry Andric 718130d950cSDimitry Andric auto arg_info = pfunc.GetArgInfo(); 719130d950cSDimitry Andric if (!arg_info) { 720130d950cSDimitry Andric llvm::consumeError(arg_info.takeError()); 721130d950cSDimitry Andric return 0; 722130d950cSDimitry Andric } 723130d950cSDimitry Andric 7245ffd83dbSDimitry Andric size_t ret_val; 725130d950cSDimitry Andric if (arg_info.get().max_positional_args < 1) 7265ffd83dbSDimitry Andric ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call())); 727130d950cSDimitry Andric else 7285ffd83dbSDimitry Andric ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call(PythonInteger(max)))); 729130d950cSDimitry Andric 7305ffd83dbSDimitry Andric if (PyErr_Occurred()) 731130d950cSDimitry Andric { 732130d950cSDimitry Andric PyErr_Print(); 733130d950cSDimitry Andric PyErr_Clear(); 7345ffd83dbSDimitry Andric return 0; 735130d950cSDimitry Andric } 736130d950cSDimitry Andric 737130d950cSDimitry Andric if (arg_info.get().max_positional_args < 1) 738130d950cSDimitry Andric ret_val = std::min(ret_val, static_cast<size_t>(max)); 739130d950cSDimitry Andric 740130d950cSDimitry Andric return ret_val; 741130d950cSDimitry Andric} 742130d950cSDimitry Andric 743130d950cSDimitry AndricSWIGEXPORT PyObject* 744130d950cSDimitry AndricLLDBSwigPython_GetChildAtIndex 745130d950cSDimitry Andric( 746130d950cSDimitry Andric PyObject *implementor, 747130d950cSDimitry Andric uint32_t idx 748130d950cSDimitry Andric) 749130d950cSDimitry Andric{ 750130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 751130d950cSDimitry Andric 752130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 753130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("get_child_at_index"); 754130d950cSDimitry Andric 755130d950cSDimitry Andric if (!pfunc.IsAllocated()) 756130d950cSDimitry Andric return nullptr; 757130d950cSDimitry Andric 758130d950cSDimitry Andric PythonObject result = pfunc(PythonInteger(idx)); 759130d950cSDimitry Andric 760130d950cSDimitry Andric if (!result.IsAllocated()) 761130d950cSDimitry Andric return nullptr; 762130d950cSDimitry Andric 763130d950cSDimitry Andric lldb::SBValue* sbvalue_ptr = nullptr; 764130d950cSDimitry Andric if (SWIG_ConvertPtr(result.get(), (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) 765130d950cSDimitry Andric return nullptr; 766130d950cSDimitry Andric 767130d950cSDimitry Andric if (sbvalue_ptr == nullptr) 768130d950cSDimitry Andric return nullptr; 769130d950cSDimitry Andric 770130d950cSDimitry Andric return result.release(); 771130d950cSDimitry Andric} 772130d950cSDimitry Andric 773130d950cSDimitry AndricSWIGEXPORT int 774130d950cSDimitry AndricLLDBSwigPython_GetIndexOfChildWithName 775130d950cSDimitry Andric( 776130d950cSDimitry Andric PyObject *implementor, 777130d950cSDimitry Andric const char* child_name 778130d950cSDimitry Andric) 779130d950cSDimitry Andric{ 780130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 781130d950cSDimitry Andric 782130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 783130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("get_child_index"); 784130d950cSDimitry Andric 785130d950cSDimitry Andric if (!pfunc.IsAllocated()) 786130d950cSDimitry Andric return UINT32_MAX; 787130d950cSDimitry Andric 7885ffd83dbSDimitry Andric llvm::Expected<PythonObject> result = pfunc.Call(PythonString(child_name)); 789130d950cSDimitry Andric 7905ffd83dbSDimitry Andric long long retval = unwrapOrSetPythonException(As<long long>(std::move(result))); 7915ffd83dbSDimitry Andric 7925ffd83dbSDimitry Andric if (PyErr_Occurred()) { 7935ffd83dbSDimitry Andric PyErr_Clear(); // FIXME print this? do something else 794130d950cSDimitry Andric return UINT32_MAX; 7955ffd83dbSDimitry Andric } 796130d950cSDimitry Andric 797130d950cSDimitry Andric if (retval >= 0) 798130d950cSDimitry Andric return (uint32_t)retval; 799130d950cSDimitry Andric 800130d950cSDimitry Andric return UINT32_MAX; 801130d950cSDimitry Andric} 802130d950cSDimitry Andric 803130d950cSDimitry AndricSWIGEXPORT bool 804130d950cSDimitry AndricLLDBSwigPython_UpdateSynthProviderInstance 805130d950cSDimitry Andric( 806130d950cSDimitry Andric PyObject *implementor 807130d950cSDimitry Andric) 808130d950cSDimitry Andric{ 809130d950cSDimitry Andric bool ret_val = false; 810130d950cSDimitry Andric 811130d950cSDimitry Andric static char callee_name[] = "update"; 812130d950cSDimitry Andric 813130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name); 814130d950cSDimitry Andric 815130d950cSDimitry Andric if (py_return == Py_True) 816130d950cSDimitry Andric ret_val = true; 817130d950cSDimitry Andric 818130d950cSDimitry Andric Py_XDECREF(py_return); 819130d950cSDimitry Andric 820130d950cSDimitry Andric return ret_val; 821130d950cSDimitry Andric} 822130d950cSDimitry Andric 823130d950cSDimitry AndricSWIGEXPORT bool 824130d950cSDimitry AndricLLDBSwigPython_MightHaveChildrenSynthProviderInstance 825130d950cSDimitry Andric( 826130d950cSDimitry Andric PyObject *implementor 827130d950cSDimitry Andric) 828130d950cSDimitry Andric{ 829130d950cSDimitry Andric bool ret_val = false; 830130d950cSDimitry Andric 831130d950cSDimitry Andric static char callee_name[] = "has_children"; 832130d950cSDimitry Andric 833130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True); 834130d950cSDimitry Andric 835130d950cSDimitry Andric if (py_return == Py_True) 836130d950cSDimitry Andric ret_val = true; 837130d950cSDimitry Andric 838130d950cSDimitry Andric Py_XDECREF(py_return); 839130d950cSDimitry Andric 840130d950cSDimitry Andric return ret_val; 841130d950cSDimitry Andric} 842130d950cSDimitry Andric 843130d950cSDimitry AndricSWIGEXPORT PyObject* 844130d950cSDimitry AndricLLDBSwigPython_GetValueSynthProviderInstance 845130d950cSDimitry Andric( 846130d950cSDimitry Andric PyObject *implementor 847130d950cSDimitry Andric) 848130d950cSDimitry Andric{ 849130d950cSDimitry Andric PyObject* ret_val = nullptr; 850130d950cSDimitry Andric 851130d950cSDimitry Andric static char callee_name[] = "get_value"; 852130d950cSDimitry Andric 853130d950cSDimitry Andric PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_None); 854130d950cSDimitry Andric 855130d950cSDimitry Andric if (py_return == Py_None || py_return == nullptr) 856130d950cSDimitry Andric ret_val = nullptr; 857130d950cSDimitry Andric 858130d950cSDimitry Andric lldb::SBValue* sbvalue_ptr = NULL; 859130d950cSDimitry Andric 860130d950cSDimitry Andric if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) 861130d950cSDimitry Andric ret_val = nullptr; 862130d950cSDimitry Andric else if (sbvalue_ptr == NULL) 863130d950cSDimitry Andric ret_val = nullptr; 864130d950cSDimitry Andric else 865130d950cSDimitry Andric ret_val = py_return; 866130d950cSDimitry Andric 867130d950cSDimitry Andric Py_XDECREF(py_return); 868130d950cSDimitry Andric return ret_val; 869130d950cSDimitry Andric} 870130d950cSDimitry Andric 871130d950cSDimitry AndricSWIGEXPORT void* 872*5f7ddb14SDimitry AndricLLDBSWIGPython_CastPyObjectToSBData 873*5f7ddb14SDimitry Andric( 874*5f7ddb14SDimitry Andric PyObject* data 875*5f7ddb14SDimitry Andric) 876*5f7ddb14SDimitry Andric{ 877*5f7ddb14SDimitry Andric lldb::SBData* sb_ptr = nullptr; 878*5f7ddb14SDimitry Andric 879*5f7ddb14SDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBData, 0); 880*5f7ddb14SDimitry Andric 881*5f7ddb14SDimitry Andric if (valid_cast == -1) 882*5f7ddb14SDimitry Andric return NULL; 883*5f7ddb14SDimitry Andric 884*5f7ddb14SDimitry Andric return sb_ptr; 885*5f7ddb14SDimitry Andric} 886*5f7ddb14SDimitry Andric 887*5f7ddb14SDimitry Andric 888*5f7ddb14SDimitry AndricSWIGEXPORT void* 889*5f7ddb14SDimitry AndricLLDBSWIGPython_CastPyObjectToSBError 890*5f7ddb14SDimitry Andric( 891*5f7ddb14SDimitry Andric PyObject* data 892*5f7ddb14SDimitry Andric) 893*5f7ddb14SDimitry Andric{ 894*5f7ddb14SDimitry Andric lldb::SBError* sb_ptr = nullptr; 895*5f7ddb14SDimitry Andric 896*5f7ddb14SDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBError, 0); 897*5f7ddb14SDimitry Andric 898*5f7ddb14SDimitry Andric if (valid_cast == -1) 899*5f7ddb14SDimitry Andric return NULL; 900*5f7ddb14SDimitry Andric 901*5f7ddb14SDimitry Andric return sb_ptr; 902*5f7ddb14SDimitry Andric} 903*5f7ddb14SDimitry Andric 904*5f7ddb14SDimitry Andric 905*5f7ddb14SDimitry AndricSWIGEXPORT void* 906130d950cSDimitry AndricLLDBSWIGPython_CastPyObjectToSBValue 907130d950cSDimitry Andric( 908130d950cSDimitry Andric PyObject* data 909130d950cSDimitry Andric) 910130d950cSDimitry Andric{ 911130d950cSDimitry Andric lldb::SBValue* sb_ptr = NULL; 912130d950cSDimitry Andric 913130d950cSDimitry Andric int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0); 914130d950cSDimitry Andric 915130d950cSDimitry Andric if (valid_cast == -1) 916130d950cSDimitry Andric return NULL; 917130d950cSDimitry Andric 918130d950cSDimitry Andric return sb_ptr; 919130d950cSDimitry Andric} 920130d950cSDimitry Andric 921130d950cSDimitry AndricSWIGEXPORT bool 922130d950cSDimitry AndricLLDBSwigPythonCallCommand 923130d950cSDimitry Andric( 924130d950cSDimitry Andric const char *python_function_name, 925130d950cSDimitry Andric const char *session_dictionary_name, 926130d950cSDimitry Andric lldb::DebuggerSP& debugger, 927130d950cSDimitry Andric const char* args, 928130d950cSDimitry Andric lldb_private::CommandReturnObject& cmd_retobj, 929130d950cSDimitry Andric lldb::ExecutionContextRefSP exe_ctx_ref_sp 930130d950cSDimitry Andric) 931130d950cSDimitry Andric{ 932130d950cSDimitry Andric lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj); 933130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 934130d950cSDimitry Andric lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); 935130d950cSDimitry Andric 936130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 937130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 938130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 939130d950cSDimitry Andric 940130d950cSDimitry Andric if (!pfunc.IsAllocated()) 941130d950cSDimitry Andric return false; 942130d950cSDimitry Andric 943130d950cSDimitry Andric // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you 944130d950cSDimitry Andric // see comment above for SBCommandReturnObjectReleaser for further details 945130d950cSDimitry Andric auto argc = pfunc.GetArgInfo(); 946130d950cSDimitry Andric if (!argc) { 947130d950cSDimitry Andric llvm::consumeError(argc.takeError()); 948130d950cSDimitry Andric return false; 949130d950cSDimitry Andric } 950130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 951130d950cSDimitry Andric PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); 952130d950cSDimitry Andric PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb)); 953130d950cSDimitry Andric 954130d950cSDimitry Andric if (argc.get().max_positional_args < 5u) 955130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), cmd_retobj_arg, dict); 956130d950cSDimitry Andric else 957130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg, dict); 958130d950cSDimitry Andric 959130d950cSDimitry Andric return true; 960130d950cSDimitry Andric} 961130d950cSDimitry Andric 962130d950cSDimitry AndricSWIGEXPORT bool 963130d950cSDimitry AndricLLDBSwigPythonCallCommandObject 964130d950cSDimitry Andric( 965130d950cSDimitry Andric PyObject *implementor, 966130d950cSDimitry Andric lldb::DebuggerSP& debugger, 967130d950cSDimitry Andric const char* args, 968130d950cSDimitry Andric lldb_private::CommandReturnObject& cmd_retobj, 969130d950cSDimitry Andric lldb::ExecutionContextRefSP exe_ctx_ref_sp 970130d950cSDimitry Andric) 971130d950cSDimitry Andric{ 972130d950cSDimitry Andric lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj); 973130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 974130d950cSDimitry Andric lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); 975130d950cSDimitry Andric 976130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 977130d950cSDimitry Andric 978130d950cSDimitry Andric PythonObject self(PyRefType::Borrowed, implementor); 979130d950cSDimitry Andric auto pfunc = self.ResolveName<PythonCallable>("__call__"); 980130d950cSDimitry Andric 981130d950cSDimitry Andric if (!pfunc.IsAllocated()) 982130d950cSDimitry Andric return false; 983130d950cSDimitry Andric 984130d950cSDimitry Andric // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you 985130d950cSDimitry Andric // see comment above for SBCommandReturnObjectReleaser for further details 986130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 987130d950cSDimitry Andric PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); 988130d950cSDimitry Andric PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb)); 989130d950cSDimitry Andric 990130d950cSDimitry Andric pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg); 991130d950cSDimitry Andric 992130d950cSDimitry Andric return true; 993130d950cSDimitry Andric} 994130d950cSDimitry Andric 995130d950cSDimitry AndricSWIGEXPORT void* 996130d950cSDimitry AndricLLDBSWIGPythonCreateOSPlugin 997130d950cSDimitry Andric( 998130d950cSDimitry Andric const char *python_class_name, 999130d950cSDimitry Andric const char *session_dictionary_name, 1000130d950cSDimitry Andric const lldb::ProcessSP& process_sp 1001130d950cSDimitry Andric) 1002130d950cSDimitry Andric{ 1003130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 1004130d950cSDimitry Andric Py_RETURN_NONE; 1005130d950cSDimitry Andric 1006130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1007130d950cSDimitry Andric 1008130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1009130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 1010130d950cSDimitry Andric 1011130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1012130d950cSDimitry Andric Py_RETURN_NONE; 1013130d950cSDimitry Andric 1014130d950cSDimitry Andric // I do not want the SBProcess to be deallocated when going out of scope because python 1015130d950cSDimitry Andric // has ownership of it and will manage memory for this object by itself 1016130d950cSDimitry Andric lldb::SBProcess *process_sb = new lldb::SBProcess(process_sp); 1017130d950cSDimitry Andric PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb)); 1018130d950cSDimitry Andric if (!process_arg.IsAllocated()) 1019130d950cSDimitry Andric Py_RETURN_NONE; 1020130d950cSDimitry Andric 1021130d950cSDimitry Andric auto result = pfunc(process_arg); 1022130d950cSDimitry Andric 1023130d950cSDimitry Andric if (result.IsAllocated()) 1024130d950cSDimitry Andric return result.release(); 1025130d950cSDimitry Andric 1026130d950cSDimitry Andric Py_RETURN_NONE; 1027130d950cSDimitry Andric} 1028130d950cSDimitry Andric 1029130d950cSDimitry AndricSWIGEXPORT void* 1030130d950cSDimitry AndricLLDBSWIGPython_CreateFrameRecognizer 1031130d950cSDimitry Andric( 1032130d950cSDimitry Andric const char *python_class_name, 1033130d950cSDimitry Andric const char *session_dictionary_name 1034130d950cSDimitry Andric) 1035130d950cSDimitry Andric{ 1036130d950cSDimitry Andric if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) 1037130d950cSDimitry Andric Py_RETURN_NONE; 1038130d950cSDimitry Andric 1039130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1040130d950cSDimitry Andric 1041130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1042130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); 1043130d950cSDimitry Andric 1044130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1045130d950cSDimitry Andric Py_RETURN_NONE; 1046130d950cSDimitry Andric 1047130d950cSDimitry Andric auto result = pfunc(); 1048130d950cSDimitry Andric 1049130d950cSDimitry Andric if (result.IsAllocated()) 1050130d950cSDimitry Andric return result.release(); 1051130d950cSDimitry Andric 1052130d950cSDimitry Andric Py_RETURN_NONE; 1053130d950cSDimitry Andric} 1054130d950cSDimitry Andric 1055130d950cSDimitry AndricSWIGEXPORT PyObject* 1056130d950cSDimitry AndricLLDBSwigPython_GetRecognizedArguments 1057130d950cSDimitry Andric( 1058130d950cSDimitry Andric PyObject *implementor, 1059130d950cSDimitry Andric const lldb::StackFrameSP& frame_sp 1060130d950cSDimitry Andric) 1061130d950cSDimitry Andric{ 1062130d950cSDimitry Andric static char callee_name[] = "get_recognized_arguments"; 1063130d950cSDimitry Andric 1064130d950cSDimitry Andric lldb::SBFrame frame_sb(frame_sp); 1065130d950cSDimitry Andric PyObject *arg = SBTypeToSWIGWrapper(frame_sb); 1066130d950cSDimitry Andric 1067130d950cSDimitry Andric PythonString str(callee_name); 1068130d950cSDimitry Andric PyObject* result = PyObject_CallMethodObjArgs(implementor, str.get(), arg, 1069130d950cSDimitry Andric NULL); 1070130d950cSDimitry Andric return result; 1071130d950cSDimitry Andric} 1072130d950cSDimitry Andric 1073130d950cSDimitry AndricSWIGEXPORT void* 1074130d950cSDimitry AndricLLDBSWIGPython_GetDynamicSetting (void* module, const char* setting, const lldb::TargetSP& target_sp) 1075130d950cSDimitry Andric{ 1076130d950cSDimitry Andric if (!module || !setting) 1077130d950cSDimitry Andric Py_RETURN_NONE; 1078130d950cSDimitry Andric 1079130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1080130d950cSDimitry Andric PythonObject py_module(PyRefType::Borrowed, (PyObject *)module); 1081130d950cSDimitry Andric auto pfunc = py_module.ResolveName<PythonCallable>("get_dynamic_setting"); 1082130d950cSDimitry Andric 1083130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1084130d950cSDimitry Andric Py_RETURN_NONE; 1085130d950cSDimitry Andric 1086130d950cSDimitry Andric lldb::SBTarget target_sb(target_sp); 1087130d950cSDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb)); 1088130d950cSDimitry Andric auto result = pfunc(target_arg, PythonString(setting)); 1089130d950cSDimitry Andric 1090130d950cSDimitry Andric return result.release(); 1091130d950cSDimitry Andric} 1092130d950cSDimitry Andric 1093130d950cSDimitry AndricSWIGEXPORT bool 1094130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordProcess 1095130d950cSDimitry Andric(const char* python_function_name, 1096130d950cSDimitry Andricconst char* session_dictionary_name, 1097130d950cSDimitry Andriclldb::ProcessSP& process, 1098130d950cSDimitry Andricstd::string& output) 1099130d950cSDimitry Andric 1100130d950cSDimitry Andric{ 1101130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1102130d950cSDimitry Andric return false; 1103130d950cSDimitry Andric 1104130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1105130d950cSDimitry Andric 1106130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1107130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1108130d950cSDimitry Andric 1109130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1110130d950cSDimitry Andric return false; 1111130d950cSDimitry Andric 1112130d950cSDimitry Andric lldb::SBProcess process_sb(process); 1113130d950cSDimitry Andric PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb)); 1114130d950cSDimitry Andric auto result = pfunc(process_arg, dict); 1115130d950cSDimitry Andric 1116130d950cSDimitry Andric output = result.Str().GetString().str(); 1117130d950cSDimitry Andric 1118130d950cSDimitry Andric return true; 1119130d950cSDimitry Andric} 1120130d950cSDimitry Andric 1121130d950cSDimitry AndricSWIGEXPORT bool 1122130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordThread 1123130d950cSDimitry Andric(const char* python_function_name, 1124130d950cSDimitry Andricconst char* session_dictionary_name, 1125130d950cSDimitry Andriclldb::ThreadSP& thread, 1126130d950cSDimitry Andricstd::string& output) 1127130d950cSDimitry Andric 1128130d950cSDimitry Andric{ 1129130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1130130d950cSDimitry Andric return false; 1131130d950cSDimitry Andric 1132130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1133130d950cSDimitry Andric 1134130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1135130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1136130d950cSDimitry Andric 1137130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1138130d950cSDimitry Andric return false; 1139130d950cSDimitry Andric 1140130d950cSDimitry Andric lldb::SBThread thread_sb(thread); 1141130d950cSDimitry Andric PythonObject thread_arg(PyRefType::Owned, SBTypeToSWIGWrapper(thread_sb)); 1142130d950cSDimitry Andric auto result = pfunc(thread_arg, dict); 1143130d950cSDimitry Andric 1144130d950cSDimitry Andric output = result.Str().GetString().str(); 1145130d950cSDimitry Andric 1146130d950cSDimitry Andric return true; 1147130d950cSDimitry Andric} 1148130d950cSDimitry Andric 1149130d950cSDimitry AndricSWIGEXPORT bool 1150130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordTarget 1151130d950cSDimitry Andric(const char* python_function_name, 1152130d950cSDimitry Andricconst char* session_dictionary_name, 1153130d950cSDimitry Andriclldb::TargetSP& target, 1154130d950cSDimitry Andricstd::string& output) 1155130d950cSDimitry Andric 1156130d950cSDimitry Andric{ 1157130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1158130d950cSDimitry Andric return false; 1159130d950cSDimitry Andric 1160130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1161130d950cSDimitry Andric 1162130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1163130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); 1164130d950cSDimitry Andric 1165130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1166130d950cSDimitry Andric return false; 1167130d950cSDimitry Andric 1168130d950cSDimitry Andric lldb::SBTarget target_sb(target); 1169130d950cSDimitry Andric PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb)); 1170130d950cSDimitry Andric auto result = pfunc(target_arg, dict); 1171130d950cSDimitry Andric 1172130d950cSDimitry Andric output = result.Str().GetString().str(); 1173130d950cSDimitry Andric 1174130d950cSDimitry Andric return true; 1175130d950cSDimitry Andric} 1176130d950cSDimitry Andric 1177130d950cSDimitry AndricSWIGEXPORT bool 1178130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordFrame 1179130d950cSDimitry Andric(const char* python_function_name, 1180130d950cSDimitry Andricconst char* session_dictionary_name, 1181130d950cSDimitry Andriclldb::StackFrameSP& frame, 1182130d950cSDimitry Andricstd::string& output) 1183130d950cSDimitry Andric 1184130d950cSDimitry Andric{ 1185130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1186130d950cSDimitry Andric return false; 1187130d950cSDimitry Andric 1188130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1189130d950cSDimitry Andric 1190130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1191130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); 1192130d950cSDimitry Andric 1193130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1194130d950cSDimitry Andric return false; 1195130d950cSDimitry Andric 1196130d950cSDimitry Andric lldb::SBFrame frame_sb(frame); 1197130d950cSDimitry Andric PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(frame_sb)); 1198130d950cSDimitry Andric auto result = pfunc(frame_arg, dict); 1199130d950cSDimitry Andric 1200130d950cSDimitry Andric output = result.Str().GetString().str(); 1201130d950cSDimitry Andric 1202130d950cSDimitry Andric return true; 1203130d950cSDimitry Andric} 1204130d950cSDimitry Andric 1205130d950cSDimitry AndricSWIGEXPORT bool 1206130d950cSDimitry AndricLLDBSWIGPythonRunScriptKeywordValue 1207130d950cSDimitry Andric(const char* python_function_name, 1208130d950cSDimitry Andricconst char* session_dictionary_name, 1209130d950cSDimitry Andriclldb::ValueObjectSP& value, 1210130d950cSDimitry Andricstd::string& output) 1211130d950cSDimitry Andric 1212130d950cSDimitry Andric{ 1213130d950cSDimitry Andric if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) 1214130d950cSDimitry Andric return false; 1215130d950cSDimitry Andric 1216130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1217130d950cSDimitry Andric 1218130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1219130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1220130d950cSDimitry Andric 1221130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1222130d950cSDimitry Andric return false; 1223130d950cSDimitry Andric 1224130d950cSDimitry Andric lldb::SBValue value_sb(value); 1225130d950cSDimitry Andric PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(value_sb)); 1226130d950cSDimitry Andric auto result = pfunc(value_arg, dict); 1227130d950cSDimitry Andric 1228130d950cSDimitry Andric output = result.Str().GetString().str(); 1229130d950cSDimitry Andric 1230130d950cSDimitry Andric return true; 1231130d950cSDimitry Andric} 1232130d950cSDimitry Andric 1233130d950cSDimitry AndricSWIGEXPORT bool 1234130d950cSDimitry AndricLLDBSwigPythonCallModuleInit 1235130d950cSDimitry Andric( 1236130d950cSDimitry Andric const char *python_module_name, 1237130d950cSDimitry Andric const char *session_dictionary_name, 1238130d950cSDimitry Andric lldb::DebuggerSP& debugger 1239130d950cSDimitry Andric) 1240130d950cSDimitry Andric{ 1241130d950cSDimitry Andric std::string python_function_name_string = python_module_name; 1242130d950cSDimitry Andric python_function_name_string += ".__lldb_init_module"; 1243130d950cSDimitry Andric const char* python_function_name = python_function_name_string.c_str(); 1244130d950cSDimitry Andric 1245130d950cSDimitry Andric PyErr_Cleaner py_err_cleaner(true); 1246130d950cSDimitry Andric 1247130d950cSDimitry Andric auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); 1248130d950cSDimitry Andric auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); 1249130d950cSDimitry Andric 1250130d950cSDimitry Andric // This method is optional and need not exist. So if we don't find it, 1251130d950cSDimitry Andric // it's actually a success, not a failure. 1252130d950cSDimitry Andric if (!pfunc.IsAllocated()) 1253130d950cSDimitry Andric return true; 1254130d950cSDimitry Andric 1255130d950cSDimitry Andric lldb::SBDebugger debugger_sb(debugger); 1256130d950cSDimitry Andric PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); 1257130d950cSDimitry Andric pfunc(debugger_arg, dict); 1258130d950cSDimitry Andric 1259130d950cSDimitry Andric return true; 1260130d950cSDimitry Andric} 1261130d950cSDimitry Andric%} 1262130d950cSDimitry Andric 1263130d950cSDimitry Andric 1264130d950cSDimitry Andric%runtime %{ 1265130d950cSDimitry Andric// Forward declaration to be inserted at the start of LLDBWrapPython.h 1266130d950cSDimitry Andric#include "lldb/API/SBDebugger.h" 1267130d950cSDimitry Andric#include "lldb/API/SBValue.h" 1268130d950cSDimitry Andric 1269130d950cSDimitry AndricSWIGEXPORT lldb::ValueObjectSP 1270130d950cSDimitry AndricLLDBSWIGPython_GetValueObjectSPFromSBValue (void* data) 1271130d950cSDimitry Andric{ 1272130d950cSDimitry Andric lldb::ValueObjectSP valobj_sp; 1273130d950cSDimitry Andric if (data) 1274130d950cSDimitry Andric { 1275130d950cSDimitry Andric lldb::SBValue* sb_ptr = (lldb::SBValue *)data; 1276130d950cSDimitry Andric valobj_sp = sb_ptr->GetSP(); 1277130d950cSDimitry Andric } 1278130d950cSDimitry Andric return valobj_sp; 1279130d950cSDimitry Andric} 1280130d950cSDimitry Andric 1281130d950cSDimitry Andric#ifdef __cplusplus 1282130d950cSDimitry Andricextern "C" { 1283130d950cSDimitry Andric#endif 1284130d950cSDimitry Andric 1285130d950cSDimitry Andricvoid LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton); 1286130d950cSDimitry Andric 1287130d950cSDimitry Andric#ifdef __cplusplus 1288130d950cSDimitry Andric} 1289130d950cSDimitry Andric#endif 1290130d950cSDimitry Andric%} 1291130d950cSDimitry Andric 1292130d950cSDimitry Andric%wrapper %{ 1293130d950cSDimitry Andric 1294130d950cSDimitry Andric 1295130d950cSDimitry Andric// For the LogOutputCallback functions 1296130d950cSDimitry Andricvoid LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) { 1297130d950cSDimitry Andric if (baton != Py_None) { 1298130d950cSDimitry Andric SWIG_PYTHON_THREAD_BEGIN_BLOCK; 1299130d950cSDimitry Andric PyObject *result = PyObject_CallFunction(reinterpret_cast<PyObject*>(baton), const_cast<char*>("s"), str); 1300130d950cSDimitry Andric Py_XDECREF(result); 1301130d950cSDimitry Andric SWIG_PYTHON_THREAD_END_BLOCK; 1302130d950cSDimitry Andric } 1303130d950cSDimitry Andric} 1304130d950cSDimitry Andric%} 1305