PythonDataObjects.cpp revision b2e953d1d753bc725ea78f573c150493b99e2205
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 "lldb/Interpreter/PythonDataObjects.h" 25 26using namespace lldb_private; 27using namespace lldb; 28 29PythonDataObject::PythonDataObject (PyObject* object) : 30 m_object(object) 31{ 32} 33 34PythonDataObject::PythonDataObject () : 35 m_object() 36{ 37} 38 39PythonDataObject::~PythonDataObject () 40{ 41} 42 43PythonDataString 44PythonDataObject::GetStringObject () 45{ 46 return PythonDataString(GetPythonObject()); 47} 48 49PythonDataInteger 50PythonDataObject::GetIntegerObject () 51{ 52 return PythonDataInteger(GetPythonObject()); 53} 54 55PythonDataArray 56PythonDataObject::GetArrayObject() 57{ 58 return PythonDataArray(GetPythonObject()); 59} 60 61PythonDataDictionary 62PythonDataObject::GetDictionaryObject() 63{ 64 return PythonDataDictionary(GetPythonObject()); 65} 66 67PythonDataInteger::PythonDataInteger (bool create_empty) : 68 m_object(create_empty ? PyInt_FromLong(0) : NULL) 69{ 70} 71 72PythonDataInteger::PythonDataInteger (PyObject* object) : 73 m_object(object) 74{ 75 if (object && !PyInt_Check(GetPythonObject())) 76 m_object.Reset(); 77} 78 79PythonDataInteger::PythonDataInteger (int64_t value) : 80 m_object(PyInt_FromLong(value)) 81{ 82} 83 84 85PythonDataInteger::~PythonDataInteger () 86{ 87} 88 89int64_t 90PythonDataInteger::GetInteger() 91{ 92 if (m_object) 93 return PyInt_AsLong(GetPythonObject()); 94 else 95 return UINT64_MAX; 96} 97 98void 99PythonDataInteger::SetInteger (int64_t value) 100{ 101 m_object.Reset(PyInt_FromLong(value)); 102} 103 104PythonDataString::PythonDataString (bool create_empty) : 105 m_object(create_empty ? PyString_FromString("") : NULL) 106{ 107} 108 109PythonDataString::PythonDataString (PyObject* object) : 110 m_object(object) 111{ 112 if (object && !PyString_Check(GetPythonObject())) 113 m_object.Reset(); 114} 115 116PythonDataString::PythonDataString (const char* string) : 117 m_object(PyString_FromString(string)) 118{ 119} 120 121PythonDataString::~PythonDataString () 122{ 123} 124 125const char* 126PythonDataString::GetString() const 127{ 128 if (m_object) 129 return PyString_AsString(GetPythonObject()); 130 return NULL; 131} 132 133size_t 134PythonDataString::GetSize() const 135{ 136 if (m_object) 137 return PyString_Size(GetPythonObject()); 138 return 0; 139} 140 141void 142PythonDataString::SetString (const char* string) 143{ 144 m_object.Reset(PyString_FromString(string)); 145} 146 147PythonDataArray::PythonDataArray (bool create_empty) : 148 m_object(create_empty ? PyList_New(0) : NULL) 149{ 150} 151 152PythonDataArray::PythonDataArray (uint32_t count) : 153 m_object(PyList_New(count)) 154{ 155} 156 157PythonDataArray::PythonDataArray (PyObject* object) : 158 m_object(object) 159{ 160 if (object && !PyList_Check(GetPythonObject())) 161 m_object.Reset(); 162} 163 164PythonDataArray::~PythonDataArray () 165{ 166} 167 168uint32_t 169PythonDataArray::GetSize() 170{ 171 if (m_object) 172 return PyList_GET_SIZE(GetPythonObject()); 173 return 0; 174} 175 176PythonDataObject 177PythonDataArray::GetItemAtIndex (uint32_t index) 178{ 179 if (m_object) 180 return PythonDataObject(PyList_GetItem(GetPythonObject(), index)); 181 return NULL; 182} 183 184void 185PythonDataArray::SetItemAtIndex (uint32_t index, const PythonDataObject & object) 186{ 187 if (m_object && object) 188 PyList_SetItem(GetPythonObject(), index, object.GetPythonObject()); 189} 190 191void 192PythonDataArray::AppendItem (const PythonDataObject &object) 193{ 194 if (m_object && object) 195 PyList_Append(GetPythonObject(), object.GetPythonObject()); 196} 197 198PythonDataDictionary::PythonDataDictionary (bool create_empty) : 199 m_object(create_empty ? PyDict_New() : NULL) 200{ 201} 202 203PythonDataDictionary::PythonDataDictionary (PyObject* object) : 204 m_object(object) 205{ 206 if (object && !PyDict_Check(GetPythonObject())) 207 m_object.Reset(); 208} 209 210PythonDataDictionary::~PythonDataDictionary () 211{ 212} 213 214uint32_t 215PythonDataDictionary::GetSize() 216{ 217 if (m_object) 218 return PyDict_Size(GetPythonObject()); 219 return 0; 220} 221 222PythonDataObject 223PythonDataDictionary::GetItemForKey (const char *key) const 224{ 225 if (key && key[0]) 226 { 227 PythonDataString python_key(key); 228 return GetItemForKey(python_key); 229 } 230 return NULL; 231} 232 233 234PythonDataObject 235PythonDataDictionary::GetItemForKey (const PythonDataString &key) const 236{ 237 if (m_object && key) 238 return PythonDataObject(PyDict_GetItem(GetPythonObject(), key.GetPythonObject())); 239 return PythonDataObject(); 240} 241 242 243const char * 244PythonDataDictionary::GetItemForKeyAsString (const PythonDataString &key, const char *fail_value) const 245{ 246 if (m_object && key) 247 { 248 PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject()); 249 if (object && PyString_Check(object)) 250 return PyString_AsString(object); 251 } 252 return fail_value; 253} 254 255int64_t 256PythonDataDictionary::GetItemForKeyAsInteger (const PythonDataString &key, int64_t fail_value) const 257{ 258 if (m_object && key) 259 { 260 PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject()); 261 if (object && PyInt_Check(object)) 262 return PyInt_AsLong(object); 263 } 264 return fail_value; 265} 266 267PythonDataArray 268PythonDataDictionary::GetKeys () const 269{ 270 if (m_object) 271 return PythonDataArray(PyDict_Keys(GetPythonObject())); 272 return PythonDataArray(); 273} 274 275PythonDataString 276PythonDataDictionary::GetKeyAtPosition (uint32_t pos) const 277{ 278 PyObject *key, *value; 279 Py_ssize_t pos_iter = 0; 280 281 if (m_object) 282 { 283 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) 284 { 285 if (pos-- == 0) 286 return PythonDataString(key); 287 } 288 } 289 return PythonDataString(); 290} 291 292PythonDataObject 293PythonDataDictionary::GetValueAtPosition (uint32_t pos) const 294{ 295 PyObject *key, *value; 296 Py_ssize_t pos_iter = 0; 297 298 if (!m_object) 299 return NULL; 300 301 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) { 302 if (pos-- == 0) 303 return PythonDataObject(value); 304 } 305 return PythonDataObject(); 306} 307 308void 309PythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value) 310{ 311 if (m_object && key && value) 312 PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject()); 313} 314 315#endif 316