aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2011-01-21 10:21:16 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:12:54 -0300
commitb18a0f63b93a6ad9f047d10408d98d0fb548919d (patch)
tree148a8930207961cc11fb9f451dcb1a74e64b71c0
parentea66e79f338202f473bc1e95e21c126bbb63756a (diff)
Shiboken enums now have a tp_print representation.
This fixes the bug #611[1], and an unit test was also added. [1] http://bugs.openbossa.org/show_bug.cgi?id=611 Reviewed by Hugo Parente <hugo.lima@openbossa.org> Reviewed by Luciano Wolf <luciano.wolf@openbossa.org> Reviewed by Renato Araújo <renato.filho@openbossa.org>
-rw-r--r--libshiboken/sbkenum.cpp16
-rw-r--r--tests/samplebinding/enum_test.py14
2 files changed, 29 insertions, 1 deletions
diff --git a/libshiboken/sbkenum.cpp b/libshiboken/sbkenum.cpp
index 34a4b7729..7aea88ad2 100644
--- a/libshiboken/sbkenum.cpp
+++ b/libshiboken/sbkenum.cpp
@@ -36,14 +36,27 @@ struct SbkEnumObject
PyObject* ob_name;
};
+#define SBKENUMOBJECT_REPR_STRING "<enum-item %s.%s (%ld)>"
+
static PyObject* SbkEnumObject_repr(PyObject* self)
{
- return PyString_FromFormat("<enum-item %s.%s (%ld)>",
+ return PyString_FromFormat(SBKENUMOBJECT_REPR_STRING,
self->ob_type->tp_name,
PyString_AS_STRING(((SbkEnumObject*)self)->ob_name),
((SbkEnumObject*)self)->ob_ival);
}
+static int SbkEnumObject_print(PyObject* self, FILE* fp, int)
+{
+ Py_BEGIN_ALLOW_THREADS
+ fprintf(fp, SBKENUMOBJECT_REPR_STRING,
+ self->ob_type->tp_name,
+ PyString_AS_STRING(((SbkEnumObject*)self)->ob_name),
+ ((SbkEnumObject*)self)->ob_ival);
+ Py_END_ALLOW_THREADS
+ return 0;
+}
+
static PyObject* SbkEnumObject_name(PyObject* self, void*)
{
Py_INCREF(((SbkEnumObject*)self)->ob_name);
@@ -169,6 +182,7 @@ PyTypeObject* newType(const char* name)
::memset(type, 0, sizeof(PyTypeObject));
type->ob_type = &SbkEnumType_Type;
type->tp_basicsize = sizeof(SbkEnumObject);
+ type->tp_print = &SbkEnumObject_print;
type->tp_repr = &SbkEnumObject_repr;
type->tp_str = &SbkEnumObject_repr;
type->tp_flags = Py_TPFLAGS_DEFAULT;
diff --git a/tests/samplebinding/enum_test.py b/tests/samplebinding/enum_test.py
index 71ebef60f..698287f9d 100644
--- a/tests/samplebinding/enum_test.py
+++ b/tests/samplebinding/enum_test.py
@@ -26,6 +26,8 @@
'''Test cases for Python representation of C++ enums.'''
+import os
+import sys
import unittest
import sample
@@ -83,6 +85,18 @@ class EnumTest(unittest.TestCase):
self.assertEqual(SampleNamespace.AnonymousClassEnum_Value0, 0)
self.assertEqual(SampleNamespace.AnonymousClassEnum_Value1, 1)
+ def testEnumTpPrintImplementation(self):
+ '''Without SbkEnum.tp_print 'print' returns the enum represented as an int.'''
+ tmpfile = os.tmpfile()
+ sys.stdout = tmpfile
+ print Event.ANY_EVENT
+ sys.stdout = sys.__stdout__
+ tmpfile.seek(0)
+ text = tmpfile.read().strip()
+ tmpfile.close()
+ self.assertEqual(text, str(Event.ANY_EVENT))
+ self.assertEqual(text, repr(Event.ANY_EVENT))
+
class EnumOverloadTest(unittest.TestCase):
'''Test case for overloads involving enums'''