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;