[Python-3000-checkins] r60292 - python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c

thomas.heller python-3000-checkins at python.org
Fri Jan 25 20:32:20 CET 2008


Author: thomas.heller
Date: Fri Jan 25 20:32:20 2008
New Revision: 60292

Modified:
   python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c
Log:
Only structures with native packing implement the pep.  Unions, or
packed structures do not.


Modified: python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c
==============================================================================
--- python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c	(original)
+++ python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c	Fri Jan 25 20:32:20 2008
@@ -408,11 +408,13 @@
 		ffi_ofs = 0;
 	}
 
-	if (isStruct) {
+	if (isStruct && !isPacked) {
 		stgdict->format = alloc_format_string(NULL, "T{");
 	} else {
-		/* PEP3118 doesn't support unions. Invent our own character... */
-		stgdict->format = alloc_format_string(NULL, "#{");
+		/* PEP3118 doesn't support union, or packed structures (well,
+		   only standard packing, but we dont support the pep for
+		   that). Use 'B' for bytes. */
+		stgdict->format = alloc_format_string(NULL, "B");
 	}
 
 #define realdict ((PyObject *)&stgdict->dict)
@@ -473,12 +475,13 @@
 			}
 		} else
 			bitsize = 0;
-		{
+		if (isStruct && !isPacked) {
 			char *fieldfmt = dict->format ? dict->format : "XXX";
 			char *fieldname = PyUnicode_AsString(name);
 			char *ptr;
 			Py_ssize_t len = strlen(fieldname) + strlen(fieldfmt);
 			char *buf = alloca(len + 2 + 1);
+
 			sprintf(buf, "%s:%s:", fieldfmt, fieldname);
 
 			ptr = stgdict->format;
@@ -521,9 +524,11 @@
 	}
 #undef realdict
 
-	stgdict->format = alloc_format_string(stgdict->format, "}");
-	if (stgdict->format == NULL)
-		return -1;
+	if (isStruct && !isPacked) {
+		stgdict->format = alloc_format_string(stgdict->format, "}");
+		if (stgdict->format == NULL)
+			return -1;
+	}
 
 	if (!isStruct)
 		size = union_size;


More information about the Python-3000-checkins mailing list