//===-- PythonDataObjects.cpp ------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // In order to guarantee correct working with Python, Python.h *MUST* be // the *FIRST* header file included here. #ifdef LLDB_DISABLE_PYTHON // Python is disabled in this build #else #if defined (__APPLE__) #include #else #include #endif #include "lldb/Interpreter/PythonDataObjects.h" using namespace lldb_private; using namespace lldb; PythonDataObject::PythonDataObject (PyObject* object) : m_object(object) { } PythonDataObject::PythonDataObject () : m_object() { } PythonDataObject::~PythonDataObject () { } PythonDataString PythonDataObject::GetStringObject () { return PythonDataString(GetPythonObject()); } PythonDataInteger PythonDataObject::GetIntegerObject () { return PythonDataInteger(GetPythonObject()); } PythonDataArray PythonDataObject::GetArrayObject() { return PythonDataArray(GetPythonObject()); } PythonDataDictionary PythonDataObject::GetDictionaryObject() { return PythonDataDictionary(GetPythonObject()); } PythonDataInteger::PythonDataInteger (bool create_empty) : m_object(create_empty ? PyInt_FromLong(0) : NULL) { } PythonDataInteger::PythonDataInteger (PyObject* object) : m_object(object) { if (object && !PyInt_Check(GetPythonObject())) m_object.Reset(); } PythonDataInteger::PythonDataInteger (int64_t value) : m_object(PyInt_FromLong(value)) { } PythonDataInteger::~PythonDataInteger () { } int64_t PythonDataInteger::GetInteger() { if (m_object) return PyInt_AsLong(GetPythonObject()); else return UINT64_MAX; } void PythonDataInteger::SetInteger (int64_t value) { m_object.Reset(PyInt_FromLong(value)); } PythonDataString::PythonDataString (bool create_empty) : m_object(create_empty ? PyString_FromString("") : NULL) { } PythonDataString::PythonDataString (PyObject* object) : m_object(object) { if (object && !PyString_Check(GetPythonObject())) m_object.Reset(); } PythonDataString::PythonDataString (const char* string) : m_object(PyString_FromString(string)) { } PythonDataString::~PythonDataString () { } const char* PythonDataString::GetString() const { if (m_object) return PyString_AsString(GetPythonObject()); return NULL; } size_t PythonDataString::GetSize() const { if (m_object) return PyString_Size(GetPythonObject()); return 0; } void PythonDataString::SetString (const char* string) { m_object.Reset(PyString_FromString(string)); } PythonDataArray::PythonDataArray (bool create_empty) : m_object(create_empty ? PyList_New(0) : NULL) { } PythonDataArray::PythonDataArray (uint32_t count) : m_object(PyList_New(count)) { } PythonDataArray::PythonDataArray (PyObject* object) : m_object(object) { if (object && !PyList_Check(GetPythonObject())) m_object.Reset(); } PythonDataArray::~PythonDataArray () { } uint32_t PythonDataArray::GetSize() { if (m_object) return PyList_GET_SIZE(GetPythonObject()); return 0; } PythonDataObject PythonDataArray::GetItemAtIndex (uint32_t index) { if (m_object) return PythonDataObject(PyList_GetItem(GetPythonObject(), index)); return NULL; } void PythonDataArray::SetItemAtIndex (uint32_t index, const PythonDataObject & object) { if (m_object && object) PyList_SetItem(GetPythonObject(), index, object.GetPythonObject()); } void PythonDataArray::AppendItem (const PythonDataObject &object) { if (m_object && object) PyList_Append(GetPythonObject(), object.GetPythonObject()); } PythonDataDictionary::PythonDataDictionary (bool create_empty) : m_object(create_empty ? PyDict_New() : NULL) { } PythonDataDictionary::PythonDataDictionary (PyObject* object) : m_object(object) { if (object && !PyDict_Check(GetPythonObject())) m_object.Reset(); } PythonDataDictionary::~PythonDataDictionary () { } uint32_t PythonDataDictionary::GetSize() { if (m_object) return PyDict_Size(GetPythonObject()); return 0; } PythonDataObject PythonDataDictionary::GetItemForKey (const char *key) const { if (key && key[0]) { PythonDataString python_key(key); return GetItemForKey(python_key); } return NULL; } PythonDataObject PythonDataDictionary::GetItemForKey (const PythonDataString &key) const { if (m_object && key) return PythonDataObject(PyDict_GetItem(GetPythonObject(), key.GetPythonObject())); return PythonDataObject(); } const char * PythonDataDictionary::GetItemForKeyAsString (const PythonDataString &key, const char *fail_value) const { if (m_object && key) { PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject()); if (object && PyString_Check(object)) return PyString_AsString(object); } return fail_value; } int64_t PythonDataDictionary::GetItemForKeyAsInteger (const PythonDataString &key, int64_t fail_value) const { if (m_object && key) { PyObject *object = PyDict_GetItem(GetPythonObject(), key.GetPythonObject()); if (object && PyInt_Check(object)) return PyInt_AsLong(object); } return fail_value; } PythonDataArray PythonDataDictionary::GetKeys () const { if (m_object) return PythonDataArray(PyDict_Keys(GetPythonObject())); return PythonDataArray(); } PythonDataString PythonDataDictionary::GetKeyAtPosition (uint32_t pos) const { PyObject *key, *value; Py_ssize_t pos_iter = 0; if (m_object) { while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) { if (pos-- == 0) return PythonDataString(key); } } return PythonDataString(); } PythonDataObject PythonDataDictionary::GetValueAtPosition (uint32_t pos) const { PyObject *key, *value; Py_ssize_t pos_iter = 0; if (!m_object) return NULL; while (PyDict_Next(GetPythonObject(), &pos_iter, &key, &value)) { if (pos-- == 0) return PythonDataObject(value); } return PythonDataObject(); } void PythonDataDictionary::SetItemForKey (const PythonDataString &key, const PythonDataObject &value) { if (m_object && key && value) PyDict_SetItem(GetPythonObject(), key.GetPythonObject(), value.GetPythonObject()); } #endif