LispBM can encode values of 4 different types into the
car
or cdr
of a cons-cell. How this works can
be found in the earler walkthrough of lispBM.
The 4 types that can be encoded are, symbol
,
character
, integer
and
unsigned integer
. All of these types are 28Bit.
To be able to express computations on 32Bit values,
integer
, unsigned integer
and
float
as well as arrays, a set of boxed types were
introduced.
The boxed values, except arrays, are stored in cons cells but have an extra level of indirection in the form of a typed pointer. Since the lisp heap is small there are unused bits on the most significant side. The 4 most significant bits are used to encode different typed pointers. Currently the following kinds of typed pointers are in use:
#define PTR_TYPE_CONS 0x10000000u
#define PTR_TYPE_BOXED_I 0x20000000u
#define PTR_TYPE_BOXED_U 0x30000000u
#define PTR_TYPE_BOXED_F 0x40000000u
#define PTR_TYPE_ARRAY 0xD0000000u
As an example, a float value is encoded as a cons cell where all the
32Bits of the car
are used for the floating point value.
The cdr
of this cell contail a special symbol
DEF_REPR_BOXED_F_TYPE
. The special symbols used in the
cdr
position of boxed values are listed below.
#define DEF_REPR_ARRAY_TYPE 0x20FFFF
#define DEF_REPR_BOXED_I_TYPE 0x21FFFF
#define DEF_REPR_BOXED_U_TYPE 0x22FFFF
#define DEF_REPR_BOXED_F_TYPE 0x23FFFF
Only the cdr
field of a cons cell hold a GC bit so there
is no problem in using all 32Bits of the car
if only it can
be identified properly.
Arrays are a special case and not fully implemented yet. Currently
the only thing that is an array in lispBM is a text string. Most of the
plumbing is there for implementing arrays of any other lispBM value
type, it just needs to be hacked up. Arrays are encoded in a very
similar way to boxed values, just that instead of a 32Bit value in the
car
slot there is an arbitrary pointer. The array storage
itself is allocated using malloc
. When garbage collection
frees a cons cell with the special symbol
DEF_REPR_ARRAY_TYPE
, it also calls free
on the
pointer in the car
position.