[Lxml-checkins] r41649 - lxml/trunk/src/lxml

scoder at codespeak.net scoder at codespeak.net
Thu Mar 29 21:46:58 CEST 2007


Author: scoder
Date: Thu Mar 29 21:46:57 2007
New Revision: 41649

Modified:
   lxml/trunk/src/lxml/extensions.pxi
Log:
cleanup

Modified: lxml/trunk/src/lxml/extensions.pxi
==============================================================================
--- lxml/trunk/src/lxml/extensions.pxi	(original)
+++ lxml/trunk/src/lxml/extensions.pxi	Thu Mar 29 21:46:57 2007
@@ -25,8 +25,6 @@
     cdef object _global_namespaces
     cdef object _utf_refs
     cdef object _function_cache
-    cdef object _function_cache_ns
-    cdef object _called_function
     # for exception handling and temporary reference keeping:
     cdef _TempStore _temp_refs
     cdef _ExceptionContext _exc
@@ -36,7 +34,6 @@
         self._utf_refs = {}
         self._global_namespaces = []
         self._function_cache = {}
-        self._function_cache_ns = {}
 
         if extensions is not None:
             # convert extensions to UTF-8
@@ -192,17 +189,14 @@
                                     _register_function reg_func):
         cdef python.PyObject* dict_result
         for ns_utf, ns_functions in _iter_ns_extension_functions():
-            if ns_utf is None:
-                d = self._function_cache
+            dict_result = python.PyDict_GetItem(
+                self._function_cache, ns_utf)
+            if dict_result is not NULL:
+                d = <object>dict_result
             else:
-                dict_result = python.PyDict_GetItem(
-                    self._function_cache_ns, ns_utf)
-                if dict_result is NULL:
-                    d = {}
-                    python.PyDict_SetItem(
-                        self._function_cache_ns, ns_utf, d)
-                else:
-                    d = <object>dict_result
+                d = {}
+                python.PyDict_SetItem(
+                    self._function_cache, ns_utf, d)
             for name_utf, function in ns_functions.iteritems():
                 python.PyDict_SetItem(d, name_utf, function)
                 reg_func(ctxt, name_utf, ns_utf)
@@ -213,39 +207,30 @@
         if self._extensions is None:
             return # done
         last_ns = None
-        d = self._function_cache
+        d = None
         for (ns_utf, name_utf), function in self._extensions.iteritems():
-            if ns_utf is not last_ns:
+            if ns_utf is not last_ns or d is None:
                 last_ns = ns_utf
-                if ns_utf is None:
-                    d = self._function_cache
+                dict_result = python.PyDict_GetItem(
+                    self._function_cache, ns_utf)
+                if dict_result is not NULL:
+                    d = <object>dict_result
                 else:
-                    dict_result = python.PyDict_GetItem(
-                        self._function_cache_ns, ns_utf)
-                    if dict_result is NULL:
-                        d = {}
-                        python.PyDict_SetItem(self._function_cache_ns,
-                                              ns_utf, d)
-                    else:
-                        d = <object>dict_result
+                    d = {}
+                    python.PyDict_SetItem(self._function_cache,
+                                          ns_utf, d)
             python.PyDict_SetItem(d, name_utf, function)
             reg_func(ctxt, name_utf, ns_utf)
 
     cdef unregisterAllFunctions(self, void* ctxt,
                                       _register_function unreg_func):
-        for name_utf in self._function_cache:
-            unreg_func(ctxt, name_utf, None)
-        for ns_utf, functions in self._function_cache_ns.iteritems():
+        for ns_utf, functions in self._function_cache.iteritems():
             for name_utf in functions:
                 unreg_func(ctxt, name_utf, ns_utf)
 
     cdef unregisterGlobalFunctions(self, void* ctxt,
                                          _register_function unreg_func):
-        for name_utf in self._function_cache:
-            if self._extensions is None or \
-                   (None, name_utf) not in self._extensions:
-                unreg_func(ctxt, name_utf, None)
-        for ns_utf, functions in self._function_cache_ns.iteritems():
+        for ns_utf, functions in self._function_cache.iteritems():
             for name_utf in functions:
                 if self._extensions is None or \
                        (ns_utf, name_utf) not in self._extensions:
@@ -259,65 +244,19 @@
         cdef python.PyObject* c_dict
         cdef python.PyObject* dict_result
         if c_ns_uri is NULL:
-            c_dict = <python.PyObject*>self._function_cache
+            c_dict = python.PyDict_GetItem(
+                self._function_cache, None)
         else:
             c_dict = python.PyDict_GetItemString(
-                self._function_cache_ns, c_ns_uri)
+                self._function_cache, c_ns_uri)
 
         if c_dict is not NULL:
-            dict_result = python.PyDict_GetItemString(<object>c_dict, c_name)
+            dict_result = python.PyDict_GetItemString(
+                <object>c_dict, c_name)
             if dict_result is not NULL:
                 return <object>dict_result
         return None
 
-    cdef int __prepare_function_call(self, char* c_ns_uri, char* c_name):
-        """Find an extension function and store it in 'self._called_function'.
-
-        This is absolutely performance-critical for XPath/XSLT!
-        Return 1 if it was found, 0 otherwise.
-        Parameters: c_ns_uri may be NULL, c_name must not be NULL
-        """
-        cdef python.PyObject* c_dict
-        cdef python.PyObject* dict_result
-        if c_ns_uri is NULL:
-            d = self._function_cache
-            c_dict = <python.PyObject*>d
-        else:
-            c_dict = python.PyDict_GetItemString(
-                self._function_cache_ns, c_ns_uri)
-            if c_dict is NULL:
-                d = {}
-                python.PyDict_SetItem(self._function_cache_ns, ns_uri_utf, d)
-            else:
-                d = <object>c_dict
-
-        name_utf = c_name
-        if c_dict is not NULL:
-            dict_result = python.PyDict_GetItem(d, name_utf)
-            if dict_result is not NULL:
-                function = <object>dict_result
-                self._called_function = function
-                return function is not None
-
-        # first time we look up this function, so the rest is less critical
-        if c_ns_uri is not NULL:
-            ns_uri_utf = c_ns_uri
-
-        if self._extensions is not None:
-            dict_result = python.PyDict_GetItem(
-                self._extensions, (ns_uri_utf, name_utf))
-        else:
-            dict_result = NULL
-        if dict_result is not NULL:
-            function = <object>dict_result
-        else:
-            function = _find_extension(ns_uri_utf, name_utf)
-
-        # we also store None values here to make sure we remember
-        python.PyDict_SetItem(d, name_utf, function)
-        self._called_function = function
-        return function is not None
-
     # Python reference keeping during XPath function evaluation
 
     cdef _release_temp_refs(self):
@@ -340,11 +279,10 @@
             return
         for o in obj:
             if isinstance(o, _Element):
-                element = <_Element>o
                 #print "Holding element:", <int>element._c_node
-                self._temp_refs.add(element)
+                self._temp_refs.add(o)
                 #print "Holding document:", <int>element._doc._c_doc
-                self._temp_refs.add(element._doc)
+                self._temp_refs.add((<_Element>o)._doc)
 
 
 def Extension(module, function_mapping, ns=None):


More information about the lxml-checkins mailing list