mirror of
https://github.com/python/cpython.git
synced 2025-11-01 18:51:43 +00:00
"Compiling" version
This commit is contained in:
parent
226d79eb4a
commit
3f5da24ea3
72 changed files with 3363 additions and 2061 deletions
134
Python/structmember.c
Normal file
134
Python/structmember.c
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
/* Map C struct members to Python object attributes */
|
||||
|
||||
#include "allobjects.h"
|
||||
|
||||
#include "structmember.h"
|
||||
|
||||
object *
|
||||
getmember(addr, mlist, name)
|
||||
char *addr;
|
||||
struct memberlist *mlist;
|
||||
char *name;
|
||||
{
|
||||
struct memberlist *l;
|
||||
|
||||
for (l = mlist; l->name != NULL; l++) {
|
||||
if (strcmp(l->name, name) == 0) {
|
||||
object *v;
|
||||
addr += l->offset;
|
||||
switch (l->type) {
|
||||
case T_SHORT:
|
||||
v = newintobject((long) *(short*)addr);
|
||||
break;
|
||||
case T_INT:
|
||||
v = newintobject((long) *(int*)addr);
|
||||
break;
|
||||
case T_LONG:
|
||||
v = newintobject(*(long*)addr);
|
||||
break;
|
||||
case T_FLOAT:
|
||||
v = newfloatobject((double)*(float*)addr);
|
||||
break;
|
||||
case T_DOUBLE:
|
||||
v = newfloatobject(*(double*)addr);
|
||||
break;
|
||||
case T_STRING:
|
||||
if (*(char**)addr == NULL) {
|
||||
INCREF(None);
|
||||
v = None;
|
||||
}
|
||||
else
|
||||
v = newstringobject(*(char**)addr);
|
||||
break;
|
||||
case T_OBJECT:
|
||||
v = *(object **)addr;
|
||||
if (v == NULL)
|
||||
v = None;
|
||||
INCREF(v);
|
||||
break;
|
||||
default:
|
||||
err_setstr(SystemError, "bad memberlist type");
|
||||
v = NULL;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
err_setstr(NameError, name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
setmember(addr, mlist, name, v)
|
||||
char *addr;
|
||||
struct memberlist *mlist;
|
||||
char *name;
|
||||
object *v;
|
||||
{
|
||||
struct memberlist *l;
|
||||
|
||||
for (l = mlist; l->name != NULL; l++) {
|
||||
if (strcmp(l->name, name) == 0) {
|
||||
if (l->readonly || l->type == T_STRING) {
|
||||
err_setstr(RuntimeError, "readonly attribute");
|
||||
return -1;
|
||||
}
|
||||
addr += l->offset;
|
||||
switch (l->type) {
|
||||
case T_SHORT:
|
||||
if (!is_intobject(v)) {
|
||||
err_badarg();
|
||||
return -1;
|
||||
}
|
||||
*(short*)addr = getintvalue(v);
|
||||
break;
|
||||
case T_INT:
|
||||
if (!is_intobject(v)) {
|
||||
err_badarg();
|
||||
return -1;
|
||||
}
|
||||
*(int*)addr = getintvalue(v);
|
||||
break;
|
||||
case T_LONG:
|
||||
if (!is_intobject(v)) {
|
||||
err_badarg();
|
||||
return -1;
|
||||
}
|
||||
*(long*)addr = getintvalue(v);
|
||||
break;
|
||||
case T_FLOAT:
|
||||
if (is_intobject(v))
|
||||
*(float*)addr = getintvalue(v);
|
||||
else if (is_floatobject(v))
|
||||
*(float*)addr = getfloatvalue(v);
|
||||
else {
|
||||
err_badarg();
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case T_DOUBLE:
|
||||
if (is_intobject(v))
|
||||
*(double*)addr = getintvalue(v);
|
||||
else if (is_floatobject(v))
|
||||
*(double*)addr = getfloatvalue(v);
|
||||
else {
|
||||
err_badarg();
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case T_OBJECT:
|
||||
XDECREF(*(object **)addr);
|
||||
XINCREF(v);
|
||||
*(object **)addr = v;
|
||||
break;
|
||||
default:
|
||||
err_setstr(SystemError, "bad memberlist type");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
err_setstr(NameError, name);
|
||||
return NULL;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue