save macro procesures in each syntax object
This commit is contained in:
parent
3d1f74d8f5
commit
1f3f7c99a2
|
@ -18,14 +18,17 @@ struct pic_syntax {
|
|||
PIC_STX_LAMBDA,
|
||||
PIC_STX_IF,
|
||||
PIC_STX_BEGIN,
|
||||
PIC_STX_MACRO,
|
||||
PIC_STX_DEFMACRO
|
||||
} kind;
|
||||
pic_sym sym;
|
||||
struct pic_proc *macro;
|
||||
};
|
||||
|
||||
#define pic_syntax(v) ((struct pic_syntax *)pic_ptr(v))
|
||||
#define pic_syntax_p(v) (pic_type(v) == PIC_TT_SYNTAX)
|
||||
|
||||
struct pic_syntax *pic_syntax_new(pic_state *, int kind, pic_sym sym);
|
||||
struct pic_syntax *pic_syntax_new_macro(pic_state *, pic_sym, struct pic_proc *);
|
||||
|
||||
#endif
|
||||
|
|
5
src/gc.c
5
src/gc.c
|
@ -276,6 +276,11 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
|||
break;
|
||||
}
|
||||
case PIC_TT_SYNTAX: {
|
||||
struct pic_syntax *stx = (struct pic_syntax *)obj;
|
||||
|
||||
if (stx->macro) {
|
||||
gc_mark_object(pic, (struct pic_object *)stx->macro);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PIC_TT_SENV: {
|
||||
|
|
13
src/macro.c
13
src/macro.c
|
@ -385,6 +385,19 @@ pic_syntax_new(pic_state *pic, int kind, pic_sym sym)
|
|||
stx = (struct pic_syntax *)pic_obj_alloc(pic, sizeof(struct pic_syntax), PIC_TT_SYNTAX);
|
||||
stx->kind = kind;
|
||||
stx->sym = sym;
|
||||
stx->macro = NULL;
|
||||
return stx;
|
||||
}
|
||||
|
||||
struct pic_syntax *
|
||||
pic_syntax_new_macro(pic_state *pic, pic_sym sym, struct pic_proc *macro)
|
||||
{
|
||||
struct pic_syntax *stx;
|
||||
|
||||
stx = (struct pic_syntax *)pic_obj_alloc(pic, sizeof(struct pic_syntax), PIC_TT_SYNTAX);
|
||||
stx->kind = PIC_STX_MACRO;
|
||||
stx->sym = sym;
|
||||
stx->macro = macro;
|
||||
return stx;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue