Merge commit 'cb919480b6f13a5aeb1beb479303a127b2da7890'

This commit is contained in:
Benjamin Vedder 2022-02-15 09:29:40 +01:00
commit 91ec0e0a5f
13 changed files with 113 additions and 50 deletions

View File

@ -32,9 +32,11 @@
#define GC_STACK_SIZE 256
#define PRINT_STACK_SIZE 256
#define HEAP_SIZE 2048
#define EXTENSION_STORAGE_SIZE 256
uint32_t gc_stack_storage[GC_STACK_SIZE];
uint32_t print_stack_storage[PRINT_STACK_SIZE];
extension_fptr extension_storage[EXTENSION_STORAGE_SIZE];
static lbm_cons_t heap[HEAP_SIZE] __attribute__ ((aligned (8)));
@ -195,7 +197,8 @@ int main(void) {
gc_stack_storage, GC_STACK_SIZE,
memory_array, LBM_MEMORY_SIZE_8K,
bitmap_array, LBM_MEMORY_BITMAP_SIZE_8K,
print_stack_storage, PRINT_STACK_SIZE)) {
print_stack_storage, PRINT_STACK_SIZE,
extension_storage, EXTENSION_STORAGE_SIZE)) {
chprintf(chp,"LispBM Init failed.\r\n");
return 0;
}
@ -307,7 +310,8 @@ int main(void) {
gc_stack_storage, GC_STACK_SIZE,
memory_array, LBM_MEMORY_SIZE_8K,
bitmap_array, LBM_MEMORY_BITMAP_SIZE_8K,
print_stack_storage, PRINT_STACK_SIZE);
print_stack_storage, PRINT_STACK_SIZE,
extension_storage, EXTENSION_STORAGE_SIZE);
lbm_add_extension("print", ext_print);

View File

@ -32,11 +32,13 @@
#define EVAL_CPS_STACK_SIZE 256
#define GC_STACK_SIZE 256
#define PRINT_STACK_SIZE 256
#define EXTENSION_STORAGE_SIZE 256
#define HEAP_SIZE 8192
uint32_t gc_stack_storage[256];
uint32_t print_stack_storage[256];
uint32_t gc_stack_storage[GC_STACK_SIZE];
uint32_t print_stack_storage[PRINT_STACK_SIZE];
extension_fptr extension_storage[EXTENSION_STORAGE_SIZE];
lbm_cons_t heap[HEAP_SIZE] __attribute__ ((aligned (8)));
@ -324,7 +326,8 @@ int main(void) {
gc_stack_storage, GC_STACK_SIZE,
memory_array, LBM_MEMORY_SIZE_8K,
bitmap_array, LBM_MEMORY_BITMAP_SIZE_8K,
print_stack_storage, PRINT_STACK_SIZE)) {
print_stack_storage, PRINT_STACK_SIZE,
extension_storage, EXTENSION_STORAGE_SIZE)) {
chprintf(chp,"Initializing LispBM failed\r\n");
return 0;
}

View File

@ -32,9 +32,12 @@
typedef lbm_value (*extension_fptr)(lbm_value*,lbm_uint);
/** Initialize the extensions subsystem.
* \return 1
*
* \param extension_storage Pointer to array of extension_fptr.
* \param extension_storage_size Size of function pointer array.
* \return 1 on success and 0 for failure
*/
extern int lbm_extensions_init(void);
extern int lbm_extensions_init(extension_fptr *extension_storage, int extension_storage_size);
/** Look up an extension associated with a key symbol.
*
* \param sym Symbol bound to the extension to look for.

View File

@ -20,27 +20,22 @@
#ifndef LBM_VERSION_H_
#define LBM_VERSION_H_
/* Approach to versions.
* Major version changes when there are interface breaking changes.
* Minor Backwards compatible additions.
* Patch Backwards compatible bug fixes or tweaks.
*/
/** LBM major version */
#define LBM_MAJOR_VERSION 0
/** LBM minor version */
#define LBM_MINOR_VERSION 2
#define LBM_MINOR_VERSION 3
/** LBM patch revision */
#define LBM_PATCH_VERSION 0
/* Change log */
/* Feb 14 2022: version 0.3.0
Extensions are stored in an array and occupy a range of dedicated symbol values.
/* Feb 14 2022: version 0.2.0
Added GEQ >= and LEQ <= comparisons.
/* Feb 13 2022: version 0.1.1
/* Feb 13 2022: version 0.1.1
Bug fix in handling of environments in progn. */
/* Feb 11 2022: First state to be given a numbered version (0.1.0) */

View File

