[Lxml-checkins] r44236 - lxml/branch/lxml-1.3/src/lxml

scoder at codespeak.net scoder at codespeak.net
Wed Jun 13 19:34:24 CEST 2007


Author: scoder
Date: Wed Jun 13 19:34:23 2007
New Revision: 44236

Modified:
   lxml/branch/lxml-1.3/src/lxml/etree.pyx
   lxml/branch/lxml-1.3/src/lxml/etree_defs.h
   lxml/branch/lxml-1.3/src/lxml/python.pxd
Log:
merged in fast path for Element instantiation from trunk

Modified: lxml/branch/lxml-1.3/src/lxml/etree.pyx
==============================================================================
--- lxml/branch/lxml-1.3/src/lxml/etree.pyx	(original)
+++ lxml/branch/lxml-1.3/src/lxml/etree.pyx	Wed Jun 13 19:34:23 2007
@@ -1038,6 +1038,10 @@
 else:
     ELEMENT_CREATION_LOCK = NULL
 
+cdef extern from "etree_defs.h":
+    # macro call to 't->tp_new()' for fast instantiation
+    cdef _Element NEW_ELEMENT "PY_NEW" (object t)
+
 cdef _Element _elementFactory(_Document doc, xmlNode* c_node):
     cdef python.PyThreadState* state
     cdef _Element result
@@ -1056,9 +1060,13 @@
             python.PyThread_release_lock(ELEMENT_CREATION_LOCK)
             return result
 
-    element_class = LOOKUP_ELEMENT_CLASS(ELEMENT_CLASS_LOOKUP_STATE,
-                                         doc, c_node)
-    result = element_class()
+    element_class = LOOKUP_ELEMENT_CLASS(
+        ELEMENT_CLASS_LOOKUP_STATE, doc, c_node)
+    if element_class is _Element:
+        # fast path for standard _Element class
+        result = NEW_ELEMENT(_Element)
+    else:
+        result = element_class()
     result._doc = doc
     result._c_node = c_node
     registerProxy(result)
@@ -1066,7 +1074,8 @@
     if config.ENABLE_THREADING:
         python.PyThread_release_lock(ELEMENT_CREATION_LOCK)
 
-    result._init()
+    if element_class is not _Element:
+        result._init()
     return result
 
 

Modified: lxml/branch/lxml-1.3/src/lxml/etree_defs.h
==============================================================================
--- lxml/branch/lxml-1.3/src/lxml/etree_defs.h	(original)
+++ lxml/branch/lxml-1.3/src/lxml/etree_defs.h	Wed Jun 13 19:34:23 2007
@@ -64,6 +64,16 @@
 #define iter(o)         PyObject_GetIter(o)
 #define _cstr(s)        PyString_AS_STRING(s)
 
+static PyObject* __PY_NEW_GLOBAL_EMPTY_TUPLE = NULL;
+
+#define PY_NEW(T) \
+     (((PyTypeObject*)(T))->tp_new( \
+         (PyTypeObject*)(T), \
+         ((__PY_NEW_GLOBAL_EMPTY_TUPLE == NULL) ? \
+             (__PY_NEW_GLOBAL_EMPTY_TUPLE = PyTuple_New(0)) : \
+             (__PY_NEW_GLOBAL_EMPTY_TUPLE)), \
+         NULL))
+
 #define _isString(obj)   PyObject_TypeCheck(obj, &PyBaseString_Type)
 
 #define _isElement(c_node) \

Modified: lxml/branch/lxml-1.3/src/lxml/python.pxd
==============================================================================
--- lxml/branch/lxml-1.3/src/lxml/python.pxd	(original)
+++ lxml/branch/lxml-1.3/src/lxml/python.pxd	Wed Jun 13 19:34:23 2007
@@ -112,3 +112,4 @@
     cdef object repr(object obj)
     cdef object iter(object obj)
     cdef char* _cstr(object s)
+    cdef object PY_NEW(object t)


More information about the lxml-checkins mailing list