[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