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 = &current_##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 ())