Mercurial > hg > xemacs-beta
comparison src/alloc.c @ 444:576fb035e263 r21-2-37
Import from CVS: tag r21-2-37
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:36:19 +0200 |
parents | abe6d1db359e |
children | 98528da0b7fc |
comparison
equal
deleted
inserted
replaced
443:a8296e22da4e | 444:576fb035e263 |
---|---|
1004 /* This cannot GC. */ | 1004 /* This cannot GC. */ |
1005 return Fcons (obj0, Fcons (obj1, Fcons (obj2, Fcons (obj3, Fcons (obj4, Fcons (obj5, Qnil)))))); | 1005 return Fcons (obj0, Fcons (obj1, Fcons (obj2, Fcons (obj3, Fcons (obj4, Fcons (obj5, Qnil)))))); |
1006 } | 1006 } |
1007 | 1007 |
1008 DEFUN ("make-list", Fmake_list, 2, 2, 0, /* | 1008 DEFUN ("make-list", Fmake_list, 2, 2, 0, /* |
1009 Return a new list of length LENGTH, with each element being INIT. | 1009 Return a new list of length LENGTH, with each element being OBJECT. |
1010 */ | 1010 */ |
1011 (length, init)) | 1011 (length, object)) |
1012 { | 1012 { |
1013 CHECK_NATNUM (length); | 1013 CHECK_NATNUM (length); |
1014 | 1014 |
1015 { | 1015 { |
1016 Lisp_Object val = Qnil; | 1016 Lisp_Object val = Qnil; |
1017 size_t size = XINT (length); | 1017 size_t size = XINT (length); |
1018 | 1018 |
1019 while (size--) | 1019 while (size--) |
1020 val = Fcons (init, val); | 1020 val = Fcons (object, val); |
1021 return val; | 1021 return val; |
1022 } | 1022 } |
1023 } | 1023 } |
1024 | 1024 |
1025 | 1025 |
1126 p->size = sizei; | 1126 p->size = sizei; |
1127 return p; | 1127 return p; |
1128 } | 1128 } |
1129 | 1129 |
1130 Lisp_Object | 1130 Lisp_Object |
1131 make_vector (size_t length, Lisp_Object init) | 1131 make_vector (size_t length, Lisp_Object object) |
1132 { | 1132 { |
1133 Lisp_Vector *vecp = make_vector_internal (length); | 1133 Lisp_Vector *vecp = make_vector_internal (length); |
1134 Lisp_Object *p = vector_data (vecp); | 1134 Lisp_Object *p = vector_data (vecp); |
1135 | 1135 |
1136 while (length--) | 1136 while (length--) |
1137 *p++ = init; | 1137 *p++ = object; |
1138 | 1138 |
1139 { | 1139 { |
1140 Lisp_Object vector; | 1140 Lisp_Object vector; |
1141 XSETVECTOR (vector, vecp); | 1141 XSETVECTOR (vector, vecp); |
1142 return vector; | 1142 return vector; |
1143 } | 1143 } |
1144 } | 1144 } |
1145 | 1145 |
1146 DEFUN ("make-vector", Fmake_vector, 2, 2, 0, /* | 1146 DEFUN ("make-vector", Fmake_vector, 2, 2, 0, /* |
1147 Return a new vector of length LENGTH, with each element being INIT. | 1147 Return a new vector of length LENGTH, with each element being OBJECT. |
1148 See also the function `vector'. | 1148 See also the function `vector'. |
1149 */ | 1149 */ |
1150 (length, init)) | 1150 (length, object)) |
1151 { | 1151 { |
1152 CONCHECK_NATNUM (length); | 1152 CONCHECK_NATNUM (length); |
1153 return make_vector (XINT (length), init); | 1153 return make_vector (XINT (length), object); |
1154 } | 1154 } |
1155 | 1155 |
1156 DEFUN ("vector", Fvector, 0, MANY, 0, /* | 1156 DEFUN ("vector", Fvector, 0, MANY, 0, /* |
1157 Return a newly created vector with specified arguments as elements. | 1157 Return a newly created vector with specified arguments as elements. |
1158 Any number of arguments, even zero arguments, are allowed. | 1158 Any number of arguments, even zero arguments, are allowed. |
1297 XSETBIT_VECTOR (all_bit_vectors, p); | 1297 XSETBIT_VECTOR (all_bit_vectors, p); |
1298 return p; | 1298 return p; |
1299 } | 1299 } |
1300 | 1300 |
1301 Lisp_Object | 1301 Lisp_Object |
1302 make_bit_vector (size_t length, Lisp_Object init) | 1302 make_bit_vector (size_t length, Lisp_Object bit) |
1303 { | 1303 { |
1304 Lisp_Bit_Vector *p = make_bit_vector_internal (length); | 1304 Lisp_Bit_Vector *p = make_bit_vector_internal (length); |
1305 size_t num_longs = BIT_VECTOR_LONG_STORAGE (length); | 1305 size_t num_longs = BIT_VECTOR_LONG_STORAGE (length); |
1306 | 1306 |
1307 CHECK_BIT (init); | 1307 CHECK_BIT (bit); |
1308 | 1308 |
1309 if (ZEROP (init)) | 1309 if (ZEROP (bit)) |
1310 memset (p->bits, 0, num_longs * sizeof (long)); | 1310 memset (p->bits, 0, num_longs * sizeof (long)); |
1311 else | 1311 else |
1312 { | 1312 { |
1313 size_t bits_in_last = length & (LONGBITS_POWER_OF_2 - 1); | 1313 size_t bits_in_last = length & (LONGBITS_POWER_OF_2 - 1); |
1314 memset (p->bits, ~0, num_longs * sizeof (long)); | 1314 memset (p->bits, ~0, num_longs * sizeof (long)); |
1340 return bit_vector; | 1340 return bit_vector; |
1341 } | 1341 } |
1342 } | 1342 } |
1343 | 1343 |
1344 DEFUN ("make-bit-vector", Fmake_bit_vector, 2, 2, 0, /* | 1344 DEFUN ("make-bit-vector", Fmake_bit_vector, 2, 2, 0, /* |
1345 Return a new bit vector of length LENGTH. with each bit being INIT. | 1345 Return a new bit vector of length LENGTH. with each bit set to BIT. |
1346 Each element is set to INIT. See also the function `bit-vector'. | 1346 BIT must be one of the integers 0 or 1. See also the function `bit-vector'. |
1347 */ | 1347 */ |
1348 (length, init)) | 1348 (length, bit)) |
1349 { | 1349 { |
1350 CONCHECK_NATNUM (length); | 1350 CONCHECK_NATNUM (length); |
1351 | 1351 |
1352 return make_bit_vector (XINT (length), init); | 1352 return make_bit_vector (XINT (length), bit); |
1353 } | 1353 } |
1354 | 1354 |
1355 DEFUN ("bit-vector", Fbit_vector, 0, MANY, 0, /* | 1355 DEFUN ("bit-vector", Fbit_vector, 0, MANY, 0, /* |
1356 Return a newly created bit vector with specified arguments as elements. | 1356 Return a newly created bit vector with specified arguments as elements. |
1357 Any number of arguments, even zero arguments, are allowed. | 1357 Any number of arguments, even zero arguments, are allowed. |
1358 Each argument must be one of the integers 0 or 1. | |
1358 */ | 1359 */ |
1359 (int nargs, Lisp_Object *args)) | 1360 (int nargs, Lisp_Object *args)) |
1360 { | 1361 { |
1361 int i; | 1362 int i; |
1362 Lisp_Bit_Vector *p = make_bit_vector_internal (nargs); | 1363 Lisp_Bit_Vector *p = make_bit_vector_internal (nargs); |
2033 } | 2034 } |
2034 | 2035 |
2035 #endif /* MULE */ | 2036 #endif /* MULE */ |
2036 | 2037 |
2037 DEFUN ("make-string", Fmake_string, 2, 2, 0, /* | 2038 DEFUN ("make-string", Fmake_string, 2, 2, 0, /* |
2038 Return a new string of length LENGTH, with each character being INIT. | 2039 Return a new string consisting of LENGTH copies of CHARACTER. |
2039 LENGTH must be an integer and INIT must be a character. | 2040 LENGTH must be a non-negative integer. |
2040 */ | 2041 */ |
2041 (length, init)) | 2042 (length, character)) |
2042 { | 2043 { |
2043 CHECK_NATNUM (length); | 2044 CHECK_NATNUM (length); |
2044 CHECK_CHAR_COERCE_INT (init); | 2045 CHECK_CHAR_COERCE_INT (character); |
2045 { | 2046 { |
2046 Bufbyte init_str[MAX_EMCHAR_LEN]; | 2047 Bufbyte init_str[MAX_EMCHAR_LEN]; |
2047 int len = set_charptr_emchar (init_str, XCHAR (init)); | 2048 int len = set_charptr_emchar (init_str, XCHAR (character)); |
2048 Lisp_Object val = make_uninit_string (len * XINT (length)); | 2049 Lisp_Object val = make_uninit_string (len * XINT (length)); |
2049 | 2050 |
2050 if (len == 1) | 2051 if (len == 1) |
2051 /* Optimize the single-byte case */ | 2052 /* Optimize the single-byte case */ |
2052 memset (XSTRING_DATA (val), XCHAR (init), XSTRING_LENGTH (val)); | 2053 memset (XSTRING_DATA (val), XCHAR (character), XSTRING_LENGTH (val)); |
2053 else | 2054 else |
2054 { | 2055 { |
2055 size_t i; | 2056 size_t i; |
2056 Bufbyte *ptr = XSTRING_DATA (val); | 2057 Bufbyte *ptr = XSTRING_DATA (val); |
2057 | 2058 |
2322 Old: | 2323 Old: |
2323 Make a copy of OBJECT in pure storage. | 2324 Make a copy of OBJECT in pure storage. |
2324 Recursively copies contents of vectors and cons cells. | 2325 Recursively copies contents of vectors and cons cells. |
2325 Does not copy symbols. | 2326 Does not copy symbols. |
2326 */ | 2327 */ |
2327 (obj)) | 2328 (object)) |
2328 { | 2329 { |
2329 return obj; | 2330 return object; |
2330 } | 2331 } |
2331 | 2332 |
2332 | 2333 |
2333 /************************************************************************/ | 2334 /************************************************************************/ |
2334 /* Garbage Collection */ | 2335 /* Garbage Collection */ |
2677 #ifdef ERROR_CHECK_GC | 2678 #ifdef ERROR_CHECK_GC |
2678 | 2679 |
2679 #define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type) \ | 2680 #define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type) \ |
2680 do { \ | 2681 do { \ |
2681 struct typename##_block *SFTB_current; \ | 2682 struct typename##_block *SFTB_current; \ |
2682 struct typename##_block **SFTB_prev; \ | |
2683 int SFTB_limit; \ | 2683 int SFTB_limit; \ |
2684 int num_free = 0, num_used = 0; \ | 2684 int num_free = 0, num_used = 0; \ |
2685 \ | 2685 \ |
2686 for (SFTB_prev = ¤t_##typename##_block, \ | 2686 for (SFTB_current = current_##typename##_block, \ |
2687 SFTB_current = current_##typename##_block, \ | |
2688 SFTB_limit = current_##typename##_block_index; \ | 2687 SFTB_limit = current_##typename##_block_index; \ |
2689 SFTB_current; \ | 2688 SFTB_current; \ |
2690 ) \ | 2689 ) \ |
2691 { \ | 2690 { \ |
2692 int SFTB_iii; \ | 2691 int SFTB_iii; \ |
2712 { \ | 2711 { \ |
2713 num_used++; \ | 2712 num_used++; \ |
2714 UNMARK_##typename (SFTB_victim); \ | 2713 UNMARK_##typename (SFTB_victim); \ |
2715 } \ | 2714 } \ |
2716 } \ | 2715 } \ |
2717 SFTB_prev = &(SFTB_current->prev); \ | |
2718 SFTB_current = SFTB_current->prev; \ | 2716 SFTB_current = SFTB_current->prev; \ |
2719 SFTB_limit = countof (current_##typename##_block->block); \ | 2717 SFTB_limit = countof (current_##typename##_block->block); \ |
2720 } \ | 2718 } \ |
2721 \ | 2719 \ |
2722 gc_count_num_##typename##_in_use = num_used; \ | 2720 gc_count_num_##typename##_in_use = num_used; \ |
2936 /* Explicitly free a marker. */ | 2934 /* Explicitly free a marker. */ |
2937 void | 2935 void |
2938 free_marker (Lisp_Marker *ptr) | 2936 free_marker (Lisp_Marker *ptr) |
2939 { | 2937 { |
2940 /* Perhaps this will catch freeing an already-freed marker. */ | 2938 /* Perhaps this will catch freeing an already-freed marker. */ |
2941 gc_checking_assert (ptr->lheader.type = lrecord_type_marker); | 2939 gc_checking_assert (ptr->lheader.type == lrecord_type_marker); |
2942 | 2940 |
2943 #ifndef ALLOC_NO_POOLS | 2941 #ifndef ALLOC_NO_POOLS |
2944 FREE_FIXED_TYPE_WHEN_NOT_IN_GC (marker, Lisp_Marker, ptr); | 2942 FREE_FIXED_TYPE_WHEN_NOT_IN_GC (marker, Lisp_Marker, ptr); |
2945 #endif /* ALLOC_NO_POOLS */ | 2943 #endif /* ALLOC_NO_POOLS */ |
2946 } | 2944 } |
3705 { | 3703 { |
3706 return make_int (consing_since_gc); | 3704 return make_int (consing_since_gc); |
3707 } | 3705 } |
3708 | 3706 |
3709 #if 0 | 3707 #if 0 |
3710 DEFUN ("memory-limit", Fmemory_limit, 0, 0, "", /* | 3708 DEFUN ("memory-limit", Fmemory_limit, 0, 0, 0, /* |
3711 Return the address of the last byte Emacs has allocated, divided by 1024. | 3709 Return the address of the last byte Emacs has allocated, divided by 1024. |
3712 This may be helpful in debugging Emacs's memory usage. | 3710 This may be helpful in debugging Emacs's memory usage. |
3713 The value is divided by 1024 to make sure it will fit in a lisp integer. | 3711 The value is divided by 1024 to make sure it will fit in a lisp integer. |
3714 */ | 3712 */ |
3715 ()) | 3713 ()) |