diff --git a/include/picrin/value.h b/include/picrin/value.h index 6fa2b75d..ef763a0a 100644 --- a/include/picrin/value.h +++ b/include/picrin/value.h @@ -9,6 +9,13 @@ extern "C" { #endif +/** + * pic_sym is just an alias to int. + * the value 0 for pic_sym is guaranteed to resolve to no symbol. + * if you are defining a function that returns optional, + * the zero symbol would be useful for such situation. + */ + typedef int pic_sym; /** diff --git a/src/state.c b/src/state.c index 4875193e..f647af15 100644 --- a/src/state.c +++ b/src/state.c @@ -75,6 +75,9 @@ pic_open(int argc, char *argv[], char **envp) /* native stack marker */ pic->native_stack_start = &t; + /* symbol 0 is reserved for system */ + xh_put_int(pic->sym_names, pic->sym_cnt++, (long)""); + #define register_core_symbol(pic,slot,name) do { \ pic->slot = pic_intern_cstr(pic, name); \ } while (0) @@ -155,6 +158,8 @@ pic_close(pic_state *pic) /* free symbol names */ for (xh_begin(pic->sym_names, &it); ! xh_isend(&it); xh_next(&it)) { + if (it.e->key == 0) + continue; free((void *)it.e->val); } free(pic->sym_names);