diff --git a/include/picrin/macro.h b/include/picrin/macro.h index 1dd6cd81..672feb73 100644 --- a/include/picrin/macro.h +++ b/include/picrin/macro.h @@ -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 diff --git a/src/gc.c b/src/gc.c index 2264d5bc..c12a1633 100644 --- a/src/gc.c +++ b/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: { diff --git a/src/macro.c b/src/macro.c index b379aed0..e4825e39 100644 --- a/src/macro.c +++ b/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; }