From 816343bd31628180e5118ef8f093e61dc2f138b6 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 25 Mar 2014 13:37:20 +0900 Subject: [PATCH] reserve the 0 symbol for system use --- include/picrin/value.h | 7 +++++++ src/state.c | 5 +++++ 2 files changed, 12 insertions(+) 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);