Selaa lähdekoodia

Fix a few graph and term methods.

Stefano Cossu 3 vuotta sitten
vanhempi
commit
b5d8da17ec
4 muutettua tiedostoa jossa 37 lisäystä ja 32 poistoa
  1. 9 10
      cpython/py_graph.h
  2. 6 6
      cpython/py_lsup_rdf.c
  3. 13 15
      cpython/py_triple.h
  4. 9 1
      setup.py

+ 9 - 10
cpython/py_graph.h

@@ -46,6 +46,7 @@ Graph_get_uri (GraphObject *self, void *closure)
 {
     PyObject *uri = PyUnicode_FromString (
             LSUP_graph_uri (self->ob_struct)->data);
+    if ( UNLIKELY (!uri)) return NULL;
 
     Py_INCREF(uri);
     return uri;
@@ -55,22 +56,20 @@ Graph_get_uri (GraphObject *self, void *closure)
 static int
 Graph_set_uri (GraphObject *self, PyObject *value, void *closure)
 {
-    if (PyUnicode_READY(value) != 0) return -1;
-    if (PyUnicode_KIND(value) != PyUnicode_1BYTE_KIND) return -1;
+    if (!PyObject_TypeCheck (value, &TermType)) return -1;
 
-    LSUP_rc rc = LSUP_graph_set_uri (self->ob_struct, PyUnicode_DATA(value));
+    LSUP_rc rc = LSUP_graph_set_uri (
+            self->ob_struct, ((TermObject*)value)->ob_struct->data);
 
     return rc == LSUP_OK ? 0 : -1;
 }
 
 
 static PyGetSetDef Graph_getsetters[] = {
-    /* FIXME This is throwing strange errors.
     {
         "uri", (getter) Graph_get_uri, (setter) Graph_set_uri,
         "Graph URI.", NULL
     },
-    */
     {NULL}
 };
 
@@ -90,7 +89,7 @@ Graph_copy (PyTypeObject *cls, PyObject *src)
 
 
 static PyObject *
-Graph_richcmp (PyObject *gr1, PyObject *gr2, int op)
+Graph_richcmp (PyObject *self, PyObject *other, int op)
 {
     if (op != Py_EQ && op != Py_NE) Py_RETURN_NOTIMPLEMENTED;
 
@@ -98,8 +97,8 @@ Graph_richcmp (PyObject *gr1, PyObject *gr2, int op)
     /*
     PyObject *res = NULL;
 
-    LSUP_Graph *t1 = ((GraphObject *) gr1)->ob_struct;
-    LSUP_Graph *t2 = ((GraphObject *) gr2)->ob_struct;
+    LSUP_Graph *t1 = ((GraphObject *) self)->ob_struct;
+    LSUP_Graph *t2 = ((GraphObject *) other)->ob_struct;
 
     if (LSUP_graph_equals (t1, t2) && op == Py_EQ) Py_RETURN_TRUE;
     Py_RETURN_FALSE;
@@ -194,7 +193,6 @@ static PyObject *Graph_lookup (
 
 
 static PyMethodDef Graph_methods[] = {
-    {"uri", (PyCFunction) Graph_get_uri, METH_NOARGS, "Get the graph URI."},
     {"copy", (PyCFunction) Graph_copy, METH_CLASS, "Copy a graph."},
     {"add", (PyCFunction) Graph_add, METH_O, "Add triples to a graph."},
     {
@@ -205,6 +203,7 @@ static PyMethodDef Graph_methods[] = {
         "lookup", (PyCFunction) Graph_lookup, METH_VARARGS,
         "Look triples in a graph by matching a pattern."
     },
+    {NULL},
 };
 
 
@@ -255,7 +254,7 @@ PyTypeObject GraphType = {
     .tp_dealloc = (destructor) Graph_dealloc,
     .tp_getset = Graph_getsetters,
     .tp_methods = Graph_methods,
-    .tp_richcompare = Graph_richcmp,
+    .tp_richcompare = (richcmpfunc) Graph_richcmp,
     .tp_as_number = &Graph_number_methods,
     .tp_as_sequence = &Graph_seq_methods,
 };

+ 6 - 6
cpython/py_lsup_rdf.c

@@ -14,19 +14,19 @@
 #include "py_graph.h"
 
 
-static PyModuleDef lsup_rdf_pkg = {
+static PyModuleDef _lsup_rdf_pkg = {
     PyModuleDef_HEAD_INIT,
-    .m_name = "lsup_rdf",
+    .m_name = "_lsup_rdf",
     .m_doc = "Lakesuperior RDF package.",
     .m_size = -1,
 };
 
 PyMODINIT_FUNC
 PyInit__lsup_rdf (void)
-{ return PyModule_Create (&lsup_rdf_pkg); }
+{ return PyModule_Create (&_lsup_rdf_pkg); }
 
 
-PyModuleDef term_mod = {
+static PyModuleDef term_mod = {
     PyModuleDef_HEAD_INIT,
     .m_name = "term",
     .m_doc = "RDF term module.",
@@ -58,7 +58,7 @@ PyInit_term()
 }
 
 
-PyModuleDef triple_mod = {
+static PyModuleDef triple_mod = {
     PyModuleDef_HEAD_INIT,
     .m_name = "triple",
     .m_doc = "RDF triple module.",
@@ -99,7 +99,7 @@ PyInit_graph()
     if (PyType_Ready (&GraphType) < 0) return NULL;
 
     PyObject *m = PyModule_Create(&graph_mod);
-    if (m == NULL) return NULL;
+    if (!m) return NULL;
 
 #define ENTRY(a, b) \
     if (PyModule_AddIntConstant (m, "STORE_" #a, b) < 0) return NULL;

+ 13 - 15
cpython/py_triple.h

@@ -13,41 +13,39 @@
 typedef struct {
     PyObject_HEAD
     LSUP_Triple * ob_struct;
-    TermObject *s;
-    TermObject *p;
-    TermObject *o;
+    PyObject *s;
+    PyObject *p;
+    PyObject *o;
 } TripleObject;
 
 
 static int
 Triple_init (TripleObject *self, PyObject *args)
 {
-    PyObject *s = NULL, *p = NULL, *o = NULL;
-    TermObject *tmp;
+    PyObject *s = NULL, *p = NULL, *o = NULL, *tmp;
 
-    if (! PyArg_ParseTuple (
-                args, "O!O!O!", &TermType, &s,
-                &TermType, &p, &TermType, &o))
-        return -1;
+    if (! PyArg_ParseTuple (args, "OOO", &s, &p, &o)) return -1;
 
     // TODO check for null s, p, o
     tmp = self->s;
     Py_INCREF(s);
-    self->s = (TermObject *) s;
+    self->s = s;
     Py_XDECREF(tmp);
 
     tmp = self->p;
     Py_INCREF(p);
-    self->p = (TermObject *) p;
+    self->p = p;
     Py_XDECREF(tmp);
 
     tmp = self->o;
     Py_INCREF(o);
-    self->o = (TermObject *) o;
+    self->o = o;
     Py_XDECREF(tmp);
 
     self->ob_struct = LSUP_triple_new (
-            self->s->ob_struct, self->p->ob_struct, self->o->ob_struct);
+            ((TermObject *) self->s)->ob_struct,
+            ((TermObject *) self->p)->ob_struct,
+            ((TermObject *) self->o)->ob_struct);
     if (!self->ob_struct) {
         PyErr_SetString (PyExc_ValueError, "Could not create triple.");
         return -1;
@@ -69,7 +67,7 @@ Triple_dealloc (TripleObject *self)
 
 
 static PyMemberDef Triple_members[] = {
-    {"s", T_OBJECT_EX, offsetof(TripleObject, s), 0, "Triple subject,"},
+    {"s", T_OBJECT_EX, offsetof(TripleObject, s), 0, "Triple subject."},
     {"p", T_OBJECT_EX, offsetof(TripleObject, p), 0, "Triple predicate."},
     {"o", T_OBJECT_EX, offsetof(TripleObject, o), 0, "Triple object."},
     {NULL}
@@ -110,7 +108,7 @@ Triple_richcmp (PyObject *obj1, PyObject *obj2, int op)
 PyTypeObject TripleType = {
     PyVarObject_HEAD_INIT(NULL, 0)
     .tp_name = "triple.Triple",
-    .tp_doc = "RDF triple",
+    .tp_doc = "RDF triple.",
     .tp_basicsize = sizeof(TripleObject),
     .tp_itemsize = 0,
     .tp_flags = Py_TPFLAGS_DEFAULT,

+ 9 - 1
setup.py

@@ -19,7 +19,15 @@ sources = (
     ]
 )
 
-compile_args = ['-std=c99', '-DDEBUG', '-g3']
+debug = True
+
+compile_args = [
+    '-std=c99',
+]
+if debug:
+    compile_args.extend(['-DDEBUG', '-g3', '-O0'])
+else:
+    compile_args.extend(['-g0', '-O3'])
 
 
 setup(