Mercurial > emacs
comparison src/alloc.c @ 10004:2c57cb7eba5f
(Fpurecopy): Use type test macros.
| author | Karl Heuer <kwzh@gnu.org> |
|---|---|
| date | Fri, 18 Nov 1994 02:31:20 +0000 |
| parents | 943a61c764a5 |
| children | 82f3daf76995 |
comparison
equal
deleted
inserted
replaced
| 10003:c5a44b9c6565 | 10004:2c57cb7eba5f |
|---|---|
| 1125 Recursively copies contents of vectors and cons cells.\n\ | 1125 Recursively copies contents of vectors and cons cells.\n\ |
| 1126 Does not copy symbols.") | 1126 Does not copy symbols.") |
| 1127 (obj) | 1127 (obj) |
| 1128 register Lisp_Object obj; | 1128 register Lisp_Object obj; |
| 1129 { | 1129 { |
| 1130 register Lisp_Object new, tem; | |
| 1131 register int i; | |
| 1132 | |
| 1133 if (NILP (Vpurify_flag)) | 1130 if (NILP (Vpurify_flag)) |
| 1134 return obj; | 1131 return obj; |
| 1135 | 1132 |
| 1136 if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE) | 1133 if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE) |
| 1137 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) | 1134 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) |
| 1138 return obj; | 1135 return obj; |
| 1139 | 1136 |
| 1140 #ifdef SWITCH_ENUM_BUG | 1137 if (CONSP (obj)) |
| 1141 switch ((int) XTYPE (obj)) | 1138 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr); |
| 1142 #else | |
| 1143 switch (XTYPE (obj)) | |
| 1144 #endif | |
| 1145 { | |
| 1146 case Lisp_Misc: | |
| 1147 switch (XMISC (obj)->type) | |
| 1148 { | |
| 1149 case Lisp_Misc_Marker: | |
| 1150 error ("Attempt to copy a marker to pure storage"); | |
| 1151 | |
| 1152 default: | |
| 1153 abort (); | |
| 1154 } | |
| 1155 | |
| 1156 case Lisp_Cons: | |
| 1157 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr); | |
| 1158 | |
| 1159 #ifdef LISP_FLOAT_TYPE | 1139 #ifdef LISP_FLOAT_TYPE |
| 1160 case Lisp_Float: | 1140 else if (FLOATP (obj)) |
| 1161 return make_pure_float (XFLOAT (obj)->data); | 1141 return make_pure_float (XFLOAT (obj)->data); |
| 1162 #endif /* LISP_FLOAT_TYPE */ | 1142 #endif /* LISP_FLOAT_TYPE */ |
| 1163 | 1143 else if (STRINGP (obj)) |
| 1164 case Lisp_String: | 1144 return make_pure_string (XSTRING (obj)->data, XSTRING (obj)->size); |
| 1165 return make_pure_string (XSTRING (obj)->data, XSTRING (obj)->size); | 1145 else if (COMPILEDP (obj) || VECTORP (obj)) |
| 1166 | 1146 { |
| 1167 case Lisp_Compiled: | 1147 register struct Lisp_Vector *vec; |
| 1168 case Lisp_Vector: | 1148 register int i, size; |
| 1169 new = make_pure_vector (XVECTOR (obj)->size); | 1149 |
| 1170 for (i = 0; i < XVECTOR (obj)->size; i++) | 1150 size = XVECTOR (obj)->size; |
| 1171 { | 1151 vec = XVECTOR (make_pure_vector (size)); |
| 1172 tem = XVECTOR (obj)->contents[i]; | 1152 for (i = 0; i < size; i++) |
| 1173 XVECTOR (new)->contents[i] = Fpurecopy (tem); | 1153 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]); |
| 1174 } | 1154 if (COMPILEDP (obj)) |
| 1175 XSETTYPE (new, XTYPE (obj)); | 1155 XSETCOMPILED (obj, vec); |
| 1176 return new; | 1156 else |
| 1177 | 1157 XSETVECTOR (obj, vec); |
| 1178 default: | |
| 1179 return obj; | 1158 return obj; |
| 1180 } | 1159 } |
| 1160 else if (MARKERP (obj)) | |
| 1161 error ("Attempt to copy a marker to pure storage"); | |
| 1162 else | |
| 1163 return obj; | |
| 1181 } | 1164 } |
| 1182 | 1165 |
| 1183 /* Recording what needs to be marked for gc. */ | 1166 /* Recording what needs to be marked for gc. */ |
| 1184 | 1167 |
| 1185 struct gcpro *gcprolist; | 1168 struct gcpro *gcprolist; |
