summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Wilson <msw@redhat.com>2000-01-21 15:10:23 +0000
committerMatt Wilson <msw@src.gnome.org>2000-01-21 15:10:23 +0000
commitdf796b1e1e77614dfd914d955752f9842dffe591 (patch)
treeff8717e1edde7b3fa4c285b4b69e9f2112634b1a
parent7d0abcacc2e18051d75b5b0dbee309960f78c764 (diff)
downloadpygtk-df796b1e1e77614dfd914d955752f9842dffe591.tar.gz
add a hack to allow a null-ok flag on the return type. This lets us create
2000-01-21 Matt Wilson <msw@redhat.com> * generate/generate.py: add a hack to allow a null-ok flag on the return type. This lets us create wrappers which return None if the C function returns NULL. * generate/gtklists.defs (gtk_ctree_node_nth): return None when gtk_ctree_node_nth returns NULL. * pygnome/generate/gnome.defs (gnome_*_file): functions may return null, change to return None in that case.
-rw-r--r--ChangeLog9
-rw-r--r--generate/generate.py76
-rw-r--r--generate/gtklists.defs2
3 files changed, 67 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 62575e04..4e6d6d9f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2000-01-21 Matt Wilson <msw@redhat.com>
+
+ * generate/generate.py: add a hack to allow a null-ok flag on the
+ return type. This lets us create wrappers which return None if
+ the C function returns NULL.
+
+ * generate/gtklists.defs (gtk_ctree_node_nth): return None when
+ gtk_ctree_node_nth returns NULL.
+
2000-01-20 Matt Wilson <msw@redhat.com>
* gtkmodule.c (PyGtk_New): disable object sinking for now, until
diff --git a/generate/generate.py b/generate/generate.py
index 4aa37fc9..d106e8d0 100644
--- a/generate/generate.py
+++ b/generate/generate.py
@@ -224,7 +224,11 @@ class FunctionDefsParser(TypesParser):
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 @@ class FunctionDefsParser(TypesParser):
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 @@ class FunctionDefsParser(TypesParser):
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 @@ class FunctionDefsParser(TypesParser):
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
diff --git a/generate/gtklists.defs b/generate/gtklists.defs
index 46d2089d..c9910d11 100644
--- a/generate/gtklists.defs
+++ b/generate/gtklists.defs
@@ -649,7 +649,7 @@
;gtk_ctree_find_node_ptr
(define-func gtk_ctree_node_nth
- GtkCTreeNode
+ (GtkCTreeNode null-ok)
((GtkCTree ctree)
(uint row)))