Replace symbol_t with struct
This commit is contained in:
parent
193ced5e73
commit
c9f5e4faeb
15
c/builtins.c
15
c/builtins.c
|
@ -148,14 +148,15 @@ static value_t fl_symbol(value_t *args, u_int32_t nargs)
|
|||
static value_t fl_keywordp(value_t *args, u_int32_t nargs)
|
||||
{
|
||||
argcount("keyword?", nargs, 1);
|
||||
return (issymbol(args[0]) && iskeyword((symbol_t *)ptr(args[0]))) ? FL_T
|
||||
: FL_F;
|
||||
return (issymbol(args[0]) && iskeyword((struct symbol *)ptr(args[0])))
|
||||
? FL_T
|
||||
: FL_F;
|
||||
}
|
||||
|
||||
static value_t fl_top_level_value(value_t *args, u_int32_t nargs)
|
||||
{
|
||||
argcount("top-level-value", nargs, 1);
|
||||
symbol_t *sym = tosymbol(args[0], "top-level-value");
|
||||
struct symbol *sym = tosymbol(args[0], "top-level-value");
|
||||
if (sym->binding == UNBOUND)
|
||||
fl_raise(fl_list2(UnboundError, args[0]));
|
||||
return sym->binding;
|
||||
|
@ -164,13 +165,13 @@ static value_t fl_top_level_value(value_t *args, u_int32_t nargs)
|
|||
static value_t fl_set_top_level_value(value_t *args, u_int32_t nargs)
|
||||
{
|
||||
argcount("set-top-level-value!", nargs, 2);
|
||||
symbol_t *sym = tosymbol(args[0], "set-top-level-value!");
|
||||
struct symbol *sym = tosymbol(args[0], "set-top-level-value!");
|
||||
if (!isconstant(sym))
|
||||
sym->binding = args[1];
|
||||
return args[1];
|
||||
}
|
||||
|
||||
static void global_env_list(symbol_t *root, value_t *pv)
|
||||
static void global_env_list(struct symbol *root, value_t *pv)
|
||||
{
|
||||
while (root != NULL) {
|
||||
if (root->name[0] != ':' && (root->binding != UNBOUND)) {
|
||||
|
@ -181,7 +182,7 @@ static void global_env_list(symbol_t *root, value_t *pv)
|
|||
}
|
||||
}
|
||||
|
||||
extern symbol_t *symtab;
|
||||
extern struct symbol *symtab;
|
||||
|
||||
value_t fl_global_env(value_t *args, u_int32_t nargs)
|
||||
{
|
||||
|
@ -200,7 +201,7 @@ static value_t fl_constantp(value_t *args, u_int32_t nargs)
|
|||
{
|
||||
argcount("constant?", nargs, 1);
|
||||
if (issymbol(args[0]))
|
||||
return (isconstant((symbol_t *)ptr(args[0])) ? FL_T : FL_F);
|
||||
return (isconstant((struct symbol *)ptr(args[0])) ? FL_T : FL_F);
|
||||
if (iscons(args[0])) {
|
||||
if (car_(args[0]) == QUOTE)
|
||||
return FL_T;
|
||||
|
|
|
@ -867,7 +867,7 @@ static value_t cvalue_array_aset(value_t *args)
|
|||
value_t fl_builtin(value_t *args, u_int32_t nargs)
|
||||
{
|
||||
argcount("builtin", nargs, 1);
|
||||
symbol_t *name = tosymbol(args[0], "builtin");
|
||||
struct symbol *name = tosymbol(args[0], "builtin");
|
||||
cvalue_t *cv;
|
||||
if (ismanaged(args[0]) || (cv = name->dlcache) == NULL) {
|
||||
lerrorf(ArgError, "builtin: function %s not found", name->name);
|
||||
|
@ -884,7 +884,7 @@ value_t cbuiltin(char *name, builtin_t f)
|
|||
*(void **)cv->data = f;
|
||||
|
||||
value_t sym = symbol(name);
|
||||
((symbol_t *)ptr(sym))->dlcache = cv;
|
||||
((struct symbol *)ptr(sym))->dlcache = cv;
|
||||
ptrhash_put(&reverse_dlsym_lookup_table, cv, (void *)sym);
|
||||
|
||||
return tagptr(cv, TAG_CVALUE);
|
||||
|
|
|
@ -327,7 +327,7 @@ static uptrint_t bounded_hash(value_t a, int bound, int *oob)
|
|||
oob);
|
||||
return inthash(a);
|
||||
case TAG_SYM:
|
||||
return ((symbol_t *)ptr(a))->hash;
|
||||
return ((struct symbol *)ptr(a))->hash;
|
||||
case TAG_CPRIM:
|
||||
cp = (struct cprim *)ptr(a);
|
||||
data = cp_data(cp);
|
||||
|
|
33
c/flisp.c
33
c/flisp.c
|
@ -250,7 +250,7 @@ void bounds_error(char *fname, value_t arr, value_t ind)
|
|||
type_error(fname, #type, v); \
|
||||
}
|
||||
SAFECAST_OP(cons, struct cons *, ptr)
|
||||
SAFECAST_OP(symbol, symbol_t *, ptr)
|
||||
SAFECAST_OP(symbol, struct symbol *, ptr)
|
||||
SAFECAST_OP(fixnum, fixnum_t, numval)
|
||||
SAFECAST_OP(cvalue, cvalue_t *, ptr)
|
||||
SAFECAST_OP(string, char *, cvalue_data)
|
||||
|
@ -259,19 +259,20 @@ SAFECAST_OP(string, char *, cvalue_data)
|
|||
// symbol table
|
||||
// ---------------------------------------------------------------
|
||||
|
||||
symbol_t *symtab = NULL;
|
||||
struct symbol *symtab = NULL;
|
||||
|
||||
int fl_is_keyword_name(char *str, size_t len)
|
||||
{
|
||||
return ((str[0] == ':' || str[len - 1] == ':') && str[1] != '\0');
|
||||
}
|
||||
|
||||
static symbol_t *mk_symbol(char *str)
|
||||
static struct symbol *mk_symbol(char *str)
|
||||
{
|
||||
symbol_t *sym;
|
||||
struct symbol *sym;
|
||||
size_t len = strlen(str);
|
||||
|
||||
sym = (symbol_t *)malloc(sizeof(symbol_t) - sizeof(void *) + len + 1);
|
||||
sym =
|
||||
(struct symbol *)malloc(sizeof(struct symbol) - sizeof(void *) + len + 1);
|
||||
assert(((uptrint_t)sym & 0x7) == 0); // make sure malloc aligns 8
|
||||
sym->left = sym->right = NULL;
|
||||
sym->flags = 0;
|
||||
|
@ -288,7 +289,7 @@ static symbol_t *mk_symbol(char *str)
|
|||
return sym;
|
||||
}
|
||||
|
||||
static symbol_t **symtab_lookup(symbol_t **ptree, char *str)
|
||||
static struct symbol **symtab_lookup(struct symbol **ptree, char *str)
|
||||
{
|
||||
int x;
|
||||
|
||||
|
@ -306,7 +307,7 @@ static symbol_t **symtab_lookup(symbol_t **ptree, char *str)
|
|||
|
||||
value_t symbol(char *str)
|
||||
{
|
||||
symbol_t **pnode;
|
||||
struct symbol **pnode;
|
||||
|
||||
pnode = symtab_lookup(&symtab, str);
|
||||
if (*pnode == NULL)
|
||||
|
@ -350,7 +351,7 @@ char *symbol_name(value_t v)
|
|||
*(--n) = 'g';
|
||||
return n;
|
||||
}
|
||||
return ((symbol_t *)ptr(v))->name;
|
||||
return ((struct symbol *)ptr(v))->name;
|
||||
}
|
||||
|
||||
// conses
|
||||
|
@ -540,7 +541,7 @@ static value_t relocate(value_t v)
|
|||
|
||||
value_t relocate_lispvalue(value_t v) { return relocate(v); }
|
||||
|
||||
static void trace_globals(symbol_t *root)
|
||||
static void trace_globals(struct symbol *root)
|
||||
{
|
||||
while (root != NULL) {
|
||||
if (root->binding != UNBOUND)
|
||||
|
@ -874,7 +875,7 @@ static uint32_t process_keys(value_t kwtable, uint32_t nreq, uint32_t nkw,
|
|||
args[i] = UNBOUND;
|
||||
for (i = nreq; i < nargs; i++) {
|
||||
v = Stack[bp + i];
|
||||
if (issymbol(v) && iskeyword((symbol_t *)ptr(v)))
|
||||
if (issymbol(v) && iskeyword((struct symbol *)ptr(v)))
|
||||
break;
|
||||
if (a >= nopt)
|
||||
goto no_kw;
|
||||
|
@ -889,7 +890,7 @@ static uint32_t process_keys(value_t kwtable, uint32_t nreq, uint32_t nkw,
|
|||
if (i >= nargs)
|
||||
lerrorf(ArgError, "keyword %s requires an argument",
|
||||
symbol_name(v));
|
||||
value_t hv = fixnum(((symbol_t *)ptr(v))->hash);
|
||||
value_t hv = fixnum(((struct symbol *)ptr(v))->hash);
|
||||
uptrint_t x = 2 * (labs(numval(hv)) % n);
|
||||
if (vector_elt(kwtable, x) == v) {
|
||||
uptrint_t idx = numval(vector_elt(kwtable, x + 1));
|
||||
|
@ -906,7 +907,7 @@ static uint32_t process_keys(value_t kwtable, uint32_t nreq, uint32_t nkw,
|
|||
if (i >= nargs)
|
||||
break;
|
||||
v = Stack[bp + i];
|
||||
} while (issymbol(v) && iskeyword((symbol_t *)ptr(v)));
|
||||
} while (issymbol(v) && iskeyword((struct symbol *)ptr(v)));
|
||||
no_kw:
|
||||
nrestargs = nargs - i;
|
||||
if (!va && nrestargs > 0)
|
||||
|
@ -979,7 +980,7 @@ static value_t apply_cl(uint32_t nargs)
|
|||
uint32_t op;
|
||||
#endif
|
||||
uint32_t i;
|
||||
symbol_t *sym;
|
||||
struct symbol *sym;
|
||||
static struct cons *c;
|
||||
static value_t *pv;
|
||||
static int64_t accum;
|
||||
|
@ -1696,7 +1697,7 @@ apply_cl_top:
|
|||
ip++;
|
||||
do_loadg:
|
||||
assert(issymbol(v));
|
||||
sym = (symbol_t *)ptr(v);
|
||||
sym = (struct symbol *)ptr(v);
|
||||
if (sym->binding == UNBOUND)
|
||||
fl_raise(fl_list2(UnboundError, v));
|
||||
PUSH(sym->binding);
|
||||
|
@ -1714,7 +1715,7 @@ apply_cl_top:
|
|||
ip++;
|
||||
do_setg:
|
||||
assert(issymbol(v));
|
||||
sym = (symbol_t *)ptr(v);
|
||||
sym = (struct symbol *)ptr(v);
|
||||
v = Stack[SP - 1];
|
||||
if (!isconstant(sym))
|
||||
sym->binding = v;
|
||||
|
@ -2602,7 +2603,7 @@ int fl_load_system_image(value_t sys_image_iostream)
|
|||
{
|
||||
value_t e;
|
||||
int saveSP;
|
||||
symbol_t *sym;
|
||||
struct symbol *sym;
|
||||
|
||||
PUSH(sys_image_iostream);
|
||||
saveSP = SP;
|
||||
|
|
22
c/flisp.h
22
c/flisp.h
|
@ -15,20 +15,20 @@ struct cons {
|
|||
value_t cdr;
|
||||
};
|
||||
|
||||
typedef struct _symbol_t {
|
||||
struct symbol {
|
||||
uptrint_t flags;
|
||||
value_t binding; // global value binding
|
||||
struct _fltype_t *type;
|
||||
uint32_t hash;
|
||||
void *dlcache; // dlsym address
|
||||
// below fields are private
|
||||
struct _symbol_t *left;
|
||||
struct _symbol_t *right;
|
||||
struct symbol *left;
|
||||
struct symbol *right;
|
||||
union {
|
||||
char name[1];
|
||||
void *_pad; // ensure field aligned to pointer size
|
||||
};
|
||||
} symbol_t;
|
||||
};
|
||||
|
||||
struct gensym {
|
||||
value_t isconst;
|
||||
|
@ -97,15 +97,15 @@ struct gensym {
|
|||
#define fn_env(f) (((value_t *)ptr(f))[2])
|
||||
#define fn_name(f) (((value_t *)ptr(f))[3])
|
||||
|
||||
#define set(s, v) (((symbol_t *)ptr(s))->binding = (v))
|
||||
#define setc(s, v) \
|
||||
do { \
|
||||
((symbol_t *)ptr(s))->flags |= 1; \
|
||||
((symbol_t *)ptr(s))->binding = (v); \
|
||||
#define set(s, v) (((struct symbol *)ptr(s))->binding = (v))
|
||||
#define setc(s, v) \
|
||||
do { \
|
||||
((struct symbol *)ptr(s))->flags |= 1; \
|
||||
((struct symbol *)ptr(s))->binding = (v); \
|
||||
} while (0)
|
||||
#define isconstant(s) ((s)->flags & 0x1)
|
||||
#define iskeyword(s) ((s)->flags & 0x2)
|
||||
#define symbol_value(s) (((symbol_t *)ptr(s))->binding)
|
||||
#define symbol_value(s) (((struct symbol *)ptr(s))->binding)
|
||||
#define ismanaged(v) \
|
||||
((((unsigned char *)ptr(v)) >= fromspace) && \
|
||||
(((unsigned char *)ptr(v)) < fromspace + heapsize))
|
||||
|
@ -157,7 +157,7 @@ int isnumtok_base(char *tok, value_t *pval, int base);
|
|||
|
||||
/* safe casts */
|
||||
struct cons *tocons(value_t v, char *fname);
|
||||
symbol_t *tosymbol(value_t v, char *fname);
|
||||
struct symbol *tosymbol(value_t v, char *fname);
|
||||
fixnum_t tofixnum(value_t v, char *fname);
|
||||
char *tostring(value_t v, char *fname);
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ fltype_t *get_type(value_t t)
|
|||
{
|
||||
fltype_t *ft;
|
||||
if (issymbol(t)) {
|
||||
ft = ((symbol_t *)ptr(t))->type;
|
||||
ft = ((struct symbol *)ptr(t))->type;
|
||||
if (ft != NULL)
|
||||
return ft;
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ fltype_t *get_type(value_t t)
|
|||
ft->type = t;
|
||||
if (issymbol(t)) {
|
||||
ft->numtype = sym_to_numtype(t);
|
||||
((symbol_t *)ptr(t))->type = ft;
|
||||
((struct symbol *)ptr(t))->type = ft;
|
||||
} else {
|
||||
ft->numtype = N_NUMTYPES;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue