Mercurial > cpython-lru_cache-weakref
comparison Python/structmember.c @ 888:dd7dfad404cd legacy-trunk
Added new types to setattr() as well...
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 03 Jun 1992 17:07:23 +0000 |
| parents | 0cd197947d81 |
| children | 1cabc2b6c970 |
comparison
equal
deleted
inserted
replaced
| 887:16a195354b2b | 888:dd7dfad404cd |
|---|---|
| 64 for (l = mlist; l->name != NULL; l++) { | 64 for (l = mlist; l->name != NULL; l++) { |
| 65 if (strcmp(l->name, name) == 0) { | 65 if (strcmp(l->name, name) == 0) { |
| 66 object *v; | 66 object *v; |
| 67 addr += l->offset; | 67 addr += l->offset; |
| 68 switch (l->type) { | 68 switch (l->type) { |
| 69 case T_BYTE: | |
| 70 v = newintobject((long) | |
| 71 (((*(char*)addr & 0xff) | |
| 72 ^ 0x80) - 0x80)); | |
| 73 break; | |
| 74 case T_UBYTE: | |
| 75 v = newintobject((long) *(char*)addr & 0xff); | |
| 76 break; | |
| 69 case T_SHORT: | 77 case T_SHORT: |
| 70 v = newintobject((long) *(short*)addr); | 78 v = newintobject((long) *(short*)addr); |
| 71 break; | 79 break; |
| 80 case T_USHORT: | |
| 81 v = newintobject((long) | |
| 82 *(unsigned short*)addr); | |
| 83 break; | |
| 72 case T_INT: | 84 case T_INT: |
| 73 v = newintobject((long) *(int*)addr); | 85 v = newintobject((long) *(int*)addr); |
| 74 break; | 86 break; |
| 87 case T_UINT: | |
| 88 v = newintobject((long) *(unsigned int*)addr); | |
| 89 break; | |
| 75 case T_LONG: | 90 case T_LONG: |
| 76 v = newintobject(*(long*)addr); | 91 v = newintobject(*(long*)addr); |
| 92 break; | |
| 93 case T_ULONG: | |
| 94 v = dnewlongobject((double) | |
| 95 *(unsigned long*)addr); | |
| 77 break; | 96 break; |
| 78 case T_FLOAT: | 97 case T_FLOAT: |
| 79 v = newfloatobject((double)*(float*)addr); | 98 v = newfloatobject((double)*(float*)addr); |
| 80 break; | 99 break; |
| 81 case T_DOUBLE: | 100 case T_DOUBLE: |
| 86 INCREF(None); | 105 INCREF(None); |
| 87 v = None; | 106 v = None; |
| 88 } | 107 } |
| 89 else | 108 else |
| 90 v = newstringobject(*(char**)addr); | 109 v = newstringobject(*(char**)addr); |
| 110 break; | |
| 111 case T_CHAR: | |
| 112 v = newsizedstringobject((char*)addr, 1); | |
| 91 break; | 113 break; |
| 92 case T_OBJECT: | 114 case T_OBJECT: |
| 93 v = *(object **)addr; | 115 v = *(object **)addr; |
| 94 if (v == NULL) | 116 if (v == NULL) |
| 95 v = None; | 117 v = None; |
| 122 err_setstr(TypeError, "readonly attribute"); | 144 err_setstr(TypeError, "readonly attribute"); |
| 123 return -1; | 145 return -1; |
| 124 } | 146 } |
| 125 addr += l->offset; | 147 addr += l->offset; |
| 126 switch (l->type) { | 148 switch (l->type) { |
| 149 case T_BYTE: | |
| 150 case T_UBYTE: | |
| 151 if (!is_intobject(v)) { | |
| 152 err_badarg(); | |
| 153 return -1; | |
| 154 } | |
| 155 *(char*)addr = getintvalue(v); | |
| 156 break; | |
| 127 case T_SHORT: | 157 case T_SHORT: |
| 158 case T_USHORT: | |
| 128 if (!is_intobject(v)) { | 159 if (!is_intobject(v)) { |
| 129 err_badarg(); | 160 err_badarg(); |
| 130 return -1; | 161 return -1; |
| 131 } | 162 } |
| 132 *(short*)addr = getintvalue(v); | 163 *(short*)addr = getintvalue(v); |
| 133 break; | 164 break; |
| 165 case T_UINT: | |
| 134 case T_INT: | 166 case T_INT: |
| 135 if (!is_intobject(v)) { | 167 if (!is_intobject(v)) { |
| 136 err_badarg(); | 168 err_badarg(); |
| 137 return -1; | 169 return -1; |
| 138 } | 170 } |
| 142 if (!is_intobject(v)) { | 174 if (!is_intobject(v)) { |
| 143 err_badarg(); | 175 err_badarg(); |
| 144 return -1; | 176 return -1; |
| 145 } | 177 } |
| 146 *(long*)addr = getintvalue(v); | 178 *(long*)addr = getintvalue(v); |
| 179 break; | |
| 180 case T_ULONG: | |
| 181 if (is_intobject(v)) | |
| 182 *(long*)addr = getintvalue(v); | |
| 183 else if (is_longobject(v)) | |
| 184 *(long*)addr = getlongvalue(v); | |
| 185 else { | |
| 186 err_badarg(); | |
| 187 return -1; | |
| 188 } | |
| 147 break; | 189 break; |
| 148 case T_FLOAT: | 190 case T_FLOAT: |
| 149 if (is_intobject(v)) | 191 if (is_intobject(v)) |
| 150 *(float*)addr = getintvalue(v); | 192 *(float*)addr = getintvalue(v); |
| 151 else if (is_floatobject(v)) | 193 else if (is_floatobject(v)) |
| 168 case T_OBJECT: | 210 case T_OBJECT: |
| 169 XDECREF(*(object **)addr); | 211 XDECREF(*(object **)addr); |
| 170 XINCREF(v); | 212 XINCREF(v); |
| 171 *(object **)addr = v; | 213 *(object **)addr = v; |
| 172 break; | 214 break; |
| 215 case T_CHAR: | |
| 216 if (is_stringobject(v) && | |
| 217 getstringsize(v) == 1) { | |
| 218 *(char*)addr = | |
| 219 getstringvalue(v)[0]; | |
| 220 } | |
| 221 else { | |
| 222 err_badarg(); | |
| 223 return -1; | |
| 224 } | |
| 173 default: | 225 default: |
| 174 err_setstr(SystemError, "bad memberlist type"); | 226 err_setstr(SystemError, "bad memberlist type"); |
| 175 return -1; | 227 return -1; |
| 176 } | 228 } |
| 177 return 0; | 229 return 0; |
