Ok, this document will describe protos, ints, blobs, atoms, slots, and their references.

References in the system were Originally 2 bit, now they are 3

  0 - PROTO - Data is a reference
  1 - INT - Data is actual int
  2 - BLOB - Data is a reference
  3 - ATOM - Data is a reference

New Entries
  4 - CODE-PROTO    - Data is a reference - Describes a proto that holds the
                      slots for arguments and locals for a method. This reference is mainly
                      checked by the PASSTHRU cnd CODE routines.
  4 - BLOCK-PROTO   - Data is a reference - Describes a block proto that holds the
                      slots for arguments and locals for a block. This reference is for
                      the push instruction so it can easily detect a block that it needs to clone
                      (which will become a CODE-PROTO).
  5 - CONTEXT-PROTO - Describes an activation record in the stack This is necessary for block protos.
                      Their variables access variables of some other protos via the stack. Therefore,
                      the Frame pointer will have to be set to that context.
                      Upon return, the frame pointer needs to be restored. So, activateSlot will just have to set
                      it different, and the previous.
  7 - FLOAT         - Data is a reference

ATOMS - Since only 21 bits are allowed in the slot keys, this limits us to about 2 million unique
strings in the system.
INT - Since there are only 29 bits for integers, and they are signed, our range is +/- 500 million.
Hopefully, that is enough.

Arrays and Floats could have special attributes in the proto to handle their special cases rather than have a reference. Could have a 'float area', for more efficient storage, but using a full proto will be fine for now.

By going to 3 bit's of data for the reference, the referenced data must be on an 8 byte boundary.

PROTO's are Aligned on 16 byte boundaries Their bitfields describe There is a field which describes the number of data slots in use and slots in use. Data slots are 32 bit fields. Slots are 32 bit fields.

In terms of 32 bit values, here is the structure of a proto on the heap.

0 - Malloc Header/Size - When malloc allocates a block of memory, the first 32 bit pointer, in general, is the
size parameter. It indicates how many bytes are used (with a 16 byte alignment, or chunks). We use the lower 4 bits to indicate special properties of the proto. The high bit is used for indicating a garbage collection marker.
1 - The size field - This is another field that indicates the allocation of the bytes within the proto. The lower 16 bits indicate the number of data slots and key slots. This indicates a maximum of 256 data or key slots.

Later on, we may allow the upper bits to indicate that the object is a float or an array (in smalltalk this is called an indexed type).


The first 21 bits are the Atom reference.
The next 3 are the Action types
Finally, the last 8 bits are for the index into the data slots of the data.

  0 - GET
  1 - SET
  5 - CODE
  7 - ??