Author: jbronn
Date: 2008-12-08 08:29:06 -0600 (Mon, 08 Dec 2008)
New Revision: 9605

Modified:
   django/trunk/django/contrib/gis/geos/prototypes/geom.py
Log:
Fixed #9747 -- now explicitly set response type on C functions that return WKB 
and WKT.


Modified: django/trunk/django/contrib/gis/geos/prototypes/geom.py
===================================================================
--- django/trunk/django/contrib/gis/geos/prototypes/geom.py     2008-12-08 
08:24:32 UTC (rev 9604)
+++ django/trunk/django/contrib/gis/geos/prototypes/geom.py     2008-12-08 
14:29:06 UTC (rev 9605)
@@ -1,8 +1,21 @@
-from ctypes import c_char_p, c_int, c_size_t, c_uint, POINTER
+from ctypes import c_char_p, c_int, c_size_t, c_ubyte, c_uint, POINTER
 from django.contrib.gis.geos.libgeos import lgeos, CS_PTR, GEOM_PTR
 from django.contrib.gis.geos.prototypes.errcheck import \
     check_geom, check_minus_one, check_sized_string, check_string, check_zero
 
+# This is the return type used by binary output (WKB, HEX) routines.
+c_uchar_p = POINTER(c_ubyte)
+
+# We create a simple subclass of c_char_p here because when the response
+# type is set to c_char_p, you get a _Python_ string and there's no way
+# to access the string's address inside the error checking function.
+# In other words, you can't free the memory allocated inside GEOS.  Previously,
+# the return type would just be omitted and the integer address would be
+# used -- but this allows us to be specific in the function definition and
+# keeps the reference so it may be free'd.
+class geos_char_p(c_char_p):
+    pass
+
 ### ctypes generation functions ###
 def bin_constructor(func):
     "Generates a prototype for binary construction (HEX, WKB) GEOS routines."
@@ -16,6 +29,7 @@
     "Generates a prototype for the routines that return a a sized string."
     func.argtypes = [GEOM_PTR, POINTER(c_size_t)]
     func.errcheck = check_sized_string
+    func.restype = c_uchar_p
     return func
 
 def geom_output(func, argtypes):
@@ -44,6 +58,7 @@
     # We do _not_ specify an argument type because we want just an
     # address returned from the function.
     func.argtypes = [GEOM_PTR]
+    func.restype = geos_char_p
     func.errcheck = check_string
     return func
 


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to