@ -50,12 +50,15 @@
* \param bitmap_size Size of the memory meta-data array.
* \param print_stack_storage Pointer to uint32_t array to use as print_value stack.
* \param print_stack_size Size in number of uint32_t values of the print stack.
* \param extension_storage Pointer to array of extension_fptr.
* \param extension_storage_size Size of extension array.
* \return 1 on success and 0 on failure.
*/
extern int lbm_init(lbm_cons_t *heap_storage, uint32_t heap_size,
uint32_t *gc_stack_storage, uint32_t gc_stack_size,
uint32_t *memory, uint32_t memory_size,
uint32_t *memory_bitmap, uint32_t bitmap_size,
uint32_t *print_stack_storage, uint32_t print_stack_size);
uint32_t *print_stack_storage, uint32_t print_stack_size,
extension_fptr *extension_storage, int extension_storage_size );
#endif

View File

@ -166,6 +166,9 @@
#define FUNDAMENTALS_END 0x200
#define MAX_SPECIAL_SYMBOLS 4096 // 12bits (highest id allowed is 0xFFFF)
#define MAX_EXTENSION_SYMBOLS 4096 // 12bits 0x10000 - 0x1FFFF
#define MAX_SYMBOL_VALUE 0x0FFFFFFF
/** Initialize the symbol table.
*
@ -186,6 +189,14 @@ extern int lbm_add_symbol(char *name, lbm_uint *id);
* \return 1 for success and 0 for failure.
*/
extern int lbm_add_symbol_const(char *name, lbm_uint *id);
/** Add an extension symbol to the symbol table.
* The name is assumed to be statically allocated.
*
* \param name Statically allocated name string.
* \param id Resulting id is returned through this argument.
* \return 1 for success and 0 for failure.
*/
extern int lbm_add_extension_symbol_const(char *name, lbm_uint* id);
/** Look up an id from the symbol table given a name.
*
* \param name Name string to look up.

View File

@ -30,9 +30,11 @@
#define EVAL_CPS_STACK_SIZE 256
#define GC_STACK_SIZE 256
#define PRINT_STACK_SIZE 256
#define EXTENSION_STORAGE_SIZE 256
uint32_t gc_stack_storage[GC_STACK_SIZE];
uint32_t print_stack_storage[PRINT_STACK_SIZE];
extension_fptr extension_storage[EXTENSION_STORAGE_SIZE];
static volatile bool allow_print = true;
@ -339,7 +341,8 @@ int main(int argc, char **argv) {
gc_stack_storage, GC_STACK_SIZE,
memory, LBM_MEMORY_SIZE_8K,
bitmap, LBM_MEMORY_BITMAP_SIZE_8K,
print_stack_storage, PRINT_STACK_SIZE);
print_stack_storage, PRINT_STACK_SIZE,
extension_storage, EXTENSION_STORAGE_SIZE);
lbm_set_ctx_done_callback(done_callback);
lbm_set_timestamp_us_callback(timestamp_callback);
@ -461,7 +464,8 @@ int main(int argc, char **argv) {
gc_stack_storage, GC_STACK_SIZE,
memory, LBM_MEMORY_SIZE_8K,
bitmap, LBM_MEMORY_BITMAP_SIZE_8K,
print_stack_storage, PRINT_STACK_SIZE);
print_stack_storage, PRINT_STACK_SIZE,
extension_storage, EXTENSION_STORAGE_SIZE);
lbm_add_extension("print", ext_print);
} else if (strncmp(str, ":prelude", 8) == 0) {

View File

@ -1323,7 +1323,7 @@ static inline void cont_application(eval_context_t *ctx) {
}
break;
} else {
// It may be an extension
// It may be an extension
extension_fptr f = lbm_get_extension(lbm_dec_sym(fun));
if (f == NULL) {
error_ctx(lbm_enc_sym(SYM_EERROR));

View File

@ -24,48 +24,50 @@
#include "extensions.h"
static int ext_offset = MAX_SPECIAL_SYMBOLS;
static int ext_max = -1;
static extension_fptr *extension_table = NULL;
#define SYM 0
#define FPTR 1
#define NEXT 2
/* typedef struct s_extension_function{ */
/* VALUE sym; */
/* extension_fptr ext_fun; */
/* struct s_extension_function* next; */
/* } extension_function_t; */
uint32_t* extensions = NULL;
int lbm_extensions_init(void) {
extensions = NULL;
int lbm_extensions_init(extension_fptr *extension_storage, int extension_storage_size) {
if (extension_storage == NULL) return 0;
extension_table = extension_storage;
ext_max = extension_storage_size;
return 1;
}
extension_fptr lbm_get_extension(lbm_uint sym) {
uint32_t *t = extensions;
while (t != NULL) {
if (t[SYM] == sym) {
return (extension_fptr)t[FPTR];
}
t = (uint32_t*)t[NEXT];
int ext_next = (int)sym - ext_offset;
if (ext_next < 0 || ext_next > ext_max) {
return NULL;
}
return NULL;
return extension_table[ext_next];
}
bool lbm_add_extension(char *sym_str, extension_fptr ext) {
lbm_value symbol;
int res = lbm_add_symbol_const(sym_str, &symbol);
int res = lbm_add_extension_symbol_const(sym_str, &symbol);
if (!res) return false;
uint32_t *m = lbm_memory_allocate(3); /* 3 words */
int ext_next = (int)symbol - ext_offset;
if (!m) return false;
if (ext_next < 0 || ext_next > ext_max) {
return false;
}
extension_table[ext_next] = ext;
m[SYM] = symbol;
m[FPTR] = (uint32_t) ext;
m[NEXT] = (uint32_t) extensions;
extensions = m;
return true;
}

View File

@ -21,7 +21,8 @@ int lbm_init(lbm_cons_t *heap_storage, uint32_t heap_size,
uint32_t *gc_stack_storage, uint32_t gc_stack_size,
uint32_t *memory, uint32_t memory_size,
uint32_t *memory_bitmap, uint32_t bitmap_size,
uint32_t *print_stack_storage, uint32_t print_stack_size) {
uint32_t *print_stack_storage, uint32_t print_stack_size,
extension_fptr *extension_storage, int extension_storage_size ) {
if (lbm_print_init(print_stack_storage, print_stack_size) == 0)
return 0;
@ -42,7 +43,7 @@ int lbm_init(lbm_cons_t *heap_storage, uint32_t heap_size,
if (lbm_eval_init() == 0)
return 0;
if (lbm_extensions_init() == 0)
if (lbm_extensions_init(extension_storage, extension_storage_size) == 0)
return 0;
return 1;

View File

@ -163,13 +163,15 @@ special_sym const special_symbols[NUM_SPECIAL_SYMBOLS] = {
{"is-fundamental" , SYM_IS_FUNDAMENTAL}
};
#define RUNTIME_SYMBOLS_START (MAX_SPECIAL_SYMBOLS + MAX_EXTENSION_SYMBOLS)
static uint32_t *symlist = NULL;
static lbm_uint next_symbol_id = 0;
static lbm_uint next_symbol_id = RUNTIME_SYMBOLS_START;
static lbm_uint next_extension_symbol_id = MAX_SPECIAL_SYMBOLS;
int lbm_symrepr_init(void) {
symlist = NULL;
next_symbol_id = 0;
next_symbol_id = RUNTIME_SYMBOLS_START;
return 1;
}
@ -255,7 +257,7 @@ int lbm_add_symbol(char *name, lbm_uint* id) {
m[NEXT] = (uint32_t) symlist;
symlist = m;
}
m[ID] = MAX_SPECIAL_SYMBOLS + next_symbol_id++;
m[ID] = next_symbol_id++;
*id = m[ID];
return 1;
}
@ -278,11 +280,36 @@ int lbm_add_symbol_const(char *name, lbm_uint* id) {
m[NEXT] = (uint32_t) symlist;
symlist = m;
}
m[ID] = MAX_SPECIAL_SYMBOLS + next_symbol_id++;
m[ID] = next_symbol_id++;
*id = m[ID];
return 1;
}
int lbm_add_extension_symbol_const(char *name, lbm_uint* id) {
if (strlen(name) == 0) return 0; // failure if empty symbol
if (next_extension_symbol_id >= RUNTIME_SYMBOLS_START) return 0;
uint32_t *m = lbm_memory_allocate(3);
if (m == NULL) {
return 0;
}
m[NAME] = (uint32_t)name;
if (symlist == NULL) {
m[NEXT] = (uint32_t) NULL;
symlist = m;
} else {
m[NEXT] = (uint32_t) symlist;
symlist = m;
}
m[ID] = next_extension_symbol_id++;
*id = m[ID];
return 1;
}
unsigned int lbm_get_symbol_table_size(void) {
unsigned int n = 0;

View File

@ -440,7 +440,7 @@ int tok_F(lbm_tokenizer_char_stream_t *str, lbm_float *res) {
for (i = 0; i < m; i ++) {
fbuf[i] = get(str);
}
fbuf[i] = 0;
*res = (float)strtod(fbuf, NULL);
return (int)n;

View File

@ -30,9 +30,11 @@
#define EVAL_CPS_STACK_SIZE 256
#define GC_STACK_SIZE 256
#define PRINT_STACK_SIZE 256
#define EXTENSION_STORAGE_SIZE 256
uint32_t gc_stack_storage[GC_STACK_SIZE];
uint32_t print_stack_storage[PRINT_STACK_SIZE];
extension_fptr *extension_storage[EXTENSION_STORAGE_SIZE];
/* Tokenizer state for strings */
static lbm_tokenizer_string_state_t string_tok_state;
@ -216,6 +218,14 @@ int main(int argc, char **argv) {
return 0;
}
res = lbm_extensions_init(extension_storage, EXTENSION_STORAGE_SIZE);
if (res)
printf("Extensions initialized.\n");
else {
printf("Error initializing extensions.\n");
return 0;
}
res = lbm_add_extension("ext-even", ext_even);
if (res)
printf("Extension added.\n");