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)