1 //===-- PythonTestSuite.cpp -----------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "gtest/gtest.h" 10 11 #include "Plugins/ScriptInterpreter/Python/lldb-python.h" 12 13 #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h" 14 #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h" 15 #include "lldb/Host/FileSystem.h" 16 #include "lldb/Host/HostInfo.h" 17 18 #include "PythonTestSuite.h" 19 20 using namespace lldb_private; 21 class TestScriptInterpreterPython : public ScriptInterpreterPythonImpl { 22 public: 23 using ScriptInterpreterPythonImpl::Initialize; 24 using ScriptInterpreterPythonImpl::InitializePrivate; 25 }; 26 27 void PythonTestSuite::SetUp() { 28 FileSystem::Initialize(); 29 HostInfoBase::Initialize(); 30 // ScriptInterpreterPython::Initialize() depends on HostInfo being 31 // initializedso it can compute the python directory etc. 32 TestScriptInterpreterPython::Initialize(); 33 TestScriptInterpreterPython::InitializePrivate(); 34 35 // Although we don't care about concurrency for the purposes of running 36 // this test suite, Python requires the GIL to be locked even for 37 // deallocating memory, which can happen when you call Py_DECREF or 38 // Py_INCREF. So acquire the GIL for the entire duration of this 39 // test suite. 40 m_gil_state = PyGILState_Ensure(); 41 } 42 43 void PythonTestSuite::TearDown() { 44 PyGILState_Release(m_gil_state); 45 46 TestScriptInterpreterPython::Terminate(); 47 HostInfoBase::Terminate(); 48 FileSystem::Terminate(); 49 } 50 51 // The following functions are the Pythonic implementations of the required 52 // callbacks. Because they're defined in libLLDB which we cannot link for the 53 // unit test, we have a 'default' implementation here. 54 55 #if PY_MAJOR_VERSION >= 3 56 extern "C" PyObject *PyInit__lldb(void) { return nullptr; } 57 #define LLDBSwigPyInit PyInit__lldb 58 #else 59 extern "C" void init_lldb(void) {} 60 #define LLDBSwigPyInit init_lldb 61 #endif 62 63 #pragma clang diagnostic push 64 #pragma clang diagnostic ignored "-Wreturn-type-c-linkage" 65 66 // Disable warning C4190: 'LLDBSwigPythonBreakpointCallbackFunction' has 67 // C-linkage specified, but returns UDT 'llvm::Expected<bool>' which is 68 // incompatible with C 69 #if _MSC_VER 70 #pragma warning (push) 71 #pragma warning (disable : 4190) 72 #endif 73 74 extern "C" llvm::Expected<bool> LLDBSwigPythonBreakpointCallbackFunction( 75 const char *python_function_name, const char *session_dictionary_name, 76 const lldb::StackFrameSP &sb_frame, 77 const lldb::BreakpointLocationSP &sb_bp_loc, 78 StructuredDataImpl *args_impl) { 79 return false; 80 } 81 82 #if _MSC_VER 83 #pragma warning (pop) 84 #endif 85 86 #pragma clang diagnostic pop 87 88 extern "C" bool LLDBSwigPythonWatchpointCallbackFunction( 89 const char *python_function_name, const char *session_dictionary_name, 90 const lldb::StackFrameSP &sb_frame, const lldb::WatchpointSP &sb_wp) { 91 return false; 92 } 93 94 extern "C" bool LLDBSwigPythonCallTypeScript( 95 const char *python_function_name, void *session_dictionary, 96 const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper, 97 const lldb::TypeSummaryOptionsSP &options_sp, std::string &retval) { 98 return false; 99 } 100 101 extern "C" void * 102 LLDBSwigPythonCreateSyntheticProvider(const char *python_class_name, 103 const char *session_dictionary_name, 104 const lldb::ValueObjectSP &valobj_sp) { 105 return nullptr; 106 } 107 108 extern "C" void * 109 LLDBSwigPythonCreateCommandObject(const char *python_class_name, 110 const char *session_dictionary_name, 111 const lldb::DebuggerSP debugger_sp) { 112 return nullptr; 113 } 114 115 extern "C" void *LLDBSwigPythonCreateScriptedThreadPlan( 116 const char *python_class_name, const char *session_dictionary_name, 117 StructuredDataImpl *args_data, 118 std::string &error_string, 119 const lldb::ThreadPlanSP &thread_plan_sp) { 120 return nullptr; 121 } 122 123 extern "C" bool LLDBSWIGPythonCallThreadPlan(void *implementor, 124 const char *method_name, 125 Event *event_sp, bool &got_error) { 126 return false; 127 } 128 129 extern "C" void *LLDBSwigPythonCreateScriptedBreakpointResolver( 130 const char *python_class_name, const char *session_dictionary_name, 131 lldb_private::StructuredDataImpl *args, lldb::BreakpointSP &bkpt_sp) { 132 return nullptr; 133 } 134 135 extern "C" unsigned int 136 LLDBSwigPythonCallBreakpointResolver(void *implementor, const char *method_name, 137 lldb_private::SymbolContext *sym_ctx) { 138 return 0; 139 } 140 141 extern "C" size_t LLDBSwigPython_CalculateNumChildren(void *implementor, 142 uint32_t max) { 143 return 0; 144 } 145 146 extern "C" void *LLDBSwigPython_GetChildAtIndex(void *implementor, 147 uint32_t idx) { 148 return nullptr; 149 } 150 151 extern "C" int LLDBSwigPython_GetIndexOfChildWithName(void *implementor, 152 const char *child_name) { 153 return 0; 154 } 155 156 extern "C" void *LLDBSWIGPython_CastPyObjectToSBValue(void *data) { 157 return nullptr; 158 } 159 160 extern lldb::ValueObjectSP 161 LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { 162 return nullptr; 163 } 164 165 extern "C" bool LLDBSwigPython_UpdateSynthProviderInstance(void *implementor) { 166 return false; 167 } 168 169 extern "C" bool 170 LLDBSwigPython_MightHaveChildrenSynthProviderInstance(void *implementor) { 171 return false; 172 } 173 174 extern "C" void * 175 LLDBSwigPython_GetValueSynthProviderInstance(void *implementor) { 176 return nullptr; 177 } 178 179 extern "C" bool 180 LLDBSwigPythonCallCommand(const char *python_function_name, 181 const char *session_dictionary_name, 182 lldb::DebuggerSP &debugger, const char *args, 183 lldb_private::CommandReturnObject &cmd_retobj, 184 lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 185 return false; 186 } 187 188 extern "C" bool 189 LLDBSwigPythonCallCommandObject(void *implementor, lldb::DebuggerSP &debugger, 190 const char *args, 191 lldb_private::CommandReturnObject &cmd_retobj, 192 lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 193 return false; 194 } 195 196 extern "C" bool 197 LLDBSwigPythonCallModuleInit(const char *python_module_name, 198 const char *session_dictionary_name, 199 lldb::DebuggerSP &debugger) { 200 return false; 201 } 202 203 extern "C" void * 204 LLDBSWIGPythonCreateOSPlugin(const char *python_class_name, 205 const char *session_dictionary_name, 206 const lldb::ProcessSP &process_sp) { 207 return nullptr; 208 } 209 210 extern "C" void * 211 LLDBSWIGPython_CreateFrameRecognizer(const char *python_class_name, 212 const char *session_dictionary_name) { 213 return nullptr; 214 } 215 216 extern "C" void * 217 LLDBSwigPython_GetRecognizedArguments(void *implementor, 218 const lldb::StackFrameSP &frame_sp) { 219 return nullptr; 220 } 221 222 extern "C" bool LLDBSWIGPythonRunScriptKeywordProcess( 223 const char *python_function_name, const char *session_dictionary_name, 224 lldb::ProcessSP &process, std::string &output) { 225 return false; 226 } 227 228 extern "C" bool LLDBSWIGPythonRunScriptKeywordThread( 229 const char *python_function_name, const char *session_dictionary_name, 230 lldb::ThreadSP &thread, std::string &output) { 231 return false; 232 } 233 234 extern "C" bool LLDBSWIGPythonRunScriptKeywordTarget( 235 const char *python_function_name, const char *session_dictionary_name, 236 lldb::TargetSP &target, std::string &output) { 237 return false; 238 } 239 240 extern "C" bool LLDBSWIGPythonRunScriptKeywordFrame( 241 const char *python_function_name, const char *session_dictionary_name, 242 lldb::StackFrameSP &frame, std::string &output) { 243 return false; 244 } 245 246 extern "C" bool LLDBSWIGPythonRunScriptKeywordValue( 247 const char *python_function_name, const char *session_dictionary_name, 248 lldb::ValueObjectSP &value, std::string &output) { 249 return false; 250 } 251 252 extern "C" void * 253 LLDBSWIGPython_GetDynamicSetting(void *module, const char *setting, 254 const lldb::TargetSP &target_sp) { 255 return nullptr; 256 } 257