Config object repr string is back.
authorSven Trenkel <collectd@semidefinite.de>
Fri, 18 Dec 2009 01:02:47 +0000 (02:02 +0100)
committerFlorian Forster <octo@noris.net>
Tue, 5 Jan 2010 10:02:32 +0000 (11:02 +0100)
src/cpython.h
src/pyconfig.c

index 8805297..001a3ae 100644 (file)
 #endif
 
 #ifdef IS_PY3K
+
 #define PyInt_FromLong PyLong_FromLong
-//#define PyString_FromString PyBytes_FromString
 #define CPY_INIT_TYPE         PyVarObject_HEAD_INIT(NULL, 0)
 #define IS_BYTES_OR_UNICODE(o) (PyUnicode_Check(o) || PyBytes_Check(o))
+#define CPY_STRCAT PyUnicode_Concat
+
 #else
+
 #define CPY_INIT_TYPE         PyObject_HEAD_INIT(NULL) 0,
 #define IS_BYTES_OR_UNICODE(o) (PyUnicode_Check(o) || PyString_Check(o))
+#define CPY_STRCAT PyString_Concat
+
 #endif
 
 static inline const char *cpy_unicode_or_bytes_to_string(PyObject **o) {
index 6f03da9..d794c9a 100644 (file)
@@ -118,11 +118,37 @@ static int Config_init(PyObject *s, PyObject *args, PyObject *kwds) {
        return 0;
 }
 
-/*static PyObject *Config_repr(PyObject *s) {
+static PyObject *Config_repr(PyObject *s) {
        Config *self = (Config *) s;
+       PyObject *name, *tmp, *ret = NULL;
+       static PyObject *node_prefix = NULL, *root_prefix = NULL, *ending = NULL;
        
-       return PyString_FromFormat("<collectd.Config %snode %s>", self->parent == Py_None ? "root " : "", PyString_AsString(PyObject_Str(self->key)));
-}*/
+       /* This is ok because we have the GIL, so this is thread-save by default. */
+       if (node_prefix == NULL)
+               node_prefix = cpy_string_to_unicode_or_bytes("<collectd.Config node '");
+       if (root_prefix == NULL)
+               root_prefix = cpy_string_to_unicode_or_bytes("<collectd.Config root node '");
+       if (ending == NULL)
+               ending = cpy_string_to_unicode_or_bytes("'>");
+       if (node_prefix == NULL || root_prefix == NULL || ending == NULL)
+               return NULL;
+       
+       name = PyObject_Str(self->key);
+       if (name == NULL)
+               return NULL;
+
+       if (self->parent == NULL || self->parent == Py_None)
+               tmp = CPY_STRCAT(root_prefix, name);
+       else
+               tmp = CPY_STRCAT(node_prefix, name);
+       
+       Py_DECREF(name);
+       if (tmp != NULL)
+               ret = CPY_STRCAT(tmp, ending);
+       Py_DECREF(tmp);
+       
+       return ret;
+}
 
 static int Config_traverse(PyObject *self, visitproc visit, void *arg) {
        Config *c = (Config *) self;
@@ -130,8 +156,7 @@ static int Config_traverse(PyObject *self, visitproc visit, void *arg) {
        Py_VISIT(c->key);
        Py_VISIT(c->values);
        Py_VISIT(c->children);
-       return 0;
-}
+       return 0;}
 
 static int Config_clear(PyObject *self) {
        Config *c = (Config *) self;
@@ -165,7 +190,7 @@ PyTypeObject ConfigType = {
        0,                         /* tp_getattr */
        0,                         /* tp_setattr */
        0,                         /* tp_compare */
-       0/*Config_repr*/,               /* tp_repr */
+       Config_repr,               /* tp_repr */
        0,                         /* tp_as_number */
        0,                         /* tp_as_sequence */
        0,                         /* tp_as_mapping */