[Python-3000-checkins] r56211 - in python/branches/py3k-struni: Modules/_ctypes/_ctypes.c Python/mactoolboxglue.c

guido.van.rossum python-3000-checkins at python.org
Mon Jul 9 13:17:34 CEST 2007


Author: guido.van.rossum
Date: Mon Jul  9 13:17:33 2007
New Revision: 56211

Modified:
   python/branches/py3k-struni/Modules/_ctypes/_ctypes.c
   python/branches/py3k-struni/Python/mactoolboxglue.c
Log:
Changes to ctypes and Mac toolbox glue that fix test_threading and test_platform.
However, test_ctypes is still broken -- and apparently more than before.


Modified: python/branches/py3k-struni/Modules/_ctypes/_ctypes.c
==============================================================================
--- python/branches/py3k-struni/Modules/_ctypes/_ctypes.c	(original)
+++ python/branches/py3k-struni/Modules/_ctypes/_ctypes.c	Mon Jul  9 13:17:33 2007
@@ -1389,6 +1389,7 @@
 	PyTypeObject *result;
 	StgDictObject *stgdict;
 	PyObject *name = PyTuple_GET_ITEM(args, 0);
+	PyObject *newname;
 	PyObject *swapped_args;
 	static PyObject *suffix;
 	Py_ssize_t i;
@@ -1399,17 +1400,17 @@
 
 	if (suffix == NULL)
 #ifdef WORDS_BIGENDIAN
-		suffix = PyString_FromString("_le");
+		suffix = PyUnicode_FromString("_le");
 #else
-		suffix = PyString_FromString("_be");
+		suffix = PyUnicode_FromString("_be");
 #endif
 
-	Py_INCREF(name);
-	PyString_Concat(&name, suffix);
-	if (name == NULL)
+	newname = PyUnicode_Concat(name, suffix);
+	if (newname == NULL) {
 		return NULL;
+	}
 
-	PyTuple_SET_ITEM(swapped_args, 0, name);
+	PyTuple_SET_ITEM(swapped_args, 0, newname);
 	for (i=1; i<PyTuple_GET_SIZE(args); ++i) {
 		PyObject *v = PyTuple_GET_ITEM(args, i);
 		Py_INCREF(v);
@@ -1484,6 +1485,8 @@
 	PyTypeObject *result;
 	StgDictObject *stgdict;
 	PyObject *proto;
+	const char *proto_str;
+	int proto_len;
 	PyMethodDef *ml;
 	struct fielddesc *fmt;
 
@@ -1494,24 +1497,52 @@
 		return NULL;
 
 	proto = PyObject_GetAttrString((PyObject *)result, "_type_"); /* new ref */
-	if (!proto
-	    || !PyString_Check(proto)
-	    || 1 != strlen(PyString_AS_STRING(proto))
-	    || !strchr(SIMPLE_TYPE_CHARS, PyString_AS_STRING(proto)[0])) {
+	if (!proto) {
+		PyErr_SetString(PyExc_AttributeError,
+				"class must define a '_type_' attribute");
+  error:
+		Py_XDECREF(proto);
+		Py_XDECREF(result);
+		return NULL;
+	}
+	if (PyUnicode_Check(proto)) {
+		PyObject *v = _PyUnicode_AsDefaultEncodedString(proto, NULL);
+		if (!v)
+			goto error;
+		proto_str = PyString_AS_STRING(v);
+		proto_len = PyString_GET_SIZE(v);
+	}
+	else if (PyString_Check(proto)) {
+		proto_str = PyString_AS_STRING(proto);
+		proto_len = PyString_GET_SIZE(proto);
+	}
+	else if (PyBytes_Check(proto)) {
+		proto_str = PyBytes_AS_STRING(proto);
+		proto_len = PyBytes_GET_SIZE(proto);
+	}
+	else {
+		PyErr_SetString(PyExc_TypeError,
+			"class must define a '_type_' string attribute");
+		goto error;
+	}
+	if (proto_len != 1) {
+		PyErr_SetString(PyExc_ValueError,
+				"class must define a '_type_' attribute "
+				"which must be a string of length 1");
+		goto error;
+	}
+	if (!strchr(SIMPLE_TYPE_CHARS, *proto_str)) {
 		PyErr_Format(PyExc_AttributeError,
 			     "class must define a '_type_' attribute which must be\n"
 			     "a single character string containing one of '%s'.",
 			     SIMPLE_TYPE_CHARS);
-		Py_XDECREF(proto);
-		Py_DECREF(result);
-		return NULL;
+		goto error;
 	}
-	fmt = getentry(PyString_AS_STRING(proto));
+	fmt = getentry(proto_str);
 	if (fmt == NULL) {
 		Py_DECREF(result);
 		PyErr_Format(PyExc_ValueError,
-			     "_type_ '%s' not supported",
-			     PyString_AS_STRING(proto));
+			     "_type_ '%s' not supported", proto_str);
 		return NULL;
 	}
 
@@ -1551,7 +1582,7 @@
 	   Overrides the SimpleType_from_param generic method.
 	 */
 	if (result->tp_base == &Simple_Type) {
-		switch (PyString_AS_STRING(proto)[0]) {
+		switch (*proto_str) {
 		case 'z': /* c_char_p */
 			ml = &c_char_p_method;
 			break;

Modified: python/branches/py3k-struni/Python/mactoolboxglue.c
==============================================================================
--- python/branches/py3k-struni/Python/mactoolboxglue.c	(original)
+++ python/branches/py3k-struni/Python/mactoolboxglue.c	Mon Jul  9 13:17:33 2007
@@ -159,12 +159,32 @@
 PyMac_GetOSType(PyObject *v, OSType *pr)
 {
 	uint32_t tmp;
-	if (!PyString_Check(v) || PyString_Size(v) != 4) {
+	const char *str;
+	int len;
+	if (PyUnicode_Check(v)) {
+		v = _PyUnicode_AsDefaultEncodedString(v, NULL);
+		if (v == NULL)
+			return 0;
+	}
+	if (PyString_Check(v)) {
+		str = PyString_AS_STRING(v);
+		len = PyString_GET_SIZE(v);
+	}
+	else if (PyBytes_Check(v)) {
+		str = PyBytes_AS_STRING(v);
+		len = PyBytes_GET_SIZE(v);
+	}
+	else {
+		PyErr_SetString(PyExc_TypeError,
+			"OSType arg must be string (of 4 chars)");
+		return 0;
+	}
+	if (len != 4) {
 		PyErr_SetString(PyExc_TypeError,
-			"OSType arg must be string of 4 chars");
+			"OSType arg must be (string of) 4 chars");
 		return 0;
 	}
-	memcpy((char *)&tmp, PyString_AsString(v), 4);
+	memcpy((char *)&tmp, str, 4);
 	*pr = (OSType)ntohl(tmp);
 	return 1;
 }


More information about the Python-3000-checkins mailing list