mirror of
https://github.com/boostorg/python.git
synced 2026-01-20 16:52:15 +00:00
Merged 2009 GSoC work from sandbox-branches/bhy/py3k branch back into trunk.
[SVN r56305]
This commit is contained in:
@@ -18,7 +18,11 @@ namespace boost { namespace python { namespace objects {
|
||||
|
||||
struct enum_object
|
||||
{
|
||||
#if PY_VERSION_HEX >= 0x03000000
|
||||
PyLongObject base_object;
|
||||
#else
|
||||
PyIntObject base_object;
|
||||
#endif
|
||||
PyObject* name;
|
||||
};
|
||||
|
||||
@@ -32,19 +36,32 @@ extern "C"
|
||||
{
|
||||
static PyObject* enum_repr(PyObject* self_)
|
||||
{
|
||||
const char *mod = PyString_AsString(PyObject_GetAttrString( self_, const_cast<char*>("__module__")));
|
||||
// XXX(bhy) Potentional memory leak here since PyObject_GetAttrString returns a new reference
|
||||
// const char *mod = PyString_AsString(PyObject_GetAttrString( self_, const_cast<char*>("__module__")));
|
||||
PyObject *mod = PyObject_GetAttrString( self_, "__module__");
|
||||
enum_object* self = downcast<enum_object>(self_);
|
||||
if (!self->name)
|
||||
{
|
||||
return PyString_FromFormat("%s.%s(%ld)", mod, self_->ob_type->tp_name, PyInt_AS_LONG(self_));
|
||||
return
|
||||
#if PY_VERSION_HEX >= 0x03000000
|
||||
PyUnicode_FromFormat("%S.%s(%ld)", mod, self_->ob_type->tp_name, PyLong_AsLong(self_));
|
||||
#else
|
||||
PyString_FromFormat("%s.%s(%ld)", PyString_AsString(mod), self_->ob_type->tp_name, PyInt_AS_LONG(self_));
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
char* name = PyString_AsString(self->name);
|
||||
PyObject* name = self->name;
|
||||
if (name == 0)
|
||||
return 0;
|
||||
|
||||
return PyString_FromFormat("%s.%s.%s", mod, self_->ob_type->tp_name, name);
|
||||
return
|
||||
#if PY_VERSION_HEX >= 0x03000000
|
||||
PyUnicode_FromFormat("%S.%s.%S", mod, self_->ob_type->tp_name, name);
|
||||
#else
|
||||
PyString_FromFormat("%s.%s.%s",
|
||||
PyString_AsString(mod), self_->ob_type->tp_name, PyString_AsString(name));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +70,11 @@ extern "C"
|
||||
enum_object* self = downcast<enum_object>(self_);
|
||||
if (!self->name)
|
||||
{
|
||||
#if PY_VERSION_HEX >= 0x03000000
|
||||
return PyLong_Type.tp_str(self_);
|
||||
#else
|
||||
return PyInt_Type.tp_str(self_);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -63,8 +84,7 @@ extern "C"
|
||||
}
|
||||
|
||||
static PyTypeObject enum_type_object = {
|
||||
PyObject_HEAD_INIT(0) // &PyType_Type
|
||||
0,
|
||||
PyVarObject_HEAD_INIT(NULL, 0) // &PyType_Type
|
||||
const_cast<char*>("Boost.Python.enum"),
|
||||
sizeof(enum_object), /* tp_basicsize */
|
||||
0, /* tp_itemsize */
|
||||
@@ -84,7 +104,9 @@ static PyTypeObject enum_type_object = {
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT
|
||||
#if PY_VERSION_HEX < 0x03000000
|
||||
| Py_TPFLAGS_CHECKTYPES
|
||||
#endif
|
||||
| Py_TPFLAGS_HAVE_GC
|
||||
| Py_TPFLAGS_BASETYPE, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
@@ -125,8 +147,12 @@ namespace
|
||||
{
|
||||
if (enum_type_object.tp_dict == 0)
|
||||
{
|
||||
enum_type_object.ob_type = incref(&PyType_Type);
|
||||
Py_TYPE(&enum_type_object) = incref(&PyType_Type);
|
||||
#if PY_VERSION_HEX >= 0x03000000
|
||||
enum_type_object.tp_base = &PyLong_Type;
|
||||
#else
|
||||
enum_type_object.tp_base = &PyInt_Type;
|
||||
#endif
|
||||
if (PyType_Ready(&enum_type_object))
|
||||
throw_error_already_set();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user