summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-07-09 11:17:33 (GMT)
committerGuido van Rossum <guido@python.org>2007-07-09 11:17:33 (GMT)
commit5e23d5732b8e549588be7b0cc7c3deeb300df7e0 (patch)
tree7cc134febc1e771719f8e62373e421e9a3d9c97a
parent9a63470fd7f1d96eff03ffd33bf75371d5bb6fac (diff)
downloadcpython-5e23d5732b8e549588be7b0cc7c3deeb300df7e0.zip
cpython-5e23d5732b8e549588be7b0cc7c3deeb300df7e0.tar.gz
cpython-5e23d5732b8e549588be7b0cc7c3deeb300df7e0.tar.bz2
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.
-rw-r--r--Modules/_ctypes/_ctypes.c65
-rw-r--r--Python/mactoolboxglue.c26
2 files changed, 71 insertions, 20 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index ab5e895..83f23ca 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -1389,6 +1389,7 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject
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 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject
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 @@ SimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyTypeObject *result;
StgDictObject *stgdict;
PyObject *proto;
+ const char *proto_str;
+ int proto_len;
PyMethodDef *ml;
struct fielddesc *fmt;
@@ -1494,24 +1497,52 @@ SimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
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 @@ SimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
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;
diff --git a/Python/mactoolboxglue.c b/Python/mactoolboxglue.c
index 26a1308..9a8d30b 100644
--- a/Python/mactoolboxglue.c
+++ b/Python/mactoolboxglue.c
@@ -159,12 +159,32 @@ int
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;
}