PythonDataObjects.cpp revision 12477554ee676b775ec419575e1b091fa95bdc80
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 "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() 127{ 128 if (m_object) 129 return PyString_AsString(GetPythonObject()); 130 return NULL; 131} 132 133void 134PythonDataString::SetString (const char* string) 135{ 136 m_object.Reset(PyString_FromString(string)); 137} 138 139PythonDataArray::PythonDataArray (bool create_empty) : 140 m_object(create_empty ? PyList_New(0) : NULL) 141{ 142} 143 144PythonDataArray::PythonDataArray (uint32_t count) : 145 m_object(PyList_New(count)) 146{ 147} 148 149PythonDataArray::PythonDataArray (PyObject* object) : 150 m_object(object) 151{ 152 if (object && !PyList_Check(GetPythonObject())) 153 m_object.Reset(); 154} 155 156PythonDataArray::~PythonDataArray () 157{ 158} 159 160uint32_t 161PythonDataArray::GetSize() 162{ 163 if (m_object) 164 return PyList_GET_SIZE(GetPythonObject()); 165 return 0; 166} 167 168PythonDataObject 169PythonDataArray::GetItemAtIndex (uint32_t index) 170{ 171 if (m_object) 172 return PythonDataObject(PyList_GetItem(GetPythonObject(), index)); 173 return NULL; 174} 175 176void 177PythonDataArray::SetItemAtIndex (uint32_t index, const PythonDataObject & object) 178{ 179 if (m_object && object) 180 PyList_SetItem(GetPythonObject(), index, object.GetPythonObject()); 181} 182 183void 184PythonDataArray::AppendItem (const PythonDataObject &object) 185{ 186 if (m_object && object) 187 PyList_Append(GetPythonObject(), object.GetPythonObject()); 188} 189 190PythonDataDictionary::PythonDataDictionary (bool create_empty) : 191 m_object(create_empty ? PyDict_New() : NULL) 192{ 193} 194 195PythonDataDictionary::PythonDataDictionary (PyObject* object) : 196 m_object(object) 197{ 198 if (object && !PyDict_Check(GetPythonObject())) 199 m_object.Reset(); 200} 201 202PythonDataDictionary::~PythonDataDictionary () 203{ 204} 205 206uint32_t 207PythonDataDictionary::GetSize() 208{ 209 if (m_object) 210 return PyDict_Size(GetPythonObject()); 211 return 0; 212} 213 214PythonDataObject 215PythonDataDictionary::GetItemForKey (const char *key) 216{ 217 if (key && key[0]) 218 { 219 PythonDataString python_key(key); 220 return GetItemForKey(python_key); 221 } 222 return NULL; 223} 224 225 226PythonDataObject 227PythonDataDictionary::GetItemForKey (const PythonDataString &key) 228{ 229 if (m_object && key) 230 return PythonDataObject(PyDict_GetItem(GetPythonObject(), key.GetPythonObject())); 231 return PythonDataObject(); 232} 233 234PythonDataArray 235PythonDataDictionary::GetKeys () 236{ 237 if (m_object) 238 return PythonDataArray(PyDict_Keys(GetPythonObject())); 239 return PythonDataArray(); 240} 241 242PythonDataString 243PythonDataDictionary::GetKeyAtPosition (uint32_t pos) 244{ 245 PyObject *key, *value; 246 Py_ssize_t pos_iter = 0; 247 248 if (m_object) 249 { 250 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) 251 { 252 if (pos-- == 0) 253 return PythonDataString(key); 254 } 255 } 256 return PythonDataString(); 257} 258 259PythonDataObject 260PythonDataDictionary::GetValueAtPosition (uint32_t pos) 261{ 262 PyObject *key, *value; 263 Py_ssize_t pos_iter = 0; 264 265 if (!m_object) 266 return NULL; 267 268 while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) { 269 if (pos-- == 0) 270 return PythonDataObject(value); 271 } 272 return PythonDataObject(); 273} 274 275void 276PythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value) 277{ 278 if (m_object && key && value) 279 PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject()); 280} 281 282#endif 283