1 //===-- PythonDataObjects.cpp ------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // In order to guarantee correct working with Python, Python.h *MUST* be 11 // the *FIRST* header file included here. 12 #ifdef LLDB_DISABLE_PYTHON 13 14 // Python is disabled in this build 15 16 #else 17 18 #if defined (__APPLE__) 19 #include <Python/Python.h> 20 #else 21 #include <Python.h> 22 #endif 23 24 #include <stdio.h> 25 26 #include "lldb/Core/Stream.h" 27 #include "lldb/Host/File.h" 28 #include "lldb/Interpreter/PythonDataObjects.h" 29 #include "lldb/Interpreter/ScriptInterpreter.h" 30 31 using namespace lldb_private; 32 using namespace lldb; 33 34 //---------------------------------------------------------------------- 35 // PythonObject 36 //---------------------------------------------------------------------- 37 PythonObject::PythonObject (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 38 m_py_obj (NULL) 39 { 40 if (script_object_sp) 41 Reset ((PyObject *)script_object_sp->GetObject()); 42 } 43 44 void 45 PythonObject::Dump (Stream &strm) const 46 { 47 if (m_py_obj) 48 { 49 FILE *file = ::tmpfile(); 50 if (file) 51 { 52 ::PyObject_Print (m_py_obj, file, 0); 53 const long length = ftell (file); 54 if (length) 55 { 56 ::rewind(file); 57 std::vector<char> file_contents (length,'\0'); 58 const size_t length_read = ::fread (file_contents.data(), 1, file_contents.size(), file); 59 if (length_read > 0) 60 strm.Write (file_contents.data(), length_read); 61 } 62 ::fclose (file); 63 } 64 } 65 else 66 strm.PutCString ("NULL"); 67 } 68 69 PythonString 70 PythonObject::Repr () 71 { 72 if (!m_py_obj) 73 return PythonString (); 74 PyObject *repr = PyObject_Repr(m_py_obj); 75 if (!repr) 76 return PythonString (); 77 return PythonString(repr); 78 } 79 80 PythonString 81 PythonObject::Str () 82 { 83 if (!m_py_obj) 84 return PythonString (); 85 PyObject *str = PyObject_Str(m_py_obj); 86 if (!str) 87 return PythonString (); 88 return PythonString(str); 89 } 90 91 //---------------------------------------------------------------------- 92 // PythonString 93 //---------------------------------------------------------------------- 94 95 PythonString::PythonString (PyObject *py_obj) : 96 PythonObject(py_obj) 97 { 98 } 99 100 PythonString::PythonString (const PythonObject &object) : 101 PythonObject(object.GetPythonObject()) 102 { 103 } 104 105 PythonString::PythonString (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 106 PythonObject (script_object_sp) 107 { 108 } 109 110 PythonString::PythonString (const char* string) : 111 PythonObject(PyString_FromString(string)) 112 { 113 } 114 115 PythonString::PythonString () : 116 PythonObject() 117 { 118 } 119 120 PythonString::~PythonString () 121 { 122 } 123 124 bool 125 PythonString::Reset (PyObject *py_obj) 126 { 127 if (py_obj && PyString_Check(py_obj)) 128 return PythonObject::Reset(py_obj); 129 130 PythonObject::Reset(NULL); 131 return py_obj == NULL; 132 } 133 134 const char* 135 PythonString::GetString() const 136 { 137 if (m_py_obj) 138 return PyString_AsString(m_py_obj); 139 return NULL; 140 } 141 142 size_t 143 PythonString::GetSize() const 144 { 145 if (m_py_obj) 146 return PyString_Size(m_py_obj); 147 return 0; 148 } 149 150 void 151 PythonString::SetString (const char* string) 152 { 153 PythonObject::Reset(PyString_FromString(string)); 154 } 155 156 //---------------------------------------------------------------------- 157 // PythonInteger 158 //---------------------------------------------------------------------- 159 160 PythonInteger::PythonInteger (PyObject *py_obj) : 161 PythonObject(py_obj) 162 { 163 } 164 165 PythonInteger::PythonInteger (const PythonObject &object) : 166 PythonObject(object.GetPythonObject()) 167 { 168 } 169 170 PythonInteger::PythonInteger (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 171 PythonObject (script_object_sp) 172 { 173 } 174 175 PythonInteger::PythonInteger (int64_t value) : 176 PythonObject(PyInt_FromLong(value)) 177 { 178 } 179 180 181 PythonInteger::~PythonInteger () 182 { 183 } 184 185 bool 186 PythonInteger::Reset (PyObject *py_obj) 187 { 188 if (py_obj && PyInt_Check(py_obj)) 189 return PythonObject::Reset(py_obj); 190 191 PythonObject::Reset(NULL); 192 return py_obj == NULL; 193 } 194 195 int64_t 196 PythonInteger::GetInteger() 197 { 198 if (m_py_obj) 199 return PyInt_AsLong(m_py_obj); 200 else 201 return UINT64_MAX; 202 } 203 204 void 205 PythonInteger::SetInteger (int64_t value) 206 { 207 PythonObject::Reset(PyInt_FromLong(value)); 208 } 209 210 //---------------------------------------------------------------------- 211 // PythonList 212 //---------------------------------------------------------------------- 213 214 PythonList::PythonList () : 215 PythonObject(PyList_New(0)) 216 { 217 } 218 219 PythonList::PythonList (uint32_t count) : 220 PythonObject(PyList_New(count)) 221 { 222 } 223 224 PythonList::PythonList (PyObject *py_obj) : 225 PythonObject(py_obj) 226 { 227 } 228 229 230 PythonList::PythonList (const PythonObject &object) : 231 PythonObject(object.GetPythonObject()) 232 { 233 } 234 235 PythonList::PythonList (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 236 PythonObject (script_object_sp) 237 { 238 } 239 240 PythonList::~PythonList () 241 { 242 } 243 244 bool 245 PythonList::Reset (PyObject *py_obj) 246 { 247 if (py_obj && PyList_Check(py_obj)) 248 return PythonObject::Reset(py_obj); 249 250 PythonObject::Reset(NULL); 251 return py_obj == NULL; 252 } 253 254 uint32_t 255 PythonList::GetSize() 256 { 257 if (m_py_obj) 258 return PyList_GET_SIZE(m_py_obj); 259 return 0; 260 } 261 262 PythonObject 263 PythonList::GetItemAtIndex (uint32_t index) 264 { 265 if (m_py_obj) 266 return PythonObject(PyList_GetItem(m_py_obj, index)); 267 return NULL; 268 } 269 270 void 271 PythonList::SetItemAtIndex (uint32_t index, const PythonObject & object) 272 { 273 if (m_py_obj && object) 274 PyList_SetItem(m_py_obj, index, object.GetPythonObject()); 275 } 276 277 void 278 PythonList::AppendItem (const PythonObject &object) 279 { 280 if (m_py_obj && object) 281 PyList_Append(m_py_obj, object.GetPythonObject()); 282 } 283 284 //---------------------------------------------------------------------- 285 // PythonDictionary 286 //---------------------------------------------------------------------- 287 288 PythonDictionary::PythonDictionary () : 289 PythonObject(PyDict_New()) 290 { 291 } 292 293 PythonDictionary::PythonDictionary (PyObject *py_obj) : 294 PythonObject(py_obj) 295 { 296 } 297 298 299 PythonDictionary::PythonDictionary (const PythonObject &object) : 300 PythonObject(object.GetPythonObject()) 301 { 302 } 303 304 PythonDictionary::PythonDictionary (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 305 PythonObject (script_object_sp) 306 { 307 } 308 309 PythonDictionary::~PythonDictionary () 310 { 311 } 312 313 bool 314 PythonDictionary::Reset (PyObject *py_obj) 315 { 316 if (py_obj && PyDict_Check(py_obj)) 317 return PythonObject::Reset(py_obj); 318 319 PythonObject::Reset(NULL); 320 return py_obj == NULL; 321 } 322 323 uint32_t 324 PythonDictionary::GetSize() 325 { 326 if (m_py_obj) 327 return PyDict_Size(m_py_obj); 328 return 0; 329 } 330 331 PythonObject 332 PythonDictionary::GetItemForKey (const char *key) const 333 { 334 if (key && key[0]) 335 { 336 PythonString python_key(key); 337 return GetItemForKey(python_key); 338 } 339 return NULL; 340 } 341 342 343 PythonObject 344 PythonDictionary::GetItemForKey (const PythonString &key) const 345 { 346 if (m_py_obj && key) 347 return PythonObject(PyDict_GetItem(m_py_obj, key.GetPythonObject())); 348 return PythonObject(); 349 } 350 351 352 const char * 353 PythonDictionary::GetItemForKeyAsString (const PythonString &key, const char *fail_value) const 354 { 355 if (m_py_obj && key) 356 { 357 PyObject *py_obj = PyDict_GetItem(m_py_obj, key.GetPythonObject()); 358 if (py_obj && PyString_Check(py_obj)) 359 return PyString_AsString(py_obj); 360 } 361 return fail_value; 362 } 363 364 int64_t 365 PythonDictionary::GetItemForKeyAsInteger (const PythonString &key, int64_t fail_value) const 366 { 367 if (m_py_obj && key) 368 { 369 PyObject *py_obj = PyDict_GetItem(m_py_obj, key.GetPythonObject()); 370 if (py_obj) 371 { 372 if (PyInt_Check(py_obj)) 373 return PyInt_AsLong(py_obj); 374 375 if (PyLong_Check(py_obj)) 376 return PyLong_AsLong(py_obj); 377 } 378 } 379 return fail_value; 380 } 381 382 PythonList 383 PythonDictionary::GetKeys () const 384 { 385 if (m_py_obj) 386 return PythonList(PyDict_Keys(m_py_obj)); 387 return PythonList(); 388 } 389 390 PythonString 391 PythonDictionary::GetKeyAtPosition (uint32_t pos) const 392 { 393 PyObject *key, *value; 394 Py_ssize_t pos_iter = 0; 395 396 if (m_py_obj) 397 { 398 while (PyDict_Next(m_py_obj, &pos_iter, &key, &value)) 399 { 400 if (pos-- == 0) 401 return PythonString(key); 402 } 403 } 404 return PythonString(); 405 } 406 407 PythonObject 408 PythonDictionary::GetValueAtPosition (uint32_t pos) const 409 { 410 PyObject *key, *value; 411 Py_ssize_t pos_iter = 0; 412 413 if (!m_py_obj) 414 return NULL; 415 416 while (PyDict_Next(m_py_obj, &pos_iter, &key, &value)) { 417 if (pos-- == 0) 418 return PythonObject(value); 419 } 420 return PythonObject(); 421 } 422 423 void 424 PythonDictionary::SetItemForKey (const PythonString &key, const PythonObject &value) 425 { 426 if (m_py_obj && key && value) 427 PyDict_SetItem(m_py_obj, key.GetPythonObject(), value.GetPythonObject()); 428 } 429 430 #endif 431