Mercurial > hg > xemacs-beta
comparison src/alloc.c @ 243:f220cc83d72e r20-5b20
Import from CVS: tag r20-5b20
| author | cvs |
|---|---|
| date | Mon, 13 Aug 2007 10:17:07 +0200 |
| parents | 52952cbfc5b5 |
| children | 51092a27c943 |
comparison
equal
deleted
inserted
replaced
| 242:fc816b73a05f | 243:f220cc83d72e |
|---|---|
| 502 /* lrecords are chained together through their "next.v" field. | 502 /* lrecords are chained together through their "next.v" field. |
| 503 * After doing the mark phase, the GC will walk this linked | 503 * After doing the mark phase, the GC will walk this linked |
| 504 * list and free any record which hasn't been marked | 504 * list and free any record which hasn't been marked |
| 505 */ | 505 */ |
| 506 static struct lcrecord_header *all_lcrecords; | 506 static struct lcrecord_header *all_lcrecords; |
| 507 | |
| 508 int lrecord_type_index (CONST struct lrecord_implementation *implementation); | |
| 509 | 507 |
| 510 void * | 508 void * |
| 511 alloc_lcrecord (int size, CONST struct lrecord_implementation *implementation) | 509 alloc_lcrecord (int size, CONST struct lrecord_implementation *implementation) |
| 512 { | 510 { |
| 513 struct lcrecord_header *lcheader; | 511 struct lcrecord_header *lcheader; |
| 992 /* conses are used and freed so often that we set this really high */ | 990 /* conses are used and freed so often that we set this really high */ |
| 993 /* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 20000 */ | 991 /* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 20000 */ |
| 994 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 2000 | 992 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 2000 |
| 995 | 993 |
| 996 #ifdef LRECORD_CONS | 994 #ifdef LRECORD_CONS |
| 997 static Lisp_Object mark_cons (Lisp_Object, void (*) (Lisp_Object)); | 995 static Lisp_Object |
| 998 static int cons_equal(Lisp_Object, Lisp_Object, int); | 996 mark_cons (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
| 999 extern void print_cons (Lisp_Object, Lisp_Object, int); | 997 { |
| 998 if (NILP (XCDR (obj))) | |
| 999 return XCAR (obj); | |
| 1000 else | |
| 1001 (markobj) (XCAR (obj)); | |
| 1002 return XCDR (obj); | |
| 1003 } | |
| 1004 | |
| 1005 static int | |
| 1006 cons_equal (Lisp_Object ob1, Lisp_Object ob2, int depth) | |
| 1007 { | |
| 1008 while (internal_equal (XCAR (ob1), XCAR (ob2), depth + 1)) | |
| 1009 { | |
| 1010 ob1 = XCDR(ob1); | |
| 1011 ob2 = XCDR(ob2); | |
| 1012 if (! CONSP (ob1) || ! CONSP (ob2)) | |
| 1013 return internal_equal (ob1, ob2, depth + 1); | |
| 1014 } | |
| 1015 return 0; | |
| 1016 } | |
| 1017 | |
| 1000 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("cons", cons, | 1018 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("cons", cons, |
| 1001 mark_cons, print_cons, 0, | 1019 mark_cons, print_cons, 0, |
| 1002 cons_equal, | 1020 cons_equal, |
| 1003 /* | 1021 /* |
| 1004 * No `hash' method needed. | 1022 * No `hash' method needed. |
| 1005 * internal_hash knows how to | 1023 * internal_hash knows how to |
| 1006 * handle conses. | 1024 * handle conses. |
| 1007 */ | 1025 */ |
| 1008 0, | 1026 0, |
| 1009 struct Lisp_Cons); | 1027 struct Lisp_Cons); |
| 1010 static Lisp_Object | |
| 1011 mark_cons (Lisp_Object obj, void (*markobj) (Lisp_Object)) | |
| 1012 { | |
| 1013 if (NILP (XCDR (obj))) | |
| 1014 return XCAR (obj); | |
| 1015 else | |
| 1016 (markobj) (XCAR (obj)); | |
| 1017 return XCDR (obj); | |
| 1018 } | |
| 1019 | |
| 1020 static int | |
| 1021 cons_equal (Lisp_Object ob1, Lisp_Object ob2, int depth) | |
| 1022 { | |
| 1023 while (internal_equal (XCAR (ob1), XCAR (ob2), depth + 1)) | |
| 1024 { | |
| 1025 ob1 = XCDR(ob1); | |
| 1026 ob2 = XCDR(ob2); | |
| 1027 if (! CONSP (ob1) || ! CONSP (ob2)) | |
| 1028 return internal_equal (ob1, ob2, depth + 1); | |
| 1029 } | |
| 1030 return 0; | |
| 1031 } | |
| 1032 #endif /* LRECORD_CONS */ | 1028 #endif /* LRECORD_CONS */ |
| 1033 | 1029 |
| 1034 DEFUN ("cons", Fcons, 2, 2, 0, /* | 1030 DEFUN ("cons", Fcons, 2, 2, 0, /* |
| 1035 Create a new cons, give it CAR and CDR as components, and return it. | 1031 Create a new cons, give it CAR and CDR as components, and return it. |
| 1036 */ | 1032 */ |
| 1181 /**********************************************************************/ | 1177 /**********************************************************************/ |
| 1182 /* Vector allocation */ | 1178 /* Vector allocation */ |
| 1183 /**********************************************************************/ | 1179 /**********************************************************************/ |
| 1184 | 1180 |
| 1185 #ifdef LRECORD_VECTOR | 1181 #ifdef LRECORD_VECTOR |
| 1186 static Lisp_Object mark_vector (Lisp_Object, void (*) (Lisp_Object)); | 1182 static Lisp_Object |
| 1187 static unsigned int size_vector (CONST void *); | 1183 mark_vector (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
| 1188 static int vector_equal(Lisp_Object, Lisp_Object, int); | 1184 { |
| 1189 extern void print_vector (Lisp_Object, Lisp_Object, int); | 1185 struct Lisp_Vector *ptr = XVECTOR (obj); |
| 1186 int len = vector_length (ptr); | |
| 1187 int i; | |
| 1188 | |
| 1189 for (i = 0; i < len - 1; i++) | |
| 1190 (markobj) (ptr->contents[i]); | |
| 1191 return (len > 0) ? ptr->contents[len - 1] : Qnil; | |
| 1192 } | |
| 1193 | |
| 1194 static unsigned int | |
| 1195 size_vector (CONST void *lheader) | |
| 1196 { | |
| 1197 struct Lisp_Vector *p = lheader; | |
| 1198 /* | |
| 1199 * -1 because struct Lisp_Vector includes 1 slot | |
| 1200 */ | |
| 1201 return sizeof (struct Lisp_Vector) + | |
| 1202 ((p->size - 1) * sizeof (Lisp_Object)) ; | |
| 1203 } | |
| 1204 | |
| 1205 static int | |
| 1206 vector_equal (Lisp_Object o1, Lisp_Object o2, int depth) | |
| 1207 { | |
| 1208 int indice; | |
| 1209 int len = XVECTOR_LENGTH (o1); | |
| 1210 if (len != XVECTOR_LENGTH (o2)) | |
| 1211 return 0; | |
| 1212 for (indice = 0; indice < len; indice++) | |
| 1213 { | |
| 1214 if (!internal_equal (XVECTOR_DATA (o1) [indice], | |
| 1215 XVECTOR_DATA (o2) [indice], | |
| 1216 depth + 1)) | |
| 1217 return 0; | |
| 1218 } | |
| 1219 return 1; | |
| 1220 } | |
| 1221 | |
| 1190 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION("vector", vector, | 1222 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION("vector", vector, |
| 1191 mark_vector, print_vector, 0, | 1223 mark_vector, print_vector, 0, |
| 1192 vector_equal, | 1224 vector_equal, |
| 1193 /* | 1225 /* |
| 1194 * No `hash' method needed for | 1226 * No `hash' method needed for |
| 1195 * vectors. internal_hash | 1227 * vectors. internal_hash |
| 1196 * knows how to handle vectors. | 1228 * knows how to handle vectors. |
| 1197 */ | 1229 */ |
| 1198 0, | 1230 0, |
| 1199 size_vector, struct Lisp_Vector); | 1231 size_vector, struct Lisp_Vector); |
| 1200 static Lisp_Object | |
| 1201 mark_vector (Lisp_Object obj, void (*markobj) (Lisp_Object)) | |
| 1202 { | |
| 1203 struct Lisp_Vector *ptr = XVECTOR (obj); | |
| 1204 int len = vector_length (ptr); | |
| 1205 int i; | |
| 1206 | |
| 1207 for (i = 0; i < len - 1; i++) | |
| 1208 (markobj) (ptr->contents[i]); | |
| 1209 return (len > 0) ? ptr->contents[len - 1] : Qnil; | |
| 1210 } | |
| 1211 | |
| 1212 static unsigned int | |
| 1213 size_vector (CONST void *lheader) | |
| 1214 { | |
| 1215 struct Lisp_Vector *p = lheader; | |
| 1216 /* | |
| 1217 * -1 because struct Lisp_Vector includes 1 slot | |
| 1218 */ | |
| 1219 return sizeof (struct Lisp_Vector) + | |
| 1220 ((p->size - 1) * sizeof (Lisp_Object)) ; | |
| 1221 } | |
| 1222 | |
| 1223 static int | |
| 1224 vector_equal (Lisp_Object o1, Lisp_Object o2, int depth) | |
| 1225 { | |
| 1226 int indice; | |
| 1227 int len = XVECTOR_LENGTH (o1); | |
| 1228 if (len != XVECTOR_LENGTH (o2)) | |
| 1229 return 0; | |
| 1230 for (indice = 0; indice < len; indice++) | |
| 1231 { | |
| 1232 if (!internal_equal (XVECTOR_DATA (o1) [indice], | |
| 1233 XVECTOR_DATA (o2) [indice], | |
| 1234 depth + 1)) | |
| 1235 return 0; | |
| 1236 } | |
| 1237 return 1; | |
| 1238 } | |
| 1239 | 1232 |
| 1240 /* #### should allocate `small' vectors from a frob-block */ | 1233 /* #### should allocate `small' vectors from a frob-block */ |
| 1241 static struct Lisp_Vector * | 1234 static struct Lisp_Vector * |
| 1242 make_vector_internal (EMACS_INT sizei) | 1235 make_vector_internal (EMACS_INT sizei) |
| 1243 { | 1236 { |
| 1272 vector_next (p) = all_vectors; | 1265 vector_next (p) = all_vectors; |
| 1273 XSETVECTOR (all_vectors, p); | 1266 XSETVECTOR (all_vectors, p); |
| 1274 return p; | 1267 return p; |
| 1275 } | 1268 } |
| 1276 | 1269 |
| 1277 #endif | 1270 #endif /* ! LRECORD_VECTOR */ |
| 1278 | 1271 |
| 1279 Lisp_Object | 1272 Lisp_Object |
| 1280 make_vector (EMACS_INT length, Lisp_Object init) | 1273 make_vector (EMACS_INT length, Lisp_Object init) |
| 1281 { | 1274 { |
| 1282 EMACS_INT elt; | 1275 EMACS_INT elt; |
| 1912 /* strings are used and freed quite often */ | 1905 /* strings are used and freed quite often */ |
| 1913 /* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 10000 */ | 1906 /* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 10000 */ |
| 1914 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 1000 | 1907 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 1000 |
| 1915 | 1908 |
| 1916 #ifdef LRECORD_STRING | 1909 #ifdef LRECORD_STRING |
| 1917 static Lisp_Object mark_string (Lisp_Object, void (*) (Lisp_Object)); | 1910 static Lisp_Object |
| 1918 static int string_equal (Lisp_Object, Lisp_Object, int); | 1911 mark_string (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
| 1919 extern void print_string (Lisp_Object, Lisp_Object, int); | 1912 { |
| 1913 struct Lisp_String *ptr = XSTRING (obj); | |
| 1914 | |
| 1915 if (GC_CONSP (ptr->plist) && GC_EXTENT_INFOP (XCAR (ptr->plist))) | |
| 1916 flush_cached_extent_info (XCAR (ptr->plist)); | |
| 1917 return ptr->plist; | |
| 1918 } | |
| 1919 | |
| 1920 static int | |
| 1921 string_equal (Lisp_Object o1, Lisp_Object o2, int depth) | |
| 1922 { | |
| 1923 Bytecount len = XSTRING_LENGTH (o1); | |
| 1924 if (len != XSTRING_LENGTH (o2)) | |
| 1925 return 0; | |
| 1926 if (memcmp (XSTRING_DATA (o1), XSTRING_DATA (o2), len)) | |
| 1927 return 0; | |
| 1928 return 1; | |
| 1929 } | |
| 1930 | |
| 1920 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("string", string, | 1931 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("string", string, |
| 1921 mark_string, print_string, | 1932 mark_string, print_string, |
| 1922 /* | 1933 /* |
| 1923 * No `finalize', or `hash' methods. | 1934 * No `finalize', or `hash' methods. |
| 1924 * internal_hash already knows how | 1935 * internal_hash already knows how |
| 1929 * finalization when using | 1940 * finalization when using |
| 1930 * SWEEP_FIXED_TYPE_BLOCK(). | 1941 * SWEEP_FIXED_TYPE_BLOCK(). |
| 1931 */ | 1942 */ |
| 1932 0, string_equal, 0, | 1943 0, string_equal, 0, |
| 1933 struct Lisp_String); | 1944 struct Lisp_String); |
| 1934 static Lisp_Object | |
| 1935 mark_string (Lisp_Object obj, void (*markobj) (Lisp_Object)) | |
| 1936 { | |
| 1937 struct Lisp_String *ptr = XSTRING (obj); | |
| 1938 | |
| 1939 if (GC_CONSP (ptr->plist) && GC_EXTENT_INFOP (XCAR (ptr->plist))) | |
| 1940 flush_cached_extent_info (XCAR (ptr->plist)); | |
| 1941 return ptr->plist; | |
| 1942 } | |
| 1943 | |
| 1944 static int | |
| 1945 string_equal (Lisp_Object o1, Lisp_Object o2, int depth) | |
| 1946 { | |
| 1947 Bytecount len = XSTRING_LENGTH (o1); | |
| 1948 if (len != XSTRING_LENGTH (o2)) | |
| 1949 return 0; | |
| 1950 if (memcmp (XSTRING_DATA (o1), XSTRING_DATA (o2), len)) | |
| 1951 return 0; | |
| 1952 return 1; | |
| 1953 } | |
| 1954 #endif /* LRECORD_STRING */ | 1945 #endif /* LRECORD_STRING */ |
| 1955 | 1946 |
| 1956 /* String blocks contain this many useful bytes. */ | 1947 /* String blocks contain this many useful bytes. */ |
| 1957 #define STRING_CHARS_BLOCK_SIZE \ | 1948 #define STRING_CHARS_BLOCK_SIZE \ |
| 1958 (8192 - MALLOC_OVERHEAD - ((2 * sizeof (struct string_chars_block *)) \ | 1949 (8192 - MALLOC_OVERHEAD - ((2 * sizeof (struct string_chars_block *)) \ |
| 2355 -- the finalize method for the lcrecord's type will be called | 2346 -- the finalize method for the lcrecord's type will be called |
| 2356 at the time that free_managed_lcrecord() is called. | 2347 at the time that free_managed_lcrecord() is called. |
| 2357 | 2348 |
| 2358 */ | 2349 */ |
| 2359 | 2350 |
| 2360 static Lisp_Object mark_lcrecord_list (Lisp_Object, void (*) (Lisp_Object)); | |
| 2361 DEFINE_LRECORD_IMPLEMENTATION ("lcrecord-list", lcrecord_list, | |
| 2362 mark_lcrecord_list, internal_object_printer, | |
| 2363 0, 0, 0, struct lcrecord_list); | |
| 2364 | |
| 2365 static Lisp_Object | 2351 static Lisp_Object |
| 2366 mark_lcrecord_list (Lisp_Object obj, void (*markobj) (Lisp_Object)) | 2352 mark_lcrecord_list (Lisp_Object obj, void (*markobj) (Lisp_Object)) |
| 2367 { | 2353 { |
| 2368 struct lcrecord_list *list = XLCRECORD_LIST (obj); | 2354 struct lcrecord_list *list = XLCRECORD_LIST (obj); |
| 2369 Lisp_Object chain = list->free; | 2355 Lisp_Object chain = list->free; |
| 2396 } | 2382 } |
| 2397 | 2383 |
| 2398 return Qnil; | 2384 return Qnil; |
| 2399 } | 2385 } |
| 2400 | 2386 |
| 2387 DEFINE_LRECORD_IMPLEMENTATION ("lcrecord-list", lcrecord_list, | |
| 2388 mark_lcrecord_list, internal_object_printer, | |
| 2389 0, 0, 0, struct lcrecord_list); | |
| 2401 Lisp_Object | 2390 Lisp_Object |
| 2402 make_lcrecord_list (int size, | 2391 make_lcrecord_list (int size, |
| 2403 CONST struct lrecord_implementation *implementation) | 2392 CONST struct lrecord_implementation *implementation) |
| 2404 { | 2393 { |
| 2405 struct lcrecord_list *p = alloc_lcrecord_type (struct lcrecord_list, | 2394 struct lcrecord_list *p = alloc_lcrecord_type (struct lcrecord_list, |
| 2683 v->size = len; | 2672 v->size = len; |
| 2684 | 2673 |
| 2685 for (size = 0; size < len; size++) | 2674 for (size = 0; size < len; size++) |
| 2686 v->contents[size] = init; | 2675 v->contents[size] = init; |
| 2687 | 2676 |
| 2688 XSETVECTOR (new, v); | 2677 XSETVECTOR (new, v); |
| 2689 return new; | 2678 return new; |
| 2690 } | 2679 } |
| 2691 | 2680 |
| 2692 #if 0 | 2681 #if 0 |
| 2693 /* Presently unused */ | 2682 /* Presently unused */ |
| 4517 { | 4506 { |
| 4518 Lisp_Object pl = Qnil; | 4507 Lisp_Object pl = Qnil; |
| 4519 Lisp_Object ret[6]; | 4508 Lisp_Object ret[6]; |
| 4520 int i; | 4509 int i; |
| 4521 #ifdef LRECORD_VECTOR | 4510 #ifdef LRECORD_VECTOR |
| 4522 int gc_count_vector_total_size; | 4511 int gc_count_vector_total_size = 0; |
| 4523 #endif | 4512 #endif |
| 4524 | 4513 |
| 4525 if (purify_flag && pure_lossage) | 4514 if (purify_flag && pure_lossage) |
| 4526 { | 4515 { |
| 4527 return Qnil; | 4516 return Qnil; |
