seems I already had a copy of this paper...
however, lacking a post-script viewer, I invoked ghostscript to convert
it into a PDF so I could view it in Acrobat Reader.
but, anyways, by this paper, my scheme is a hybrid of object-pointers
and typed-locations.
in the case of my system, the GC stores the type in the memory-block
header (along with the object size, some GC-related bits, ...). this is
mostly hidden from any client code though (it sees an interface which
looks/behaves much like "malloc", but with an optional type-name field).
generally, I represent most dynamic types as string-based names
(internally to the GC though, they are represented as type-numbers which
are keyed to a hash table, with a number of special-case types having
been micro-optimized).
locations outside the address-space proper are used for encoding some
special cases, such as the space from 0xC0000000..0xFFFFFFFF on 32-bit
x86 and ARM (except in certain cases).
on x86-64, a 56-bit space starting at 0x7F000000_00000000 is used
instead (it is divided up into 48-bit regions).
these regions encode "fixnum" and "flonum" types, among others (allowing
for 28 bit fixnum and flonum types on x86 and ARM, and 48 on x86-64).
an edge case is if using Linux with a full 4GB addressable space, in
which case it will resort to using "mmap" to reserve 24-bit regions for
fixnum and flonum.
"cons cells" are also handled specially by the GC, as my scripting
language (unlike a "proper" JavaScript variant) internally makes fairly
heavy use of cons-cells and lists (the VM more-or-less descended from a
Scheme implementation...).
some other parts of the type-system use a JVM-style "signature string"
system (though the notation is a bit more complex, and is based more
closely on the IA64 C++ ABI, but is technically a hybrid notation).
there is also a database-system thrown into the mix (albeit a
system-registry-like hierarchical system), ...
a lot of this is for things like "hey, here is a pointer to some random
C struct, give me the value of the field named N" and similar (so the
system will try to figure out the type of struct pointed to by the
pointer, look up the field, and fetch the value).
or such...