Skip to content

Commit c1b4c35

Browse files
committed
fixes
1 parent d045747 commit c1b4c35

File tree

3 files changed

+34
-18
lines changed

3 files changed

+34
-18
lines changed

Lib/test/test_capi/test_structmembers.py

+13
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ def _make_test_object(cls):
3737
9.99999,# T_FLOAT
3838
10.1010101010, # T_DOUBLE
3939
"hi", # T_STRING_INPLACE
40+
12, # T_LONGLONG
41+
13, # T_ULONGLONG
42+
"c", # T_CHAR
4043
)
4144

4245

@@ -162,6 +165,16 @@ def test_inplace_string(self):
162165
self.assertRaises(TypeError, setattr, ts, "T_STRING_INPLACE", "s")
163166
self.assertRaises(TypeError, delattr, ts, "T_STRING_INPLACE")
164167

168+
def test_char(self):
169+
ts = self.ts
170+
self.assertEqual(ts.T_CHAR, "c")
171+
ts.T_CHAR = "z"
172+
self.assertEqual(ts.T_CHAR, "z")
173+
self.assertRaises(TypeError, setattr, ts, "T_CHAR", "")
174+
self.assertRaises(TypeError, setattr, ts, "T_CHAR", b"a")
175+
self.assertRaises(TypeError, setattr, ts, "T_CHAR", bytearray(b"b"))
176+
self.assertRaises(TypeError, delattr, ts, "T_STRING_INPLACE")
177+
165178
class ReadWriteTests_OldAPI(ReadWriteTests, unittest.TestCase):
166179
cls = _test_structmembersType_OldAPI
167180

Modules/_testcapi/structmember.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ test_structmembers_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
6060
"T_FLOAT", "T_DOUBLE", "T_STRING_INPLACE",
6161
"T_LONGLONG", "T_ULONGLONG", "T_CHAR",
6262
NULL};
63-
static const char fmt[] = "|bbBhHiIlknfds#LK";
63+
static const char fmt[] = "|bbBhHiIlknfds#LKC";
6464
test_structmembers *ob;
6565
const char *s = NULL;
6666
Py_ssize_t string_len = 0;
@@ -135,7 +135,7 @@ static struct PyMemberDef test_members[] = {
135135
{"T_STRING_INPLACE", T_STRING_INPLACE, offsetof(test_structmembers, structmembers.inplace_member), 0, NULL},
136136
{"T_LONGLONG", T_LONGLONG, offsetof(test_structmembers, structmembers.longlong_member), 0, NULL},
137137
{"T_ULONGLONG", T_ULONGLONG, offsetof(test_structmembers, structmembers.ulonglong_member), 0, NULL},
138-
{"T_CHAR", Py_T_CHAR, offsetof(test_structmembers, structmembers.char_member), 0, NULL},
138+
{"T_CHAR", T_CHAR, offsetof(test_structmembers, structmembers.char_member), 0, NULL},
139139
{NULL}
140140
};
141141

Python/structmember.c

+19-16
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
8080
v = PyUnicode_FromString((char*)addr);
8181
break;
8282
case Py_T_CHAR: {
83-
char value = FT_ATOMIC_LOAD_CHAR_RELAXED(*addr);
84-
v = PyUnicode_FromStringAndSize(&value, 1);
83+
char char_val = FT_ATOMIC_LOAD_CHAR_RELAXED(*addr);
84+
v = PyUnicode_FromStringAndSize(&char_val, 1);
8585
break;
8686
}
8787
case _Py_T_OBJECT:
@@ -252,12 +252,13 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
252252
}
253253
break;
254254
}
255-
case Py_T_LONG:{
256-
FT_ATOMIC_STORE_LONG_RELAXED(*(long*)addr, PyLong_AsLong(v));
257-
if ((*(long*)addr == -1) && PyErr_Occurred())
255+
case Py_T_LONG: {
256+
const long long_val = PyLong_AsLong(v);
257+
if ((long_val == -1) && PyErr_Occurred())
258258
return -1;
259+
FT_ATOMIC_STORE_LONG_RELAXED(*(long*)addr, long_val);
259260
break;
260-
}
261+
}
261262
case Py_T_ULONG: {
262263
/* XXX: For compatibility, accept negative int values
263264
as well. */
@@ -284,25 +285,27 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
284285
}
285286
break;
286287
}
287-
case Py_T_PYSSIZET:{
288-
FT_ATOMIC_STORE_SSIZE_RELAXED(*(Py_ssize_t*)addr, PyLong_AsSsize_t(v));
289-
if ((*(Py_ssize_t*)addr == (Py_ssize_t)-1)
290-
&& PyErr_Occurred())
291-
return -1;
288+
case Py_T_PYSSIZET: {
289+
const Py_ssize_t ssize_val = PyLong_AsSsize_t(v);
290+
if ((ssize_val == (Py_ssize_t)-1) && PyErr_Occurred())
291+
return -1;
292+
FT_ATOMIC_STORE_SSIZE_RELAXED(*(Py_ssize_t*)addr, ssize_val);
292293
break;
293-
}
294+
}
294295
case Py_T_FLOAT:{
295296
double double_val = PyFloat_AsDouble(v);
296297
if ((double_val == -1) && PyErr_Occurred())
297298
return -1;
298299
FT_ATOMIC_STORE_FLOAT_RELAXED(*(float*)addr, (float)double_val);
299300
break;
300301
}
301-
case Py_T_DOUBLE:
302-
FT_ATOMIC_STORE_DOUBLE_RELAXED(*(double*)addr, PyFloat_AsDouble(v));
303-
if ((*(double*)addr == -1) && PyErr_Occurred())
302+
case Py_T_DOUBLE: {
303+
const double double_val = PyFloat_AsDouble(v);
304+
if ((double_val == -1) && PyErr_Occurred())
304305
return -1;
306+
FT_ATOMIC_STORE_DOUBLE_RELAXED(*(double *) addr, double_val);
305307
break;
308+
}
306309
case _Py_T_OBJECT:
307310
case Py_T_OBJECT_EX:
308311
Py_BEGIN_CRITICAL_SECTION(obj);
@@ -329,9 +332,9 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
329332
return -1;
330333
case Py_T_LONGLONG:{
331334
long long value = PyLong_AsLongLong(v);
332-
FT_ATOMIC_STORE_LLONG_RELAXED(*(long long*)addr, value);
333335
if ((value == -1) && PyErr_Occurred())
334336
return -1;
337+
FT_ATOMIC_STORE_LLONG_RELAXED(*(long long*)addr, value);
335338
break;
336339
}
337340
case Py_T_ULONGLONG: {

0 commit comments

Comments
 (0)