diff --git a/src/c/debug.h b/src/c/debug.h index dc833dd..1f66a9f 100644 --- a/src/c/debug.h +++ b/src/c/debug.h @@ -17,6 +17,11 @@ #include #include +/* + * wide characters + */ +#include +#include /** * @brief Print messages debugging memory allocation. diff --git a/src/c/memory/header.h b/src/c/memory/header.h index 429cda1..42fa488 100644 --- a/src/c/memory/header.h +++ b/src/c/memory/header.h @@ -29,7 +29,7 @@ struct pso_header { char mnemonic[TAGLENGTH]; /** size class for this object */ uint8_t size_class; - } tag; + } bytes; /** the tag considered as a number */ uint32_t value; } tag; diff --git a/src/c/memory/memory.h b/src/c/memory/memory.h index fc242c2..33e9d39 100644 --- a/src/c/memory/memory.h +++ b/src/c/memory/memory.h @@ -21,7 +21,7 @@ * since managed objects require a two word header; it's unlikely that * these undersized size classes will be used at all. */ -#define MAX_SIZE_CLASS = 0xf +#define MAX_SIZE_CLASS 0xf int initialise_memory( ); diff --git a/src/c/memory/page.c b/src/c/memory/page.c index 1486301..2fdaf79 100644 --- a/src/c/memory/page.c +++ b/src/c/memory/page.c @@ -9,7 +9,10 @@ #include #include +#include +#include +#include "debug.h" #include "memory/memory.h" #include "memory/node.h" #include "memory/page.h" @@ -36,13 +39,13 @@ * to hold the number of pages we *might* create at start up time. We need a * way to grow the number of pages, while keeping access to them cheap. */ -struct page * pages[NPAGES]; +union page * pages[NPAGES]; /** * @brief the number of pages which have thus far been allocated. * */ -uint32_t npages_allocated = 0 +uint32_t npages_allocated = 0; /** * @brief private to allocate_page; do not use. @@ -51,10 +54,11 @@ uint32_t npages_allocated = 0 * @param page_index its location in the pages[] array; * @param size_class the size class of objects in this page; * @param freelist the freelist for objects of this size class. - * @return struct cons_pointer the new head for the freelist for this size_class, + * @return struct pso_pointer the new head for the freelist for this size_class, */ -struct cons_pointer initialise_page( struct page * page_addr, uint16_t page_index, uint8_t size_class, pso_pointer freelist) { - struct cons_pointer result = freelist; +struct pso_pointer initialise_page( union page* page_addr, uint16_t page_index, + uint8_t size_class, struct pso_pointer freelist) { + struct pso_pointer result = freelist; int obj_size = pow(2, size_class); int obj_bytes = obj_size * sizeof(uint64_t); int objs_in_page = PAGE_BYTES/obj_bytes; @@ -64,16 +68,14 @@ struct cons_pointer initialise_page( struct page * page_addr, uint16_t page_inde // `nil` and the next on for `t`. for (int i = objs_in_page - 1; i >= 0; i--) { // it should be safe to cast any pso object to a pso2 - struct pso2* object = (pso2 *)(page_addr + (i * obj_bytes)); + struct pso2* object = (struct pso2 *)(page_addr + (i * obj_bytes)); - object->header.tag.size_class = size_class; - strncpy( (char *)(object->header.tag.mnemonic), FREETAG, TAGLENGTH); + object->header.tag.bytes.size_class = size_class; + strncpy( (char *)(object->header.tag.bytes.mnemonic), FREETAG, TAGLENGTH); object->payload.free.next = result; result = make_pointer( node_index, page_index, (uint16_t)( i * obj_size)); } - - return result; } /** @@ -89,8 +91,8 @@ struct cons_pointer initialise_page( struct page * page_addr, uint16_t page_inde * @param size_class an integer in the range 0...MAX_SIZE_CLASS. * @return t on success, an exception if an error occurred. */ -struct cons_pointer allocate_page( uint8_t size_class ) { - struct cons_pointer result = t; +struct pso_pointer allocate_page( uint8_t size_class ) { + struct pso_pointer result = t; if ( npages_allocated == 0) { for (int i = 0; i < NPAGES; i++) { @@ -101,17 +103,17 @@ struct cons_pointer allocate_page( uint8_t size_class ) { if ( npages_allocated < NPAGES) { if ( size_class >= 2 && size_class <= MAX_SIZE_CLASS ) { - result = malloc( sizeof( page ) ); + void* pg = malloc( sizeof( union page ) ); - if ( result != NULL ) { - memset( result, 0, sizeof( page ) ); - pages[ npages_allocated] = result; + if ( pg != NULL ) { + memset( pg, 0, sizeof( union page ) ); + pages[ npages_allocated] = pg; debug_printf( DEBUG_ALLOC, 0, L"Allocated page %d for objects of size class %x.\n", npages_allocated, size_class); freelists[size_class] = - initialise_page( result, npages_allocated, size_class, freelists[size_class] ); + initialise_page( (union page*)pg, npages_allocated, size_class, freelists[size_class] ); debug_printf( DEBUG_ALLOC, 0, L"Initialised page %d; freelist for size class %x updated.\n", diff --git a/src/c/memory/page.h b/src/c/memory/page.h index 522b2fa..b5285f5 100644 --- a/src/c/memory/page.h +++ b/src/c/memory/page.h @@ -10,6 +10,7 @@ #ifndef __psse_memory_page_h #define __psse_memory_page_h +#include "memory/pointer.h" #include "memory/pso2.h" #include "memory/pso3.h" #include "memory/pso4.h" @@ -38,7 +39,7 @@ */ #define NPAGES 64 -extern struct page *pages[NPAGES]; +extern union page *pages[NPAGES]; /** * @brief A page is a megabyte of memory which contains objects all of which @@ -53,22 +54,25 @@ extern struct page *pages[NPAGES]; * collection they will be returned to that freelist. */ union page { - uint8_t[PAGE_BYTES] bytes; - uint64_t[PAGE_BYTES / 8] words; - struct pso2[PAGE_BYTES / 32] pso2s; - struct pso3[PAGE_BYTES / 64] pso3s; - struct pso4[PAGE_BYTES / 128] pso4s; - struct pso5[PAGE_BYTES / 256] pso5s; - struct pso6[PAGE_BYTES / 512] pso6s; - struct pso7[PAGE_BYTES / 1024] pso7s; - struct pso8[PAGE_BYTES / 2048] pso8s; - struct pso9[PAGE_BYTES / 4096] pso9s; - struct psoa[PAGE_BYTES / 8192] psoas; - struct psob[PAGE_BYTES / 16384] psobs; - struct psoc[PAGE_BYTES / 32768] psocs; - struct psod[PAGE_BYTES / 65536] psods; - struct psoe[PAGE_BYTES / 131072] psoes; - struct psof[PAGE_BYTES / 262144] psofs; + uint8_t bytes[PAGE_BYTES]; + uint64_t words[PAGE_BYTES / 8]; + struct pso2 pso2s[PAGE_BYTES / 32]; + struct pso3 pso3s[PAGE_BYTES / 64]; + struct pso4 pso4s[PAGE_BYTES / 128]; + struct pso5 pso5s[PAGE_BYTES / 256]; + struct pso6 pso6s[PAGE_BYTES / 512]; + struct pso7 pso7s[PAGE_BYTES / 1024]; + struct pso8 pso8s[PAGE_BYTES / 2048]; + struct pso9 pso9s[PAGE_BYTES / 4096]; + struct psoa psoas[PAGE_BYTES / 8192]; + struct psob psobs[PAGE_BYTES / 16384]; + struct psoc psocs[PAGE_BYTES / 32768]; + struct psod psods[PAGE_BYTES / 65536]; + struct psoe psoes[PAGE_BYTES / 131072]; + struct psof psofs[PAGE_BYTES / 262144]; }; +struct pso_pointer initialise_page( union page * page_addr, uint16_t page_index, + uint8_t size_class, struct pso_pointer freelist); + #endif diff --git a/src/c/memory/pso2.h b/src/c/memory/pso2.h index 9e838c4..e8305d0 100644 --- a/src/c/memory/pso2.h +++ b/src/c/memory/pso2.h @@ -24,7 +24,7 @@ #include "payloads/special.h" #include "payloads/string.h" #include "payloads/symbol.h" -#include "payloads/time.h" +// #include "payloads/time.h" #include "payloads/vector_pointer.h" #include "payloads/write_stream.h" @@ -45,7 +45,7 @@ struct pso2 { struct lambda_payload lambda; // struct special_payload special; struct stream_payload stream; - struct time_payload time; +// struct time_payload time; struct vectorp_payload vectorp; } payload; }; diff --git a/src/c/payloads/cons.c b/src/c/payloads/cons.c index 5eaf2b6..6a002c8 100644 --- a/src/c/payloads/cons.c +++ b/src/c/payloads/cons.c @@ -12,6 +12,7 @@ #include "memory/node.h" #include "memory/pointer.h" #include "memory/pso.h" +#include "memory/pso2.h" #include "payloads/cons.h" /** diff --git a/src/c/payloads/stack.c b/src/c/payloads/stack.c index 484c13d..5cb2113 100644 --- a/src/c/payloads/stack.c +++ b/src/c/payloads/stack.c @@ -8,12 +8,10 @@ */ #include "memory/node.h" -#include "memory/pso.h" +#include "memory/pso2.h" +#include "memory/pso4.h" #include "payloads/stack.h" -#define STACKTAG "STK" -#define STACKTV 4936787 - /** * @brief The maximum depth of stack before we throw an exception. * diff --git a/src/c/payloads/stack.h b/src/c/payloads/stack.h index 23fb8e5..4225dbc 100644 --- a/src/c/payloads/stack.h +++ b/src/c/payloads/stack.h @@ -13,8 +13,9 @@ #define __psse_payloads_stack_h #include "memory/pointer.h" -#include "memory/pso2.h" -#include "memory/pso4.h" + +#define STACKTAG "STK" +#define STACKTV 4936787 /* * number of arguments stored in a stack frame diff --git a/src/c/payloads/time.h b/src/c/payloads/time.h index fd67716..cc1ef0a 100644 --- a/src/c/payloads/time.h +++ b/src/c/payloads/time.h @@ -26,7 +26,7 @@ * convenience, 14Bn years before 1st Jan 1970 (the UNIX epoch)) */ struct time_payload { - unsigned __int128 value; + unsigned __int128_t value; }; #endif diff --git a/src/c/psse.c b/src/c/psse.c index 5c67b6f..5f5f2fb 100644 --- a/src/c/psse.c +++ b/src/c/psse.c @@ -99,7 +99,7 @@ int main( int argc, char *argv[] ) { initialise_node( 0 ); - repl( ); + // repl( ); exit( 0 ); } diff --git a/src/c/psse.h b/src/c/psse.h index 0c57020..0fe9b43 100644 --- a/src/c/psse.h +++ b/src/c/psse.h @@ -24,7 +24,7 @@ #include "debug.h" #include "memory/memory.h" -#include "memory/stack.h" +#include "payloads/stack.h" #include "version.h" #endif