X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgc-common.c;h=3caac3b8a7125e8ffe0173af1fbb5446a6b59ba2;hb=63817d29028c8551cda23f432a3328acd7fdd62f;hp=0e94dd413e000968774c96bed582653996cf5329;hpb=832641b988e3898bd87fe7ba47ea6efe7d01b9a2;p=sbcl.git diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 0e94dd4..3caac3b 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -37,6 +37,7 @@ #include "validate.h" #include "lispregs.h" #include "arch.h" +#include "fixnump.h" #include "gc.h" #include "genesis/primitive-objects.h" #include "genesis/static-symbols.h" @@ -107,10 +108,10 @@ copy_object(lispobj object, int nwords) tag = lowtag_of(object); /* Allocate space. */ - new = gc_general_alloc(nwords*4,ALLOC_BOXED,ALLOC_QUICK); + new = gc_general_alloc(nwords*N_WORD_BYTES,ALLOC_BOXED,ALLOC_QUICK); /* Copy the object. */ - memcpy(new,native_pointer(object),nwords*4); + memcpy(new,native_pointer(object),nwords*N_WORD_BYTES); return make_lispobj(new,tag); } @@ -175,7 +176,7 @@ scavenge(lispobj *start, long n_words) } } #endif - else if ((object & 3) == 0) { + else if (fixnump(object)) { /* It's a fixnum: really easy.. */ n_words_scavenged = 1; } else { @@ -399,7 +400,8 @@ trans_return_pc_header(lispobj object) struct code *code, *ncode; return_pc = (struct simple_fun *) native_pointer(object); - offset = HeaderValue(return_pc->header) * 4 ; + /* FIXME: was times 4, should it really be N_WORD_BYTES? */ + offset = HeaderValue(return_pc->header) * N_WORD_BYTES; /* Transport the whole code object */ code = (struct code *) ((unsigned long) return_pc - offset); @@ -453,7 +455,8 @@ trans_fun_header(lispobj object) struct code *code, *ncode; fheader = (struct simple_fun *) native_pointer(object); - offset = HeaderValue(fheader->header) * 4; + /* FIXME: was times 4, should it really be N_WORD_BYTES? */ + offset = HeaderValue(fheader->header) * N_WORD_BYTES; /* Transport the whole code object */ code = (struct code *) ((unsigned long) fheader - offset); @@ -690,8 +693,7 @@ scav_fdefn(lispobj *where, lispobj object) fdefn->raw_addr = (char *)(fdefn->fun + FUN_RAW_ADDR_OFFSET); /* gc.c has more casts here, which may be relevant or alternatively may be compiler warning defeaters. try - fdefn->raw_addr = - (u32) ((char *) LOW_WORD(fdefn->fun)) + FUN_RAW_ADDR_OFFSET; + fdefn->raw_addr = ((char *) LOW_WORD(fdefn->fun)) + FUN_RAW_ADDR_OFFSET; */ return sizeof(struct fdefn) / sizeof(lispobj); } else { @@ -1144,7 +1146,7 @@ scav_vector_single_float(lispobj *where, lispobj object) vector = (struct vector *) where; length = fixnum_value(vector->length); - nwords = CEILING(length + 2, 2); + nwords = CEILING(NWORDS(length, 32) + 2, 2); return nwords; } @@ -1159,7 +1161,7 @@ trans_vector_single_float(lispobj object) vector = (struct vector *) native_pointer(object); length = fixnum_value(vector->length); - nwords = CEILING(length + 2, 2); + nwords = CEILING(NWORDS(length, 32) + 2, 2); return copy_large_unboxed_object(object, nwords); } @@ -1172,7 +1174,7 @@ size_vector_single_float(lispobj *where) vector = (struct vector *) where; length = fixnum_value(vector->length); - nwords = CEILING(length + 2, 2); + nwords = CEILING(NWORDS(length, 32) + 2, 2); return nwords; } @@ -1185,7 +1187,7 @@ scav_vector_double_float(lispobj *where, lispobj object) vector = (struct vector *) where; length = fixnum_value(vector->length); - nwords = CEILING(length * 2 + 2, 2); + nwords = CEILING(NWORDS(length, 64) + 2, 2); return nwords; } @@ -1200,7 +1202,7 @@ trans_vector_double_float(lispobj object) vector = (struct vector *) native_pointer(object); length = fixnum_value(vector->length); - nwords = CEILING(length * 2 + 2, 2); + nwords = CEILING(NWORDS(length, 64) + 2, 2); return copy_large_unboxed_object(object, nwords); } @@ -1213,7 +1215,7 @@ size_vector_double_float(lispobj *where) vector = (struct vector *) where; length = fixnum_value(vector->length); - nwords = CEILING(length * 2 + 2, 2); + nwords = CEILING(NWORDS(length, 64) + 2, 2); return nwords; } @@ -1272,7 +1274,7 @@ scav_vector_complex_single_float(lispobj *where, lispobj object) vector = (struct vector *) where; length = fixnum_value(vector->length); - nwords = CEILING(length * 2 + 2, 2); + nwords = CEILING(NWORDS(length, 64) + 2, 2); return nwords; } @@ -1287,7 +1289,7 @@ trans_vector_complex_single_float(lispobj object) vector = (struct vector *) native_pointer(object); length = fixnum_value(vector->length); - nwords = CEILING(length * 2 + 2, 2); + nwords = CEILING(NWORDS(length, 64) + 2, 2); return copy_large_unboxed_object(object, nwords); } @@ -1300,7 +1302,7 @@ size_vector_complex_single_float(lispobj *where) vector = (struct vector *) where; length = fixnum_value(vector->length); - nwords = CEILING(length * 2 + 2, 2); + nwords = CEILING(NWORDS(length, 64) + 2, 2); return nwords; } @@ -1315,7 +1317,7 @@ scav_vector_complex_double_float(lispobj *where, lispobj object) vector = (struct vector *) where; length = fixnum_value(vector->length); - nwords = CEILING(length * 4 + 2, 2); + nwords = CEILING(NWORDS(length, 128) + 2, 2); return nwords; } @@ -1330,7 +1332,7 @@ trans_vector_complex_double_float(lispobj object) vector = (struct vector *) native_pointer(object); length = fixnum_value(vector->length); - nwords = CEILING(length * 4 + 2, 2); + nwords = CEILING(NWORDS(length, 128) + 2, 2); return copy_large_unboxed_object(object, nwords); } @@ -1343,7 +1345,7 @@ size_vector_complex_double_float(lispobj *where) vector = (struct vector *) where; length = fixnum_value(vector->length); - nwords = CEILING(length * 4 + 2, 2); + nwords = CEILING(NWORDS(length, 128) + 2, 2); return nwords; } @@ -1470,8 +1472,9 @@ static int scav_lose(lispobj *where, lispobj object) { lose("no scavenge function for object 0x%08x (widetag 0x%x)", - (unsigned long)object, - widetag_of(*(lispobj*)native_pointer(object))); + (unsigned long)object, + widetag_of(*(lispobj*)native_pointer(object))); + return 0; /* bogus return value to satisfy static type checking */ } @@ -1640,7 +1643,7 @@ gc_init_tables(void) #endif scavtab[VALUE_CELL_HEADER_WIDETAG] = scav_boxed; scavtab[SYMBOL_HEADER_WIDETAG] = scav_boxed; - scavtab[BASE_CHAR_WIDETAG] = scav_immediate; + scavtab[CHARACTER_WIDETAG] = scav_immediate; scavtab[SAP_WIDETAG] = scav_unboxed; scavtab[UNBOUND_MARKER_WIDETAG] = scav_immediate; scavtab[INSTANCE_HEADER_WIDETAG] = scav_boxed; @@ -1697,7 +1700,7 @@ gc_init_tables(void) trans_vector_unsigned_byte_32; #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG transother[SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG] = - trans_vector_unsigned_byte_32; + trans_vector_unsigned_byte_64; #endif #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG transother[SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG] = @@ -1763,7 +1766,7 @@ gc_init_tables(void) transother[FUNCALLABLE_INSTANCE_HEADER_WIDETAG] = trans_boxed; transother[VALUE_CELL_HEADER_WIDETAG] = trans_boxed; transother[SYMBOL_HEADER_WIDETAG] = trans_boxed; - transother[BASE_CHAR_WIDETAG] = trans_immediate; + transother[CHARACTER_WIDETAG] = trans_immediate; transother[SAP_WIDETAG] = trans_unboxed; transother[UNBOUND_MARKER_WIDETAG] = trans_immediate; transother[WEAK_POINTER_WIDETAG] = trans_weak_pointer; @@ -1892,7 +1895,7 @@ gc_init_tables(void) sizetab[FUNCALLABLE_INSTANCE_HEADER_WIDETAG] = size_boxed; sizetab[VALUE_CELL_HEADER_WIDETAG] = size_boxed; sizetab[SYMBOL_HEADER_WIDETAG] = size_boxed; - sizetab[BASE_CHAR_WIDETAG] = size_immediate; + sizetab[CHARACTER_WIDETAG] = size_immediate; sizetab[SAP_WIDETAG] = size_unboxed; sizetab[UNBOUND_MARKER_WIDETAG] = size_immediate; sizetab[WEAK_POINTER_WIDETAG] = size_weak_pointer;