]>
git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/Python-2.7.10/Python/structmember.c
2 /* Map C struct members to Python object attributes */
6 #include "structmember.h"
9 listmembers(struct memberlist
*mlist
)
13 for (n
= 0; mlist
[n
].name
!= NULL
; n
++)
17 for (i
= 0; i
< n
; i
++)
19 PyString_FromString(mlist
[i
].name
));
20 if (PyErr_Occurred()) {
32 PyMember_Get(const char *addr
, struct memberlist
*mlist
, const char *name
)
36 if (strcmp(name
, "__members__") == 0)
37 return listmembers(mlist
);
38 for (l
= mlist
; l
->name
!= NULL
; l
++) {
39 if (strcmp(l
->name
, name
) == 0) {
43 copy
.offset
= l
->offset
;
44 copy
.flags
= l
->flags
;
46 return PyMember_GetOne(addr
, ©
);
49 PyErr_SetString(PyExc_AttributeError
, name
);
54 PyMember_GetOne(const char *addr
, PyMemberDef
*l
)
57 if ((l
->flags
& READ_RESTRICTED
) &&
58 PyEval_GetRestricted()) {
59 PyErr_SetString(PyExc_RuntimeError
, "restricted attribute");
65 v
= PyBool_FromLong(*(char*)addr
);
68 v
= PyInt_FromLong(*(char*)addr
);
71 v
= PyLong_FromUnsignedLong(*(unsigned char*)addr
);
74 v
= PyInt_FromLong(*(short*)addr
);
77 v
= PyLong_FromUnsignedLong(*(unsigned short*)addr
);
80 v
= PyInt_FromLong(*(int*)addr
);
83 v
= PyLong_FromUnsignedLong(*(unsigned int*)addr
);
86 v
= PyInt_FromLong(*(long*)addr
);
89 v
= PyLong_FromUnsignedLong(*(unsigned long*)addr
);
92 v
= PyInt_FromSsize_t(*(Py_ssize_t
*)addr
);
95 v
= PyFloat_FromDouble((double)*(float*)addr
);
98 v
= PyFloat_FromDouble(*(double*)addr
);
101 if (*(char**)addr
== NULL
) {
106 v
= PyString_FromString(*(char**)addr
);
108 case T_STRING_INPLACE
:
109 v
= PyString_FromString((char*)addr
);
112 v
= PyString_FromStringAndSize((char*)addr
, 1);
115 v
= *(PyObject
**)addr
;
121 v
= *(PyObject
**)addr
;
123 PyErr_SetString(PyExc_AttributeError
, l
->name
);
126 #ifdef HAVE_LONG_LONG
128 v
= PyLong_FromLongLong(*(PY_LONG_LONG
*)addr
);
131 v
= PyLong_FromUnsignedLongLong(*(unsigned PY_LONG_LONG
*)addr
);
133 #endif /* HAVE_LONG_LONG */
135 PyErr_SetString(PyExc_SystemError
, "bad memberdescr type");
142 PyMember_Set(char *addr
, struct memberlist
*mlist
, const char *name
, PyObject
*v
)
144 struct memberlist
*l
;
146 for (l
= mlist
; l
->name
!= NULL
; l
++) {
147 if (strcmp(l
->name
, name
) == 0) {
151 copy
.offset
= l
->offset
;
152 copy
.flags
= l
->flags
;
154 return PyMember_SetOne(addr
, ©
, v
);
158 PyErr_SetString(PyExc_AttributeError
, name
);
164 if (PyErr_Warn(PyExc_RuntimeWarning, msg) < 0) \
169 PyMember_SetOne(char *addr
, PyMemberDef
*l
, PyObject
*v
)
175 if ((l
->flags
& READONLY
))
177 PyErr_SetString(PyExc_TypeError
, "readonly attribute");
180 if ((l
->flags
& PY_WRITE_RESTRICTED
) && PyEval_GetRestricted()) {
181 PyErr_SetString(PyExc_RuntimeError
, "restricted attribute");
185 if (l
->type
== T_OBJECT_EX
) {
186 /* Check if the attribute is set. */
187 if (*(PyObject
**)addr
== NULL
) {
188 PyErr_SetString(PyExc_AttributeError
, l
->name
);
192 else if (l
->type
!= T_OBJECT
) {
193 PyErr_SetString(PyExc_TypeError
,
194 "can't delete numeric/char attribute");
200 if (!PyBool_Check(v
)) {
201 PyErr_SetString(PyExc_TypeError
,
202 "attribute value type must be bool");
206 *(char*)addr
= (char) 1;
208 *(char*)addr
= (char) 0;
212 long long_val
= PyInt_AsLong(v
);
213 if ((long_val
== -1) && PyErr_Occurred())
215 *(char*)addr
= (char)long_val
;
216 /* XXX: For compatibility, only warn about truncations
218 if ((long_val
> CHAR_MAX
) || (long_val
< CHAR_MIN
))
219 WARN("Truncation of value to char");
223 long long_val
= PyInt_AsLong(v
);
224 if ((long_val
== -1) && PyErr_Occurred())
226 *(unsigned char*)addr
= (unsigned char)long_val
;
227 if ((long_val
> UCHAR_MAX
) || (long_val
< 0))
228 WARN("Truncation of value to unsigned char");
232 long long_val
= PyInt_AsLong(v
);
233 if ((long_val
== -1) && PyErr_Occurred())
235 *(short*)addr
= (short)long_val
;
236 if ((long_val
> SHRT_MAX
) || (long_val
< SHRT_MIN
))
237 WARN("Truncation of value to short");
241 long long_val
= PyInt_AsLong(v
);
242 if ((long_val
== -1) && PyErr_Occurred())
244 *(unsigned short*)addr
= (unsigned short)long_val
;
245 if ((long_val
> USHRT_MAX
) || (long_val
< 0))
246 WARN("Truncation of value to unsigned short");
250 long long_val
= PyInt_AsLong(v
);
251 if ((long_val
== -1) && PyErr_Occurred())
253 *(int *)addr
= (int)long_val
;
254 if ((long_val
> INT_MAX
) || (long_val
< INT_MIN
))
255 WARN("Truncation of value to int");
259 unsigned long ulong_val
= PyLong_AsUnsignedLong(v
);
260 if ((ulong_val
== (unsigned long)-1) && PyErr_Occurred()) {
261 /* XXX: For compatibility, accept negative int values
264 ulong_val
= PyLong_AsLong(v
);
265 if ((ulong_val
== (unsigned long)-1) &&
268 *(unsigned int *)addr
= (unsigned int)ulong_val
;
269 WARN("Writing negative value into unsigned field");
271 *(unsigned int *)addr
= (unsigned int)ulong_val
;
272 if (ulong_val
> UINT_MAX
)
273 WARN("Truncation of value to unsigned int");
277 *(long*)addr
= PyLong_AsLong(v
);
278 if ((*(long*)addr
== -1) && PyErr_Occurred())
283 *(unsigned long*)addr
= PyLong_AsUnsignedLong(v
);
284 if ((*(unsigned long*)addr
== (unsigned long)-1)
285 && PyErr_Occurred()) {
286 /* XXX: For compatibility, accept negative int values
289 *(unsigned long*)addr
= PyLong_AsLong(v
);
290 if ((*(unsigned long*)addr
== (unsigned long)-1)
293 WARN("Writing negative value into unsigned field");
298 *(Py_ssize_t
*)addr
= PyInt_AsSsize_t(v
);
299 if ((*(Py_ssize_t
*)addr
== (Py_ssize_t
)-1)
305 double double_val
= PyFloat_AsDouble(v
);
306 if ((double_val
== -1) && PyErr_Occurred())
308 *(float*)addr
= (float)double_val
;
312 *(double*)addr
= PyFloat_AsDouble(v
);
313 if ((*(double*)addr
== -1) && PyErr_Occurred())
319 oldv
= *(PyObject
**)addr
;
320 *(PyObject
**)addr
= v
;
324 if (PyString_Check(v
) && PyString_Size(v
) == 1) {
325 *(char*)addr
= PyString_AsString(v
)[0];
333 case T_STRING_INPLACE
:
334 PyErr_SetString(PyExc_TypeError
, "readonly attribute");
336 #ifdef HAVE_LONG_LONG
339 *(PY_LONG_LONG
*)addr
= value
= PyLong_AsLongLong(v
);
340 if ((value
== -1) && PyErr_Occurred())
345 unsigned PY_LONG_LONG value
;
346 /* ??? PyLong_AsLongLong accepts an int, but PyLong_AsUnsignedLongLong
349 *(unsigned PY_LONG_LONG
*)addr
= value
= PyLong_AsUnsignedLongLong(v
);
351 *(unsigned PY_LONG_LONG
*)addr
= value
= PyInt_AsLong(v
);
352 if ((value
== (unsigned PY_LONG_LONG
)-1) && PyErr_Occurred())
356 #endif /* HAVE_LONG_LONG */
358 PyErr_Format(PyExc_SystemError
,
359 "bad memberdescr type for %s", l
->name
);