@@@ lbuf needs test
[mLib-python] / sym.pyx
diff --git a/sym.pyx b/sym.pyx
index 48ba3f0..a41fad8 100644 (file)
--- a/sym.pyx
+++ b/sym.pyx
@@ -27,41 +27,45 @@ cdef struct _sym_entry:
   sym_base _b
   PyObject *v
 
-cdef class SymTable (Mapping):
+cdef class SymTable (_Mapping):
+  """
+  SymTable([DICT], **KW)
+
+  A mapping keyed by strings.
+  """
   cdef sym_table _t
-  cdef int _init(me) except -1:
+  def __cinit__(me):
     sym_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 const char *p
     cdef Py_ssize_t n
-    cdef _sym_entry *e
-    PyObject_AsReadBuffer(key, <cvp *>&p, &n)
-    if f:
-      f[0] = 0
+    cdef _sym_entry *e = NULL
+    TEXT_PTRLEN(key, &p, &n)
+    if not f:
+      e = <_sym_entry *>sym_find(&me._t, <char *>p, n, 0, NULL)
+      if not e:
+        raise KeyError(key)
+    else:
       e = <_sym_entry *>sym_find(&me._t, <char *>p, n, PSIZEOF(e), f)
       if not f[0]:
         e.v = NULL
-    else:
-      e = <_sym_entry *>sym_find(&me._t, <char *>p, n, 0, NULL)
     return <void *>e
   cdef object _key(me, void *e):
-    return PyString_FromStringAndSize(SYM_NAME(e), SYM_LEN(e))
+    return TEXT_FROMSTRLEN(SYM_NAME(e), SYM_LEN(e))
   cdef object _value(me, void *e):
-    cdef _sym_entry *ee
-    ee = <_sym_entry *>e
+    cdef _sym_entry *ee = <_sym_entry *>e
     Py_INCREF(ee.v)
     return <object>ee.v
   cdef void _setval(me, void *e, object val):
-    cdef _sym_entry *ee
-    ee = <_sym_entry *>e
+    cdef _sym_entry *ee = <_sym_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 _sym_entry *ee
-    ee = <_sym_entry *>e
+    cdef _sym_entry *ee = <_sym_entry *>e
     if ee.v:
       Py_DECREF(ee.v)
     sym_remove(&me._t, <void *>ee)
@@ -71,7 +75,7 @@ cdef class SymTable (Mapping):
 cdef class _SymIter (_MapIterator):
   cdef SymTable t
   cdef sym_iter i
-  def __cinit__(me, SymTable t):
+  def __cinit__(me, SymTable t not None):
     me.t = t
     sym_mkiter(&me.i, &me.t._t)
   cdef void *_next(me):