Fix genesis bug that manifested in scav_vector().
commitba8910dec886e02345448c01edfa728dbb7fbcae
authorDouglas Katzman <dougk@google.com>
Sun, 10 Apr 2016 04:24:21 +0000 (10 00:24 -0400)
committerDouglas Katzman <dougk@google.com>
Sun, 10 Apr 2016 04:24:21 +0000 (10 00:24 -0400)
tree210b5dbfd3e74899f327751db96a08d4e1ad229b
parentd9450cbb8891937a9c5adcf00445443c714898c5
Fix genesis bug that manifested in scav_vector().

scav_vector(), when it scavenged a vector backing a hash-table,
invoked scavenge() on a hash-table using an 'n_words' value computed from
sizeof(hash_table), not the sizetab[] function on the table.
This was a right only by accident. If the C struct was slightly different,
the n_words computation might disagree with the number of words that instance
scavenging actually scanned based on the instance header.
This is because write-structure-object would omit a raw slot from C
unless followed by a non-raw slot; and the compensation for dd-length
worked only if no slots had been omitted. So by messing with slot order,
you could violate the assertion at line 168 of gc-common that scavenging
didn't go past the expected end pointer calculated from n_words.
src/compiler/generic/genesis.lisp