X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgc-common.c;h=8e8b3fa244598cc0e8e871ee1afc66fcc7289871;hb=e3547b45241fdc4a2aaab382f1e7e8f71566beba;hp=c08309695b4bfb1b6d95d84e9532eca15a7d3c06;hpb=e01e7a01b67b98a47730a08dfa5d0d58518486ea;p=sbcl.git diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index c083096..8e8b3fa 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -41,6 +41,7 @@ #include "gc.h" #include "genesis/primitive-objects.h" #include "genesis/static-symbols.h" +#include "genesis/layout.h" #include "gc-internal.h" #ifdef LISP_FEATURE_SPARC @@ -643,6 +644,24 @@ scav_boxed(lispobj *where, lispobj object) return 1; } +static long +scav_instance(lispobj *where, lispobj object) +{ + lispobj nuntagged; + long ntotal = HeaderValue(object); + lispobj layout = ((struct instance *)native_pointer(where))->slots[0]; + + if (!layout) + return 1; + if (forwarding_pointer_p(native_pointer(layout))) + layout = (lispobj) forwarding_pointer_value(native_pointer(layout)); + + nuntagged = ((struct layout *)native_pointer(layout))->n_untagged_slots; + scavenge(where + 1, ntotal - fixnum_value(nuntagged)); + + return ntotal + 1; +} + static lispobj trans_boxed(lispobj object) { @@ -1708,7 +1727,7 @@ gc_init_tables(void) scavtab[CHARACTER_WIDETAG] = scav_immediate; scavtab[SAP_WIDETAG] = scav_unboxed; scavtab[UNBOUND_MARKER_WIDETAG] = scav_immediate; - scavtab[INSTANCE_HEADER_WIDETAG] = scav_boxed; + scavtab[INSTANCE_HEADER_WIDETAG] = scav_instance; #ifdef LISP_FEATURE_SPARC scavtab[FDEFN_WIDETAG] = scav_boxed; #else