comparison src/alloc.c @ 185:3d6bfa290dbd r20-3b19

Import from CVS: tag r20-3b19
author cvs
date Mon, 13 Aug 2007 09:55:28 +0200
parents e121b013d1f0
children a2f645c6b9f8
comparison
equal deleted inserted replaced
184:bcd2674570bf 185:3d6bfa290dbd
367 #ifdef xmalloc 367 #ifdef xmalloc
368 #undef xmalloc 368 #undef xmalloc
369 #endif 369 #endif
370 370
371 void * 371 void *
372 xmalloc (int size) 372 xmalloc (size_t size)
373 { 373 {
374 void *val; 374 void *val = (void *) malloc (size);
375
376 val = (void *) malloc (size);
377 375
378 if (!val && (size != 0)) memory_full (); 376 if (!val && (size != 0)) memory_full ();
379 return val; 377 return val;
380 } 378 }
381 379
382 void * 380 void *
383 xmalloc_and_zero (int size) 381 xmalloc_and_zero (size_t size)
384 { 382 {
385 void *val = xmalloc (size); 383 void *val = xmalloc (size);
386 memset (val, 0, size); 384 memset (val, 0, size);
387 return val; 385 return val;
388 } 386 }
390 #ifdef xrealloc 388 #ifdef xrealloc
391 #undef xrealloc 389 #undef xrealloc
392 #endif 390 #endif
393 391
394 void * 392 void *
395 xrealloc (void *block, int size) 393 xrealloc (void *block, size_t size)
396 { 394 {
397 void *val;
398
399 /* We must call malloc explicitly when BLOCK is 0, since some 395 /* We must call malloc explicitly when BLOCK is 0, since some
400 reallocs don't do this. */ 396 reallocs don't do this. */
401 if (! block) 397 void *val = (void *) (block ? realloc (block, size) : malloc (size));
402 val = (void *) malloc (size);
403 else
404 val = (void *) realloc (block, size);
405 398
406 if (!val && (size != 0)) memory_full (); 399 if (!val && (size != 0)) memory_full ();
407 return val; 400 return val;
408 } 401 }
409 402
467 #endif 460 #endif
468 461
469 char * 462 char *
470 xstrdup (CONST char *str) 463 xstrdup (CONST char *str)
471 { 464 {
472 char *val;
473 int len = strlen (str) + 1; /* for stupid terminating 0 */ 465 int len = strlen (str) + 1; /* for stupid terminating 0 */
474 466
475 val = xmalloc (len); 467 void *val = xmalloc (len);
476 if (val == 0) return 0; 468 if (val == 0) return 0;
477 memcpy (val, str, len); 469 memcpy (val, str, len);
478 return val; 470 return (char *) val;
479 } 471 }
480 472
481 #ifdef NEED_STRDUP 473 #ifdef NEED_STRDUP
482 char * 474 char *
483 strdup (CONST char *s) 475 strdup (CONST char *s)
532 abort (); 524 abort ();
533 } 525 }
534 else if (implementation->static_size != size) 526 else if (implementation->static_size != size)
535 abort (); 527 abort ();
536 528
537 lcheader = allocate_lisp_storage (size); 529 lcheader = (struct lcrecord_header *) allocate_lisp_storage (size);
538 lcheader->lheader.implementation = implementation; 530 lcheader->lheader.implementation = implementation;
539 lcheader->next = all_lcrecords; 531 lcheader->next = all_lcrecords;
540 #if 1 /* mly prefers to see small ID numbers */ 532 #if 1 /* mly prefers to see small ID numbers */
541 lcheader->uid = lrecord_uid_counter++; 533 lcheader->uid = lrecord_uid_counter++;
542 #else /* jwz prefers to see real addrs */ 534 #else /* jwz prefers to see real addrs */
624 616
625 /* XGCTYPE for records */ 617 /* XGCTYPE for records */
626 int 618 int
627 gc_record_type_p (Lisp_Object frob, CONST struct lrecord_implementation *type) 619 gc_record_type_p (Lisp_Object frob, CONST struct lrecord_implementation *type)
628 { 620 {
629 return (XGCTYPE (frob) == Lisp_Record 621 return (XGCTYPE (frob) == Lisp_Type_Record
630 && (XRECORD_LHEADER (frob)->implementation == type 622 && (XRECORD_LHEADER (frob)->implementation == type ||
631 || XRECORD_LHEADER (frob)->implementation == type + 1)); 623 XRECORD_LHEADER (frob)->implementation == type + 1));
632 } 624 }
633 625
634 626
635 /**********************************************************************/ 627 /**********************************************************************/
636 /* Fixed-size type macros */ 628 /* Fixed-size type macros */
829 #define ALLOCATE_FIXED_TYPE_FROM_BLOCK(type, result) \ 821 #define ALLOCATE_FIXED_TYPE_FROM_BLOCK(type, result) \
830 do { \ 822 do { \
831 if (current_##type##_block_index \ 823 if (current_##type##_block_index \
832 == countof (current_##type##_block->block)) \ 824 == countof (current_##type##_block->block)) \
833 { \ 825 { \
834 struct type##_block *__new__ \ 826 struct type##_block *__new__ = (struct type##_block *) \
835 = allocate_lisp_storage (sizeof (struct type##_block)); \ 827 allocate_lisp_storage (sizeof (struct type##_block)); \
836 __new__->prev = current_##type##_block; \ 828 __new__->prev = current_##type##_block; \
837 current_##type##_block = __new__; \ 829 current_##type##_block = __new__; \
838 current_##type##_block_index = 0; \ 830 current_##type##_block_index = 0; \
839 } \ 831 } \
840 (result) = \ 832 (result) = \
1153 EMACS_INT sizem = (sizeof (struct Lisp_Vector) 1145 EMACS_INT sizem = (sizeof (struct Lisp_Vector)
1154 /* -1 because struct Lisp_Vector includes 1 slot, 1146 /* -1 because struct Lisp_Vector includes 1 slot,
1155 * +1 to account for vector_next */ 1147 * +1 to account for vector_next */
1156 + (sizei - 1 + 1) * sizeof (Lisp_Object) 1148 + (sizei - 1 + 1) * sizeof (Lisp_Object)
1157 ); 1149 );
1158 struct Lisp_Vector *p = allocate_lisp_storage (sizem); 1150 struct Lisp_Vector *p = (struct Lisp_Vector *) allocate_lisp_storage (sizem);
1159 #ifdef LRECORD_VECTOR 1151 #ifdef LRECORD_VECTOR
1160 set_lheader_implementation (&(p->lheader), lrecord_vector); 1152 set_lheader_implementation (&(p->lheader), lrecord_vector);
1161 #endif 1153 #endif
1162 1154
1163 INCREMENT_CONS_COUNTER (sizem, "vector"); 1155 INCREMENT_CONS_COUNTER (sizem, "vector");
1340 make_bit_vector_internal (EMACS_INT sizei) 1332 make_bit_vector_internal (EMACS_INT sizei)
1341 { 1333 {
1342 EMACS_INT sizem = (sizeof (struct Lisp_Bit_Vector) + 1334 EMACS_INT sizem = (sizeof (struct Lisp_Bit_Vector) +
1343 /* -1 because struct Lisp_Bit_Vector includes 1 slot */ 1335 /* -1 because struct Lisp_Bit_Vector includes 1 slot */
1344 sizeof (long) * (BIT_VECTOR_LONG_STORAGE (sizei) - 1)); 1336 sizeof (long) * (BIT_VECTOR_LONG_STORAGE (sizei) - 1));
1345 struct Lisp_Bit_Vector *p = allocate_lisp_storage (sizem); 1337 struct Lisp_Bit_Vector *p =
1338 (struct Lisp_Bit_Vector *) allocate_lisp_storage (sizem);
1346 set_lheader_implementation (&(p->lheader), lrecord_bit_vector); 1339 set_lheader_implementation (&(p->lheader), lrecord_bit_vector);
1347 1340
1348 INCREMENT_CONS_COUNTER (sizem, "bit-vector"); 1341 INCREMENT_CONS_COUNTER (sizem, "bit-vector");
1349 1342
1350 bit_vector_length (p) = sizei; 1343 bit_vector_length (p) = sizei;
1848 }; 1841 };
1849 1842
1850 static void 1843 static void
1851 init_string_chars_alloc (void) 1844 init_string_chars_alloc (void)
1852 { 1845 {
1853 first_string_chars_block = 1846 first_string_chars_block = xnew (struct string_chars_block);
1854 (struct string_chars_block *) xmalloc (sizeof (struct string_chars_block));
1855 first_string_chars_block->prev = 0; 1847 first_string_chars_block->prev = 0;
1856 first_string_chars_block->next = 0; 1848 first_string_chars_block->next = 0;
1857 first_string_chars_block->pos = 0; 1849 first_string_chars_block->pos = 0;
1858 current_string_chars_block = first_string_chars_block; 1850 current_string_chars_block = first_string_chars_block;
1859 } 1851 }
1880 current_string_chars_block->pos += fullsize; 1872 current_string_chars_block->pos += fullsize;
1881 } 1873 }
1882 else 1874 else
1883 { 1875 {
1884 /* Make a new current string chars block */ 1876 /* Make a new current string chars block */
1885 struct string_chars_block *new 1877 struct string_chars_block *new = xnew (struct string_chars_block);
1886 = (struct string_chars_block *)
1887 xmalloc (sizeof (struct string_chars_block));
1888 1878
1889 current_string_chars_block->next = new; 1879 current_string_chars_block->next = new;
1890 new->prev = current_string_chars_block; 1880 new->prev = current_string_chars_block;
1891 new->next = 0; 1881 new->next = 0;
1892 current_string_chars_block = new; 1882 current_string_chars_block = new;
2082 oldlen = charcount_to_bytecount (string_data (s) + bytoff, 1); 2072 oldlen = charcount_to_bytecount (string_data (s) + bytoff, 1);
2083 newlen = set_charptr_emchar (newstr, c); 2073 newlen = set_charptr_emchar (newstr, c);
2084 2074
2085 if (oldlen != newlen) 2075 if (oldlen != newlen)
2086 resize_string (s, bytoff, newlen - oldlen); 2076 resize_string (s, bytoff, newlen - oldlen);
2087 /* Remember, string_data (s) might have changed so we can't 2077 /* Remember, string_data (s) might have changed so we can't cache it. */
2088 cache it. */
2089 memcpy (string_data (s) + bytoff, newstr, newlen); 2078 memcpy (string_data (s) + bytoff, newstr, newlen);
2090 } 2079 }
2091 2080
2092 #endif /* MULE */ 2081 #endif /* MULE */
2093 2082
2154 } 2143 }
2155 2144
2156 Lisp_Object 2145 Lisp_Object
2157 build_string (CONST char *str) 2146 build_string (CONST char *str)
2158 { 2147 {
2159 Bytecount length; 2148 /* Some strlen's crash and burn if passed null. */
2160 2149 return make_string ((CONST Bufbyte *) str, (str ? strlen(str) : 0));
2161 /* Some strlen crash and burn if passed null. */
2162 if (!str)
2163 length = 0;
2164 else
2165 length = strlen (str);
2166
2167 return make_string ((CONST Bufbyte *) str, length);
2168 } 2150 }
2169 2151
2170 Lisp_Object 2152 Lisp_Object
2171 build_ext_string (CONST char *str, enum external_data_format fmt) 2153 build_ext_string (CONST char *str, enum external_data_format fmt)
2172 { 2154 {
2173 Bytecount length; 2155 /* Some strlen's crash and burn if passed null. */
2174 2156 return make_ext_string ((Extbyte *) str, (str ? strlen(str) : 0), fmt);
2175 /* Some strlen crash and burn if passed null. */
2176 if (!str)
2177 length = 0;
2178 else
2179 length = strlen (str);
2180
2181 return make_ext_string ((Extbyte *) str, length, fmt);
2182 } 2157 }
2183 2158
2184 Lisp_Object 2159 Lisp_Object
2185 build_translated_string (CONST char *str) 2160 build_translated_string (CONST char *str)
2186 { 2161 {
2263 2238
2264 Lisp_Object 2239 Lisp_Object
2265 make_lcrecord_list (int size, 2240 make_lcrecord_list (int size,
2266 CONST struct lrecord_implementation *implementation) 2241 CONST struct lrecord_implementation *implementation)
2267 { 2242 {
2268 struct lcrecord_list *p = alloc_lcrecord (sizeof (*p), 2243 struct lcrecord_list *p = alloc_lcrecord_type (struct lcrecord_list,
2269 lrecord_lcrecord_list); 2244 lrecord_lcrecord_list);
2270 Lisp_Object val = Qnil; 2245 Lisp_Object val = Qnil;
2271 2246
2272 p->implementation = implementation; 2247 p->implementation = implementation;
2273 p->size = size; 2248 p->size = size;
2274 p->free = Qnil; 2249 p->free = Qnil;
2308 free_header->lcheader.free = 0; 2283 free_header->lcheader.free = 0;
2309 return val; 2284 return val;
2310 } 2285 }
2311 else 2286 else
2312 { 2287 {
2313 Lisp_Object foo = Qnil; 2288 Lisp_Object val = Qnil;
2314 2289
2315 XSETOBJ (foo, Lisp_Record, 2290 XSETOBJ (val, Lisp_Type_Record,
2316 alloc_lcrecord (list->size, list->implementation)); 2291 alloc_lcrecord (list->size, list->implementation));
2317 return foo; 2292 return val;
2318 } 2293 }
2319 } 2294 }
2320 2295
2321 void 2296 void
2322 free_managed_lcrecord (Lisp_Object lcrecord_list, Lisp_Object lcrecord) 2297 free_managed_lcrecord (Lisp_Object lcrecord_list, Lisp_Object lcrecord)
2560 || PURIFIED (XPNTR (obj))) 2535 || PURIFIED (XPNTR (obj)))
2561 return obj; 2536 return obj;
2562 2537
2563 switch (XTYPE (obj)) 2538 switch (XTYPE (obj))
2564 { 2539 {
2565 case Lisp_Cons: 2540 case Lisp_Type_Cons:
2566 return pure_cons (XCAR (obj), XCDR (obj)); 2541 return pure_cons (XCAR (obj), XCDR (obj));
2567 2542
2568 case Lisp_String: 2543 case Lisp_Type_String:
2569 return make_pure_string (XSTRING_DATA (obj), 2544 return make_pure_string (XSTRING_DATA (obj),
2570 XSTRING_LENGTH (obj), 2545 XSTRING_LENGTH (obj),
2571 XSTRING (obj)->plist, 2546 XSTRING (obj)->plist,
2572 0); 2547 0);
2573 2548
2574 case Lisp_Vector: 2549 #ifndef LRECORD_VECTOR
2550 case Lisp_Type_Vector:
2575 { 2551 {
2576 struct Lisp_Vector *o = XVECTOR (obj); 2552 struct Lisp_Vector *o = XVECTOR (obj);
2577 Lisp_Object new = make_pure_vector (vector_length (o), Qnil); 2553 Lisp_Object new = make_pure_vector (vector_length (o), Qnil);
2578 for (i = 0; i < vector_length (o); i++) 2554 for (i = 0; i < vector_length (o); i++)
2579 XVECTOR_DATA (new)[i] = Fpurecopy (o->contents[i]); 2555 XVECTOR_DATA (new)[i] = Fpurecopy (o->contents[i]);
2580 return new; 2556 return new;
2581 } 2557 }
2558 #endif /* !LRECORD_VECTOR */
2582 2559
2583 default: 2560 default:
2584 { 2561 {
2585 if (COMPILED_FUNCTIONP (obj)) 2562 if (COMPILED_FUNCTIONP (obj))
2586 { 2563 {
2801 return; 2778 return;
2802 if (PURIFIED (XPNTR (obj))) 2779 if (PURIFIED (XPNTR (obj)))
2803 return; 2780 return;
2804 switch (XGCTYPE (obj)) 2781 switch (XGCTYPE (obj))
2805 { 2782 {
2806 case Lisp_Cons: 2783 case Lisp_Type_Cons:
2807 { 2784 {
2808 struct Lisp_Cons *ptr = XCONS (obj); 2785 struct Lisp_Cons *ptr = XCONS (obj);
2809 if (CONS_MARKED_P (ptr)) 2786 if (CONS_MARKED_P (ptr))
2810 break; 2787 break;
2811 MARK_CONS (ptr); 2788 MARK_CONS (ptr);
2820 obj = ptr->cdr; 2797 obj = ptr->cdr;
2821 } 2798 }
2822 goto tail_recurse; 2799 goto tail_recurse;
2823 } 2800 }
2824 2801
2825 case Lisp_Record: 2802 case Lisp_Type_Record:
2826 /* case Lisp_Symbol_Value_Magic: */ 2803 /* case Lisp_Symbol_Value_Magic: */
2827 { 2804 {
2828 struct lrecord_header *lheader = XRECORD_LHEADER (obj); 2805 struct lrecord_header *lheader = XRECORD_LHEADER (obj);
2829 CONST struct lrecord_implementation *implementation 2806 CONST struct lrecord_implementation *implementation
2830 = lheader->implementation; 2807 = lheader->implementation;
2844 } 2821 }
2845 } 2822 }
2846 } 2823 }
2847 break; 2824 break;
2848 2825
2849 case Lisp_String: 2826 case Lisp_Type_String:
2850 { 2827 {
2851 struct Lisp_String *ptr = XSTRING (obj); 2828 struct Lisp_String *ptr = XSTRING (obj);
2852 2829
2853 if (!XMARKBIT (ptr->plist)) 2830 if (!XMARKBIT (ptr->plist))
2854 { 2831 {
2860 goto tail_recurse; 2837 goto tail_recurse;
2861 } 2838 }
2862 } 2839 }
2863 break; 2840 break;
2864 2841
2865 case Lisp_Vector: 2842 #ifndef LRECORD_VECTOR
2843 case Lisp_Type_Vector:
2866 { 2844 {
2867 struct Lisp_Vector *ptr = XVECTOR (obj); 2845 struct Lisp_Vector *ptr = XVECTOR (obj);
2868 int len = vector_length (ptr); 2846 int len = vector_length (ptr);
2869 int i; 2847 int i;
2870 2848
2878 obj = ptr->contents[len - 1]; 2856 obj = ptr->contents[len - 1];
2879 goto tail_recurse; 2857 goto tail_recurse;
2880 } 2858 }
2881 } 2859 }
2882 break; 2860 break;
2861 #endif /* !LRECORD_VECTOR */
2883 2862
2884 #ifndef LRECORD_SYMBOL 2863 #ifndef LRECORD_SYMBOL
2885 case Lisp_Symbol: 2864 case Lisp_Type_Symbol:
2886 { 2865 {
2887 struct Lisp_Symbol *sym = XSYMBOL (obj); 2866 struct Lisp_Symbol *sym = XSYMBOL (obj);
2888 2867
2889 while (!XMARKBIT (sym->plist)) 2868 while (!XMARKBIT (sym->plist))
2890 { 2869 {
2970 if (SYMBOLP (obj)) 2949 if (SYMBOLP (obj))
2971 return total; 2950 return total;
2972 2951
2973 switch (XTYPE (obj)) 2952 switch (XTYPE (obj))
2974 { 2953 {
2975 case Lisp_String: 2954 case Lisp_Type_String:
2976 { 2955 {
2977 struct Lisp_String *ptr = XSTRING (obj); 2956 struct Lisp_String *ptr = XSTRING (obj);
2978 int size = string_length (ptr); 2957 int size = string_length (ptr);
2979 2958
2980 if (string_data (ptr) != 2959 if (string_data (ptr) !=
2991 } 2970 }
2992 total += size; 2971 total += size;
2993 } 2972 }
2994 break; 2973 break;
2995 2974
2996 case Lisp_Vector: 2975 #ifndef LRECORD_VECTOR
2976 case Lisp_Type_Vector:
2997 { 2977 {
2998 struct Lisp_Vector *ptr = XVECTOR (obj); 2978 struct Lisp_Vector *ptr = XVECTOR (obj);
2999 int len = vector_length (ptr); 2979 int len = vector_length (ptr);
3000 2980
3001 total += (sizeof (struct Lisp_Vector) 2981 total += (sizeof (struct Lisp_Vector)
3014 goto tail_recurse; 2994 goto tail_recurse;
3015 } 2995 }
3016 #endif /* unused */ 2996 #endif /* unused */
3017 } 2997 }
3018 break; 2998 break;
3019 2999 #endif /* !LRECORD_SYMBOL */
3020 case Lisp_Record: 3000
3001 case Lisp_Type_Record:
3021 { 3002 {
3022 struct lrecord_header *lheader = XRECORD_LHEADER (obj); 3003 struct lrecord_header *lheader = XRECORD_LHEADER (obj);
3023 CONST struct lrecord_implementation *implementation 3004 CONST struct lrecord_implementation *implementation
3024 = lheader->implementation; 3005 = lheader->implementation;
3025 3006
3045 } 3026 }
3046 #endif /* unused */ 3027 #endif /* unused */
3047 } 3028 }
3048 break; 3029 break;
3049 3030
3050 case Lisp_Cons: 3031 case Lisp_Type_Cons:
3051 { 3032 {
3052 struct Lisp_Cons *ptr = XCONS (obj); 3033 struct Lisp_Cons *ptr = XCONS (obj);
3053 total += sizeof (*ptr); 3034 total += sizeof (*ptr);
3054 #if 0 /* unused */ 3035 #if 0 /* unused */
3055 if (!recurse) 3036 if (!recurse)
3807 { 3788 {
3808 if (!POINTER_TYPE_P (XGCTYPE (obj))) return 1; 3789 if (!POINTER_TYPE_P (XGCTYPE (obj))) return 1;
3809 if (PURIFIED (XPNTR (obj))) return 1; 3790 if (PURIFIED (XPNTR (obj))) return 1;
3810 switch (XGCTYPE (obj)) 3791 switch (XGCTYPE (obj))
3811 { 3792 {
3812 case Lisp_Cons: 3793 case Lisp_Type_Cons:
3813 return XMARKBIT (XCAR (obj)); 3794 return XMARKBIT (XCAR (obj));
3814 case Lisp_Record: 3795 case Lisp_Type_Record:
3815 return MARKED_RECORD_HEADER_P (XRECORD_LHEADER (obj)); 3796 return MARKED_RECORD_HEADER_P (XRECORD_LHEADER (obj));
3816 case Lisp_String: 3797 case Lisp_Type_String:
3817 return XMARKBIT (XSTRING (obj)->plist); 3798 return XMARKBIT (XSTRING (obj)->plist);
3818 case Lisp_Vector: 3799 #ifndef LRECORD_VECTOR
3800 case Lisp_Type_Vector:
3819 return XVECTOR_LENGTH (obj) < 0; 3801 return XVECTOR_LENGTH (obj) < 0;
3802 #endif /* !LRECORD_VECTOR */
3820 #ifndef LRECORD_SYMBOL 3803 #ifndef LRECORD_SYMBOL
3821 case Lisp_Symbol: 3804 case Lisp_Type_Symbol:
3822 return XMARKBIT (XSYMBOL (obj)->plist); 3805 return XMARKBIT (XSYMBOL (obj)->plist);
3823 #endif 3806 #endif
3824 default: 3807 default:
3825 abort (); 3808 abort ();
3826 } 3809 }