From 6f18465189dbfdf6efb1e6580243918a4f609d1c Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Fri, 29 Mar 2013 15:17:40 +0800 Subject: 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(-) (limited to 'python') diff --git a/python/generator.py b/python/generator.py index e4951437..82109e3f 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 43ad49d0..b6349820 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: -- cgit v1.2.3