Mercurial > cpython-lru_cache-weakref
annotate Python/structmember.c @ 46634:cc66029d2efe legacy-trunk
Fix some indentation errors.
| author | Brett Cannon <bcannon@gmail.com> |
|---|---|
| date | Sat, 03 May 2008 01:02:41 +0000 |
| parents | eb4b50f739f6 |
| children | 4fe192d48960 |
| rev | line source |
|---|---|
| 145 | 1 |
| 86 | 2 /* Map C struct members to Python object attributes */ |
| 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 | 5 |
| 6 #include "structmember.h" | |
| 7 | |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
8 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
9 listmembers(struct memberlist *mlist) |
|
398
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
10 { |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
11 int i, n; |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
12 PyObject *v; |
|
398
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
13 for (n = 0; mlist[n].name != NULL; n++) |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
14 ; |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
15 v = PyList_New(n); |
|
398
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
16 if (v != NULL) { |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
17 for (i = 0; i < n; i++) |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
18 PyList_SetItem(v, i, |
|
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
19 PyString_FromString(mlist[i].name)); |
|
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
20 if (PyErr_Occurred()) { |
|
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
21 Py_DECREF(v); |
|
398
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
22 v = NULL; |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
23 } |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
24 else { |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
25 PyList_Sort(v); |
|
398
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
26 } |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
27 } |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
28 return v; |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
29 } |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
30 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
31 PyObject * |
|
36114
e9a10f74cf88
const poisoning, spreading to fix new const warnings
Tim Peters <tim.peters@gmail.com>
parents:
34677
diff
changeset
|
32 PyMember_Get(const char *addr, struct memberlist *mlist, const char *name) |
| 86 | 33 { |
| 34 struct memberlist *l; | |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
35 |
|
398
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
36 if (strcmp(name, "__members__") == 0) |
|
0ac1357cd898
Added __members__ secret attribute
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
37 return listmembers(mlist); |
| 86 | 38 for (l = mlist; l->name != NULL; l++) { |
| 39 if (strcmp(l->name, name) == 0) { | |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
40 PyMemberDef copy; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
41 copy.name = l->name; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
42 copy.type = l->type; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
43 copy.offset = l->offset; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
44 copy.flags = l->flags; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
45 copy.doc = NULL; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
46 return PyMember_GetOne(addr, ©); |
| 86 | 47 } |
| 48 } | |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
49 PyErr_SetString(PyExc_AttributeError, name); |
| 86 | 50 return NULL; |
| 51 } | |
| 52 | |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
53 PyObject * |
|
36114
e9a10f74cf88
const poisoning, spreading to fix new const warnings
Tim Peters <tim.peters@gmail.com>
parents:
34677
diff
changeset
|
54 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
|
55 { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
56 PyObject *v; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
57 if ((l->flags & READ_RESTRICTED) && |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
58 PyEval_GetRestricted()) { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
59 PyErr_SetString(PyExc_RuntimeError, "restricted attribute"); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
60 return NULL; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
61 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
62 addr += l->offset; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
63 switch (l->type) { |
|
44863
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
64 case T_BOOL: |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
65 v = PyBool_FromLong(*(char*)addr); |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
66 break; |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
67 case T_BYTE: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
68 v = PyInt_FromLong(*(char*)addr); |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
69 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
70 case T_UBYTE: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
71 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
|
72 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
73 case T_SHORT: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
74 v = PyInt_FromLong(*(short*)addr); |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
75 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
76 case T_USHORT: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
77 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
|
78 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
79 case T_INT: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
80 v = PyInt_FromLong(*(int*)addr); |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
81 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
82 case T_UINT: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
83 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
|
84 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
85 case T_LONG: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
86 v = PyInt_FromLong(*(long*)addr); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
87 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
88 case T_ULONG: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
89 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
|
90 break; |
|
42083
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
91 case T_PYSSIZET: |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
92 v = PyInt_FromSsize_t(*(Py_ssize_t*)addr); |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
93 break; |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
94 case T_FLOAT: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
95 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
|
96 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
97 case T_DOUBLE: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
98 v = PyFloat_FromDouble(*(double*)addr); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
99 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
100 case T_STRING: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
101 if (*(char**)addr == NULL) { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
102 Py_INCREF(Py_None); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
103 v = Py_None; |
|
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 else |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
106 v = PyString_FromString(*(char**)addr); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
107 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
108 case T_STRING_INPLACE: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
109 v = PyString_FromString((char*)addr); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
110 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
111 case T_CHAR: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
112 v = PyString_FromStringAndSize((char*)addr, 1); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
113 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
114 case T_OBJECT: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
115 v = *(PyObject **)addr; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
116 if (v == NULL) |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
117 v = Py_None; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
118 Py_INCREF(v); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
119 break; |
|
21187
ef6f692c76e2
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents:
20456
diff
changeset
|
120 case T_OBJECT_EX: |
|
ef6f692c76e2
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents:
20456
diff
changeset
|
121 v = *(PyObject **)addr; |
|
ef6f692c76e2
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents:
20456
diff
changeset
|
122 if (v == NULL) |
|
ef6f692c76e2
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents:
20456
diff
changeset
|
123 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
|
124 Py_XINCREF(v); |
|
ef6f692c76e2
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents:
20456
diff
changeset
|
125 break; |
|
34677
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
126 #ifdef HAVE_LONG_LONG |
|
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
127 case T_LONGLONG: |
|
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
128 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
|
129 break; |
|
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
130 case T_ULONGLONG: |
|
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
131 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
|
132 break; |
|
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
133 #endif /* HAVE_LONG_LONG */ |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
134 default: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
135 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
|
136 v = NULL; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
137 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
138 return v; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
139 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
140 |
| 86 | 141 int |
|
36114
e9a10f74cf88
const poisoning, spreading to fix new const warnings
Tim Peters <tim.peters@gmail.com>
parents:
34677
diff
changeset
|
142 PyMember_Set(char *addr, struct memberlist *mlist, const char *name, PyObject *v) |
| 86 | 143 { |
| 144 struct memberlist *l; | |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
145 |
| 86 | 146 for (l = mlist; l->name != NULL; l++) { |
| 147 if (strcmp(l->name, name) == 0) { | |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
148 PyMemberDef copy; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
149 copy.name = l->name; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
150 copy.type = l->type; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
151 copy.offset = l->offset; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
152 copy.flags = l->flags; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
153 copy.doc = NULL; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
154 return PyMember_SetOne(addr, ©, v); |
| 86 | 155 } |
| 156 } | |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
157 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
158 PyErr_SetString(PyExc_AttributeError, name); |
| 95 | 159 return -1; |
| 86 | 160 } |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
161 |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
162 #define WARN(msg) \ |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
163 do { \ |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
164 if (PyErr_Warn(PyExc_RuntimeWarning, msg) < 0) \ |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
165 return -1; \ |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
166 } while (0) |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
167 |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
168 int |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
169 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
|
170 { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
171 PyObject *oldv; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
172 |
|
30979
86fdf8fe7f17
Getting rid of all the code inside #ifdef macintosh too.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21187
diff
changeset
|
173 if ((l->flags & READONLY) || l->type == T_STRING) |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
174 { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
175 PyErr_SetString(PyExc_TypeError, "readonly attribute"); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
176 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
177 } |
|
43972
a8dd8874ff2d
Backport of the PCbuild9 directory from the py3k branch.
Christian Heimes <christian@cheimes.de>
parents:
42454
diff
changeset
|
178 if ((l->flags & PY_WRITE_RESTRICTED) && PyEval_GetRestricted()) { |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
179 PyErr_SetString(PyExc_RuntimeError, "restricted attribute"); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
180 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
181 } |
|
21187
ef6f692c76e2
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents:
20456
diff
changeset
|
182 if (v == NULL && l->type != T_OBJECT_EX && l->type != T_OBJECT) { |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
183 PyErr_SetString(PyExc_TypeError, |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
184 "can't delete numeric/char attribute"); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
185 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
186 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
187 addr += l->offset; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
188 switch (l->type) { |
|
44863
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
189 case T_BOOL:{ |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
190 if (!PyBool_Check(v)) { |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
191 PyErr_SetString(PyExc_TypeError, |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
192 "attribute value type must be bool"); |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
193 return -1; |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
194 } |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
195 if (v == Py_True) |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
196 *(char*)addr = (char) 1; |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
197 else |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
198 *(char*)addr = (char) 0; |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
199 break; |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
200 } |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
201 case T_BYTE:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
202 long long_val = PyInt_AsLong(v); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
203 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
|
204 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
205 *(char*)addr = (char)long_val; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
206 /* XXX: For compatibility, only warn about truncations |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
207 for now. */ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
208 if ((long_val > CHAR_MAX) || (long_val < CHAR_MIN)) |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
209 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
|
210 break; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
211 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
212 case T_UBYTE:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
213 long long_val = PyInt_AsLong(v); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
214 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
|
215 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
216 *(unsigned char*)addr = (unsigned char)long_val; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
217 if ((long_val > UCHAR_MAX) || (long_val < 0)) |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
218 WARN("Truncation of value to unsigned char"); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
219 break; |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
220 } |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
221 case T_SHORT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
222 long long_val = PyInt_AsLong(v); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
223 if ((long_val == -1) && PyErr_Occurred()) |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
224 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
225 *(short*)addr = (short)long_val; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
226 if ((long_val > SHRT_MAX) || (long_val < SHRT_MIN)) |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
227 WARN("Truncation of value to short"); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
228 break; |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
229 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
230 case T_USHORT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
231 long long_val = PyInt_AsLong(v); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
232 if ((long_val == -1) && PyErr_Occurred()) |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
233 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
234 *(unsigned short*)addr = (unsigned short)long_val; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
235 if ((long_val > USHRT_MAX) || (long_val < 0)) |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
236 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
|
237 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
238 } |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
239 case T_INT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
240 long long_val = PyInt_AsLong(v); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
241 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
|
242 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
243 *(int *)addr = (int)long_val; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
244 if ((long_val > INT_MAX) || (long_val < INT_MIN)) |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
245 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
|
246 break; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
247 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
248 case T_UINT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
249 unsigned long ulong_val = PyLong_AsUnsignedLong(v); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
250 if ((ulong_val == (unsigned int)-1) && PyErr_Occurred()) { |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
251 /* XXX: For compatibility, accept negative int values |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
252 as well. */ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
253 PyErr_Clear(); |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
254 ulong_val = PyLong_AsLong(v); |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
255 if ((ulong_val == (unsigned int)-1) && PyErr_Occurred()) |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
256 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
257 *(unsigned int *)addr = (unsigned int)ulong_val; |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
258 WARN("Writing negative value into unsigned field"); |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
259 } else |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
260 *(unsigned int *)addr = (unsigned int)ulong_val; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
261 if (ulong_val > UINT_MAX) |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
262 WARN("Truncation of value to unsigned int"); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
263 break; |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
264 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
265 case T_LONG:{ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
266 *(long*)addr = PyLong_AsLong(v); |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
267 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
|
268 return -1; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
269 break; |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
270 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
271 case T_ULONG:{ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
272 *(unsigned long*)addr = PyLong_AsUnsignedLong(v); |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
273 if ((*(unsigned long*)addr == (unsigned long)-1) |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
274 && PyErr_Occurred()) { |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
275 /* XXX: For compatibility, accept negative int values |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
276 as well. */ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
277 PyErr_Clear(); |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
278 *(unsigned long*)addr = PyLong_AsLong(v); |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
279 if ((*(unsigned long*)addr == (unsigned int)-1) |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
280 && PyErr_Occurred()) |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
281 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
282 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
|
283 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
284 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
285 } |
|
42083
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
286 case T_PYSSIZET:{ |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
287 *(Py_ssize_t*)addr = PyInt_AsSsize_t(v); |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
288 if ((*(Py_ssize_t*)addr == (Py_ssize_t)-1) |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
289 && PyErr_Occurred()) |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
290 return -1; |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
291 break; |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
292 } |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
293 case T_FLOAT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
294 double double_val = PyFloat_AsDouble(v); |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
295 if ((double_val == -1) && PyErr_Occurred()) |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
296 return -1; |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
297 *(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
|
298 break; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
299 } |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
300 case T_DOUBLE: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
301 *(double*)addr = PyFloat_AsDouble(v); |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
302 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
|
303 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
304 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
305 case T_OBJECT: |
|
21187
ef6f692c76e2
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents:
20456
diff
changeset
|
306 case T_OBJECT_EX: |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
307 Py_XINCREF(v); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
308 oldv = *(PyObject **)addr; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
309 *(PyObject **)addr = v; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
310 Py_XDECREF(oldv); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
311 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
312 case T_CHAR: |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
313 if (PyString_Check(v) && PyString_Size(v) == 1) { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
314 *(char*)addr = PyString_AsString(v)[0]; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
315 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
316 else { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
317 PyErr_BadArgument(); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
318 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
319 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
320 break; |
|
34677
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
321 #ifdef HAVE_LONG_LONG |
|
42007
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
322 case T_LONGLONG:{ |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
323 PY_LONG_LONG value; |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
324 *(PY_LONG_LONG*)addr = value = PyLong_AsLongLong(v); |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
325 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
|
326 return -1; |
|
42007
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
327 break; |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
328 } |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
329 case T_ULONGLONG:{ |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
330 unsigned PY_LONG_LONG value; |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
331 /* ??? PyLong_AsLongLong accepts an int, but PyLong_AsUnsignedLongLong |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
332 doesn't ??? */ |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
333 if (PyLong_Check(v)) |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
334 *(unsigned PY_LONG_LONG*)addr = value = PyLong_AsUnsignedLongLong(v); |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
335 else |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
336 *(unsigned PY_LONG_LONG*)addr = value = PyInt_AsLong(v); |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
337 if ((value == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred()) |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
338 return -1; |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
339 break; |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
340 } |
|
34677
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
341 #endif /* HAVE_LONG_LONG */ |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
342 default: |
|
20456
bff6c2d76f33
Put descr name in "bad memberdescr type" error message.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20012
diff
changeset
|
343 PyErr_Format(PyExc_SystemError, |
|
bff6c2d76f33
Put descr name in "bad memberdescr type" error message.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20012
diff
changeset
|
344 "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
|
345 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
346 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
347 return 0; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
348 } |
