annotate Python/structmember.c @ 61184:4fd3ab5fa71d

Make (most of) Python's tests pass under Thread Sanitizer. http://code.google.com/p/data-race-test/wiki/ThreadSanitizer is a dynamic data race detector that runs on top of valgrind. With this patch, the binaries at http://code.google.com/p/data-race-test/wiki/ThreadSanitizer#Binaries pass many but not all of the Python tests. All of regrtest still passes outside of tsan. I've implemented part of the C1x atomic types so that we can explicitly mark variables that are used across threads, and get defined behavior as compilers advance. I've added tsan's client header and implementation to the codebase in dynamic_annotations.{h,c} (docs at http://code.google.com/p/data-race-test/wiki/DynamicAnnotations). Unfortunately, I haven't been able to get helgrind and drd to give sensible error messages, even when I use their client annotations, so I'm not supporting them.
author Jeffrey Yasskin <jyasskin@gmail.com>
date Mon, 03 May 2010 19:29:34 +0000
parents fb2d64a4d872
children cab14be0ada1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 95
diff changeset
1
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Map C struct members to Python object attributes */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
4 #include "Python.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #include "structmember.h"
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
7
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
8 PyObject *
36114
e9a10f74cf88 const poisoning, spreading to fix new const warnings
Tim Peters <tim.peters@gmail.com>
parents: 34677
diff changeset
9 PyMember_GetOne(const char *addr, PyMemberDef *l)
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
10 {
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
11 PyObject *v;
41715
f60c877d52c8 Merged revisions 55270-55324 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41317
diff changeset
12
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
13 addr += l->offset;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
14 switch (l->type) {
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
15 case T_BOOL:
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
16 v = PyBool_FromLong(*(char*)addr);
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
17 break;
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
18 case T_BYTE:
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
19 v = PyLong_FromLong(*(char*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
20 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
21 case T_UBYTE:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
22 v = PyLong_FromUnsignedLong(*(unsigned char*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
23 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
24 case T_SHORT:
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
25 v = PyLong_FromLong(*(short*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
26 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
27 case T_USHORT:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
28 v = PyLong_FromUnsignedLong(*(unsigned short*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
29 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
30 case T_INT:
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
31 v = PyLong_FromLong(*(int*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
32 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
33 case T_UINT:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
34 v = PyLong_FromUnsignedLong(*(unsigned int*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
35 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
36 case T_LONG:
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
37 v = PyLong_FromLong(*(long*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
38 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
39 case T_ULONG:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
40 v = PyLong_FromUnsignedLong(*(unsigned long*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
41 break;
42110
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
42 case T_PYSSIZET:
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
43 v = PyLong_FromSsize_t(*(Py_ssize_t*)addr);
42110
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
44 break;
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
45 case T_FLOAT:
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
46 v = PyFloat_FromDouble((double)*(float*)addr);
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
47 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
48 case T_DOUBLE:
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
49 v = PyFloat_FromDouble(*(double*)addr);
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
50 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
51 case T_STRING:
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
52 if (*(char**)addr == NULL) {
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
53 Py_INCREF(Py_None);
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
54 v = Py_None;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
55 }
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
56 else
43603
dd03aa741f56 This is the uncontroversial half of patch 1263 by Thomas Lee:
Guido van Rossum <guido@python.org>
parents: 42560
diff changeset
57 v = PyUnicode_FromString(*(char**)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
58 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
59 case T_STRING_INPLACE:
43603
dd03aa741f56 This is the uncontroversial half of patch 1263 by Thomas Lee:
Guido van Rossum <guido@python.org>
parents: 42560
diff changeset
60 v = PyUnicode_FromString((char*)addr);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
61 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
62 case T_CHAR:
43603
dd03aa741f56 This is the uncontroversial half of patch 1263 by Thomas Lee:
Guido van Rossum <guido@python.org>
parents: 42560
diff changeset
63 v = PyUnicode_FromStringAndSize((char*)addr, 1);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
64 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
65 case T_OBJECT:
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
66 v = *(PyObject **)addr;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
67 if (v == NULL)
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
68 v = Py_None;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
69 Py_INCREF(v);
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
70 break;
21187
ef6f692c76e2 Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents: 20456
diff changeset
71 case T_OBJECT_EX:
ef6f692c76e2 Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents: 20456
diff changeset
72 v = *(PyObject **)addr;
ef6f692c76e2 Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents: 20456
diff changeset
73 if (v == NULL)
ef6f692c76e2 Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents: 20456
diff changeset
74 PyErr_SetString(PyExc_AttributeError, l->name);
ef6f692c76e2 Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents: 20456
diff changeset
75 Py_XINCREF(v);
ef6f692c76e2 Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents: 20456
diff changeset
76 break;
34677
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
77 #ifdef HAVE_LONG_LONG
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
78 case T_LONGLONG:
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
79 v = PyLong_FromLongLong(*(PY_LONG_LONG *)addr);
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
80 break;
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
81 case T_ULONGLONG:
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
82 v = PyLong_FromUnsignedLongLong(*(unsigned PY_LONG_LONG *)addr);
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
83 break;
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
84 #endif /* HAVE_LONG_LONG */
39536
8f5b9982beba Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents: 38453
diff changeset
85 case T_NONE:
8f5b9982beba Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents: 38453
diff changeset
86 v = Py_None;
8f5b9982beba Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents: 38453
diff changeset
87 Py_INCREF(v);
8f5b9982beba Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents: 38453
diff changeset
88 break;
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
89 default:
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
90 PyErr_SetString(PyExc_SystemError, "bad memberdescr type");
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
91 v = NULL;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
92 }
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
93 return v;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
94 }
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
95
42560
0fcc18aba385 PyErr_Warn is deprecated in 2.5 - goes away for 3.0
Skip Montanaro <skip@pobox.com>
parents: 42537
diff changeset
96 #define WARN(msg) \
0fcc18aba385 PyErr_Warn is deprecated in 2.5 - goes away for 3.0
Skip Montanaro <skip@pobox.com>
parents: 42537
diff changeset
97 do { \
0fcc18aba385 PyErr_Warn is deprecated in 2.5 - goes away for 3.0
Skip Montanaro <skip@pobox.com>
parents: 42537
diff changeset
98 if (PyErr_WarnEx(PyExc_RuntimeWarning, msg, 1) < 0) \
0fcc18aba385 PyErr_Warn is deprecated in 2.5 - goes away for 3.0
Skip Montanaro <skip@pobox.com>
parents: 42537
diff changeset
99 return -1; \
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
100 } while (0)
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
101
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
102 int
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
103 PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
104 {
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
105 PyObject *oldv;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
106
58018
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
107 addr += l->offset;
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
108
60209
fa641d605468 Merged revisions 79642,79644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59580
diff changeset
109 if ((l->flags & READONLY))
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
110 {
41317
b897b77a004f Make readonly members defined in C throw an AttributeError on modification. This brings them into sync with Python-level attributes. Fixes bug #1687163.
Collin Winter <collinw@gmail.com>
parents: 40450
diff changeset
111 PyErr_SetString(PyExc_AttributeError, "readonly attribute");
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
112 return -1;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
113 }
58018
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
114 if (v == NULL) {
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
115 if (l->type == T_OBJECT_EX) {
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
116 /* Check if the attribute is set. */
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
117 if (*(PyObject **)addr == NULL) {
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
118 PyErr_SetString(PyExc_AttributeError, l->name);
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
119 return -1;
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
120 }
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
121 }
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
122 else if (l->type != T_OBJECT) {
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
123 PyErr_SetString(PyExc_TypeError,
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
124 "can't delete numeric/char attribute");
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
125 return -1;
46f4b7b5b4dd Merged revisions 77161 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
126 }
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
127 }
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
128 switch (l->type) {
44885
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
129 case T_BOOL:{
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
130 if (!PyBool_Check(v)) {
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
131 PyErr_SetString(PyExc_TypeError,
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
132 "attribute value type must be bool");
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
133 return -1;
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
134 }
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
135 if (v == Py_True)
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
136 *(char*)addr = (char) 1;
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
137 else
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
138 *(char*)addr = (char) 0;
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
139 break;
fefaa0e66fdd Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
140 }
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
141 case T_BYTE:{
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
142 long long_val = PyLong_AsLong(v);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
143 if ((long_val == -1) && PyErr_Occurred())
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
144 return -1;
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
145 *(char*)addr = (char)long_val;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
146 /* XXX: For compatibility, only warn about truncations
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
147 for now. */
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
148 if ((long_val > CHAR_MAX) || (long_val < CHAR_MIN))
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
149 WARN("Truncation of value to char");
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
150 break;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
151 }
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
152 case T_UBYTE:{
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
153 long long_val = PyLong_AsLong(v);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
154 if ((long_val == -1) && PyErr_Occurred())
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
155 return -1;
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
156 *(unsigned char*)addr = (unsigned char)long_val;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
157 if ((long_val > UCHAR_MAX) || (long_val < 0))
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
158 WARN("Truncation of value to unsigned char");
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
159 break;
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
160 }
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
161 case T_SHORT:{
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
162 long long_val = PyLong_AsLong(v);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
163 if ((long_val == -1) && PyErr_Occurred())
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
164 return -1;
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
165 *(short*)addr = (short)long_val;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
166 if ((long_val > SHRT_MAX) || (long_val < SHRT_MIN))
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
167 WARN("Truncation of value to short");
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
168 break;
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
169 }
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
170 case T_USHORT:{
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
171 long long_val = PyLong_AsLong(v);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
172 if ((long_val == -1) && PyErr_Occurred())
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
173 return -1;
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
174 *(unsigned short*)addr = (unsigned short)long_val;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
175 if ((long_val > USHRT_MAX) || (long_val < 0))
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
176 WARN("Truncation of value to unsigned short");
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
177 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
178 }
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
179 case T_INT:{
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
180 long long_val = PyLong_AsLong(v);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
181 if ((long_val == -1) && PyErr_Occurred())
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
182 return -1;
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
183 *(int *)addr = (int)long_val;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
184 if ((long_val > INT_MAX) || (long_val < INT_MIN))
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
185 WARN("Truncation of value to int");
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
186 break;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
187 }
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
188 case T_UINT:{
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
189 unsigned long ulong_val = PyLong_AsUnsignedLong(v);
59580
a7b58f1e8af0 Issue #8014: Fix incorrect error checks in structmember.c, and re-enable
Mark Dickinson <dickinsm@gmail.com>
parents: 58018
diff changeset
190 if ((ulong_val == (unsigned long)-1) && PyErr_Occurred()) {
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
191 /* XXX: For compatibility, accept negative int values
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
192 as well. */
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
193 PyErr_Clear();
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
194 ulong_val = PyLong_AsLong(v);
59580
a7b58f1e8af0 Issue #8014: Fix incorrect error checks in structmember.c, and re-enable
Mark Dickinson <dickinsm@gmail.com>
parents: 58018
diff changeset
195 if ((ulong_val == (unsigned long)-1) &&
a7b58f1e8af0 Issue #8014: Fix incorrect error checks in structmember.c, and re-enable
Mark Dickinson <dickinsm@gmail.com>
parents: 58018
diff changeset
196 PyErr_Occurred())
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
197 return -1;
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
198 *(unsigned int *)addr = (unsigned int)ulong_val;
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
199 WARN("Writing negative value into unsigned field");
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
200 } else
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
201 *(unsigned int *)addr = (unsigned int)ulong_val;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
202 if (ulong_val > UINT_MAX)
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
203 WARN("Truncation of value to unsigned int");
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
204 break;
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
205 }
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
206 case T_LONG:{
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
207 *(long*)addr = PyLong_AsLong(v);
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
208 if ((*(long*)addr == -1) && PyErr_Occurred())
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
209 return -1;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
210 break;
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
211 }
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
212 case T_ULONG:{
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
213 *(unsigned long*)addr = PyLong_AsUnsignedLong(v);
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
214 if ((*(unsigned long*)addr == (unsigned long)-1)
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
215 && PyErr_Occurred()) {
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
216 /* XXX: For compatibility, accept negative int values
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
217 as well. */
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
218 PyErr_Clear();
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
219 *(unsigned long*)addr = PyLong_AsLong(v);
59580
a7b58f1e8af0 Issue #8014: Fix incorrect error checks in structmember.c, and re-enable
Mark Dickinson <dickinsm@gmail.com>
parents: 58018
diff changeset
220 if ((*(unsigned long*)addr == (unsigned long)-1)
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
221 && PyErr_Occurred())
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
222 return -1;
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
223 WARN("Writing negative value into unsigned field");
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
224 }
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
225 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
226 }
42110
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
227 case T_PYSSIZET:{
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
228 *(Py_ssize_t*)addr = PyLong_AsSsize_t(v);
42110
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
229 if ((*(Py_ssize_t*)addr == (Py_ssize_t)-1)
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
230 && PyErr_Occurred())
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
231 return -1;
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
232 break;
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
233 }
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
234 case T_FLOAT:{
42466
3fc3cedc49ca Merged revisions 56753-56781 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42110
diff changeset
235 double double_val = PyFloat_AsDouble(v);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
236 if ((double_val == -1) && PyErr_Occurred())
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
237 return -1;
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
238 *(float*)addr = (float)double_val;
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
239 break;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
240 }
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
241 case T_DOUBLE:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
242 *(double*)addr = PyFloat_AsDouble(v);
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39536
diff changeset
243 if ((*(double*)addr == -1) && PyErr_Occurred())
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
244 return -1;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
245 break;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
246 case T_OBJECT:
21187
ef6f692c76e2 Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents: 20456
diff changeset
247 case T_OBJECT_EX:
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
248 Py_XINCREF(v);
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
249 oldv = *(PyObject **)addr;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
250 *(PyObject **)addr = v;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
251 Py_XDECREF(oldv);
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
252 break;
46644
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
253 case T_CHAR: {
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
254 char *string;
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
255 Py_ssize_t len;
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
256
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
257 if (!PyUnicode_Check(v)) {
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
258 PyErr_BadArgument();
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
259 return -1;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
260 }
48660
85b67fb5672b Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents: 46644
diff changeset
261 string = _PyUnicode_AsStringAndSize(v, &len);
46644
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
262 if (len != 1) {
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
263 PyErr_BadArgument();
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
264 return -1;
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
265 }
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
266 *(char*)addr = string[0];
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
267 break;
46644
ea594306ea85 Issue #1950: Fixed misusage of PyUnicode_AsString().
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 44885
diff changeset
268 }
60209
fa641d605468 Merged revisions 79642,79644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59580
diff changeset
269 case T_STRING:
60325
fb2d64a4d872 Merged revisions 79763 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 60209
diff changeset
270 case T_STRING_INPLACE:
60209
fa641d605468 Merged revisions 79642,79644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59580
diff changeset
271 PyErr_SetString(PyExc_TypeError, "readonly attribute");
fa641d605468 Merged revisions 79642,79644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59580
diff changeset
272 return -1;
34677
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
273 #ifdef HAVE_LONG_LONG
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
274 case T_LONGLONG:{
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
275 PY_LONG_LONG value;
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
276 *(PY_LONG_LONG*)addr = value = PyLong_AsLongLong(v);
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
277 if ((value == -1) && PyErr_Occurred())
34677
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
278 return -1;
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
279 break;
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
280 }
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
281 case T_ULONGLONG:{
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
282 unsigned PY_LONG_LONG value;
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
283 /* ??? PyLong_AsLongLong accepts an int, but PyLong_AsUnsignedLongLong
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
284 doesn't ??? */
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
285 if (PyLong_Check(v))
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
286 *(unsigned PY_LONG_LONG*)addr = value = PyLong_AsUnsignedLongLong(v);
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
287 else
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43603
diff changeset
288 *(unsigned PY_LONG_LONG*)addr = value = PyLong_AsLong(v);
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
289 if ((value == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred())
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
290 return -1;
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
291 break;
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
292 }
34677
e9ffad6d8822 Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents: 30979
diff changeset
293 #endif /* HAVE_LONG_LONG */
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
294 default:
20456
bff6c2d76f33 Put descr name in "bad memberdescr type" error message.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20012
diff changeset
295 PyErr_Format(PyExc_SystemError,
bff6c2d76f33 Put descr name in "bad memberdescr type" error message.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20012
diff changeset
296 "bad memberdescr type for %s", l->name);
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
297 return -1;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
298 }
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
299 return 0;
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19942
diff changeset
300 }