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 31using namespace lldb_private; 32using namespace lldb; 33 34//---------------------------------------------------------------------- 35// PythonObject 36//---------------------------------------------------------------------- 37PythonObject::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 44void 45PythonObject::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 69PythonString 70PythonObject::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 80PythonString 81PythonObject::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 95PythonString::PythonString (PyObject *py_obj) : 96 PythonObject(py_obj) 97{ 98} 99 100PythonString::PythonString (const PythonObject &object) : 101 PythonObject(object.GetPythonObject()) 102{ 103} 104 105PythonString::PythonString (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 106 PythonObject (script_object_sp) 107{ 108} 109 110PythonString::PythonString (const char* string) : 111 PythonObject(PyString_FromString(string)) 112{ 113} 114 115PythonString::PythonString () : 116 PythonObject() 117{ 118} 119 120PythonString::~PythonString () 121{ 122} 123 124bool 125PythonString::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 134const char* 135PythonString::GetString() const 136{ 137 if (m_py_obj) 138 return PyString_AsString(m_py_obj); 139 return NULL; 140} 141 142size_t 143PythonString::GetSize() const 144{ 145 if (m_py_obj) 146 return PyString_Size(m_py_obj); 147 return 0; 148} 149 150void 151PythonString::SetString (const char* string) 152{ 153 PythonObject::Reset(PyString_FromString(string)); 154} 155 156//---------------------------------------------------------------------- 157// PythonInteger 158//---------------------------------------------------------------------- 159 160PythonInteger::PythonInteger (PyObject *py_obj) : 161 PythonObject(py_obj) 162{ 163} 164 165PythonInteger::PythonInteger (const PythonObject &object) : 166 PythonObject(object.GetPythonObject()) 167{ 168} 169 170PythonInteger::PythonInteger (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 171 PythonObject (script_object_sp) 172{ 173} 174 175PythonInteger::PythonInteger (int64_t value) : 176 PythonObject(PyInt_FromLong(value)) 177{ 178} 179 180 181PythonInteger::~PythonInteger () 182{ 183} 184 185bool 186PythonInteger::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 195int64_t 196PythonInteger::GetInteger() 197{ 198 if (m_py_obj) 199 return PyInt_AsLong(m_py_obj); 200 else 201 return UINT64_MAX; 202} 203 204void 205PythonInteger::SetInteger (int64_t value) 206{ 207 PythonObject::Reset(PyInt_FromLong(value)); 208} 209 210//---------------------------------------------------------------------- 211// PythonList 212//---------------------------------------------------------------------- 213 214PythonList::PythonList () : 215 PythonObject(PyList_New(0)) 216{ 217} 218 219PythonList::PythonList (uint32_t count) : 220 PythonObject(PyList_New(count)) 221{ 222} 223 224PythonList::PythonList (PyObject *py_obj) : 225 PythonObject(py_obj) 226{ 227} 228 229 230PythonList::PythonList (const PythonObject &object) : 231 PythonObject(object.GetPythonObject()) 232{ 233} 234 235PythonList::PythonList (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 236 PythonObject (script_object_sp) 237{ 238} 239 240PythonList::~PythonList () 241{ 242} 243 244bool 245PythonList::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 254uint32_t 255PythonList::GetSize() 256{ 257 if (m_py_obj) 258 return PyList_GET_SIZE(m_py_obj); 259 return 0; 260} 261 262PythonObject 263PythonList::GetItemAtIndex (uint32_t index) 264{ 265 if (m_py_obj) 266 return PythonObject(PyList_GetItem(m_py_obj, index)); 267 return NULL; 268} 269 270void 271PythonList::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 277void 278PythonList::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 288PythonDictionary::PythonDictionary () : 289 PythonObject(PyDict_New()) 290{ 291} 292 293PythonDictionary::PythonDictionary (PyObject *py_obj) : 294 PythonObject(py_obj) 295{ 296} 297 298 299PythonDictionary::PythonDictionary (const PythonObject &object) : 300 PythonObject(object.GetPythonObject()) 301{ 302} 303 304PythonDictionary::PythonDictionary (const lldb::ScriptInterpreterObjectSP &script_object_sp) : 305 PythonObject (script_object_sp) 306{ 307} 308 309PythonDictionary::~PythonDictionary () 310{ 311} 312 313bool 314PythonDictionary::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 323uint32_t 324PythonDictionary::GetSize() 325{ 326 if (m_py_obj) 327 return PyDict_Size(m_py_obj); 328 return 0; 329} 330 331PythonObject 332PythonDictionary::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 343PythonObject 344PythonDictionary::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 352const char * 353PythonDictionary::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 364int64_t 365PythonDictionary::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 382PythonList 383PythonDictionary::GetKeys () const 384{ 385 if (m_py_obj) 386 return PythonList(PyDict_Keys(m_py_obj)); 387 return PythonList(); 388} 389 390PythonString 391PythonDictionary::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 407PythonObject 408PythonDictionary::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 423void 424PythonDictionary::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