Commit 97f9d4f3 authored by Guido van Rossum's avatar Guido van Rossum

Patch #1318 by Amaury Forgeot d'Arc.

Updates to ctypes for python 3.0 to make the tests pass.
Notable changes are:
- return bytes instead of str8
- integers in range(256) are accepted as "one char string":
  libc.strchr("abcdef", 98) is now valid.
- directly use the wide-char version of the win32 function LoadLibrary.
parent b98cda44
...@@ -52,11 +52,11 @@ STDAPICALLTYPE ...@@ -52,11 +52,11 @@ STDAPICALLTYPE
""" """
def create_string_buffer(init, size=None): def create_string_buffer(init, size=None):
"""create_string_buffer(aString) -> character array """create_string_buffer(aBytes) -> character array
create_string_buffer(anInteger) -> character array create_string_buffer(anInteger) -> character array
create_string_buffer(aString, anInteger) -> character array create_string_buffer(aString, anInteger) -> character array
""" """
if isinstance(init, str): if isinstance(init, (str, bytes)):
if size is None: if size is None:
size = len(init)+1 size = len(init)+1
buftype = c_char * size buftype = c_char * size
......
...@@ -94,12 +94,12 @@ class ArrayTestCase(unittest.TestCase): ...@@ -94,12 +94,12 @@ class ArrayTestCase(unittest.TestCase):
# Failed with 0.9.8, reported by JUrner # Failed with 0.9.8, reported by JUrner
p = create_string_buffer("foo") p = create_string_buffer("foo")
sz = (c_char * 3).from_address(addressof(p)) sz = (c_char * 3).from_address(addressof(p))
self.failUnlessEqual(sz[:], "foo") self.failUnlessEqual(sz[:], b"foo")
self.failUnlessEqual(sz[::], "foo") self.failUnlessEqual(sz[::], b"foo")
self.failUnlessEqual(sz[::-1], "oof") self.failUnlessEqual(sz[::-1], b"oof")
self.failUnlessEqual(sz[::3], "f") self.failUnlessEqual(sz[::3], b"f")
self.failUnlessEqual(sz[1:4:2], "o") self.failUnlessEqual(sz[1:4:2], b"o")
self.failUnlessEqual(sz.value, "foo") self.failUnlessEqual(sz.value, b"foo")
try: try:
create_unicode_buffer create_unicode_buffer
......
...@@ -14,11 +14,11 @@ class StringBufferTestCase(unittest.TestCase): ...@@ -14,11 +14,11 @@ class StringBufferTestCase(unittest.TestCase):
self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char)) self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char))
self.failUnless(type(b[0]) is bytes) self.failUnless(type(b[0]) is bytes)
self.failUnlessEqual(b[0], b"a") self.failUnlessEqual(b[0], b"a")
self.failUnlessEqual(b[:], "abc\0") self.failUnlessEqual(b[:], b"abc\0")
self.failUnlessEqual(b[::], "abc\0") self.failUnlessEqual(b[::], b"abc\0")
self.failUnlessEqual(b[::-1], "\0cba") self.failUnlessEqual(b[::-1], b"\0cba")
self.failUnlessEqual(b[::2], "ac") self.failUnlessEqual(b[::2], b"ac")
self.failUnlessEqual(b[::5], "a") self.failUnlessEqual(b[::5], b"a")
def test_string_conversion(self): def test_string_conversion(self):
b = create_string_buffer("abc") b = create_string_buffer("abc")
...@@ -26,11 +26,11 @@ class StringBufferTestCase(unittest.TestCase): ...@@ -26,11 +26,11 @@ class StringBufferTestCase(unittest.TestCase):
self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char)) self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char))
self.failUnless(type(b[0]) is bytes) self.failUnless(type(b[0]) is bytes)
self.failUnlessEqual(b[0], b"a") self.failUnlessEqual(b[0], b"a")
self.failUnlessEqual(b[:], "abc\0") self.failUnlessEqual(b[:], b"abc\0")
self.failUnlessEqual(b[::], "abc\0") self.failUnlessEqual(b[::], b"abc\0")
self.failUnlessEqual(b[::-1], "\0cba") self.failUnlessEqual(b[::-1], b"\0cba")
self.failUnlessEqual(b[::2], "ac") self.failUnlessEqual(b[::2], b"ac")
self.failUnlessEqual(b[::5], "a") self.failUnlessEqual(b[::5], b"a")
try: try:
c_wchar c_wchar
......
...@@ -24,7 +24,7 @@ class LibTest(unittest.TestCase): ...@@ -24,7 +24,7 @@ class LibTest(unittest.TestCase):
chars = create_string_buffer("spam, spam, and spam") chars = create_string_buffer("spam, spam, and spam")
lib.my_qsort(chars, len(chars)-1, sizeof(c_char), comparefunc(sort)) lib.my_qsort(chars, len(chars)-1, sizeof(c_char), comparefunc(sort))
self.failUnlessEqual(chars.raw, " ,,aaaadmmmnpppsss\x00") self.failUnlessEqual(chars.raw, b" ,,aaaadmmmnpppsss\x00")
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()
...@@ -9,21 +9,21 @@ class MemFunctionsTest(unittest.TestCase): ...@@ -9,21 +9,21 @@ class MemFunctionsTest(unittest.TestCase):
a = create_string_buffer(1000000) a = create_string_buffer(1000000)
p = b"Hello, World" p = b"Hello, World"
result = memmove(a, p, len(p)) result = memmove(a, p, len(p))
self.failUnlessEqual(a.value, "Hello, World") self.failUnlessEqual(a.value, b"Hello, World")
self.failUnlessEqual(string_at(result), "Hello, World") self.failUnlessEqual(string_at(result), b"Hello, World")
self.failUnlessEqual(string_at(result, 5), "Hello") self.failUnlessEqual(string_at(result, 5), b"Hello")
self.failUnlessEqual(string_at(result, 16), "Hello, World\0\0\0\0") self.failUnlessEqual(string_at(result, 16), b"Hello, World\0\0\0\0")
self.failUnlessEqual(string_at(result, 0), "") self.failUnlessEqual(string_at(result, 0), b"")
def test_memset(self): def test_memset(self):
a = create_string_buffer(1000000) a = create_string_buffer(1000000)
result = memset(a, ord('x'), 16) result = memset(a, ord('x'), 16)
self.failUnlessEqual(a.value, "xxxxxxxxxxxxxxxx") self.failUnlessEqual(a.value, b"xxxxxxxxxxxxxxxx")
self.failUnlessEqual(string_at(result), "xxxxxxxxxxxxxxxx") self.failUnlessEqual(string_at(result), b"xxxxxxxxxxxxxxxx")
self.failUnlessEqual(string_at(a), "xxxxxxxxxxxxxxxx") self.failUnlessEqual(string_at(a), b"xxxxxxxxxxxxxxxx")
self.failUnlessEqual(string_at(a, 20), "xxxxxxxxxxxxxxxx\0\0\0\0") self.failUnlessEqual(string_at(a, 20), b"xxxxxxxxxxxxxxxx\0\0\0\0")
def test_cast(self): def test_cast(self):
a = (c_ubyte * 32)(*map(ord, "abcdef")) a = (c_ubyte * 32)(*map(ord, "abcdef"))
...@@ -46,8 +46,8 @@ class MemFunctionsTest(unittest.TestCase): ...@@ -46,8 +46,8 @@ class MemFunctionsTest(unittest.TestCase):
self.failUnlessEqual(2, sys.getrefcount(s)) self.failUnlessEqual(2, sys.getrefcount(s))
self.failUnless(s, "foo bar") self.failUnless(s, "foo bar")
self.failUnlessEqual(string_at(b"foo bar", 7), "foo bar") self.failUnlessEqual(string_at(b"foo bar", 7), b"foo bar")
self.failUnlessEqual(string_at(b"foo bar", 3), "foo") self.failUnlessEqual(string_at(b"foo bar", 3), b"foo")
try: try:
create_unicode_buffer create_unicode_buffer
......
...@@ -23,13 +23,13 @@ class PythonAPITestCase(unittest.TestCase): ...@@ -23,13 +23,13 @@ class PythonAPITestCase(unittest.TestCase):
PyString_FromStringAndSize.restype = py_object PyString_FromStringAndSize.restype = py_object
PyString_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t PyString_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t
self.failUnlessEqual(PyString_FromStringAndSize("abcdefghi", 3), "abc") self.failUnlessEqual(PyString_FromStringAndSize(b"abcdefghi", 3), b"abc")
def test_PyString_FromString(self): def test_PyString_FromString(self):
pythonapi.PyString_FromString.restype = py_object pythonapi.PyString_FromString.restype = py_object
pythonapi.PyString_FromString.argtypes = (c_char_p,) pythonapi.PyString_FromString.argtypes = (c_char_p,)
s = "abc" s = b"abc"
refcnt = grc(s) refcnt = grc(s)
pyob = pythonapi.PyString_FromString(s) pyob = pythonapi.PyString_FromString(s)
self.failUnlessEqual(grc(s), refcnt) self.failUnlessEqual(grc(s), refcnt)
...@@ -73,10 +73,10 @@ class PythonAPITestCase(unittest.TestCase): ...@@ -73,10 +73,10 @@ class PythonAPITestCase(unittest.TestCase):
buf = c_buffer(256) buf = c_buffer(256)
PyOS_snprintf(buf, sizeof(buf), "Hello from %s", b"ctypes") PyOS_snprintf(buf, sizeof(buf), "Hello from %s", b"ctypes")
self.failUnlessEqual(buf.value, "Hello from ctypes") self.failUnlessEqual(buf.value, b"Hello from ctypes")
PyOS_snprintf(buf, sizeof(buf), "Hello from %s (%d, %d, %d)", b"ctypes", 1, 2, 3) PyOS_snprintf(buf, sizeof(buf), "Hello from %s (%d, %d, %d)", b"ctypes", 1, 2, 3)
self.failUnlessEqual(buf.value, "Hello from ctypes (1, 2, 3)") self.failUnlessEqual(buf.value, b"Hello from ctypes (1, 2, 3)")
# not enough arguments # not enough arguments
self.failUnlessRaises(TypeError, PyOS_snprintf, buf) self.failUnlessRaises(TypeError, PyOS_snprintf, buf)
......
...@@ -14,7 +14,9 @@ class ReturnFuncPtrTestCase(unittest.TestCase): ...@@ -14,7 +14,9 @@ class ReturnFuncPtrTestCase(unittest.TestCase):
strchr = get_strchr() strchr = get_strchr()
self.failUnlessEqual(strchr("abcdef", "b"), "bcdef") self.failUnlessEqual(strchr("abcdef", "b"), "bcdef")
self.failUnlessEqual(strchr("abcdef", "x"), None) self.failUnlessEqual(strchr("abcdef", "x"), None)
self.assertRaises(ArgumentError, strchr, "abcdef", 3) self.failUnlessEqual(strchr("abcdef", 98), "bcdef")
self.failUnlessEqual(strchr("abcdef", 107), None)
self.assertRaises(ArgumentError, strchr, "abcdef", 3.0)
self.assertRaises(TypeError, strchr, "abcdef") self.assertRaises(TypeError, strchr, "abcdef")
def test_without_prototype(self): def test_without_prototype(self):
...@@ -28,7 +30,7 @@ class ReturnFuncPtrTestCase(unittest.TestCase): ...@@ -28,7 +30,7 @@ class ReturnFuncPtrTestCase(unittest.TestCase):
strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(addr) strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(addr)
self.failUnless(strchr("abcdef", "b"), "bcdef") self.failUnless(strchr("abcdef", "b"), "bcdef")
self.failUnlessEqual(strchr("abcdef", "x"), None) self.failUnlessEqual(strchr("abcdef", "x"), None)
self.assertRaises(ArgumentError, strchr, "abcdef", 3) self.assertRaises(ArgumentError, strchr, "abcdef", 3.0)
self.assertRaises(TypeError, strchr, "abcdef") self.assertRaises(TypeError, strchr, "abcdef")
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -121,7 +121,7 @@ class SlicesTestCase(unittest.TestCase): ...@@ -121,7 +121,7 @@ class SlicesTestCase(unittest.TestCase):
def test_char_array(self): def test_char_array(self):
s = "abcdefghijklmnopqrstuvwxyz\0" s = b"abcdefghijklmnopqrstuvwxyz\0"
p = (c_char * 27)(*s) p = (c_char * 27)(*s)
self.failUnlessEqual(p[:], s) self.failUnlessEqual(p[:], s)
......
...@@ -6,20 +6,20 @@ class StringArrayTestCase(unittest.TestCase): ...@@ -6,20 +6,20 @@ class StringArrayTestCase(unittest.TestCase):
BUF = c_char * 4 BUF = c_char * 4
buf = BUF("a", "b", "c") buf = BUF("a", "b", "c")
self.failUnlessEqual(buf.value, "abc") self.failUnlessEqual(buf.value, b"abc")
self.failUnlessEqual(buf.raw, "abc\000") self.failUnlessEqual(buf.raw, b"abc\000")
buf.value = "ABCD" buf.value = "ABCD"
self.failUnlessEqual(buf.value, "ABCD") self.failUnlessEqual(buf.value, b"ABCD")
self.failUnlessEqual(buf.raw, "ABCD") self.failUnlessEqual(buf.raw, b"ABCD")
buf.value = "x" buf.value = "x"
self.failUnlessEqual(buf.value, "x") self.failUnlessEqual(buf.value, b"x")
self.failUnlessEqual(buf.raw, "x\000CD") self.failUnlessEqual(buf.raw, b"x\000CD")
buf[1] = "Z" buf[1] = "Z"
self.failUnlessEqual(buf.value, "xZCD") self.failUnlessEqual(buf.value, b"xZCD")
self.failUnlessEqual(buf.raw, "xZCD") self.failUnlessEqual(buf.raw, b"xZCD")
self.assertRaises(ValueError, setattr, buf, "value", "aaaaaaaa") self.assertRaises(ValueError, setattr, buf, "value", "aaaaaaaa")
self.assertRaises(TypeError, setattr, buf, "value", 42) self.assertRaises(TypeError, setattr, buf, "value", 42)
...@@ -27,8 +27,8 @@ class StringArrayTestCase(unittest.TestCase): ...@@ -27,8 +27,8 @@ class StringArrayTestCase(unittest.TestCase):
def test_c_buffer_value(self): def test_c_buffer_value(self):
buf = c_buffer(32) buf = c_buffer(32)
buf.value = "Hello, World" buf.value = b"Hello, World"
self.failUnlessEqual(buf.value, "Hello, World") self.failUnlessEqual(buf.value, b"Hello, World")
self.failUnlessRaises(TypeError, setattr, buf, "value", memoryview(b"Hello, World")) self.failUnlessRaises(TypeError, setattr, buf, "value", memoryview(b"Hello, World"))
self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"abc")) self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"abc"))
...@@ -38,7 +38,7 @@ class StringArrayTestCase(unittest.TestCase): ...@@ -38,7 +38,7 @@ class StringArrayTestCase(unittest.TestCase):
buf = c_buffer(32) buf = c_buffer(32)
buf.raw = memoryview(b"Hello, World") buf.raw = memoryview(b"Hello, World")
self.failUnlessEqual(buf.value, "Hello, World") self.failUnlessEqual(buf.value, b"Hello, World")
self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"abc")) self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"abc"))
self.assertRaises(ValueError, setattr, buf, "raw", memoryview(b"x" * 100)) self.assertRaises(ValueError, setattr, buf, "raw", memoryview(b"x" * 100))
......
...@@ -111,18 +111,18 @@ else: ...@@ -111,18 +111,18 @@ else:
ctypes.set_conversion_mode("ascii", "replace") ctypes.set_conversion_mode("ascii", "replace")
buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc") buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc")
self.failUnlessEqual(buf[:], "ab???\0") self.failUnlessEqual(buf[:], b"ab???\0")
self.failUnlessEqual(buf[::], "ab???\0") self.failUnlessEqual(buf[::], b"ab???\0")
self.failUnlessEqual(buf[::-1], "\0???ba") self.failUnlessEqual(buf[::-1], b"\0???ba")
self.failUnlessEqual(buf[::2], "a??") self.failUnlessEqual(buf[::2], b"a??")
self.failUnlessEqual(buf[6:5:-1], "") self.failUnlessEqual(buf[6:5:-1], b"")
ctypes.set_conversion_mode("ascii", "ignore") ctypes.set_conversion_mode("ascii", "ignore")
buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc") buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc")
# is that correct? not sure. But with 'ignore', you get what you pay for.. # is that correct? not sure. But with 'ignore', you get what you pay for..
self.failUnlessEqual(buf[:], "ab\0\0\0\0") self.failUnlessEqual(buf[:], b"ab\0\0\0\0")
self.failUnlessEqual(buf[::], "ab\0\0\0\0") self.failUnlessEqual(buf[::], b"ab\0\0\0\0")
self.failUnlessEqual(buf[::-1], "\0\0\0\0ba") self.failUnlessEqual(buf[::-1], b"\0\0\0\0ba")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -763,7 +763,7 @@ CharArray_set_raw(CDataObject *self, PyObject *value) ...@@ -763,7 +763,7 @@ CharArray_set_raw(CDataObject *self, PyObject *value)
static PyObject * static PyObject *
CharArray_get_raw(CDataObject *self) CharArray_get_raw(CDataObject *self)
{ {
return PyString_FromStringAndSize(self->b_ptr, self->b_size); return PyBytes_FromStringAndSize(self->b_ptr, self->b_size);
} }
static PyObject * static PyObject *
...@@ -774,7 +774,7 @@ CharArray_get_value(CDataObject *self) ...@@ -774,7 +774,7 @@ CharArray_get_value(CDataObject *self)
for (i = 0; i < self->b_size; ++i) for (i = 0; i < self->b_size; ++i)
if (*ptr++ == '\0') if (*ptr++ == '\0')
break; break;
return PyString_FromStringAndSize(self->b_ptr, i); return PyBytes_FromStringAndSize(self->b_ptr, i);
} }
static int static int
...@@ -1251,7 +1251,7 @@ c_void_p_from_param(PyObject *type, PyObject *value) ...@@ -1251,7 +1251,7 @@ c_void_p_from_param(PyObject *type, PyObject *value)
} }
/* XXX struni: remove later */ /* XXX struni: remove later */
/* string */ /* string */
if (PyString_Check(value)) { if (PyBytes_Check(value)) {
PyCArgObject *parg; PyCArgObject *parg;
struct fielddesc *fd = getentry("z"); struct fielddesc *fd = getentry("z");
...@@ -1452,7 +1452,7 @@ SimpleType_paramfunc(CDataObject *self) ...@@ -1452,7 +1452,7 @@ SimpleType_paramfunc(CDataObject *self)
dict = PyObject_stgdict((PyObject *)self); dict = PyObject_stgdict((PyObject *)self);
assert(dict); /* Cannot be NULL for CDataObject instances */ assert(dict); /* Cannot be NULL for CDataObject instances */
fmt = PyString_AsString(dict->proto); fmt = PyUnicode_AsString(dict->proto);
assert(fmt); assert(fmt);
fd = getentry(fmt); fd = getentry(fmt);
...@@ -1644,7 +1644,7 @@ SimpleType_from_param(PyObject *type, PyObject *value) ...@@ -1644,7 +1644,7 @@ SimpleType_from_param(PyObject *type, PyObject *value)
assert(dict); assert(dict);
/* I think we can rely on this being a one-character string */ /* I think we can rely on this being a one-character string */
fmt = PyString_AsString(dict->proto); fmt = PyUnicode_AsString(dict->proto);
assert(fmt); assert(fmt);
fd = getentry(fmt); fd = getentry(fmt);
...@@ -2667,7 +2667,7 @@ _validate_paramflags(PyTypeObject *type, PyObject *paramflags) ...@@ -2667,7 +2667,7 @@ _validate_paramflags(PyTypeObject *type, PyObject *paramflags)
char *name; char *name;
PyObject *defval; PyObject *defval;
PyObject *typ; PyObject *typ;
if (!PyArg_ParseTuple(item, "i|zO", &flag, &name, &defval)) { if (!PyArg_ParseTuple(item, "i|ZO", &flag, &name, &defval)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"paramflags must be a sequence of (int [,string [,value]]) tuples"); "paramflags must be a sequence of (int [,string [,value]]) tuples");
return 0; return 0;
...@@ -2705,8 +2705,12 @@ _get_name(PyObject *obj, char **pname) ...@@ -2705,8 +2705,12 @@ _get_name(PyObject *obj, char **pname)
return 1; return 1;
} }
#endif #endif
if (PyString_Check(obj) || PyUnicode_Check(obj)) { if (PyBytes_Check(obj)) {
*pname = PyString_AsString(obj); *pname = PyBytes_AS_STRING(obj);
return *pname ? 1 : 0;
}
if (PyUnicode_Check(obj)) {
*pname = PyUnicode_AsString(obj);
return *pname ? 1 : 0; return *pname ? 1 : 0;
} }
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
...@@ -2966,7 +2970,7 @@ _byref(PyObject *obj) ...@@ -2966,7 +2970,7 @@ _byref(PyObject *obj)
} }
static PyObject * static PyObject *
_get_arg(int *pindex, char *name, PyObject *defval, PyObject *inargs, PyObject *kwds) _get_arg(int *pindex, PyObject *name, PyObject *defval, PyObject *inargs, PyObject *kwds)
{ {
PyObject *v; PyObject *v;
...@@ -2976,7 +2980,7 @@ _get_arg(int *pindex, char *name, PyObject *defval, PyObject *inargs, PyObject * ...@@ -2976,7 +2980,7 @@ _get_arg(int *pindex, char *name, PyObject *defval, PyObject *inargs, PyObject *
Py_INCREF(v); Py_INCREF(v);
return v; return v;
} }
if (kwds && (v = PyDict_GetItemString(kwds, name))) { if (kwds && (v = PyDict_GetItem(kwds, name))) {
++*pindex; ++*pindex;
Py_INCREF(v); Py_INCREF(v);
return v; return v;
...@@ -3057,15 +3061,15 @@ _build_callargs(CFuncPtrObject *self, PyObject *argtypes, ...@@ -3057,15 +3061,15 @@ _build_callargs(CFuncPtrObject *self, PyObject *argtypes,
PyObject *item = PyTuple_GET_ITEM(paramflags, i); PyObject *item = PyTuple_GET_ITEM(paramflags, i);
PyObject *ob; PyObject *ob;
int flag; int flag;
char *name = NULL; PyObject *name = NULL;
PyObject *defval = NULL; PyObject *defval = NULL;
/* This way seems to be ~2 us faster than the PyArg_ParseTuple /* This way seems to be ~2 us faster than the PyArg_ParseTuple
calls below. */ calls below. */
/* We HAVE already checked that the tuple can be parsed with "i|zO", so... */ /* We HAVE already checked that the tuple can be parsed with "i|ZO", so... */
Py_ssize_t tsize = PyTuple_GET_SIZE(item); Py_ssize_t tsize = PyTuple_GET_SIZE(item);
flag = PyInt_AS_LONG(PyTuple_GET_ITEM(item, 0)); flag = PyInt_AS_LONG(PyTuple_GET_ITEM(item, 0));
name = tsize > 1 ? PyString_AS_STRING(PyTuple_GET_ITEM(item, 1)) : NULL; name = tsize > 1 ? PyTuple_GET_ITEM(item, 1) : NULL;
defval = tsize > 2 ? PyTuple_GET_ITEM(item, 2) : NULL; defval = tsize > 2 ? PyTuple_GET_ITEM(item, 2) : NULL;
switch (flag & (PARAMFLAG_FIN | PARAMFLAG_FOUT | PARAMFLAG_FLCID)) { switch (flag & (PARAMFLAG_FIN | PARAMFLAG_FOUT | PARAMFLAG_FLCID)) {
...@@ -3730,10 +3734,10 @@ Array_subscript(PyObject *_self, PyObject *item) ...@@ -3730,10 +3734,10 @@ Array_subscript(PyObject *_self, PyObject *item)
char *dest; char *dest;
if (slicelen <= 0) if (slicelen <= 0)
return PyString_FromString(""); return PyBytes_FromStringAndSize("", 0);
if (step == 1) { if (step == 1) {
return PyString_FromStringAndSize(ptr + start, return PyBytes_FromStringAndSize(ptr + start,
slicelen); slicelen);
} }
dest = (char *)PyMem_Malloc(slicelen); dest = (char *)PyMem_Malloc(slicelen);
...@@ -3745,7 +3749,7 @@ Array_subscript(PyObject *_self, PyObject *item) ...@@ -3745,7 +3749,7 @@ Array_subscript(PyObject *_self, PyObject *item)
dest[i] = ptr[cur]; dest[i] = ptr[cur];
} }
np = PyString_FromStringAndSize(dest, slicelen); np = PyBytes_FromStringAndSize(dest, slicelen);
PyMem_Free(dest); PyMem_Free(dest);
return np; return np;
} }
...@@ -4407,10 +4411,10 @@ Pointer_subscript(PyObject *_self, PyObject *item) ...@@ -4407,10 +4411,10 @@ Pointer_subscript(PyObject *_self, PyObject *item)
char *dest; char *dest;
if (len <= 0) if (len <= 0)
return PyString_FromString(""); return PyBytes_FromStringAndSize("", 0);
if (step == 1) { if (step == 1) {
return PyString_FromStringAndSize(ptr + start, return PyBytes_FromStringAndSize(ptr + start,
len); len);
} }
dest = (char *)PyMem_Malloc(len); dest = (char *)PyMem_Malloc(len);
if (dest == NULL) if (dest == NULL)
...@@ -4418,7 +4422,7 @@ Pointer_subscript(PyObject *_self, PyObject *item) ...@@ -4418,7 +4422,7 @@ Pointer_subscript(PyObject *_self, PyObject *item)
for (cur = start, i = 0; i < len; cur += step, i++) { for (cur = start, i = 0; i < len; cur += step, i++) {
dest[i] = ptr[cur]; dest[i] = ptr[cur];
} }
np = PyString_FromStringAndSize(dest, len); np = PyBytes_FromStringAndSize(dest, len);
PyMem_Free(dest); PyMem_Free(dest);
return np; return np;
} }
...@@ -4629,7 +4633,7 @@ create_comerror(void) ...@@ -4629,7 +4633,7 @@ create_comerror(void)
++methods; ++methods;
} }
s = PyString_FromString(comerror_doc); s = PyUnicode_FromString(comerror_doc);
if (s == NULL) if (s == NULL)
return -1; return -1;
status = PyDict_SetItemString(dict, "__doc__", s); status = PyDict_SetItemString(dict, "__doc__", s);
...@@ -4654,8 +4658,8 @@ static PyObject * ...@@ -4654,8 +4658,8 @@ static PyObject *
string_at(const char *ptr, int size) string_at(const char *ptr, int size)
{ {
if (size == -1) if (size == -1)
return PyString_FromString(ptr); return PyBytes_FromStringAndSize(ptr, strlen(ptr));
return PyString_FromStringAndSize(ptr, size); return PyBytes_FromStringAndSize(ptr, size);
} }
static int static int
......
...@@ -365,7 +365,7 @@ long Call_GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) ...@@ -365,7 +365,7 @@ long Call_GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
static PyObject *context; static PyObject *context;
if (context == NULL) if (context == NULL)
context = PyString_FromString("_ctypes.DllGetClassObject"); context = PyUnicode_FromString("_ctypes.DllGetClassObject");
mod = PyImport_ImportModule("ctypes"); mod = PyImport_ImportModule("ctypes");
if (!mod) { if (!mod) {
...@@ -444,7 +444,7 @@ long Call_CanUnloadNow(void) ...@@ -444,7 +444,7 @@ long Call_CanUnloadNow(void)
static PyObject *context; static PyObject *context;
if (context == NULL) if (context == NULL)
context = PyString_FromString("_ctypes.DllCanUnloadNow"); context = PyUnicode_FromString("_ctypes.DllCanUnloadNow");
mod = PyImport_ImportModule("ctypes"); mod = PyImport_ImportModule("ctypes");
if (!mod) { if (!mod) {
......
...@@ -770,7 +770,7 @@ void Extend_Error_Info(PyObject *exc_class, char *fmt, ...) ...@@ -770,7 +770,7 @@ void Extend_Error_Info(PyObject *exc_class, char *fmt, ...)
PyObject *tp, *v, *tb, *s, *cls_str, *msg_str; PyObject *tp, *v, *tb, *s, *cls_str, *msg_str;
va_start(vargs, fmt); va_start(vargs, fmt);
s = PyString_FromFormatV(fmt, vargs); s = PyUnicode_FromFormatV(fmt, vargs);
va_end(vargs); va_end(vargs);
if (!s) if (!s)
return; return;
...@@ -779,18 +779,18 @@ void Extend_Error_Info(PyObject *exc_class, char *fmt, ...) ...@@ -779,18 +779,18 @@ void Extend_Error_Info(PyObject *exc_class, char *fmt, ...)
PyErr_NormalizeException(&tp, &v, &tb); PyErr_NormalizeException(&tp, &v, &tb);
cls_str = PyObject_Str(tp); cls_str = PyObject_Str(tp);
if (cls_str) { if (cls_str) {
PyString_ConcatAndDel(&s, cls_str); PyUnicode_AppendAndDel(&s, cls_str);
PyString_ConcatAndDel(&s, PyString_FromString(": ")); PyUnicode_AppendAndDel(&s, PyUnicode_FromString(": "));
if (s == NULL) if (s == NULL)
goto error; goto error;
} else } else
PyErr_Clear(); PyErr_Clear();
msg_str = PyObject_Str(v); msg_str = PyObject_Unicode(v);
if (msg_str) if (msg_str)
PyString_ConcatAndDel(&s, msg_str); PyUnicode_AppendAndDel(&s, msg_str);
else { else {
PyErr_Clear(); PyErr_Clear();
PyString_ConcatAndDel(&s, PyString_FromString("???")); PyUnicode_AppendAndDel(&s, PyUnicode_FromString("???"));
if (s == NULL) if (s == NULL)
goto error; goto error;
} }
...@@ -1087,34 +1087,18 @@ The handle may be used to locate exported functions in this\n\ ...@@ -1087,34 +1087,18 @@ The handle may be used to locate exported functions in this\n\
module.\n"; module.\n";
static PyObject *load_library(PyObject *self, PyObject *args) static PyObject *load_library(PyObject *self, PyObject *args)
{ {
TCHAR *name; WCHAR *name;
PyObject *nameobj; PyObject *nameobj;
PyObject *ignored; PyObject *ignored;
HMODULE hMod; HMODULE hMod;
if (!PyArg_ParseTuple(args, "O|O:LoadLibrary", &nameobj, &ignored)) if (!PyArg_ParseTuple(args, "O|O:LoadLibrary", &nameobj, &ignored))
return NULL; return NULL;
#ifdef _UNICODE
name = alloca((PyString_Size(nameobj) + 1) * sizeof(WCHAR));
if (!name) {
PyErr_NoMemory();
return NULL;
}
{ name = PyUnicode_AsUnicode(nameobj);
int r; if (!name)
char *aname = PyString_AsString(nameobj);
if(!aname)
return NULL;
r = MultiByteToWideChar(CP_ACP, 0, aname, -1, name, PyString_Size(nameobj) + 1);
name[r] = 0;
}
#else
name = PyString_AsString(nameobj);
if(!name)
return NULL; return NULL;
#endif
hMod = LoadLibrary(name); hMod = LoadLibraryW(name);
if (!hMod) if (!hMod)
return PyErr_SetFromWindowsErr(GetLastError()); return PyErr_SetFromWindowsErr(GetLastError());
#ifdef _WIN64 #ifdef _WIN64
......
...@@ -1169,6 +1169,14 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size) ...@@ -1169,6 +1169,14 @@ c_set(void *ptr, PyObject *value, Py_ssize_t size)
*(char *)ptr = PyBytes_AsString(value)[0]; *(char *)ptr = PyBytes_AsString(value)[0];
_RET(value); _RET(value);
} }
if (PyInt_Check(value))
{
long longval = PyInt_AS_LONG(value);
if (longval < 0 || longval >= 256)
goto error;
*(char *)ptr = (char)longval;
_RET(value);
}
error: error:
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"one character string expected"); "one character string expected");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment