[Lxml-checkins] r33386 - in lxml/branch/lxml-1.1: . src/lxml src/lxml/tests

scoder at codespeak.net scoder at codespeak.net
Tue Oct 17 19:08:08 CEST 2006


Author: scoder
Date: Tue Oct 17 19:08:06 2006
New Revision: 33386

Modified:
   lxml/branch/lxml-1.1/CHANGES.txt
   lxml/branch/lxml-1.1/src/lxml/etree.pyx
   lxml/branch/lxml-1.1/src/lxml/tests/test_elementtree.py
   lxml/branch/lxml-1.1/src/lxml/tests/test_etree.py
Log:
fix: deep-copying Comments and PIs

Modified: lxml/branch/lxml-1.1/CHANGES.txt
==============================================================================
--- lxml/branch/lxml-1.1/CHANGES.txt	(original)
+++ lxml/branch/lxml-1.1/CHANGES.txt	Tue Oct 17 19:08:06 2006
@@ -18,6 +18,8 @@
 Bugs fixed
 ----------
 
+* Copying Comments and ProcessingInstructions failed
+
 * Memory leak for external URLs in _XSLTProcessingInstruction.parseXSL()
 
 * Memory leak when garbage collecting tailed root elements

Modified: lxml/branch/lxml-1.1/src/lxml/etree.pyx
==============================================================================
--- lxml/branch/lxml-1.1/src/lxml/etree.pyx	(original)
+++ lxml/branch/lxml-1.1/src/lxml/etree.pyx	Tue Oct 17 19:08:06 2006
@@ -715,10 +715,20 @@
         
     def __copy__(self):
         cdef xmlDoc* c_doc
+        cdef xmlNode* c_node
         cdef _Document new_doc
         c_doc = _copyDocRoot(self._doc._c_doc, self._c_node) # recursive
         new_doc = _documentFactory(c_doc, self._doc._parser)
-        return new_doc.getroot()
+        root = new_doc.getroot()
+        if root is not None:
+            return root
+        # Comment/PI
+        c_node = c_doc.children
+        while c_node is not NULL and c_node.type != self._c_node.type:
+            c_node = c_node.next
+        if c_node is NULL:
+            return None
+        return _elementFactory(new_doc, c_node)
 
     def set(self, key, value):
         """Sets an element attribute.

Modified: lxml/branch/lxml-1.1/src/lxml/tests/test_elementtree.py
==============================================================================
--- lxml/branch/lxml-1.1/src/lxml/tests/test_elementtree.py	(original)
+++ lxml/branch/lxml-1.1/src/lxml/tests/test_elementtree.py	Tue Oct 17 19:08:06 2006
@@ -2242,6 +2242,17 @@
         self.assertEquals('<a><X/></a>',
                           tostring(b).replace(' ', ''))
 
+    def test_deepcopy_comment(self):
+        # previously caused a crash
+        Comment = self.etree.Comment
+        
+        a = Comment("ONE")
+        b = copy.deepcopy(a)
+        b.text = "ANOTHER"
+
+        self.assertEquals('ONE',     a.text)
+        self.assertEquals('ANOTHER', b.text)
+
     def test_shallowcopy(self):
         Element = self.etree.Element
         

Modified: lxml/branch/lxml-1.1/src/lxml/tests/test_etree.py
==============================================================================
--- lxml/branch/lxml-1.1/src/lxml/tests/test_etree.py	(original)
+++ lxml/branch/lxml-1.1/src/lxml/tests/test_etree.py	Tue Oct 17 19:08:06 2006
@@ -8,7 +8,7 @@
 """
 
 
-import unittest, doctest
+import unittest, doctest, copy
 
 from common_imports import etree, StringIO, HelperTestCase, fileInTestDir
 from common_imports import SillyFileLike, canonicalize
@@ -82,6 +82,17 @@
         self.assertEquals(root[0].target, "mypi")
         self.assertEquals(root[0].text, "my test ")
 
+    def test_deepcopy_pi(self):
+        # previously caused a crash
+        ProcessingInstruction = self.etree.ProcessingInstruction
+        
+        a = ProcessingInstruction("PI", "ONE")
+        b = copy.deepcopy(a)
+        b.text = "ANOTHER"
+
+        self.assertEquals('ONE',     a.text)
+        self.assertEquals('ANOTHER', b.text)
+
     def test_attribute_set(self):
         # ElementTree accepts arbitrary attribute values
         # lxml.etree allows only strings


More information about the lxml-checkins mailing list