Mercurial > cpython-lru_cache-weakref
annotate Python/structmember.c @ 58707:76cf60e2d005 legacy-trunk
normalize exceptions passed to the __exit__ method #7853
In Python 2.x, exceptions in finally blocks are not normalized. Since with
statements are implemented using finally blocks, ceval.c had to be tweaked to
distinguish between with finally blocks and normal ones.
A test for the finalization of generators containing with statements was also
added.
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Fri, 05 Feb 2010 02:12:14 +0000 |
| parents | 96a2371b114b |
| children | 66b60a6e8198 e808fc548cd6 |
| 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, |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
19 PyString_FromString(mlist[i].name)); |
|
5373
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 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
106 v = PyString_FromString(*(char**)addr); |
|
20012
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: |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
109 v = PyString_FromString((char*)addr); |
|
20012
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: |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
112 v = PyString_FromStringAndSize((char*)addr, 1); |
|
20012
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 |
|
58015
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
173 addr += l->offset; |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
174 |
|
30979
86fdf8fe7f17
Getting rid of all the code inside #ifdef macintosh too.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21187
diff
changeset
|
175 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
|
176 { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
177 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
|
178 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
179 } |
|
43972
a8dd8874ff2d
Backport of the PCbuild9 directory from the py3k branch.
Christian Heimes <christian@cheimes.de>
parents:
42454
diff
changeset
|
180 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
|
181 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
|
182 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
183 } |
|
58015
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
184 if (v == NULL) { |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
185 if (l->type == T_OBJECT_EX) { |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
186 /* Check if the attribute is set. */ |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
187 if (*(PyObject **)addr == NULL) { |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
188 PyErr_SetString(PyExc_AttributeError, l->name); |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
189 return -1; |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
190 } |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
191 } |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
192 else if (l->type != T_OBJECT) { |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
193 PyErr_SetString(PyExc_TypeError, |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
194 "can't delete numeric/char attribute"); |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
195 return -1; |
|
96a2371b114b
Merged revisions 77157 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
47527
diff
changeset
|
196 } |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
197 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
198 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
|
199 case T_BOOL:{ |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
200 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
|
201 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
|
202 "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
|
203 return -1; |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
204 } |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
205 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
|
206 *(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
|
207 else |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
208 *(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
|
209 break; |
|
eb4b50f739f6
Patch #1720595: add T_BOOL to the range of structmember types.
Georg Brandl <georg@python.org>
parents:
43972
diff
changeset
|
210 } |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
211 case T_BYTE:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
212 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
|
213 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
|
214 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
215 *(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
|
216 /* 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
|
217 for now. */ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
218 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
|
219 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
|
220 break; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
221 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
222 case T_UBYTE:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
223 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
|
224 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
|
225 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
226 *(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
|
227 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
|
228 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
|
229 break; |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
230 } |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
231 case T_SHORT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
232 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
|
233 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
|
234 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
235 *(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
|
236 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
|
237 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
|
238 break; |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
239 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
240 case T_USHORT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
241 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
|
242 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
|
243 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
244 *(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
|
245 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
|
246 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
|
247 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
248 } |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
249 case T_INT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
250 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
|
251 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
|
252 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
253 *(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
|
254 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
|
255 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
|
256 break; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
257 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
258 case T_UINT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
259 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
|
260 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
|
261 /* 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
|
262 as well. */ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
263 PyErr_Clear(); |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
264 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
|
265 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
|
266 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
267 *(unsigned int *)addr = (unsigned int)ulong_val; |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
268 WARN("Writing negative value into unsigned field"); |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
269 } else |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
270 *(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
|
271 if (ulong_val > UINT_MAX) |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
272 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
|
273 break; |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
274 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
275 case T_LONG:{ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
276 *(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
|
277 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
|
278 return -1; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
279 break; |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
280 } |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
281 case T_ULONG:{ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
282 *(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
|
283 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
|
284 && PyErr_Occurred()) { |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
285 /* 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
|
286 as well. */ |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
287 PyErr_Clear(); |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
288 *(unsigned long*)addr = PyLong_AsLong(v); |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
289 if ((*(unsigned long*)addr == (unsigned int)-1) |
|
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
290 && PyErr_Occurred()) |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
291 return -1; |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
292 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
|
293 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
294 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
295 } |
|
42083
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
296 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
|
297 *(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
|
298 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
|
299 && PyErr_Occurred()) |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
300 return -1; |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
301 break; |
|
37189e375ec7
Add T_PYSSIZET in structmember.h: This can be used for
Walter Dörwald <walter@livinglogic.de>
parents:
42007
diff
changeset
|
302 } |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
303 case T_FLOAT:{ |
|
42454
648577cc688a
Handle errors when generating a warning.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42083
diff
changeset
|
304 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
|
305 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
|
306 return -1; |
|
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
307 *(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
|
308 break; |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
309 } |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
310 case T_DOUBLE: |
|
40176
0c1cb92dac97
Patch #1549049: Rewrite type conversion in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
38024
diff
changeset
|
311 *(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
|
312 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
|
313 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
314 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
315 case T_OBJECT: |
|
21187
ef6f692c76e2
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
Guido van Rossum <guido@python.org>
parents:
20456
diff
changeset
|
316 case T_OBJECT_EX: |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
317 Py_XINCREF(v); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
318 oldv = *(PyObject **)addr; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
319 *(PyObject **)addr = v; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
320 Py_XDECREF(oldv); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
321 break; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
322 case T_CHAR: |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
323 if (PyString_Check(v) && PyString_Size(v) == 1) { |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
324 *(char*)addr = PyString_AsString(v)[0]; |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
325 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
326 else { |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
327 PyErr_BadArgument(); |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
328 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
329 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
330 break; |
|
34677
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
331 #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
|
332 case T_LONGLONG:{ |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
333 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
|
334 *(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
|
335 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
|
336 return -1; |
|
42007
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
337 break; |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
338 } |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
339 case T_ULONGLONG:{ |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
340 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
|
341 /* ??? 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
|
342 doesn't ??? */ |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
343 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
|
344 *(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
|
345 else |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
346 *(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
|
347 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
|
348 return -1; |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
349 break; |
|
e8413971212d
Patch #1733960: Allow T_LONGLONG to accept ints.
Martin v. Löwis <martin@v.loewis.de>
parents:
40176
diff
changeset
|
350 } |
|
34677
e9ffad6d8822
Patch #1115086: support PY_LONGLONG in structmember.
Martin v. Löwis <martin@v.loewis.de>
parents:
30979
diff
changeset
|
351 #endif /* HAVE_LONG_LONG */ |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
352 default: |
|
20456
bff6c2d76f33
Put descr name in "bad memberdescr type" error message.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20012
diff
changeset
|
353 PyErr_Format(PyExc_SystemError, |
|
bff6c2d76f33
Put descr name in "bad memberdescr type" error message.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20012
diff
changeset
|
354 "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
|
355 return -1; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
356 } |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
357 return 0; |
|
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19942
diff
changeset
|
358 } |
