/* * AUTOMATIC COMPACTING OBJECT HEAP SYSTEM * * Allows one to create one of two basic heap objects: an array of bytes and * a vector of object pointers. The heap will automatically compact memory * to a new heap area. To keep your code correct, each object variable must * be registered. Each object also allows for 7 bits of 'type' data. * */ #ifndef _MEM_H #define _MEM_H /* TUNEABLE PARAMETERS FOR THE COMPACTING GARBAGE COLLECTOR. */ #define INCREMENT_HEAP_SIZE 0x100000 #define DECREMENT_HEAP_SIZE 0x000100 #include "globals.h" /* REGISTERS */ extern OBJ r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf, stack; extern OBJ *sp; typedef U32 desc_t; /* CLASS (2bits) ID (6) AND SIZE (24) */ #define DESC_SIZE sizeof(desc_t) /* TWO BITS FOR OBJECT CLASS SIX BITS FOR OBJECT ID */ #define DESC_TYPE_MASK 0xff000000 #define DESC_LENGTH_MASK 0x00ffffff #define TYPE_CLASS_MASK 0xc0 #define TYPE_ID_MASK 0x3f #define ARRAY_CLASS 0x00 #define DIRTY_CLASS 0x40 #define VECTOR_CLASS 0x80 #define STACK_CLASS 0xc0 #define MAKE_ARRAY_TYPE(i) (ARRAY_CLASS |(i)) #define MAKE_DIRTY_TYPE(i) (DIRTY_CLASS |(i)) #define MAKE_VECTOR_TYPE(i) (VECTOR_CLASS|(i)) #define MAKE_STACK_TYPE(i) (STACK_CLASS |(i)) //#define SHADOW_TYPE (VECTOR_CLASS | TYPE_ID_MASK) #define SHADOW_TYPE 0xff #define MAKE_DESC(t,l) (((t)<<24)|(l)) #define ary_to_size(l) ((3+(l))&-sizeof(OBJ)) #define vec_to_size(l) ((l)*sizeof(OBJ)) void obj_type_set (OBJ o, U8 t); /* MUTATE AN OBJECTS TYPE */ U8 obj_type (OBJ o); /* RETURNS 8BIT TYPE (CLASS | ID) */ U32 obj_len (OBJ o); /* RETURNS NUMBER OF ELEMENTS IN OBJECT */ /* THIS MUST BE CALLED BEFORE USAGE OF THIS LIBRARY */ void mem_init (void); U32 mem_heap_size (void); U32 mem_heap_count (void); U32 mem_heap_free (void); U32 mem_heap_gccount(void); void mem_heap_inc_dirtycount(void); /* RETURNS THE ADDRESS OF AN ARRAY/VECTOR ELEMENT. */ U8* mem_ary_ref (OBJ o, U32 r); void* mem_drt_clnr(OBJ o); /* RETURNS ADDRESS OF OBJECT CLEANER */ void* mem_drt_ref (OBJ o, U32 r); /* RETURNS ADDRESS OF DIRTY C OBJECT */ OBJ* mem_vec_ref (OBJ o, U32 r); OBJ* mem_stk_ref (OBJ o, U32 r); /* RETURNS ELEMENT OF THE ARRAY/VECTOR. */ U8 mem_ary_obj (OBJ o, U32 r); OBJ mem_vec_obj (OBJ o, U32 r); OBJ mem_stk_obj (OBJ o, U32 r); U32 mem_stk_count (OBJ o); /* MUTATE AN OBJECT ARRAY/VECTOR ENTRY. */ void mem_ary_set (OBJ o, U32 r, U8 p); void mem_vec_set (OBJ o, U32 r, OBJ p); void stack_push (OBJ o); OBJ stack_pop (void); OBJ stack_peek (U32 I); /* CREATE NEW OBJECTS IN THE HEAP */ void mem_obj_new (desc_t desc, U32 size); void mem_obj_new_static (desc_t desc, U32 size); #define mem_new_ary(t,l) (mem_obj_new(MAKE_DESC(t,l),ary_to_size(l))) #define mem_new_static(t,l) (mem_obj_new_static(MAKE_DESC(t,l),ary_to_size(l))) #define mem_new_drt(t,l) (mem_obj_new(MAKE_DESC(t,sizeof(void*)+l),ary_to_size(sizeof(void*)+l)),mem_heap_inc_dirtycount()) #define mem_new_vec(t,l) (mem_obj_new(MAKE_DESC(t,l),vec_to_size(l))) /* THE FIRST ITEM IN A STACK (VECTOR) IS U32 REPRESENTING OBJECT COUNT*/ #define mem_new_stk(t,l) (mem_obj_new(MAKE_DESC(t,l),vec_to_size(l))) /* SWAP STACK WITH ACC */ void mem_swap_stack (void); /* FORCE GARBAGE COLLECTION. PASSED SIZE OF DESIRED OBJECT SIZE FOR NEXT NEW. */ void mem_gc (U32 desired); /* DEVELOPMENT DEBUGGING AIDS. */ void mem_heap_info (void); void mem_stats_dump (void); void mem_heap_obj_dump (OBJ o); /*void mem_obj_dump (OBJ o);*/ #endif