@@@ cython and python3
[mLib-python] / assoc.pyx
index 7685dd6..01f04de 100644 (file)
--- a/assoc.pyx
+++ b/assoc.pyx
@@ -27,43 +27,38 @@ cdef struct _assoc_entry:
   sym_base _b
   PyObject *v
 
-cdef class AssocTable (Mapping):
+cdef class AssocTable (_Mapping):
   cdef assoc_table _t
-  cdef int _init(me) except -1:
+  def __cinit__(me):
     assoc_create(&me._t)
+  cdef int _init(me) except -1:
     return 0
   cdef void *_find(me, object key, unsigned *f) except NULL:
-    cdef void *p
-    cdef Py_ssize_t n
-    cdef _assoc_entry *e
-    cdef atom *a
-    a = ATOM_A(atom_pyintern(key))
-    PyObject_AsReadBuffer(key, <cvp *>&p, &n)
-    if f:
-      f[0] = 0
-      e = <_assoc_entry *>assoc_find(&me._t, a, PSIZEOF(e), f)
+    cdef _assoc_entry *e = NULL
+    cdef object a = atom_pyintern(key)
+    if not f:
+      e = <_assoc_entry *>assoc_find(&me._t, ATOM_A(a), 0, NULL)
+      if not e:
+        raise KeyError(a)
+    else:
+      e = <_assoc_entry *>assoc_find(&me._t, ATOM_A(a), PSIZEOF(e), f)
       if not f[0]:
         e.v = NULL
-    else:
-      e = <_assoc_entry *>assoc_find(&me._t, a, 0, NULL)
     return <void *>e
   cdef object _key(me, void *e):
     return atom_pywrap(ASSOC_ATOM(e))
   cdef object _value(me, void *e):
-    cdef _assoc_entry *ee
-    ee = <_assoc_entry *>e
+    cdef _assoc_entry *ee = <_assoc_entry *>e
     Py_INCREF(ee.v)
     return <object>ee.v
   cdef void _setval(me, void *e, object val):
-    cdef _assoc_entry *ee
-    ee = <_assoc_entry *>e
+    cdef _assoc_entry *ee = <_assoc_entry *>e
     if ee.v:
       Py_DECREF(ee.v)
-    ee.v = <PyObject *>v
+    ee.v = <PyObject *>val
     Py_INCREF(ee.v)
   cdef void _del(me, void *e):
-    cdef _assoc_entry *ee
-    ee = <_assoc_entry *>e
+    cdef _assoc_entry *ee = <_assoc_entry *>e
     if ee.v:
       Py_DECREF(ee.v)
     assoc_remove(&me._t, <void *>ee)