X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgc-common.c;h=04096e8ae40377341de28130aafbdd12f2c68dde;hb=2378b4fe567a8fea78b1e4915b9497d8c18ca92f;hp=aa15701b2cb316844dbacfcf8980b5c3de443e39;hpb=9f10bc102adce15a820027777a03e49a7b7623da;p=sbcl.git diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index aa15701..04096e8 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -52,6 +52,8 @@ #include "lispregs.h" #include "arch.h" #include "gc.h" +#include "genesis/primitive-objects.h" +#include "genesis/static-symbols.h" #include "gc-internal.h" #ifdef LISP_FEATURE_SPARC @@ -97,6 +99,9 @@ lispobj (*transother[256])(lispobj object); int (*sizetab[256])(lispobj *where); struct weak_pointer *weak_pointers; +unsigned long bytes_consed_between_gcs = 12*1024*1024; + + /* * copying objects */ @@ -764,7 +769,7 @@ static int #define NWORDS(x,y) (CEILING((x),(y)) / (y)) -scav_string(lispobj *where, lispobj object) +scav_base_string(lispobj *where, lispobj object) { struct vector *vector; int length, nwords; @@ -779,7 +784,7 @@ scav_string(lispobj *where, lispobj object) return nwords; } static lispobj -trans_string(lispobj object) +trans_base_string(lispobj object) { struct vector *vector; int length, nwords; @@ -798,7 +803,7 @@ trans_string(lispobj object) } static int -size_string(lispobj *where) +size_base_string(lispobj *where) { struct vector *vector; int length, nwords; @@ -844,6 +849,26 @@ size_vector(lispobj *where) } static int +scav_vector_nil(lispobj *where, lispobj object) +{ + return 2; +} + +static lispobj +trans_vector_nil(lispobj object) +{ + gc_assert(is_lisp_pointer(object)); + return copy_unboxed_object(object, 2); +} + +static int +size_vector_nil(lispobj *where) +{ + /* Just the header word and the length word */ + return 2; +} + +static int scav_vector_bit(lispobj *where, lispobj object) { struct vector *vector; @@ -1504,16 +1529,25 @@ gc_init_tables(void) scavtab[COMPLEX_LONG_FLOAT_WIDETAG] = scav_unboxed; #endif scavtab[SIMPLE_ARRAY_WIDETAG] = scav_boxed; - scavtab[SIMPLE_STRING_WIDETAG] = scav_string; + scavtab[SIMPLE_BASE_STRING_WIDETAG] = scav_base_string; scavtab[SIMPLE_BIT_VECTOR_WIDETAG] = scav_vector_bit; + scavtab[SIMPLE_ARRAY_NIL_WIDETAG] = scav_vector_nil; scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG] = scav_vector_unsigned_byte_2; scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG] = scav_vector_unsigned_byte_4; + scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG] = + scav_vector_unsigned_byte_8; scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG] = scav_vector_unsigned_byte_8; + scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG] = + scav_vector_unsigned_byte_16; scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG] = scav_vector_unsigned_byte_16; + scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG] = + scav_vector_unsigned_byte_32; + scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG] = + scav_vector_unsigned_byte_32; scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG] = scav_vector_unsigned_byte_32; #ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG @@ -1548,7 +1582,8 @@ gc_init_tables(void) scavtab[SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG] = scav_vector_complex_long_float; #endif - scavtab[COMPLEX_STRING_WIDETAG] = scav_boxed; + scavtab[COMPLEX_BASE_STRING_WIDETAG] = scav_boxed; + scavtab[COMPLEX_VECTOR_NIL_WIDETAG] = scav_boxed; scavtab[COMPLEX_BIT_VECTOR_WIDETAG] = scav_boxed; scavtab[COMPLEX_VECTOR_WIDETAG] = scav_boxed; scavtab[COMPLEX_ARRAY_WIDETAG] = scav_boxed; @@ -1598,17 +1633,26 @@ gc_init_tables(void) transother[COMPLEX_LONG_FLOAT_WIDETAG] = trans_unboxed; #endif transother[SIMPLE_ARRAY_WIDETAG] = trans_boxed; /* but not GENCGC */ - transother[SIMPLE_STRING_WIDETAG] = trans_string; + transother[SIMPLE_BASE_STRING_WIDETAG] = trans_base_string; transother[SIMPLE_BIT_VECTOR_WIDETAG] = trans_vector_bit; transother[SIMPLE_VECTOR_WIDETAG] = trans_vector; + transother[SIMPLE_ARRAY_NIL_WIDETAG] = trans_vector_nil; transother[SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG] = trans_vector_unsigned_byte_2; transother[SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG] = trans_vector_unsigned_byte_4; + transother[SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG] = + trans_vector_unsigned_byte_8; transother[SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG] = trans_vector_unsigned_byte_8; + transother[SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG] = + trans_vector_unsigned_byte_16; transother[SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG] = trans_vector_unsigned_byte_16; + transother[SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG] = + trans_vector_unsigned_byte_32; + transother[SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG] = + trans_vector_unsigned_byte_32; transother[SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG] = trans_vector_unsigned_byte_32; #ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG @@ -1647,8 +1691,9 @@ gc_init_tables(void) transother[SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG] = trans_vector_complex_long_float; #endif - transother[COMPLEX_STRING_WIDETAG] = trans_boxed; + transother[COMPLEX_BASE_STRING_WIDETAG] = trans_boxed; transother[COMPLEX_BIT_VECTOR_WIDETAG] = trans_boxed; + transother[COMPLEX_VECTOR_NIL_WIDETAG] = trans_boxed; transother[COMPLEX_VECTOR_WIDETAG] = trans_boxed; transother[COMPLEX_ARRAY_WIDETAG] = trans_boxed; transother[CODE_HEADER_WIDETAG] = trans_code_header; @@ -1697,17 +1742,26 @@ gc_init_tables(void) sizetab[COMPLEX_LONG_FLOAT_WIDETAG] = size_unboxed; #endif sizetab[SIMPLE_ARRAY_WIDETAG] = size_boxed; - sizetab[SIMPLE_STRING_WIDETAG] = size_string; + sizetab[SIMPLE_BASE_STRING_WIDETAG] = size_base_string; sizetab[SIMPLE_BIT_VECTOR_WIDETAG] = size_vector_bit; sizetab[SIMPLE_VECTOR_WIDETAG] = size_vector; + sizetab[SIMPLE_ARRAY_NIL_WIDETAG] = size_vector_nil; sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG] = size_vector_unsigned_byte_2; sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG] = size_vector_unsigned_byte_4; + sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG] = + size_vector_unsigned_byte_8; sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG] = size_vector_unsigned_byte_8; + sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG] = + size_vector_unsigned_byte_16; sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG] = size_vector_unsigned_byte_16; + sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG] = + size_vector_unsigned_byte_32; + sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG] = + size_vector_unsigned_byte_32; sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG] = size_vector_unsigned_byte_32; #ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG @@ -1742,7 +1796,8 @@ gc_init_tables(void) sizetab[SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG] = size_vector_complex_long_float; #endif - sizetab[COMPLEX_STRING_WIDETAG] = size_boxed; + sizetab[COMPLEX_BASE_STRING_WIDETAG] = size_boxed; + sizetab[COMPLEX_VECTOR_NIL_WIDETAG] = size_boxed; sizetab[COMPLEX_BIT_VECTOR_WIDETAG] = size_boxed; sizetab[COMPLEX_VECTOR_WIDETAG] = size_boxed; sizetab[COMPLEX_ARRAY_WIDETAG] = size_boxed;