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;