[libxml2] A few more fixes for python 3 affecting libxml2.py



commit 6f18465189dbfdf6efb1e6580243918a4f609d1c
Author: Daniel Veillard <veillard redhat com>
Date:   Fri Mar 29 15:17:40 2013 +0800

    A few more fixes for python 3 affecting libxml2.py
    
    need a few changes to the generator and the libxml.py stub

 python/generator.py |    9 ++++-----
 python/libxml.py    |   40 +++++++++++++++++++++++++++++++++-------
 2 files changed, 37 insertions(+), 12 deletions(-)
---
diff --git a/python/generator.py b/python/generator.py
index e495143..82109e3 100755
--- a/python/generator.py
+++ b/python/generator.py
@@ -1038,10 +1038,9 @@ def buildWrappers():
                 classes.write("    def __init__(self, _obj=None):\n")
                 if classes_ancestor[classname] == "xmlCore" or \
                    classes_ancestor[classname] == "xmlNode":
-                    classes.write("        if type(_obj).__name__ != ")
-                    classes.write("'PyCObject':\n")
-                    classes.write("            raise TypeError, ")
-                    classes.write("'%s needs a PyCObject argument'\n" % \
+                    classes.write("        if checkWrapper(_obj) != 0:")
+                    classes.write("            raise TypeError")
+                    classes.write("('%s got a wrong wrapper object type')\n" % \
                                 classname)
                 if classname in reference_keepers:
                     rlist = reference_keepers[classname]
@@ -1054,7 +1053,7 @@ def buildWrappers():
                    classes_ancestor[classname] == "xmlNode":
                     classes.write("    def __repr__(self):\n")
                     format = "<%s (%%s) object at 0x%%x>" % (classname)
-                    classes.write("        return \"%s\" %% (self.name, long(pos_id (self)))\n\n" % (
+                    classes.write("        return \"%s\" %% (self.name, int(pos_id (self)))\n\n" % (
                                   format))
             else:
                 txt.write("Class %s()\n" % (classname))
diff --git a/python/libxml.py b/python/libxml.py
index 43ad49d..b634982 100644
--- a/python/libxml.py
+++ b/python/libxml.py
@@ -5,6 +5,16 @@ import sys
 # The root of all libxml2 errors.
 class libxmlError(Exception): pass
 
+# Type of the wrapper class for the C objects wrappers
+def checkWrapper(obj):
+    try:
+        n = type(_obj).__name__
+        if n != 'PyCObject' and n != 'PyCapsule':
+            return 1
+    except:
+        return 0
+    return 0
+
 #
 # id() is sometimes negative ...
 #
@@ -62,9 +72,18 @@ class ioWrapper:
     def io_read(self, len = -1):
         if self.__io == None:
             return(-1)
-        if len < 0:
-            return(self.__io.read())
-        return(self.__io.read(len))
+        try:
+            if len < 0:
+                ret = self.__io.read()
+            else:
+                ret = self.__io.read(len)
+        except Exception as e:
+            print("failed to read from Python:", type(e))
+            print("on IO:", self.__io)
+            self.__io == None
+            return(-1)
+
+        return(ret)
 
     def io_write(self, str, len = -1):
         if self.__io == None:
@@ -97,10 +116,17 @@ class ioWriteWrapper(ioWrapper):
         if type(_obj) == type(''):
             print("write io from a string")
             self.o = None
-        elif type(_obj) == types.InstanceType:
-            print("write io from instance of %s" % (_obj.__class__))
-            ioWrapper.__init__(self, _obj)
-            self._o = libxml2mod.xmlCreateOutputBuffer(self, enc)
+        elif type(_obj).__name__ == 'PyCapsule':
+            file = libxml2mod.outputBufferGetPythonFile(_obj)
+            if file != None:
+                ioWrapper.__init__(self, file)
+            else:
+                ioWrapper.__init__(self, _obj)
+            self._o = _obj
+#        elif type(_obj) == types.InstanceType:
+#            print(("write io from instance of %s" % (_obj.__class__)))
+#            ioWrapper.__init__(self, _obj)
+#            self._o = libxml2mod.xmlCreateOutputBuffer(self, enc)
         else:
             file = libxml2mod.outputBufferGetPythonFile(_obj)
             if file != None:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]