Of course, after I send this I look at it again and made some small
changes. Here's another patch, this time only to generate.py.
Matt
Index: generate.py
===================================================================
RCS file: /cvs/gnome/gnome-python/pygtk/generate/generate.py,v
retrieving revision 1.3
diff -u -r1.3 generate.py
--- generate.py 1999/12/13 03:11:18 1.3
+++ generate.py 1999/12/17 04:19:28
@@ -224,7 +224,11 @@
parseList = [] # args to PyArg_ParseTuple
argList = [] # args to actual function
extraCode = [] # any extra code (for enums, flags)
- if retType == 'string' or retType == 'string_or_null':
+ retArgs = None
+ if type(retType) == type(()):
+ retArgs = retType[1:]
+ retType = retType[0]
+ if retType == 'string':
# this is needed so we can free result string
varDefs.add('char', '*ret')
varDefs.add('PyObject', '*py_ret')
@@ -381,14 +385,22 @@
impl.write(string.join(extraCode, ''))
funcCall = name + '(' + string.join(argList, ', ') + ')'
- if self.decodeRet(impl, funcCall, retType):
+ if self.decodeRet(impl, funcCall, retType, retArgs):
return
impl.write('}\n\n')
# actually write the info to the output files
self.defs.write(funcDefTmpl % (name,name))
self.impl.write(impl.getvalue())
- def decodeRet(self, impl, funcCall, retType):
+ def decodeRet(self, impl, funcCall, retType, retArgs=None):
+ nullok = FALSE
+ if retArgs:
+ # XXX fix me
+ if retArgs[0] == 'null-ok':
+ nullok = TRUE
+ else:
+ print "unknown return attribute '%s'" % (retArgs,)
+ return 1
if retType == 'none':
impl.write(' ')
impl.write(funcCall)
@@ -398,13 +410,21 @@
impl.write(funcCall)
impl.write(');\n')
elif retType == 'string':
- impl.write(' ret = ')
- impl.write(funcCall)
- impl.write(';\n py_ret = PyString_FromString(ret);\n
g_free(ret);\n return py_ret;\n')
- elif retType == 'string_or_null':
- impl.write(' ret = ')
- impl.write(funcCall)
- impl.write(';\n if (ret) {\n py_ret =
PyString_FromString(ret);\n g_free(ret);\n return py_ret;\n } else
{\n Py_INCREF(Py_None);\n return Py_None;\n }\n')
+ if nullok:
+ impl.write(' ret = %s;\n' % funcCall)
+ impl.write(' if (ret) {\n')
+ impl.write(' py_ret =
+PyString_FromString(ret);\n'
+ ' g_free(ret);\n'
+ ' return py_ret;\n'
+ ' } else {\n'
+ ' Py_INCREF(Py_None);\n'
+ ' return Py_None;\n'
+ ' }\n')
+ else:
+ impl.write(' ret = %s;\n' % funcCall)
+ impl.write(' py_ret = PyString_FromString(ret);\n'
+ ' g_free(ret);\n'
+ ' return py_ret;\n')
elif retType in ('char', 'uchar'):
impl.write(' return PyString_fromStringAndSize(*(')
impl.write(funcCall)
@@ -419,17 +439,35 @@
impl.write(funcCall)
impl.write(');\n')
elif retType in boxed.keys():
- impl.write(' return ')
- impl.write(boxed[retType][2])
- impl.write('(')
- impl.write(funcCall)
- impl.write(');\n')
+ if nullok:
+ impl.write(' {\n'
+ ' %s *p = %s;\n' % (retType,
+funcCall))
+ impl.write(' if (p)\n')
+ impl.write(' return %s(p);\n' %
+boxed[retType][2])
+ impl.write(' Py_INCREF(Py_None);\n'
+ ' return Py_None;\n'
+ ' }\n')
+ else:
+ impl.write(' return ')
+ impl.write(boxed[retType][2])
+ impl.write('(')
+ impl.write(funcCall)
+ impl.write(');\n')
elif retType in objects.keys():
- impl.write(' return PyGtk_New((GtkObject *)')
- impl.write(funcCall)
- impl.write(');\n')
+ if nullok:
+ impl.write(' {\n'
+ ' GtkObject *p = (GtkObject *) %s;'
+% funcCall)
+ impl.write(' if (p)\n'
+ ' return PyGtk_New((GtkObject *)
+p);\n')
+ impl.write(' Py_INCREF(Py_None);\n'
+ ' return Py_None;\n'
+ ' }\n')
+ else:
+ impl.write(' return PyGtk_New((GtkObject *)')
+ impl.write(funcCall)
+ impl.write(');\n')
else:
- print "%s: unknown return type '%s'" % (name, retType)
+ print "unknown return type '%s'" % (retType,)
return 1
return 0