From 9209722a5b981c84b88419583ba4b63212efde58 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 18 Jan 2015 21:25:34 +0900 Subject: [PATCH 01/26] use dictionaries for pic->globals and pic->macros --- extlib/benz/codegen.c | 6 +++--- extlib/benz/gc.c | 8 ++++---- extlib/benz/include/picrin.h | 4 ++-- extlib/benz/include/picrin/dict.h | 7 +++++++ extlib/benz/macro.c | 8 +++----- extlib/benz/state.c | 15 +++++++++------ extlib/benz/vm.c | 14 ++++++-------- 7 files changed, 34 insertions(+), 28 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 39b4bfc4..f3d34730 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -8,6 +8,7 @@ #include "picrin/proc.h" #include "picrin/lib.h" #include "picrin/macro.h" +#include "picrin/dict.h" #if PIC_NONE_IS_FALSE # define OP_PUSHNONE OP_PUSHFALSE @@ -63,7 +64,7 @@ static analyze_state * new_analyze_state(pic_state *pic) { analyze_state *state; - xh_entry *it; + pic_sym sym; state = pic_alloc(pic, sizeof(analyze_state)); state->pic = pic; @@ -101,8 +102,7 @@ new_analyze_state(pic_state *pic) /* push initial scope */ push_scope(state, pic_nil_value()); - for (it = xh_begin(&pic->globals); it != NULL; it = xh_next(it)) { - pic_sym sym = xh_key(it, pic_sym); + pic_dict_for_each (sym, pic->globals) { xv_push(&state->scope->locals, &sym); } diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index e209ddda..88d2df5a 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -549,13 +549,13 @@ gc_mark_phase(pic_state *pic) } /* global variables */ - for (it = xh_begin(&pic->globals); it != NULL; it = xh_next(it)) { - gc_mark(pic, xh_val(it, pic_value)); + if (pic->globals) { + gc_mark_object(pic, (struct pic_object *)pic->globals); } /* macro objects */ - for (it = xh_begin(&pic->macros); it != NULL; it = xh_next(it)) { - gc_mark_object(pic, xh_val(it, struct pic_object *)); + if (pic->macros) { + gc_mark_object(pic, (struct pic_object *)pic->macros); } /* error object */ diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 418cff2c..b424ac65 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -116,8 +116,8 @@ typedef struct { int sym_cnt; int uniq_sym_cnt; - xhash globals; - xhash macros; + struct pic_dict *globals; + struct pic_dict *macros; pic_value libs; xhash attrs; diff --git a/extlib/benz/include/picrin/dict.h b/extlib/benz/include/picrin/dict.h index 8d6077af..cfbd4855 100644 --- a/extlib/benz/include/picrin/dict.h +++ b/extlib/benz/include/picrin/dict.h @@ -19,6 +19,13 @@ struct pic_dict { struct pic_dict *pic_make_dict(pic_state *); +#define pic_dict_for_each(sym, dict) \ + pic_dict_for_each_helper_((sym), PIC_GENSYM(tmp), (dict)) +#define pic_dict_for_each_helper_(var, tmp, dict) \ + for (xh_entry *tmp = xh_begin(&dict->hash); \ + (tmp && ((var = xh_key(tmp, pic_sym)), 1)); \ + tmp = xh_next(tmp)) + pic_value pic_dict_ref(pic_state *, struct pic_dict *, pic_sym); void pic_dict_set(pic_state *, struct pic_dict *, pic_sym, pic_value); void pic_dict_del(pic_state *, struct pic_dict *, pic_sym); diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index d5604635..7e1c7b36 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -49,18 +49,16 @@ pic_find_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym *ren static void define_macro(pic_state *pic, pic_sym rename, struct pic_proc *mac) { - xh_put_int(&pic->macros, rename, &mac); + pic_dict_set(pic, pic->macros, rename, pic_obj_value(mac)); } static struct pic_proc * find_macro(pic_state *pic, pic_sym rename) { - xh_entry *e; - - if ((e = xh_get_int(&pic->macros, rename)) == NULL) { + if (! pic_dict_has(pic, pic->macros, rename)) { return NULL; } - return xh_val(e, struct pic_proc *); + return pic_proc_ptr(pic_dict_ref(pic, pic->macros, rename)); } static pic_sym diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 3f32e1c5..7271c8e7 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -10,6 +10,7 @@ #include "picrin/cont.h" #include "picrin/port.h" #include "picrin/error.h" +#include "picrin/dict.h" void pic_init_core(pic_state *); @@ -54,10 +55,10 @@ pic_open(int argc, char *argv[], char **envp) pic->uniq_sym_cnt = 0; /* global variables */ - xh_init_int(&pic->globals, sizeof(pic_value)); + pic->globals = NULL; /* macros */ - xh_init_int(&pic->macros, sizeof(struct pic_macro *)); + pic->macros = NULL; /* attributes */ xh_init_ptr(&pic->attrs, sizeof(struct pic_dict *)); @@ -155,6 +156,10 @@ pic_open(int argc, char *argv[], char **envp) R(rCOND_EXPAND, "cond-expand"); pic_gc_arena_restore(pic, ai); + /* root tables */ + pic->globals = pic_make_dict(pic); + pic->macros = pic_make_dict(pic); + /* root block */ pic->wind = pic_alloc(pic, sizeof(struct pic_winder)); pic->wind->prev = NULL; @@ -198,8 +203,8 @@ pic_close(pic_state *pic) pic->xp = pic->xpbase; pic->arena_idx = 0; pic->err = pic_undef_value(); - xh_clear(&pic->globals); - xh_clear(&pic->macros); + pic->globals = NULL; + pic->macros = NULL; xh_clear(&pic->attrs); pic->features = pic_nil_value(); pic->libs = pic_nil_value(); @@ -222,8 +227,6 @@ pic_close(pic_state *pic) /* free global stacks */ xh_destroy(&pic->syms); - xh_destroy(&pic->globals); - xh_destroy(&pic->macros); xh_destroy(&pic->attrs); /* free GC arena */ diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index ea4821e2..0e5bc7fd 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -442,7 +442,7 @@ pic_define_noexport(pic_state *pic, const char *name, pic_value val) pic_warn(pic, "redefining global"); } - xh_put_int(&pic->globals, rename, &val); + pic_dict_set(pic, pic->globals, rename, val); } void @@ -464,7 +464,7 @@ pic_ref(pic_state *pic, struct pic_lib *lib, const char *name) pic_errorf(pic, "symbol \"%s\" not defined in library ~s", name, lib->name); } - return xh_val(xh_get_int(&pic->globals, rename), pic_value); + return pic_dict_ref(pic, pic->globals, rename); } void @@ -478,7 +478,7 @@ pic_set(pic_state *pic, struct pic_lib *lib, const char *name, pic_value val) pic_errorf(pic, "symbol \"%s\" not defined in library ~s", name, lib->name); } - xh_put_int(&pic->globals, rename, &val); + pic_dict_set(pic, pic->globals, rename, val); } pic_value @@ -766,19 +766,17 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) NEXT; } CASE(OP_GREF) { - xh_entry *e; - - if ((e = xh_get_int(&pic->globals, c.u.i)) == NULL) { + if (! pic_dict_has(pic, pic->globals, c.u.i)) { pic_errorf(pic, "logic flaw; reference to uninitialized global variable: %s", pic_symbol_name(pic, c.u.i)); } - PUSH(xh_val(e, pic_value)); + PUSH(pic_dict_ref(pic, pic->globals, c.u.i)); NEXT; } CASE(OP_GSET) { pic_value val; val = POP(); - xh_put_int(&pic->globals, c.u.i, &val); + pic_dict_set(pic, pic->globals, c.u.i, val); NEXT; } CASE(OP_LREF) { From c86e97094d46cea93ffffa3d1cd3cfeeb2d3c7ac Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 18 Jan 2015 21:32:16 +0900 Subject: [PATCH 02/26] use dictionary for lib->exports --- extlib/benz/gc.c | 3 +-- extlib/benz/include/picrin/lib.h | 2 +- extlib/benz/lib.c | 14 +++++++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 88d2df5a..0bbeb84b 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -428,6 +428,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) struct pic_lib *lib = (struct pic_lib *)obj; gc_mark(pic, lib->name); gc_mark_object(pic, (struct pic_object *)lib->env); + gc_mark_object(pic, (struct pic_object *)lib->exports); break; } case PIC_TT_IREP: { @@ -640,8 +641,6 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) break; } case PIC_TT_LIB: { - struct pic_lib *lib = (struct pic_lib *)obj; - xh_destroy(&lib->exports); break; } case PIC_TT_IREP: { diff --git a/extlib/benz/include/picrin/lib.h b/extlib/benz/include/picrin/lib.h index 98ab3ae8..d0611425 100644 --- a/extlib/benz/include/picrin/lib.h +++ b/extlib/benz/include/picrin/lib.h @@ -13,7 +13,7 @@ struct pic_lib { PIC_OBJECT_HEADER pic_value name; struct pic_senv *env; - xhash exports; + struct pic_dict *exports; }; #define pic_lib_ptr(o) ((struct pic_lib *)pic_ptr(o)) diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 37cba2bd..6c54d51b 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -9,12 +9,14 @@ #include "picrin/error.h" #include "picrin/string.h" #include "picrin/proc.h" +#include "picrin/dict.h" struct pic_lib * pic_open_library(pic_state *pic, pic_value name) { struct pic_lib *lib; struct pic_senv *senv; + struct pic_dict *exports; if ((lib = pic_find_library(pic, name)) != NULL) { @@ -28,11 +30,12 @@ pic_open_library(pic_state *pic, pic_value name) } senv = pic_null_syntactic_environment(pic); + exports = pic_make_dict(pic); lib = (struct pic_lib *)pic_obj_alloc(pic, sizeof(struct pic_lib), PIC_TT_LIB); - lib->env = senv; lib->name = name; - xh_init_int(&lib->exports, sizeof(pic_sym)); + lib->env = senv; + lib->exports = exports; /* register! */ pic->libs = pic_acons(pic, name, pic_obj_value(lib), pic->libs); @@ -116,8 +119,9 @@ import_table(pic_state *pic, pic_value spec, xhash *imports) if (! lib) { pic_errorf(pic, "library not found: ~a", spec); } - for (it = xh_begin(&lib->exports); it != NULL; it = xh_next(it)) { - xh_put_int(imports, xh_key(it, pic_sym), &xh_val(it, pic_sym)); + pic_dict_for_each (sym, lib->exports) { + id = pic_sym(pic_dict_ref(pic, lib->exports, sym)); + xh_put_int(imports, sym, &id); } exit: @@ -176,7 +180,7 @@ export(pic_state *pic, pic_value spec) printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym(b)), pic_symbol_name(pic, rename)); #endif - xh_put_int(&pic->lib->exports, pic_sym(b), &rename); + pic_dict_set(pic, pic->lib->exports, pic_sym(b), pic_sym_value(rename)); return; From 14a93ccf0fc94dad7234460c704b750b73673c22 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 18 Jan 2015 21:40:14 +0900 Subject: [PATCH 03/26] use dictionary for rec->data --- extlib/benz/gc.c | 7 +------ extlib/benz/include/picrin/record.h | 2 +- extlib/benz/record.c | 17 ++++++++--------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 0bbeb84b..678b1964 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -466,11 +466,8 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) } case PIC_TT_RECORD: { struct pic_record *rec = (struct pic_record *)obj; - xh_entry *it; - for (it = xh_begin(&rec->hash); it != NULL; it = xh_next(it)) { - gc_mark(pic, xh_val(it, pic_value)); - } + gc_mark_object(pic, (struct pic_object *)rec->data); break; } case PIC_TT_NIL: @@ -662,8 +659,6 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) break; } case PIC_TT_RECORD: { - struct pic_record *rec = (struct pic_record *)obj; - xh_destroy(&rec->hash); break; } case PIC_TT_NIL: diff --git a/extlib/benz/include/picrin/record.h b/extlib/benz/include/picrin/record.h index d2944c06..97476ce4 100644 --- a/extlib/benz/include/picrin/record.h +++ b/extlib/benz/include/picrin/record.h @@ -11,7 +11,7 @@ extern "C" { struct pic_record { PIC_OBJECT_HEADER - xhash hash; + struct pic_dict *data; }; #define pic_record_p(v) (pic_type(v) == PIC_TT_RECORD) diff --git a/extlib/benz/record.c b/extlib/benz/record.c index 7ba4be29..73beed13 100644 --- a/extlib/benz/record.c +++ b/extlib/benz/record.c @@ -4,14 +4,18 @@ #include "picrin.h" #include "picrin/record.h" +#include "picrin/dict.h" struct pic_record * pic_make_record(pic_state *pic, pic_value rectype) { struct pic_record *rec; + struct pic_dict *data; + + data = pic_make_dict(pic); rec = (struct pic_record *)pic_obj_alloc(pic, sizeof(struct pic_record), PIC_TT_RECORD); - xh_init_int(&rec->hash, sizeof(pic_value)); + rec->data = data; pic_record_set(pic, rec, pic_intern_cstr(pic, "@@type"), rectype); @@ -27,21 +31,16 @@ pic_record_type(pic_state *pic, struct pic_record *rec) pic_value pic_record_ref(pic_state *pic, struct pic_record *rec, pic_sym slot) { - xh_entry *e; - - e = xh_get_int(&rec->hash, slot); - if (! e) { + if (! pic_dict_has(pic, rec->data, slot)) { pic_errorf(pic, "slot named ~s is not found for record: ~s", pic_sym_value(slot), rec); } - return xh_val(e, pic_value); + return pic_dict_ref(pic, rec->data, slot); } void pic_record_set(pic_state *pic, struct pic_record *rec, pic_sym slot, pic_value val) { - PIC_UNUSED(pic); - - xh_put_int(&rec->hash, slot, &val); + pic_dict_set(pic, rec->data, slot, val); } static pic_value From c1bba1ec83fa16385111d6cf01da391d22a211e9 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 18 Jan 2015 21:55:17 +0900 Subject: [PATCH 04/26] use dictionaries for temporary import table --- extlib/benz/lib.c | 67 ++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 38 deletions(-) diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 6c54d51b..0e603fe4 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -68,51 +68,53 @@ pic_find_library(pic_state *pic, pic_value spec) } static void -import_table(pic_state *pic, pic_value spec, xhash *imports) +import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) { struct pic_lib *lib; - xhash table; - pic_value val; + struct pic_dict *table; + pic_value val, tmp, prefix; pic_sym sym, id, tag; - xh_entry *it; - xh_init_int(&table, sizeof(pic_sym)); + table = pic_make_dict(pic); if (pic_pair_p(spec) && pic_sym_p(pic_car(pic, spec))) { tag = pic_sym(pic_car(pic, spec)); if (tag == pic->sONLY) { - import_table(pic, pic_cadr(pic, spec), &table); + import_table(pic, pic_cadr(pic, spec), table); + pic_for_each (val, pic_cddr(pic, spec)) { - xh_put_int(imports, pic_sym(val), &xh_val(xh_get_int(&table, pic_sym(val)), pic_sym)); + pic_dict_set(pic, imports, pic_sym(val), pic_dict_ref(pic, table, pic_sym(val))); } - goto exit; + return; } if (tag == pic->sRENAME) { import_table(pic, pic_cadr(pic, spec), imports); + pic_for_each (val, pic_cddr(pic, spec)) { - id = xh_val(xh_get_int(imports, pic_sym(pic_car(pic, val))), pic_sym); - xh_del_int(imports, pic_sym(pic_car(pic, val))); - xh_put_int(imports, pic_sym(pic_cadr(pic, val)), &id); + tmp = pic_dict_ref(pic, imports, pic_sym(pic_car(pic, val))); + pic_dict_del(pic, imports, pic_sym(pic_car(pic, val))); + pic_dict_set(pic, imports, pic_sym(pic_cadr(pic, val)), tmp); } - goto exit; + return; } if (tag == pic->sPREFIX) { - import_table(pic, pic_cadr(pic, spec), &table); - for (it = xh_begin(&table); it != NULL; it = xh_next(it)) { - val = pic_list_ref(pic, spec, 2); - sym = pic_intern_str(pic, pic_format(pic, "~s~s", val, pic_sym_value(xh_key(it, pic_sym)))); - xh_put_int(imports, sym, &xh_val(it, pic_sym)); + import_table(pic, pic_cadr(pic, spec), table); + + prefix = pic_list_ref(pic, spec, 2); + pic_dict_for_each (sym, table) { + id = pic_intern_str(pic, pic_format(pic, "~s~s", prefix, pic_sym_value(sym))); + pic_dict_set(pic, imports, id, pic_dict_ref(pic, table, sym)); } - goto exit; + return; } if (tag == pic->sEXCEPT) { import_table(pic, pic_cadr(pic, spec), imports); pic_for_each (val, pic_cddr(pic, spec)) { - xh_del_int(imports, pic_sym(val)); + pic_dict_del(pic, imports, pic_sym(val)); } - goto exit; + return; } } lib = pic_find_library(pic, spec); @@ -120,34 +122,23 @@ import_table(pic_state *pic, pic_value spec, xhash *imports) pic_errorf(pic, "library not found: ~a", spec); } pic_dict_for_each (sym, lib->exports) { - id = pic_sym(pic_dict_ref(pic, lib->exports, sym)); - xh_put_int(imports, sym, &id); + pic_dict_set(pic, imports, sym, pic_dict_ref(pic, lib->exports, sym)); } - - exit: - xh_destroy(&table); } static void import(pic_state *pic, pic_value spec) { - xhash imports; - xh_entry *it; + struct pic_dict *imports; + pic_sym sym; - xh_init_int(&imports, sizeof(pic_sym)); /* pic_sym to pic_sym */ + imports = pic_make_dict(pic); - import_table(pic, spec, &imports); + import_table(pic, spec, imports); - for (it = xh_begin(&imports); it != NULL; it = xh_next(it)) { - -#if DEBUG - printf("* importing %s as %s\n", pic_symbol_name(pic, xh_key(it, pic_sym)), pic_symbol_name(pic, xh_val(it, pic_sym))); -#endif - - pic_put_rename(pic, pic->lib->env, xh_key(it, pic_sym), xh_val(it, pic_sym)); + pic_dict_for_each (sym, imports) { + pic_put_rename(pic, pic->lib->env, sym, pic_sym(pic_dict_ref(pic, imports, sym))); } - - xh_destroy(&imports); } static void From cabae2767bfb3366eb6222137617ad147016b947 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 18 Jan 2015 21:58:40 +0900 Subject: [PATCH 05/26] use dictionary for senv->map --- extlib/benz/gc.c | 3 +-- extlib/benz/include/picrin/macro.h | 2 +- extlib/benz/macro.c | 17 +++++++---------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 678b1964..9c005479 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -422,6 +422,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) gc_mark_object(pic, (struct pic_object *)senv->up); } gc_mark(pic, senv->defer); + gc_mark_object(pic, (struct pic_object *)senv->map); break; } case PIC_TT_LIB: { @@ -633,8 +634,6 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) break; } case PIC_TT_SENV: { - struct pic_senv *senv = (struct pic_senv *)obj; - xh_destroy(&senv->map); break; } case PIC_TT_LIB: { diff --git a/extlib/benz/include/picrin/macro.h b/extlib/benz/include/picrin/macro.h index fe4074f5..e79c4251 100644 --- a/extlib/benz/include/picrin/macro.h +++ b/extlib/benz/include/picrin/macro.h @@ -11,7 +11,7 @@ extern "C" { struct pic_senv { PIC_OBJECT_HEADER - xhash map; + struct pic_dict *map; pic_value defer; struct pic_senv *up; }; diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index 7e1c7b36..87dea7c1 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -25,23 +25,17 @@ pic_add_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym) void pic_put_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym rename) { - PIC_UNUSED(pic); - - xh_put_int(&senv->map, sym, &rename); + pic_dict_set(pic, senv->map, sym, pic_sym_value(rename)); } bool pic_find_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym *rename) { - xh_entry *e; - - PIC_UNUSED(pic); - - if ((e = xh_get_int(&senv->map, sym)) == NULL) { + if (! pic_dict_has(pic, senv->map, sym)) { return false; } if (rename != NULL) { - *rename = xh_val(e, pic_sym); + *rename = pic_sym(pic_dict_ref(pic, senv->map, sym)); } return true; } @@ -383,11 +377,14 @@ struct pic_senv * pic_make_senv(pic_state *pic, struct pic_senv *up) { struct pic_senv *senv; + struct pic_dict *map; + + map = pic_make_dict(pic); senv = (struct pic_senv *)pic_obj_alloc(pic, sizeof(struct pic_senv), PIC_TT_SENV); senv->up = up; senv->defer = pic_nil_value(); - xh_init_int(&senv->map, sizeof(pic_sym)); + senv->map = map; return senv; } From 1b510e982ec9d9838f4ee9741fecce63c5ab004b Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 01:29:00 +0900 Subject: [PATCH 06/26] add irep->syms --- extlib/benz/codegen.c | 33 ++++++++++++++++++++-- extlib/benz/gc.c | 1 + extlib/benz/include/picrin/irep.h | 3 +- extlib/benz/vm.c | 46 +++++++++++++++++++++---------- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index f3d34730..f488d898 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -884,6 +884,9 @@ typedef struct codegen_context { /* constant object pool */ pic_value *pool; size_t plen, pcapa; + /* symbol pool */ + pic_sym *syms; + size_t slen, scapa; struct codegen_context *up; } codegen_context; @@ -1024,6 +1027,10 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v cxt->plen = 0; cxt->pcapa = PIC_POOL_SIZE; + cxt->syms = pic_calloc(pic, PIC_POOL_SIZE, sizeof(pic_value)); + cxt->slen = 0; + cxt->scapa = PIC_POOL_SIZE; + state->cxt = cxt; create_activation(cxt); @@ -1049,6 +1056,8 @@ pop_codegen_context(codegen_state *state) irep->ilen = state->cxt->ilen; irep->pool = pic_realloc(pic, state->cxt->pool, sizeof(pic_value) * state->cxt->plen); irep->plen = state->cxt->plen; + irep->syms = pic_realloc(pic, state->cxt->syms, sizeof(pic_sym) * state->cxt->slen); + irep->slen = state->cxt->slen; /* finalize */ xv_destroy(&cxt->args); @@ -1104,6 +1113,26 @@ index_local(codegen_state *state, pic_sym sym) return -1; } +static int +index_symbol(codegen_state *state, pic_sym sym) +{ + pic_state *pic = state->pic; + codegen_context *cxt = state->cxt; + size_t i; + + for (i = 0; i < cxt->slen; ++i) { + if (cxt->syms[i] == sym) { + return i; + } + } + if (cxt->slen >= cxt->scapa) { + cxt->scapa *= 2; + cxt->syms = pic_realloc(pic, cxt->syms, sizeof(pic_sym) * cxt->scapa); + } + cxt->syms[cxt->slen++] = sym; + return i; +} + static struct pic_irep *codegen_lambda(codegen_state *, pic_value); static void @@ -1116,7 +1145,7 @@ codegen(codegen_state *state, pic_value obj) sym = pic_sym(pic_car(pic, obj)); if (sym == state->sGREF) { cxt->code[cxt->clen].insn = OP_GREF; - cxt->code[cxt->clen].u.i = pic_sym(pic_list_ref(pic, obj, 1)); + cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, obj, 1))); cxt->clen++; return; } else if (sym == state->sCREF) { @@ -1156,7 +1185,7 @@ codegen(codegen_state *state, pic_value obj) type = pic_sym(pic_list_ref(pic, var, 0)); if (type == state->sGREF) { cxt->code[cxt->clen].insn = OP_GSET; - cxt->code[cxt->clen].u.i = pic_int(pic_list_ref(pic, var, 1)); + cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, var, 1))); cxt->clen++; cxt->code[cxt->clen].insn = OP_PUSHNONE; cxt->clen++; diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 9c005479..15b0f59a 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -644,6 +644,7 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) pic_free(pic, irep->code); pic_free(pic, irep->irep); pic_free(pic, irep->pool); + pic_free(pic, irep->syms); break; } case PIC_TT_DATA: { diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/irep.h index 5b10628a..70597a71 100644 --- a/extlib/benz/include/picrin/irep.h +++ b/extlib/benz/include/picrin/irep.h @@ -68,7 +68,8 @@ struct pic_irep { bool varg; struct pic_irep **irep; pic_value *pool; - size_t clen, ilen, plen; + pic_sym *syms; + size_t clen, ilen, plen, slen; }; pic_value pic_analyze(pic_state *, pic_value); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 0e5bc7fd..db54e0ba 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -550,6 +550,23 @@ pic_vm_tear_off(pic_state *pic) } } +static struct pic_irep * +vm_get_irep(pic_state *pic) +{ + pic_value self; + struct pic_irep *irep; + + self = pic->ci->fp[0]; + if (! pic_proc_p(self)) { + pic_errorf(pic, "logic flaw"); + } + irep = pic_proc_ptr(self)->u.irep; + if (! pic_proc_irep_p(pic_proc_ptr(self))) { + pic_errorf(pic, "logic flaw"); + } + return irep; +} + pic_value pic_apply0(pic_state *pic, struct pic_proc *proc) { @@ -688,7 +705,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) &&L_OP_GREF, &&L_OP_GSET, &&L_OP_LREF, &&L_OP_LSET, &&L_OP_CREF, &&L_OP_CSET, &&L_OP_JMP, &&L_OP_JMPIF, &&L_OP_NOT, &&L_OP_CALL, &&L_OP_TAILCALL, &&L_OP_RET, &&L_OP_LAMBDA, &&L_OP_CONS, &&L_OP_CAR, &&L_OP_CDR, &&L_OP_NILP, - &&L_OP_SYMBOL_P, &&L_OP_PAIR_P, + &&L_OP_SYMBOL_P, &&L_OP_PAIR_P, &&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL, &&L_OP_DIV, &&L_OP_MINUS, &&L_OP_EQ, &&L_OP_LT, &&L_OP_LE, &&L_OP_STOP }; @@ -751,32 +768,31 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) NEXT; } CASE(OP_PUSHCONST) { - pic_value self; - struct pic_irep *irep; + struct pic_irep *irep = vm_get_irep(pic); - self = pic->ci->fp[0]; - if (! pic_proc_p(self)) { - pic_errorf(pic, "logic flaw"); - } - irep = pic_proc_ptr(self)->u.irep; - if (! pic_proc_irep_p(pic_proc_ptr(self))) { - pic_errorf(pic, "logic flaw"); - } PUSH(irep->pool[c.u.i]); NEXT; } CASE(OP_GREF) { - if (! pic_dict_has(pic, pic->globals, c.u.i)) { - pic_errorf(pic, "logic flaw; reference to uninitialized global variable: %s", pic_symbol_name(pic, c.u.i)); + struct pic_irep *irep = vm_get_irep(pic); + pic_sym sym; + + sym = irep->syms[c.u.i]; + if (! pic_dict_has(pic, pic->globals, sym)) { + pic_errorf(pic, "logic flaw; reference to uninitialized global variable: %s", pic_symbol_name(pic, sym)); } - PUSH(pic_dict_ref(pic, pic->globals, c.u.i)); + PUSH(pic_dict_ref(pic, pic->globals, sym)); NEXT; } CASE(OP_GSET) { + struct pic_irep *irep = vm_get_irep(pic); + pic_sym sym; pic_value val; + sym = irep->syms[c.u.i]; + val = POP(); - pic_dict_set(pic, pic->globals, c.u.i, val); + pic_dict_set(pic, pic->globals, sym, val); NEXT; } CASE(OP_LREF) { From 09cb576a3b53561df3375cf6727e32c96a354d1d Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 01:55:39 +0900 Subject: [PATCH 07/26] remove pic_ungensym --- extlib/benz/include/picrin.h | 1 - extlib/benz/symbol.c | 16 ---------------- 2 files changed, 17 deletions(-) diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index b424ac65..ae728792 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -180,7 +180,6 @@ pic_sym pic_intern_str(pic_state *, pic_str *); pic_sym pic_intern_cstr(pic_state *, const char *); const char *pic_symbol_name(pic_state *, pic_sym); pic_sym pic_gensym(pic_state *, pic_sym); -pic_sym pic_ungensym(pic_state *, pic_sym); bool pic_interned_p(pic_state *, pic_sym); pic_value pic_read(pic_state *, struct pic_port *); diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 3fd40f68..c6d68c44 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -63,22 +63,6 @@ pic_gensym(pic_state *pic, pic_sym base) return uniq; } -pic_sym -pic_ungensym(pic_state *pic, pic_sym base) -{ - const char *name, *occr; - - if (pic_interned_p(pic, base)) { - return base; - } - - name = pic_symbol_name(pic, base); - if ((occr = strrchr(name, '@')) == NULL) { - pic_panic(pic, "logic flaw"); - } - return pic_intern(pic, name, (size_t)(occr - name)); -} - bool pic_interned_p(pic_state *pic, pic_sym sym) { From 4be979b1dffb1d6dec63f168e5f42df57aa0c084 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 02:21:10 +0900 Subject: [PATCH 08/26] change pic_intern interface --- extlib/benz/include/picrin.h | 3 +-- extlib/benz/lib.c | 2 +- extlib/benz/read.c | 3 ++- extlib/benz/symbol.c | 19 ++++++------------- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index ae728792..b8a2df83 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -175,8 +175,7 @@ bool pic_eq_p(pic_value, pic_value); bool pic_eqv_p(pic_value, pic_value); bool pic_equal_p(pic_state *, pic_value, pic_value); -pic_sym pic_intern(pic_state *, const char *, size_t); -pic_sym pic_intern_str(pic_state *, pic_str *); +pic_sym pic_intern(pic_state *, pic_str *); pic_sym pic_intern_cstr(pic_state *, const char *); const char *pic_symbol_name(pic_state *, pic_sym); pic_sym pic_gensym(pic_state *, pic_sym); diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 0e603fe4..f75ca99e 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -104,7 +104,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) prefix = pic_list_ref(pic, spec, 2); pic_dict_for_each (sym, table) { - id = pic_intern_str(pic, pic_format(pic, "~s~s", prefix, pic_sym_value(sym))); + id = pic_intern(pic, pic_format(pic, "~s~s", prefix, pic_sym_value(sym))); pic_dict_set(pic, imports, id, pic_dict_ref(pic, table, sym)); } return; diff --git a/extlib/benz/read.c b/extlib/benz/read.c index aed121a6..c416fa22 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -222,7 +222,8 @@ read_symbol(pic_state *pic, struct pic_port *port, const char *str) buf[len - 1] = (char)c; } - sym = pic_intern(pic, buf, len); + buf[len] = 0; + sym = pic_intern_cstr(pic, buf); pic_free(pic, buf); return pic_sym_value(sym); diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index c6d68c44..65c1e6d1 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -6,21 +6,20 @@ #include "picrin/string.h" pic_sym -pic_intern(pic_state *pic, const char *str, size_t len) +pic_intern(pic_state *pic, pic_str *str) { char *cstr; xh_entry *e; pic_sym id; - cstr = (char *)pic_malloc(pic, len + 1); - cstr[len] = '\0'; - memcpy(cstr, str, len); - - e = xh_get_str(&pic->syms, cstr); + e = xh_get_str(&pic->syms, pic_str_cstr(str)); if (e) { return xh_val(e, pic_sym); } + cstr = (char *)pic_malloc(pic, pic_strlen(str) + 1); + strcpy(cstr, pic_str_cstr(str)); + id = pic->sym_cnt++; xh_put_str(&pic->syms, cstr, &id); xh_put_int(&pic->sym_names, id, &cstr); @@ -30,13 +29,7 @@ pic_intern(pic_state *pic, const char *str, size_t len) pic_sym pic_intern_cstr(pic_state *pic, const char *str) { - return pic_intern(pic, str, strlen(str)); -} - -pic_sym -pic_intern_str(pic_state *pic, pic_str *str) -{ - return pic_intern_cstr(pic, pic_str_cstr(str)); + return pic_intern(pic, pic_make_str(pic, str, strlen(str))); } pic_sym From fc654dd2807a4859b8671b9908fb51933d73a562 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 10:59:35 +0900 Subject: [PATCH 09/26] heap symbol seems working (with GC stopped) --- extlib/benz/codegen.c | 8 ++-- extlib/benz/dict.c | 12 ++--- extlib/benz/gc.c | 14 ++++-- extlib/benz/include/picrin.h | 9 ++-- extlib/benz/include/picrin/symbol.h | 21 +++++++++ extlib/benz/include/picrin/value.h | 55 ++--------------------- extlib/benz/state.c | 14 +++--- extlib/benz/symbol.c | 70 ++++++++++++----------------- 8 files changed, 83 insertions(+), 120 deletions(-) create mode 100644 extlib/benz/include/picrin/symbol.h diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index f488d898..e79a2313 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -949,24 +949,24 @@ create_activation(codegen_context *cxt) pic_sym *var; size_t offset; - xh_init_int(®s, sizeof(size_t)); + xh_init_ptr(®s, sizeof(size_t)); offset = 1; for (i = 0; i < xv_size(&cxt->args); ++i) { var = xv_get(&cxt->args, i); n = i + offset; - xh_put_int(®s, *var, &n); + xh_put_ptr(®s, *var, &n); } offset += i; for (i = 0; i < xv_size(&cxt->locals); ++i) { var = xv_get(&cxt->locals, i); n = i + offset; - xh_put_int(®s, *var, &n); + xh_put_ptr(®s, *var, &n); } for (i = 0; i < xv_size(&cxt->captures); ++i) { var = xv_get(&cxt->captures, i); - if ((n = xh_val(xh_get_int(®s, *var), size_t)) <= xv_size(&cxt->args) || (cxt->varg && n == xv_size(&cxt->args) + 1)) { + if ((n = xh_val(xh_get_ptr(®s, *var), size_t)) <= xv_size(&cxt->args) || (cxt->varg && n == xv_size(&cxt->args) + 1)) { /* copy arguments to capture variable area */ cxt->code[cxt->clen].insn = OP_LREF; cxt->code[cxt->clen].u.i = (int)n; diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index 19e80176..fa83fe7c 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -14,7 +14,7 @@ pic_make_dict(pic_state *pic) struct pic_dict *dict; dict = (struct pic_dict *)pic_obj_alloc(pic, sizeof(struct pic_dict), PIC_TT_DICT); - xh_init_int(&dict->hash, sizeof(pic_value)); + xh_init_ptr(&dict->hash, sizeof(pic_value)); return dict; } @@ -24,7 +24,7 @@ pic_dict_ref(pic_state *pic, struct pic_dict *dict, pic_sym key) { xh_entry *e; - e = xh_get_int(&dict->hash, key); + e = xh_get_ptr(&dict->hash, key); if (! e) { pic_errorf(pic, "element not found for a key: ~s", pic_sym_value(key)); } @@ -36,7 +36,7 @@ pic_dict_set(pic_state *pic, struct pic_dict *dict, pic_sym key, pic_value val) { PIC_UNUSED(pic); - xh_put_int(&dict->hash, key, &val); + xh_put_ptr(&dict->hash, key, &val); } size_t @@ -52,17 +52,17 @@ pic_dict_has(pic_state *pic, struct pic_dict *dict, pic_sym key) { PIC_UNUSED(pic); - return xh_get_int(&dict->hash, key) != NULL; + return xh_get_ptr(&dict->hash, key) != NULL; } void pic_dict_del(pic_state *pic, struct pic_dict *dict, pic_sym key) { - if (xh_get_int(&dict->hash, key) == NULL) { + if (xh_get_ptr(&dict->hash, key) == NULL) { pic_errorf(pic, "no slot named ~s found in dictionary", pic_sym_value(key)); } - xh_del_int(&dict->hash, key); + xh_del_ptr(&dict->hash, key); } static pic_value diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 15b0f59a..1eb068e4 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -19,6 +19,7 @@ #include "picrin/dict.h" #include "picrin/record.h" #include "picrin/read.h" +#include "picrin/symbol.h" union header { struct { @@ -471,11 +472,16 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) gc_mark_object(pic, (struct pic_object *)rec->data); break; } + case PIC_TT_SYMBOL: { + struct pic_symbol *sym = (struct pic_symbol *)obj; + + gc_mark_object(pic, (struct pic_object *)sym->str); + break; + } case PIC_TT_NIL: case PIC_TT_BOOL: case PIC_TT_FLOAT: case PIC_TT_INT: - case PIC_TT_SYMBOL: case PIC_TT_CHAR: case PIC_TT_EOF: case PIC_TT_UNDEF: @@ -661,11 +667,13 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) case PIC_TT_RECORD: { break; } + case PIC_TT_SYMBOL: { + break; + } case PIC_TT_NIL: case PIC_TT_BOOL: case PIC_TT_FLOAT: case PIC_TT_INT: - case PIC_TT_SYMBOL: case PIC_TT_CHAR: case PIC_TT_EOF: case PIC_TT_UNDEF: @@ -802,7 +810,7 @@ pic_obj_alloc_unsafe(pic_state *pic, size_t size, enum pic_tt tt) obj = (struct pic_object *)gc_alloc(pic, size); if (obj == NULL) { - pic_gc_run(pic); + /* pic_gc_run(pic); */ obj = (struct pic_object *)gc_alloc(pic, size); if (obj == NULL) { add_heap_page(pic); diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index b8a2df83..8f0562ec 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -51,6 +51,11 @@ extern "C" { #include "picrin/util.h" #include "picrin/value.h" +#define pic_sym(v) pic_ptr(v) +#define pic_symbol_value(v) pic_sym_value(v) +#define pic_sym_value(v) pic_obj_value(v) +#define pic_sym_p(v) (pic_type(v) == PIC_TT_SYMBOL) + typedef struct pic_code pic_code; struct pic_winder { @@ -112,10 +117,6 @@ typedef struct { pic_value features; xhash syms; /* name to symbol */ - xhash sym_names; /* symbol to name */ - int sym_cnt; - int uniq_sym_cnt; - struct pic_dict *globals; struct pic_dict *macros; pic_value libs; diff --git a/extlib/benz/include/picrin/symbol.h b/extlib/benz/include/picrin/symbol.h new file mode 100644 index 00000000..84a706bc --- /dev/null +++ b/extlib/benz/include/picrin/symbol.h @@ -0,0 +1,21 @@ +/** + * See Copyright Notice in picrin.h + */ + +#ifndef PICRIN_SYMBOL_H +#define PICRIN_SYMBOL_H + +#if defined(__cplusplus) +extern "C" { +#endif + +struct pic_symbol { + PIC_OBJECT_HEADER + pic_str *str; +}; + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index 493cb033..8eb407e4 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -9,12 +9,6 @@ extern "C" { #endif -/** - * pic_sym is just an alias of int. - */ - -typedef int pic_sym; - /** * `undef` values never seen from user-end: that is, * it's used only for repsenting internal special state @@ -27,7 +21,6 @@ enum pic_vtype { PIC_VTYPE_UNDEF, PIC_VTYPE_FLOAT, PIC_VTYPE_INT, - PIC_VTYPE_SYMBOL, PIC_VTYPE_CHAR, PIC_VTYPE_EOF, PIC_VTYPE_HEAP @@ -40,7 +33,6 @@ enum pic_vtype { * float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF * ptr : 111111111111TTTT PPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP * int : 1111111111110110 0000000000000000 IIIIIIIIIIIIIIII IIIIIIIIIIIIIIII - * sym : 1111111111110111 0000000000000000 SSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSS * char : 1111111111111000 0000000000000000 CCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCC */ @@ -71,14 +63,6 @@ pic_int(pic_value v) return u.i; } -static inline int -pic_sym(pic_value v) -{ - union { int i; unsigned u; } u; - u.u = v & 0xfffffffful; - return u.i; -} - #define pic_char(v) ((v) & 0xfffffffful) #else @@ -89,7 +73,6 @@ typedef struct { void *data; double f; int i; - pic_sym sym; char c; } u; } pic_value; @@ -100,7 +83,6 @@ typedef struct { #define pic_float(v) ((v).u.f) #define pic_int(v) ((v).u.i) -#define pic_sym(v) ((v).u.sym) #define pic_char(v) ((v).u.c) #endif @@ -111,11 +93,11 @@ enum pic_tt { PIC_TT_BOOL, PIC_TT_FLOAT, PIC_TT_INT, - PIC_TT_SYMBOL, PIC_TT_CHAR, PIC_TT_EOF, PIC_TT_UNDEF, /* heap */ + PIC_TT_SYMBOL, PIC_TT_PAIR, PIC_TT_STRING, PIC_TT_VECTOR, @@ -139,6 +121,7 @@ struct pic_object { PIC_OBJECT_HEADER }; +struct pic_symbol; struct pic_pair; struct pic_string; struct pic_vector; @@ -150,6 +133,7 @@ struct pic_error; /* set aliases to basic types */ typedef pic_value pic_list; +typedef struct pic_symbol *pic_sym; typedef struct pic_pair pic_pair; typedef struct pic_string pic_str; typedef struct pic_vector pic_vec; @@ -164,7 +148,6 @@ typedef struct pic_blob pic_blob; #define pic_undef_p(v) (pic_vtype(v) == PIC_VTYPE_UNDEF) #define pic_float_p(v) (pic_vtype(v) == PIC_VTYPE_FLOAT) #define pic_int_p(v) (pic_vtype(v) == PIC_VTYPE_INT) -#define pic_sym_p(v) (pic_vtype(v) == PIC_VTYPE_SYMBOL) #define pic_char_p(v) (pic_vtype(v) == PIC_VTYPE_CHAR) #define pic_eof_p(v) (pic_vtype(v) == PIC_VTYPE_EOF) @@ -189,12 +172,9 @@ static inline pic_value pic_obj_value(void *); static inline pic_value pic_float_value(double); static inline pic_value pic_int_value(int); static inline pic_value pic_size_value(size_t); -static inline pic_value pic_sym_value(pic_sym); static inline pic_value pic_char_value(char c); static inline pic_value pic_none_value(); -#define pic_symbol_value(sym) pic_sym_value(sym) - static inline bool pic_eq_p(pic_value, pic_value); static inline bool pic_eqv_p(pic_value, pic_value); @@ -214,8 +194,6 @@ pic_type(pic_value v) return PIC_TT_FLOAT; case PIC_VTYPE_INT: return PIC_TT_INT; - case PIC_VTYPE_SYMBOL: - return PIC_TT_SYMBOL; case PIC_VTYPE_CHAR: return PIC_TT_CHAR; case PIC_VTYPE_EOF: @@ -370,19 +348,6 @@ pic_int_value(int i) return v; } -static inline pic_value -pic_symbol_value(pic_sym sym) -{ - union { int i; unsigned u; } u; - pic_value v; - - u.i = sym; - - pic_init_value(v, PIC_VTYPE_SYMBOL); - v |= u.u; - return v; -} - static inline pic_value pic_char_value(char c) { @@ -425,16 +390,6 @@ pic_int_value(int i) return v; } -static inline pic_value -pic_symbol_value(pic_sym sym) -{ - pic_value v; - - pic_init_value(v, PIC_VTYPE_SYMBOL); - v.u.sym = sym; - return v; -} - static inline pic_value pic_char_value(char c) { @@ -493,8 +448,6 @@ pic_eq_p(pic_value x, pic_value y) return true; case PIC_TT_BOOL: return pic_vtype(x) == pic_vtype(y); - case PIC_TT_SYMBOL: - return pic_sym(x) == pic_sym(y); default: return pic_ptr(x) == pic_ptr(y); } @@ -511,8 +464,6 @@ pic_eqv_p(pic_value x, pic_value y) return true; case PIC_TT_BOOL: return pic_vtype(x) == pic_vtype(y); - case PIC_TT_SYMBOL: - return pic_sym(x) == pic_sym(y); case PIC_TT_FLOAT: return pic_float(x) == pic_float(y); case PIC_TT_INT: diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 7271c8e7..9c10e56e 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -50,9 +50,6 @@ pic_open(int argc, char *argv[], char **envp) /* symbol table */ xh_init_str(&pic->syms, sizeof(pic_sym)); - xh_init_int(&pic->sym_names, sizeof(const char *)); - pic->sym_cnt = 0; - pic->uniq_sym_cnt = 0; /* global variables */ pic->globals = NULL; @@ -225,6 +222,11 @@ pic_close(pic_state *pic) pic_trie_delete(pic, pic->reader->trie); free(pic->reader); + /* free symbol names */ + for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { + free(xh_key(it, char *)); + } + /* free global stacks */ xh_destroy(&pic->syms); xh_destroy(&pic->attrs); @@ -232,11 +234,5 @@ pic_close(pic_state *pic) /* free GC arena */ free(pic->arena); - /* free symbol names */ - for (it = xh_begin(&pic->sym_names); it != NULL; it = xh_next(it)) { - free(xh_val(it, char *)); - } - xh_destroy(&pic->sym_names); - free(pic); } diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 65c1e6d1..5305f9de 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -3,27 +3,37 @@ */ #include "picrin.h" +#include "picrin/symbol.h" #include "picrin/string.h" +pic_sym +pic_make_symbol(pic_state *pic, pic_str *str) +{ + pic_sym sym; + + sym = (pic_sym)pic_obj_alloc(pic, sizeof(struct pic_symbol), PIC_TT_SYMBOL); + sym->str = str; + return sym; +} + pic_sym pic_intern(pic_state *pic, pic_str *str) { - char *cstr; xh_entry *e; - pic_sym id; + pic_sym sym; + char *cstr; e = xh_get_str(&pic->syms, pic_str_cstr(str)); if (e) { return xh_val(e, pic_sym); } - cstr = (char *)pic_malloc(pic, pic_strlen(str) + 1); + cstr = pic_malloc(pic, pic_strlen(str) + 1); strcpy(cstr, pic_str_cstr(str)); - id = pic->sym_cnt++; - xh_put_str(&pic->syms, cstr, &id); - xh_put_int(&pic->sym_names, id, &cstr); - return id; + sym = pic_make_symbol(pic, str); + xh_put_str(&pic->syms, cstr, &sym); + return sym; } pic_sym @@ -35,37 +45,21 @@ pic_intern_cstr(pic_state *pic, const char *str) pic_sym pic_gensym(pic_state *pic, pic_sym base) { - int uid = pic->uniq_sym_cnt++, len; - char *str, mark; - pic_sym uniq; - - if (pic_interned_p(pic, base)) { - mark = '@'; - } else { - mark = '.'; - } - - len = snprintf(NULL, 0, "%s%c%d", pic_symbol_name(pic, base), mark, uid); - str = pic_alloc(pic, (size_t)len + 1); - sprintf(str, "%s%c%d", pic_symbol_name(pic, base), mark, uid); - - /* don't put the symbol to pic->syms to keep it uninterned */ - uniq = pic->sym_cnt++; - xh_put_int(&pic->sym_names, uniq, &str); - - return uniq; + return pic_make_symbol(pic, base->str); } bool pic_interned_p(pic_state *pic, pic_sym sym) { - return sym == pic_intern_cstr(pic, pic_symbol_name(pic, sym)); + return sym == pic_intern(pic, sym->str); } const char * pic_symbol_name(pic_state *pic, pic_sym sym) { - return xh_val(xh_get_int(&pic->sym_names, sym), const char *); + PIC_UNUSED(pic); + + return pic_str_cstr(sym->str); } static pic_value @@ -100,29 +94,21 @@ pic_symbol_symbol_eq_p(pic_state *pic) static pic_value pic_symbol_symbol_to_string(pic_state *pic) { - pic_value v; + pic_sym sym; - pic_get_args(pic, "o", &v); + pic_get_args(pic, "m", &sym); - if (! pic_sym_p(v)) { - pic_errorf(pic, "symbol->string: expected symbol"); - } - - return pic_obj_value(pic_make_str_cstr(pic, pic_symbol_name(pic, pic_sym(v)))); + return pic_obj_value(sym->str); } static pic_value pic_symbol_string_to_symbol(pic_state *pic) { - pic_value v; + pic_str *str; - pic_get_args(pic, "o", &v); + pic_get_args(pic, "s", &str); - if (! pic_str_p(v)) { - pic_errorf(pic, "string->symbol: expected string"); - } - - return pic_symbol_value(pic_intern_cstr(pic, pic_str_cstr(pic_str_ptr(v)))); + return pic_sym_value(pic_intern(pic, str)); } void From f349e4148ea84d83783460d5577f722443316544 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 11:02:22 +0900 Subject: [PATCH 10/26] remove pic_symbol_value --- extlib/benz/codegen.c | 90 ++++++++++++++++++------------------ extlib/benz/include/picrin.h | 1 - extlib/benz/write.c | 2 +- 3 files changed, 46 insertions(+), 47 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index e79a2313..3507f072 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -283,7 +283,7 @@ analyze(analyze_state *state, pic_value obj, bool tailpos) /* pass through */ } else { - res = pic_list2(pic, pic_symbol_value(state->sRETURN), res); + res = pic_list2(pic, pic_sym_value(state->sRETURN), res); } } @@ -298,7 +298,7 @@ analyze_global_var(analyze_state *state, pic_sym sym) { pic_state *pic = state->pic; - return pic_list2(pic, pic_symbol_value(state->sGREF), pic_sym_value(sym)); + return pic_list2(pic, pic_sym_value(state->sGREF), pic_sym_value(sym)); } static pic_value @@ -306,7 +306,7 @@ analyze_local_var(analyze_state *state, pic_sym sym) { pic_state *pic = state->pic; - return pic_list2(pic, pic_symbol_value(state->sLREF), pic_sym_value(sym)); + return pic_list2(pic, pic_sym_value(state->sLREF), pic_sym_value(sym)); } static pic_value @@ -314,7 +314,7 @@ analyze_free_var(analyze_state *state, pic_sym sym, int depth) { pic_state *pic = state->pic; - return pic_list3(pic, pic_symbol_value(state->sCREF), pic_int_value(depth), pic_sym_value(sym)); + return pic_list3(pic, pic_sym_value(state->sCREF), pic_int_value(depth), pic_sym_value(sym)); } static pic_value @@ -480,7 +480,7 @@ analyze_define(analyze_state *state, pic_value obj) val = analyze(state, pic_list_ref(pic, obj, 2), false); } - return pic_list3(pic, pic_symbol_value(pic->sSETBANG), var, val); + return pic_list3(pic, pic_sym_value(pic->sSETBANG), var, val); } static pic_value @@ -505,7 +505,7 @@ analyze_if(analyze_state *state, pic_value obj, bool tailpos) if_true = analyze(state, if_true, tailpos); if_false = analyze(state, if_false, tailpos); - return pic_list4(pic, pic_symbol_value(pic->sIF), cond, if_true, if_false); + return pic_list4(pic, pic_sym_value(pic->sIF), cond, if_true, if_false); } static pic_value @@ -521,7 +521,7 @@ analyze_begin(analyze_state *state, pic_value obj, bool tailpos) case 2: return analyze(state, pic_list_ref(pic, obj, 1), tailpos); default: - seq = pic_list1(pic, pic_symbol_value(pic->sBEGIN)); + seq = pic_list1(pic, pic_sym_value(pic->sBEGIN)); for (obj = pic_cdr(pic, obj); ! pic_nil_p(obj); obj = pic_cdr(pic, obj)) { if (pic_nil_p(pic_cdr(pic, obj))) { tail = tailpos; @@ -554,7 +554,7 @@ analyze_set(analyze_state *state, pic_value obj) var = analyze(state, var, false); val = analyze(state, val, false); - return pic_list3(pic, pic_symbol_value(pic->sSETBANG), var, val); + return pic_list3(pic, pic_sym_value(pic->sSETBANG), var, val); } static pic_value @@ -569,18 +569,18 @@ analyze_quote(analyze_state *state, pic_value obj) } #define ARGC_ASSERT_GE(n) do { \ - if (pic_length(pic, obj) < (n) + 1) { \ - pic_errorf(pic, "wrong number of arguments"); \ - } \ - } while (0) + if (pic_length(pic, obj) < (n) + 1) { \ + pic_errorf(pic, "wrong number of arguments"); \ + } \ + } while (0) -#define FOLD_ARGS(sym) do { \ - obj = analyze(state, pic_car(pic, args), false); \ - pic_for_each (arg, pic_cdr(pic, args)) { \ - obj = pic_list3(pic, pic_symbol_value(sym), obj, \ - analyze(state, arg, false)); \ - } \ - } while (0) +#define FOLD_ARGS(sym) do { \ + obj = analyze(state, pic_car(pic, args), false); \ + pic_for_each (arg, pic_cdr(pic, args)) { \ + obj = pic_list3(pic, pic_sym_value(sym), obj, \ + analyze(state, arg, false)); \ + } \ + } while (0) static pic_value analyze_add(analyze_state *state, pic_value obj, bool tailpos) @@ -591,7 +591,7 @@ analyze_add(analyze_state *state, pic_value obj, bool tailpos) ARGC_ASSERT_GE(0); switch (pic_length(pic, obj)) { case 1: - return pic_list2(pic, pic_symbol_value(pic->sQUOTE), pic_int_value(0)); + return pic_list2(pic, pic_sym_value(pic->sQUOTE), pic_int_value(0)); case 2: return analyze(state, pic_car(pic, pic_cdr(pic, obj)), tailpos); default: @@ -610,7 +610,7 @@ analyze_sub(analyze_state *state, pic_value obj) ARGC_ASSERT_GE(1); switch (pic_length(pic, obj)) { case 2: - return pic_list2(pic, pic_symbol_value(pic->sMINUS), + return pic_list2(pic, pic_sym_value(pic->sMINUS), analyze(state, pic_car(pic, pic_cdr(pic, obj)), false)); default: args = pic_cdr(pic, obj); @@ -628,7 +628,7 @@ analyze_mul(analyze_state *state, pic_value obj, bool tailpos) ARGC_ASSERT_GE(0); switch (pic_length(pic, obj)) { case 1: - return pic_list2(pic, pic_symbol_value(pic->sQUOTE), pic_int_value(1)); + return pic_list2(pic, pic_sym_value(pic->sQUOTE), pic_int_value(1)); case 2: return analyze(state, pic_car(pic, pic_cdr(pic, obj)), tailpos); default: @@ -669,7 +669,7 @@ analyze_call(analyze_state *state, pic_value obj, bool tailpos) } else { call = state->sTAILCALL; } - seq = pic_list1(pic, pic_symbol_value(call)); + seq = pic_list1(pic, pic_sym_value(call)); pic_for_each (elt, obj) { seq = pic_cons(pic, analyze(state, elt, false), seq); } @@ -686,7 +686,7 @@ analyze_values(analyze_state *state, pic_value obj, bool tailpos) return analyze_call(state, obj, false); } - seq = pic_list1(pic, pic_symbol_value(state->sRETURN)); + seq = pic_list1(pic, pic_sym_value(state->sRETURN)); pic_for_each (v, pic_cdr(pic, obj)) { seq = pic_cons(pic, analyze(state, v, false), seq); } @@ -711,31 +711,31 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) } prod = analyze(state, pic_list_ref(pic, obj, 1), false); cnsm = analyze(state, pic_list_ref(pic, obj, 2), false); - return pic_list3(pic, pic_symbol_value(call), prod, cnsm); + return pic_list3(pic, pic_sym_value(call), prod, cnsm); } #define ARGC_ASSERT(n) do { \ - if (pic_length(pic, obj) != (n) + 1) { \ - pic_errorf(pic, "wrong number of arguments"); \ - } \ - } while (0) + if (pic_length(pic, obj) != (n) + 1) { \ + pic_errorf(pic, "wrong number of arguments"); \ + } \ + } while (0) -#define ARGC_ASSERT_WITH_FALLBACK(n) do { \ - if (pic_length(pic, obj) != (n) + 1) { \ - goto fallback; \ - } \ - } while (0) +#define ARGC_ASSERT_WITH_FALLBACK(n) do { \ + if (pic_length(pic, obj) != (n) + 1) { \ + goto fallback; \ + } \ + } while (0) -#define CONSTRUCT_OP1(op) \ - pic_list2(pic, \ - pic_symbol_value(op), \ - analyze(state, pic_list_ref(pic, obj, 1), false)) +#define CONSTRUCT_OP1(op) \ + pic_list2(pic, \ + pic_sym_value(op), \ + analyze(state, pic_list_ref(pic, obj, 1), false)) -#define CONSTRUCT_OP2(op) \ - pic_list3(pic, \ - pic_symbol_value(op), \ - analyze(state, pic_list_ref(pic, obj, 1), false), \ - analyze(state, pic_list_ref(pic, obj, 2), false)) +#define CONSTRUCT_OP2(op) \ + pic_list3(pic, \ + pic_sym_value(op), \ + analyze(state, pic_list_ref(pic, obj, 1), false), \ + analyze(state, pic_list_ref(pic, obj, 2), false)) static pic_value analyze_node(analyze_state *state, pic_value obj, bool tailpos) @@ -842,12 +842,12 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) return analyze_call_with_values(state, obj, tailpos); } } - fallback: + fallback: return analyze_call(state, obj, tailpos); } default: - return pic_list2(pic, pic_symbol_value(pic->sQUOTE), obj); + return pic_list2(pic, pic_sym_value(pic->sQUOTE), obj); } } diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 8f0562ec..ffacc89c 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -52,7 +52,6 @@ extern "C" { #include "picrin/value.h" #define pic_sym(v) pic_ptr(v) -#define pic_symbol_value(v) pic_sym_value(v) #define pic_sym_value(v) pic_obj_value(v) #define pic_sym_p(v) (pic_type(v) == PIC_TT_SYMBOL) diff --git a/extlib/benz/write.c b/extlib/benz/write.c index e35d6eee..f9ad68cf 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -17,7 +17,7 @@ is_tagged(pic_state *pic, pic_sym tag, pic_value pair) { return pic_pair_p(pic_cdr(pic, pair)) && pic_nil_p(pic_cddr(pic, pair)) - && pic_eq_p(pic_car(pic, pair), pic_symbol_value(tag)); + && pic_eq_p(pic_car(pic, pair), pic_sym_value(tag)); } static bool From fa1b681eba46bd05651e91fbc56f6e6fd680942d Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 11:08:27 +0900 Subject: [PATCH 11/26] remove pic_sym_value --- extlib/benz/codegen.c | 54 ++++++++++++++++++------------------ extlib/benz/debug.c | 2 +- extlib/benz/dict.c | 12 ++++---- extlib/benz/error.c | 2 +- extlib/benz/include/picrin.h | 1 - extlib/benz/init.c | 2 +- extlib/benz/lib.c | 12 ++++---- extlib/benz/macro.c | 18 ++++++------ extlib/benz/read.c | 12 ++++---- extlib/benz/record.c | 2 +- extlib/benz/symbol.c | 2 +- extlib/benz/write.c | 2 +- 12 files changed, 60 insertions(+), 61 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 3507f072..8bac2f3e 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -257,7 +257,7 @@ define_var(analyze_state *state, pic_sym sym) analyze_scope *scope = state->scope; if (lookup_scope(scope, sym)) { - pic_warnf(pic, "redefining variable: ~s", pic_sym_value(sym)); + pic_warnf(pic, "redefining variable: ~s", pic_obj_value(sym)); return; } @@ -283,7 +283,7 @@ analyze(analyze_state *state, pic_value obj, bool tailpos) /* pass through */ } else { - res = pic_list2(pic, pic_sym_value(state->sRETURN), res); + res = pic_list2(pic, pic_obj_value(state->sRETURN), res); } } @@ -298,7 +298,7 @@ analyze_global_var(analyze_state *state, pic_sym sym) { pic_state *pic = state->pic; - return pic_list2(pic, pic_sym_value(state->sGREF), pic_sym_value(sym)); + return pic_list2(pic, pic_obj_value(state->sGREF), pic_obj_value(sym)); } static pic_value @@ -306,7 +306,7 @@ analyze_local_var(analyze_state *state, pic_sym sym) { pic_state *pic = state->pic; - return pic_list2(pic, pic_sym_value(state->sLREF), pic_sym_value(sym)); + return pic_list2(pic, pic_obj_value(state->sLREF), pic_obj_value(sym)); } static pic_value @@ -314,7 +314,7 @@ analyze_free_var(analyze_state *state, pic_sym sym, int depth) { pic_state *pic = state->pic; - return pic_list3(pic, pic_sym_value(state->sCREF), pic_int_value(depth), pic_sym_value(sym)); + return pic_list3(pic, pic_obj_value(state->sCREF), pic_int_value(depth), pic_obj_value(sym)); } static pic_value @@ -343,7 +343,7 @@ analyze_defer(analyze_state *state, pic_value name, pic_value formal, pic_value const pic_sym sNOWHERE = pic_intern_cstr(pic, " nowhere "); pic_value skel; - skel = pic_list2(pic, pic_sym_value(state->sGREF), pic_sym_value(sNOWHERE)); + skel = pic_list2(pic, pic_obj_value(state->sGREF), pic_obj_value(sNOWHERE)); pic_push(pic, pic_list4(pic, name, formal, body, skel), state->scope->defer); @@ -388,7 +388,7 @@ analyze_procedure(analyze_state *state, pic_value name, pic_value formals, pic_v args = pic_nil_value(); for (i = xv_size(&scope->args); i > 0; --i) { var = xv_get(&scope->args, i - 1); - pic_push(pic, pic_sym_value(*var), args); + pic_push(pic, pic_obj_value(*var), args); } varg = scope->varg @@ -396,20 +396,20 @@ analyze_procedure(analyze_state *state, pic_value name, pic_value formals, pic_v : pic_false_value(); /* To know what kind of local variables are defined, analyze body at first. */ - body = analyze(state, pic_cons(pic, pic_sym_value(pic->rBEGIN), body_exprs), true); + body = analyze(state, pic_cons(pic, pic_obj_value(pic->rBEGIN), body_exprs), true); analyze_deferred(state); locals = pic_nil_value(); for (i = xv_size(&scope->locals); i > 0; --i) { var = xv_get(&scope->locals, i - 1); - pic_push(pic, pic_sym_value(*var), locals); + pic_push(pic, pic_obj_value(*var), locals); } captures = pic_nil_value(); for (i = xv_size(&scope->captures); i > 0; --i) { var = xv_get(&scope->captures, i - 1); - pic_push(pic, pic_sym_value(*var), captures); + pic_push(pic, pic_obj_value(*var), captures); } pop_scope(state); @@ -418,7 +418,7 @@ analyze_procedure(analyze_state *state, pic_value name, pic_value formals, pic_v pic_errorf(pic, "invalid formal syntax: ~s", args); } - return pic_list7(pic, pic_sym_value(pic->sLAMBDA), name, args, locals, varg, captures, body); + return pic_list7(pic, pic_obj_value(pic->sLAMBDA), name, args, locals, varg, captures, body); } static pic_value @@ -472,7 +472,7 @@ analyze_define(analyze_state *state, pic_value obj) formals = pic_list_ref(pic, pic_list_ref(pic, obj, 2), 1); body_exprs = pic_list_tail(pic, pic_list_ref(pic, obj, 2), 2); - val = analyze_defer(state, pic_sym_value(sym), formals, body_exprs); + val = analyze_defer(state, pic_obj_value(sym), formals, body_exprs); } else { if (pic_length(pic, obj) != 3) { pic_errorf(pic, "syntax error"); @@ -480,7 +480,7 @@ analyze_define(analyze_state *state, pic_value obj) val = analyze(state, pic_list_ref(pic, obj, 2), false); } - return pic_list3(pic, pic_sym_value(pic->sSETBANG), var, val); + return pic_list3(pic, pic_obj_value(pic->sSETBANG), var, val); } static pic_value @@ -505,7 +505,7 @@ analyze_if(analyze_state *state, pic_value obj, bool tailpos) if_true = analyze(state, if_true, tailpos); if_false = analyze(state, if_false, tailpos); - return pic_list4(pic, pic_sym_value(pic->sIF), cond, if_true, if_false); + return pic_list4(pic, pic_obj_value(pic->sIF), cond, if_true, if_false); } static pic_value @@ -521,7 +521,7 @@ analyze_begin(analyze_state *state, pic_value obj, bool tailpos) case 2: return analyze(state, pic_list_ref(pic, obj, 1), tailpos); default: - seq = pic_list1(pic, pic_sym_value(pic->sBEGIN)); + seq = pic_list1(pic, pic_obj_value(pic->sBEGIN)); for (obj = pic_cdr(pic, obj); ! pic_nil_p(obj); obj = pic_cdr(pic, obj)) { if (pic_nil_p(pic_cdr(pic, obj))) { tail = tailpos; @@ -554,7 +554,7 @@ analyze_set(analyze_state *state, pic_value obj) var = analyze(state, var, false); val = analyze(state, val, false); - return pic_list3(pic, pic_sym_value(pic->sSETBANG), var, val); + return pic_list3(pic, pic_obj_value(pic->sSETBANG), var, val); } static pic_value @@ -565,7 +565,7 @@ analyze_quote(analyze_state *state, pic_value obj) if (pic_length(pic, obj) != 2) { pic_errorf(pic, "syntax error"); } - return pic_list2(pic, pic_sym_value(pic->sQUOTE), pic_list_ref(pic, obj, 1)); + return pic_list2(pic, pic_obj_value(pic->sQUOTE), pic_list_ref(pic, obj, 1)); } #define ARGC_ASSERT_GE(n) do { \ @@ -577,7 +577,7 @@ analyze_quote(analyze_state *state, pic_value obj) #define FOLD_ARGS(sym) do { \ obj = analyze(state, pic_car(pic, args), false); \ pic_for_each (arg, pic_cdr(pic, args)) { \ - obj = pic_list3(pic, pic_sym_value(sym), obj, \ + obj = pic_list3(pic, pic_obj_value(sym), obj, \ analyze(state, arg, false)); \ } \ } while (0) @@ -591,7 +591,7 @@ analyze_add(analyze_state *state, pic_value obj, bool tailpos) ARGC_ASSERT_GE(0); switch (pic_length(pic, obj)) { case 1: - return pic_list2(pic, pic_sym_value(pic->sQUOTE), pic_int_value(0)); + return pic_list2(pic, pic_obj_value(pic->sQUOTE), pic_int_value(0)); case 2: return analyze(state, pic_car(pic, pic_cdr(pic, obj)), tailpos); default: @@ -610,7 +610,7 @@ analyze_sub(analyze_state *state, pic_value obj) ARGC_ASSERT_GE(1); switch (pic_length(pic, obj)) { case 2: - return pic_list2(pic, pic_sym_value(pic->sMINUS), + return pic_list2(pic, pic_obj_value(pic->sMINUS), analyze(state, pic_car(pic, pic_cdr(pic, obj)), false)); default: args = pic_cdr(pic, obj); @@ -628,7 +628,7 @@ analyze_mul(analyze_state *state, pic_value obj, bool tailpos) ARGC_ASSERT_GE(0); switch (pic_length(pic, obj)) { case 1: - return pic_list2(pic, pic_sym_value(pic->sQUOTE), pic_int_value(1)); + return pic_list2(pic, pic_obj_value(pic->sQUOTE), pic_int_value(1)); case 2: return analyze(state, pic_car(pic, pic_cdr(pic, obj)), tailpos); default: @@ -669,7 +669,7 @@ analyze_call(analyze_state *state, pic_value obj, bool tailpos) } else { call = state->sTAILCALL; } - seq = pic_list1(pic, pic_sym_value(call)); + seq = pic_list1(pic, pic_obj_value(call)); pic_for_each (elt, obj) { seq = pic_cons(pic, analyze(state, elt, false), seq); } @@ -686,7 +686,7 @@ analyze_values(analyze_state *state, pic_value obj, bool tailpos) return analyze_call(state, obj, false); } - seq = pic_list1(pic, pic_sym_value(state->sRETURN)); + seq = pic_list1(pic, pic_obj_value(state->sRETURN)); pic_for_each (v, pic_cdr(pic, obj)) { seq = pic_cons(pic, analyze(state, v, false), seq); } @@ -711,7 +711,7 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) } prod = analyze(state, pic_list_ref(pic, obj, 1), false); cnsm = analyze(state, pic_list_ref(pic, obj, 2), false); - return pic_list3(pic, pic_sym_value(call), prod, cnsm); + return pic_list3(pic, pic_obj_value(call), prod, cnsm); } #define ARGC_ASSERT(n) do { \ @@ -728,12 +728,12 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) #define CONSTRUCT_OP1(op) \ pic_list2(pic, \ - pic_sym_value(op), \ + pic_obj_value(op), \ analyze(state, pic_list_ref(pic, obj, 1), false)) #define CONSTRUCT_OP2(op) \ pic_list3(pic, \ - pic_sym_value(op), \ + pic_obj_value(op), \ analyze(state, pic_list_ref(pic, obj, 1), false), \ analyze(state, pic_list_ref(pic, obj, 2), false)) @@ -847,7 +847,7 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) return analyze_call(state, obj, tailpos); } default: - return pic_list2(pic, pic_sym_value(pic->sQUOTE), obj); + return pic_list2(pic, pic_obj_value(pic->sQUOTE), obj); } } diff --git a/extlib/benz/debug.c b/extlib/benz/debug.c index bb9f711d..bcd95546 100644 --- a/extlib/benz/debug.c +++ b/extlib/benz/debug.c @@ -50,7 +50,7 @@ pic_print_backtrace(pic_state *pic) e = pic_error_ptr(pic->err); if (e->type != pic_intern_cstr(pic, "")) { - trace = pic_format(pic, "~s ", pic_sym_value(e->type)); + trace = pic_format(pic, "~s ", pic_obj_value(e->type)); } else { trace = pic_make_str(pic, NULL, 0); } diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index fa83fe7c..bdfc40fd 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -26,7 +26,7 @@ pic_dict_ref(pic_state *pic, struct pic_dict *dict, pic_sym key) e = xh_get_ptr(&dict->hash, key); if (! e) { - pic_errorf(pic, "element not found for a key: ~s", pic_sym_value(key)); + pic_errorf(pic, "element not found for a key: ~s", pic_obj_value(key)); } return xh_val(e, pic_value); } @@ -59,7 +59,7 @@ void pic_dict_del(pic_state *pic, struct pic_dict *dict, pic_sym key) { if (xh_get_ptr(&dict->hash, key) == NULL) { - pic_errorf(pic, "no slot named ~s found in dictionary", pic_sym_value(key)); + pic_errorf(pic, "no slot named ~s found in dictionary", pic_obj_value(key)); } xh_del_ptr(&dict->hash, key); @@ -186,7 +186,7 @@ pic_dict_dictionary_map(pic_state *pic) if (it[i] == NULL) { break; } - pic_push(pic, pic_sym_value(xh_key(it[i], pic_sym)), arg); + pic_push(pic, pic_obj_value(xh_key(it[i], pic_sym)), arg); it[i] = xh_next(it[i]); } if (i != argc) { @@ -232,7 +232,7 @@ pic_dict_dictionary_for_each(pic_state *pic) if (it[i] == NULL) { break; } - pic_push(pic, pic_sym_value(xh_key(it[i], pic_sym)), arg); + pic_push(pic, pic_obj_value(xh_key(it[i], pic_sym)), arg); it[i] = xh_next(it[i]); } if (i != argc) { @@ -261,7 +261,7 @@ pic_dict_dictionary_to_alist(pic_state *pic) pic_get_args(pic, "d", &dict); for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { - item = pic_cons(pic, pic_sym_value(xh_key(it, pic_sym)), xh_val(it, pic_value)); + item = pic_cons(pic, pic_obj_value(xh_key(it, pic_sym)), xh_val(it, pic_value)); pic_push(pic, item, alist); } @@ -296,7 +296,7 @@ pic_dict_dictionary_to_plist(pic_state *pic) pic_get_args(pic, "d", &dict); for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { - pic_push(pic, pic_sym_value(xh_key(it, pic_sym)), plist); + pic_push(pic, pic_obj_value(xh_key(it, pic_sym)), plist); pic_push(pic, xh_val(it, pic_value), plist); } diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 1d950359..9a1ccac7 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -302,7 +302,7 @@ pic_error_error_object_type(pic_state *pic) pic_get_args(pic, "e", &e); - return pic_sym_value(e->type); + return pic_obj_value(e->type); } void diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index ffacc89c..8092fb96 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -52,7 +52,6 @@ extern "C" { #include "picrin/value.h" #define pic_sym(v) pic_ptr(v) -#define pic_sym_value(v) pic_obj_value(v) #define pic_sym_p(v) (pic_type(v) == PIC_TT_SYMBOL) typedef struct pic_code pic_code; diff --git a/extlib/benz/init.c b/extlib/benz/init.c index 6a1e05a3..68a58484 100644 --- a/extlib/benz/init.c +++ b/extlib/benz/init.c @@ -11,7 +11,7 @@ void pic_add_feature(pic_state *pic, const char *feature) { - pic_push(pic, pic_sym_value(pic_intern_cstr(pic, feature)), pic->features); + pic_push(pic, pic_obj_value(pic_intern_cstr(pic, feature)), pic->features); } void pic_init_bool(pic_state *); diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index f75ca99e..a4874156 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -104,7 +104,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) prefix = pic_list_ref(pic, spec, 2); pic_dict_for_each (sym, table) { - id = pic_intern(pic, pic_format(pic, "~s~s", prefix, pic_sym_value(sym))); + id = pic_intern(pic, pic_format(pic, "~s~s", prefix, pic_obj_value(sym))); pic_dict_set(pic, imports, id, pic_dict_ref(pic, table, sym)); } return; @@ -155,7 +155,7 @@ export(pic_state *pic, pic_value spec) goto fail; if (! (pic_length(pic, spec) == 3)) goto fail; - if (! pic_eq_p(pic_car(pic, spec), pic_sym_value(sRENAME))) + if (! pic_eq_p(pic_car(pic, spec), pic_obj_value(sRENAME))) goto fail; if (! pic_sym_p(a = pic_list_ref(pic, spec, 1))) goto fail; @@ -171,7 +171,7 @@ export(pic_state *pic, pic_value spec) printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym(b)), pic_symbol_name(pic, rename)); #endif - pic_dict_set(pic, pic->lib->exports, pic_sym(b), pic_sym_value(rename)); + pic_dict_set(pic, pic->lib->exports, pic_sym(b), pic_obj_value(rename)); return; @@ -194,7 +194,7 @@ pic_import_library(pic_state *pic, struct pic_lib *lib) void pic_export(pic_state *pic, pic_sym sym) { - export(pic, pic_sym_value(sym)); + export(pic, pic_obj_value(sym)); } static bool @@ -203,7 +203,7 @@ condexpand(pic_state *pic, pic_value clause) pic_sym tag; pic_value c, feature; - if (pic_eq_p(clause, pic_sym_value(pic->sELSE))) { + if (pic_eq_p(clause, pic_obj_value(pic->sELSE))) { return true; } if (pic_sym_p(clause)) { @@ -254,7 +254,7 @@ pic_lib_condexpand(pic_state *pic) for (i = 0; i < argc; i++) { if (condexpand(pic, pic_car(pic, clauses[i]))) { - return pic_cons(pic, pic_sym_value(pic->rBEGIN), pic_cdr(pic, clauses[i])); + return pic_cons(pic, pic_obj_value(pic->rBEGIN), pic_cdr(pic, clauses[i])); } } diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index 87dea7c1..ed3f85a0 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -25,7 +25,7 @@ pic_add_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym) void pic_put_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym rename) { - pic_dict_set(pic, senv->map, sym, pic_sym_value(rename)); + pic_dict_set(pic, senv->map, sym, pic_obj_value(rename)); } bool @@ -82,13 +82,13 @@ static pic_value macroexpand_lambda(pic_state *, pic_value, struct pic_senv *); static pic_value macroexpand_symbol(pic_state *pic, pic_sym sym, struct pic_senv *senv) { - return pic_sym_value(make_identifier(pic, sym, senv)); + return pic_obj_value(make_identifier(pic, sym, senv)); } static pic_value macroexpand_quote(pic_state *pic, pic_value expr) { - return pic_cons(pic, pic_sym_value(pic->rQUOTE), pic_cdr(pic, expr)); + return pic_cons(pic, pic_obj_value(pic->rQUOTE), pic_cdr(pic, expr)); } static pic_value @@ -172,7 +172,7 @@ macroexpand_lambda(pic_state *pic, pic_value expr, struct pic_senv *senv) macroexpand_deferred(pic, in); - return pic_cons(pic, pic_sym_value(pic->rLAMBDA), pic_cons(pic, formal, body)); + return pic_cons(pic, pic_obj_value(pic->rLAMBDA), pic_cons(pic, formal, body)); } static pic_value @@ -185,7 +185,7 @@ macroexpand_define(pic_state *pic, pic_value expr, struct pic_senv *senv) var = pic_car(pic, pic_cadr(pic, expr)); val = pic_cdr(pic, pic_cadr(pic, expr)); - expr = pic_list3(pic, pic_sym_value(pic->rDEFINE), var, pic_cons(pic, pic_sym_value(pic->rLAMBDA), pic_cons(pic, val, pic_cddr(pic, expr)))); + expr = pic_list3(pic, pic_obj_value(pic->rDEFINE), var, pic_cons(pic, pic_obj_value(pic->rLAMBDA), pic_cons(pic, val, pic_cddr(pic, expr)))); } if (pic_length(pic, expr) != 3) { @@ -202,7 +202,7 @@ macroexpand_define(pic_state *pic, pic_value expr, struct pic_senv *senv) } val = macroexpand(pic, pic_list_ref(pic, expr, 2), senv); - return pic_list3(pic, pic_sym_value(pic->rDEFINE), pic_sym_value(rename), val); + return pic_list3(pic, pic_obj_value(pic->rDEFINE), pic_obj_value(rename), val); } static pic_value @@ -223,7 +223,7 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) if (! pic_find_rename(pic, senv, sym, &rename)) { rename = pic_add_rename(pic, senv, sym); } else { - pic_warnf(pic, "redefining syntax variable: ~s", pic_sym_value(sym)); + pic_warnf(pic, "redefining syntax variable: ~s", pic_obj_value(sym)); } val = pic_cadr(pic, pic_cdr(pic, expr)); @@ -468,7 +468,7 @@ pic_identifier_eq_p(pic_state *pic, struct pic_senv *env1, pic_sym sym1, struct b = sym2; } - return pic_eq_p(pic_sym_value(a), pic_sym_value(b)); + return pic_eq_p(pic_obj_value(a), pic_obj_value(b)); } static pic_value @@ -491,7 +491,7 @@ pic_macro_make_identifier(pic_state *pic) pic_assert_type(pic, obj, senv); - return pic_sym_value(make_identifier(pic, sym, pic_senv_ptr(obj))); + return pic_obj_value(make_identifier(pic, sym, pic_senv_ptr(obj))); } static pic_value diff --git a/extlib/benz/read.c b/extlib/benz/read.c index c416fa22..f7637dc1 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -166,7 +166,7 @@ read_quote(pic_state *pic, struct pic_port *port, const char *str) { PIC_UNUSED(str); - return pic_list2(pic, pic_sym_value(pic->sQUOTE), read(pic, port, next(port))); + return pic_list2(pic, pic_obj_value(pic->sQUOTE), read(pic, port, next(port))); } static pic_value @@ -174,7 +174,7 @@ read_quasiquote(pic_state *pic, struct pic_port *port, const char *str) { PIC_UNUSED(str); - return pic_list2(pic, pic_sym_value(pic->sQUASIQUOTE), read(pic, port, next(port))); + return pic_list2(pic, pic_obj_value(pic->sQUASIQUOTE), read(pic, port, next(port))); } static pic_value @@ -182,7 +182,7 @@ read_unquote(pic_state *pic, struct pic_port *port, const char *str) { PIC_UNUSED(str); - return pic_list2(pic, pic_sym_value(pic->sUNQUOTE), read(pic, port, next(port))); + return pic_list2(pic, pic_obj_value(pic->sUNQUOTE), read(pic, port, next(port))); } static pic_value @@ -190,7 +190,7 @@ read_unquote_splicing(pic_state *pic, struct pic_port *port, const char *str) { PIC_UNUSED(str); - return pic_list2(pic, pic_sym_value(pic->sUNQUOTE_SPLICING), read(pic, port, next(port))); + return pic_list2(pic, pic_obj_value(pic->sUNQUOTE_SPLICING), read(pic, port, next(port))); } static pic_value @@ -226,7 +226,7 @@ read_symbol(pic_state *pic, struct pic_port *port, const char *str) sym = pic_intern_cstr(pic, buf); pic_free(pic, buf); - return pic_sym_value(sym); + return pic_obj_value(sym); } static size_t @@ -490,7 +490,7 @@ read_pipe(pic_state *pic, struct pic_port *port, const char *str) sym = pic_intern_cstr(pic, buf); pic_free(pic, buf); - return pic_sym_value(sym); + return pic_obj_value(sym); } static pic_value diff --git a/extlib/benz/record.c b/extlib/benz/record.c index 73beed13..331b43d4 100644 --- a/extlib/benz/record.c +++ b/extlib/benz/record.c @@ -32,7 +32,7 @@ pic_value pic_record_ref(pic_state *pic, struct pic_record *rec, pic_sym slot) { if (! pic_dict_has(pic, rec->data, slot)) { - pic_errorf(pic, "slot named ~s is not found for record: ~s", pic_sym_value(slot), rec); + pic_errorf(pic, "slot named ~s is not found for record: ~s", pic_obj_value(slot), rec); } return pic_dict_ref(pic, rec->data, slot); } diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 5305f9de..6c7cd620 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -108,7 +108,7 @@ pic_symbol_string_to_symbol(pic_state *pic) pic_get_args(pic, "s", &str); - return pic_sym_value(pic_intern(pic, str)); + return pic_obj_value(pic_intern(pic, str)); } void diff --git a/extlib/benz/write.c b/extlib/benz/write.c index f9ad68cf..ee521079 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -17,7 +17,7 @@ is_tagged(pic_state *pic, pic_sym tag, pic_value pair) { return pic_pair_p(pic_cdr(pic, pair)) && pic_nil_p(pic_cddr(pic, pair)) - && pic_eq_p(pic_car(pic, pair), pic_sym_value(tag)); + && pic_eq_p(pic_car(pic, pair), pic_obj_value(tag)); } static bool From 3fc49b59bed9fe294a3e237acdec78ece4011bc0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 11:11:19 +0900 Subject: [PATCH 12/26] move symbol-related macros to symbol.h --- extlib/benz/codegen.c | 1 + extlib/benz/dict.c | 1 + extlib/benz/include/picrin.h | 3 --- extlib/benz/include/picrin/symbol.h | 3 +++ extlib/benz/lib.c | 1 + extlib/benz/macro.c | 1 + extlib/benz/read.c | 1 + extlib/benz/vm.c | 1 + extlib/benz/write.c | 1 + 9 files changed, 10 insertions(+), 3 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 8bac2f3e..a58d24c8 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -9,6 +9,7 @@ #include "picrin/lib.h" #include "picrin/macro.h" #include "picrin/dict.h" +#include "picrin/symbol.h" #if PIC_NONE_IS_FALSE # define OP_PUSHNONE OP_PUSHFALSE diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index bdfc40fd..b9c18cce 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -7,6 +7,7 @@ #include "picrin/cont.h" #include "picrin/pair.h" #include "picrin/error.h" +#include "picrin/symbol.h" struct pic_dict * pic_make_dict(pic_state *pic) diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 8092fb96..c2a8c6ab 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -51,9 +51,6 @@ extern "C" { #include "picrin/util.h" #include "picrin/value.h" -#define pic_sym(v) pic_ptr(v) -#define pic_sym_p(v) (pic_type(v) == PIC_TT_SYMBOL) - typedef struct pic_code pic_code; struct pic_winder { diff --git a/extlib/benz/include/picrin/symbol.h b/extlib/benz/include/picrin/symbol.h index 84a706bc..629633e7 100644 --- a/extlib/benz/include/picrin/symbol.h +++ b/extlib/benz/include/picrin/symbol.h @@ -14,6 +14,9 @@ struct pic_symbol { pic_str *str; }; +#define pic_sym(v) pic_ptr(v) +#define pic_sym_p(v) (pic_type(v) == PIC_TT_SYMBOL) + #if defined(__cplusplus) } #endif diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index a4874156..217ba8d7 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -10,6 +10,7 @@ #include "picrin/string.h" #include "picrin/proc.h" #include "picrin/dict.h" +#include "picrin/symbol.h" struct pic_lib * pic_open_library(pic_state *pic, pic_value name) diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index ed3f85a0..5286f7d8 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -11,6 +11,7 @@ #include "picrin/error.h" #include "picrin/dict.h" #include "picrin/cont.h" +#include "picrin/symbol.h" pic_sym pic_add_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index f7637dc1..00e6fe8c 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -11,6 +11,7 @@ #include "picrin/blob.h" #include "picrin/port.h" #include "picrin/proc.h" +#include "picrin/symbol.h" static pic_value read(pic_state *pic, struct pic_port *port, int c); static pic_value read_nullable(pic_state *pic, struct pic_port *port, int c); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index db54e0ba..7bbaaf24 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -15,6 +15,7 @@ #include "picrin/error.h" #include "picrin/dict.h" #include "picrin/record.h" +#include "picrin/symbol.h" #define GET_OPERAND(pic,n) ((pic)->ci->fp[(n)]) diff --git a/extlib/benz/write.c b/extlib/benz/write.c index ee521079..ac374fe8 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -11,6 +11,7 @@ #include "picrin/dict.h" #include "picrin/record.h" #include "picrin/proc.h" +#include "picrin/symbol.h" static bool is_tagged(pic_state *pic, pic_sym tag, pic_value pair) From ccc7a2beed136ec10ade763c07f1ec2b725688fd Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 12:14:29 +0900 Subject: [PATCH 13/26] add gc on/off flag --- extlib/benz/gc.c | 4 ++++ extlib/benz/include/picrin.h | 1 + extlib/benz/state.c | 32 ++++++++++++++++++++------------ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 1eb068e4..4c6c37c8 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -760,6 +760,10 @@ pic_gc_run(pic_state *pic) struct heap_page *page; #endif + if (! pic->gc_enable) { + return; + } + #if DEBUG puts("gc run!"); #endif diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index c2a8c6ab..5bbbf620 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -119,6 +119,7 @@ typedef struct { struct pic_reader *reader; + bool gc_enable; struct pic_heap *heap; struct pic_object **arena; size_t arena_size, arena_idx; diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 9c10e56e..862fc719 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -25,6 +25,9 @@ pic_open(int argc, char *argv[], char **envp) pic = malloc(sizeof(pic_state)); + /* turn off GC */ + pic->gc_enable = false; + /* root block */ pic->wind = NULL; @@ -67,11 +70,10 @@ pic_open(int argc, char *argv[], char **envp) pic->libs = pic_nil_value(); pic->lib = NULL; - /* reader */ - pic->reader = malloc(sizeof(struct pic_reader)); - pic->reader->typecase = PIC_CASE_DEFAULT; - pic->reader->trie = pic_make_trie(pic); - xh_init_int(&pic->reader->labels, sizeof(pic_value)); + /* GC arena */ + pic->arena = calloc(PIC_ARENA_SIZE, sizeof(struct pic_object **)); + pic->arena_size = PIC_ARENA_SIZE; + pic->arena_idx = 0; /* raised error object */ pic->err = pic_undef_value(); @@ -81,17 +83,13 @@ pic_open(int argc, char *argv[], char **envp) pic->xSTDOUT = NULL; pic->xSTDERR = NULL; - /* GC arena */ - pic->arena = calloc(PIC_ARENA_SIZE, sizeof(struct pic_object **)); - pic->arena_size = PIC_ARENA_SIZE; - pic->arena_idx = 0; - /* native stack marker */ pic->native_stack_start = &t; + ai = pic_gc_arena_preserve(pic); + #define S(slot,name) pic->slot = pic_intern_cstr(pic, name); - ai = pic_gc_arena_preserve(pic); S(sDEFINE, "define"); S(sLAMBDA, "lambda"); S(sIF, "if"); @@ -138,7 +136,6 @@ pic_open(int argc, char *argv[], char **envp) #define R(slot,name) pic->slot = pic_gensym(pic, pic_intern_cstr(pic, name)); - ai = pic_gc_arena_preserve(pic); R(rDEFINE, "define"); R(rLAMBDA, "lambda"); R(rIF, "if"); @@ -163,6 +160,12 @@ pic_open(int argc, char *argv[], char **envp) pic->wind->depth = 0; pic->wind->in = pic->wind->out = NULL; + /* reader */ + pic->reader = malloc(sizeof(struct pic_reader)); + pic->reader->typecase = PIC_CASE_DEFAULT; + pic->reader->trie = pic_make_trie(pic); + xh_init_int(&pic->reader->labels, sizeof(pic_value)); + /* init readers */ pic_init_reader(pic); @@ -176,6 +179,11 @@ pic_open(int argc, char *argv[], char **envp) pic->xSTDOUT = pic_make_standard_port(pic, xstdout, PIC_PORT_OUT); pic->xSTDERR = pic_make_standard_port(pic, xstderr, PIC_PORT_OUT); + pic_gc_arena_restore(pic, ai); + + /* turn on GC */ + pic->gc_enable = true; + pic_init_core(pic); return pic; From ca690485138908a8169b7054b7f36b5f575b12b4 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 12:14:46 +0900 Subject: [PATCH 14/26] turn on GC --- extlib/benz/gc.c | 40 ++++++++++++++++++++++++++++++++++++++-- extlib/benz/state.c | 11 ++++++----- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 4c6c37c8..c82d6838 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -390,6 +390,8 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) } if (pic_proc_irep_p(proc)) { gc_mark_object(pic, (struct pic_object *)proc->u.irep); + } else { + gc_mark_object(pic, (struct pic_object *)proc->u.func.name); } break; } @@ -398,7 +400,8 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) } case PIC_TT_ERROR: { struct pic_error *err = (struct pic_error *)obj; - gc_mark_object(pic,(struct pic_object *)err->msg); + gc_mark_object(pic, (struct pic_object *)err->type); + gc_mark_object(pic, (struct pic_object *)err->msg); gc_mark(pic, err->irrs); gc_mark_object(pic, (struct pic_object *)err->stack); break; @@ -443,6 +446,9 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) for (i = 0; i < irep->plen; ++i) { gc_mark(pic, irep->pool[i]); } + for (i = 0; i < irep->slen; ++i) { + gc_mark_object(pic, (struct pic_object *)irep->syms[i]); + } break; } case PIC_TT_DATA: { @@ -462,6 +468,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) xh_entry *it; for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { + gc_mark_object(pic, (struct pic_object *)xh_key(it, pic_sym)); gc_mark(pic, xh_val(it, pic_value)); } break; @@ -516,6 +523,28 @@ gc_mark_trie(pic_state *pic, struct pic_trie *trie) } } +#define M(x) gc_mark_object(pic, (struct pic_object *)pic->x) + +static void +gc_mark_global_symbols(pic_state *pic) +{ + M(sDEFINE); M(sLAMBDA); M(sIF); M(sBEGIN); M(sQUOTE); M(sSETBANG); + M(sQUASIQUOTE); M(sUNQUOTE); M(sUNQUOTE_SPLICING); + M(sDEFINE_SYNTAX); M(sIMPORT); M(sEXPORT); + M(sDEFINE_LIBRARY); M(sIN_LIBRARY); + M(sCOND_EXPAND); M(sAND); M(sOR); M(sELSE); M(sLIBRARY); + M(sONLY); M(sRENAME); M(sPREFIX); M(sEXCEPT); + M(sCONS); M(sCAR); M(sCDR); M(sNILP); + M(sSYMBOL_P); M(sPAIR_P); + M(sADD); M(sSUB); M(sMUL); M(sDIV); M(sMINUS); + M(sEQ); M(sLT); M(sLE); M(sGT); M(sGE); M(sNOT); + M(sREAD); M(sFILE); + M(rDEFINE); M(rLAMBDA); M(rIF); M(rBEGIN); M(rQUOTE); M(rSETBANG); + M(rDEFINE_SYNTAX); M(rIMPORT); M(rEXPORT); + M(rDEFINE_LIBRARY); M(rIN_LIBRARY); + M(rCOND_EXPAND); +} + static void gc_mark_phase(pic_state *pic) { @@ -553,6 +582,13 @@ gc_mark_phase(pic_state *pic) gc_mark_object(pic, pic->arena[j]); } + gc_mark_global_symbols(pic); + + /* symbol table */ + for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { + gc_mark_object(pic, (struct pic_object *)xh_val(it, pic_sym)); + } + /* global variables */ if (pic->globals) { gc_mark_object(pic, (struct pic_object *)pic->globals); @@ -814,7 +850,7 @@ pic_obj_alloc_unsafe(pic_state *pic, size_t size, enum pic_tt tt) obj = (struct pic_object *)gc_alloc(pic, size); if (obj == NULL) { - /* pic_gc_run(pic); */ + pic_gc_run(pic); obj = (struct pic_object *)gc_alloc(pic, size); if (obj == NULL) { add_heap_page(pic); diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 862fc719..43a44934 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -202,6 +202,11 @@ pic_close(pic_state *pic) pic->wind = pic->wind->prev; } + /* free symbol names */ + for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { + free(xh_key(it, char *)); + } + /* clear out root objects */ pic->sp = pic->stbase; pic->ci = pic->cibase; @@ -210,6 +215,7 @@ pic_close(pic_state *pic) pic->err = pic_undef_value(); pic->globals = NULL; pic->macros = NULL; + xh_clear(&pic->syms); xh_clear(&pic->attrs); pic->features = pic_nil_value(); pic->libs = pic_nil_value(); @@ -230,11 +236,6 @@ pic_close(pic_state *pic) pic_trie_delete(pic, pic->reader->trie); free(pic->reader); - /* free symbol names */ - for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { - free(xh_key(it, char *)); - } - /* free global stacks */ xh_destroy(&pic->syms); xh_destroy(&pic->attrs); From 3b3032ee550115ba866ee7a81ea63575db854e57 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 13:12:04 +0900 Subject: [PATCH 15/26] don't malloc in pic_interned_p --- extlib/benz/symbol.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 6c7cd620..879f48ae 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -51,7 +51,14 @@ pic_gensym(pic_state *pic, pic_sym base) bool pic_interned_p(pic_state *pic, pic_sym sym) { - return sym == pic_intern(pic, sym->str); + xh_entry *e; + + e = xh_get_str(&pic->syms, pic_str_cstr(sym->str)); + if (e) { + return sym == xh_val(e, pic_sym); + } else { + return false; + } } const char * From ce3cf1741de3d0d1aef4f7d6e75e1d3544870bb1 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 13:12:45 +0900 Subject: [PATCH 16/26] improve error message --- extlib/benz/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index a58d24c8..7b2adb46 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -1465,7 +1465,7 @@ codegen(codegen_state *state, pic_value obj) cxt->clen++; return; } - pic_errorf(pic, "codegen: unknown AST type"); + pic_errorf(pic, "codegen: unknown AST type ~s", obj); } static struct pic_irep * From ffa27e4b11b269360474ddaa30f20cb2f8753f08 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 13:16:07 +0900 Subject: [PATCH 17/26] s/SYMBOL_P/SYMBOLP/g, s/PAIR_P/PAIRP/g --- extlib/benz/codegen.c | 22 +++++++++++----------- extlib/benz/gc.c | 2 +- extlib/benz/include/picrin.h | 2 +- extlib/benz/include/picrin/irep.h | 12 ++++++------ extlib/benz/state.c | 4 ++-- extlib/benz/vm.c | 6 +++--- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 7b2adb46..eab53fd0 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -37,7 +37,7 @@ typedef struct analyze_state { pic_state *pic; analyze_scope *scope; pic_sym rCONS, rCAR, rCDR, rNILP; - pic_sym rSYMBOL_P, rPAIR_P; + pic_sym rSYMBOLP, rPAIRP; pic_sym rADD, rSUB, rMUL, rDIV; pic_sym rEQ, rLT, rLE, rGT, rGE, rNOT; pic_sym rVALUES, rCALL_WITH_VALUES; @@ -76,8 +76,8 @@ new_analyze_state(pic_state *pic) register_renamed_symbol(pic, state, rCAR, pic->PICRIN_BASE, "car"); register_renamed_symbol(pic, state, rCDR, pic->PICRIN_BASE, "cdr"); register_renamed_symbol(pic, state, rNILP, pic->PICRIN_BASE, "null?"); - register_renamed_symbol(pic, state, rSYMBOL_P, pic->PICRIN_BASE, "symbol?"); - register_renamed_symbol(pic, state, rPAIR_P, pic->PICRIN_BASE, "pair?"); + register_renamed_symbol(pic, state, rSYMBOLP, pic->PICRIN_BASE, "symbol?"); + register_renamed_symbol(pic, state, rPAIRP, pic->PICRIN_BASE, "pair?"); register_renamed_symbol(pic, state, rADD, pic->PICRIN_BASE, "+"); register_renamed_symbol(pic, state, rSUB, pic->PICRIN_BASE, "-"); register_renamed_symbol(pic, state, rMUL, pic->PICRIN_BASE, "*"); @@ -792,13 +792,13 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) ARGC_ASSERT(1); return CONSTRUCT_OP1(pic->sNILP); } - else if (sym == state->rSYMBOL_P) { + else if (sym == state->rSYMBOLP) { ARGC_ASSERT(1); - return CONSTRUCT_OP1(pic->sSYMBOL_P); + return CONSTRUCT_OP1(pic->sSYMBOLP); } - else if (sym == state->rPAIR_P) { + else if (sym == state->rPAIRP) { ARGC_ASSERT(1); - return CONSTRUCT_OP1(pic->sPAIR_P); + return CONSTRUCT_OP1(pic->sPAIRP); } else if (sym == state->rADD) { return analyze_add(state, obj, tailpos); @@ -1340,15 +1340,15 @@ codegen(codegen_state *state, pic_value obj) cxt->clen++; return; } - else if (sym == pic->sSYMBOL_P) { + else if (sym == pic->sSYMBOLP) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_SYMBOL_P; + cxt->code[cxt->clen].insn = OP_SYMBOLP; cxt->clen++; return; } - else if (sym == pic->sPAIR_P) { + else if (sym == pic->sPAIRP) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_PAIR_P; + cxt->code[cxt->clen].insn = OP_PAIRP; cxt->clen++; return; } diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index c82d6838..9c89682e 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -535,7 +535,7 @@ gc_mark_global_symbols(pic_state *pic) M(sCOND_EXPAND); M(sAND); M(sOR); M(sELSE); M(sLIBRARY); M(sONLY); M(sRENAME); M(sPREFIX); M(sEXCEPT); M(sCONS); M(sCAR); M(sCDR); M(sNILP); - M(sSYMBOL_P); M(sPAIR_P); + M(sSYMBOLP); M(sPAIRP); M(sADD); M(sSUB); M(sMUL); M(sDIV); M(sMINUS); M(sEQ); M(sLT); M(sLE); M(sGT); M(sGE); M(sNOT); M(sREAD); M(sFILE); diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 5bbbf620..a0a87575 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -96,7 +96,7 @@ typedef struct { pic_sym sCOND_EXPAND, sAND, sOR, sELSE, sLIBRARY; pic_sym sONLY, sRENAME, sPREFIX, sEXCEPT; pic_sym sCONS, sCAR, sCDR, sNILP; - pic_sym sSYMBOL_P, sPAIR_P; + pic_sym sSYMBOLP, sPAIRP; pic_sym sADD, sSUB, sMUL, sDIV, sMINUS; pic_sym sEQ, sLT, sLE, sGT, sGE, sNOT; pic_sym sREAD, sFILE; diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/irep.h index 70597a71..80159547 100644 --- a/extlib/benz/include/picrin/irep.h +++ b/extlib/benz/include/picrin/irep.h @@ -35,8 +35,8 @@ enum pic_opcode { OP_CAR, OP_CDR, OP_NILP, - OP_SYMBOL_P, - OP_PAIR_P, + OP_SYMBOLP, + OP_PAIRP, OP_ADD, OP_SUB, OP_MUL, @@ -152,11 +152,11 @@ pic_dump_code(pic_code c) case OP_NILP: puts("OP_NILP"); break; - case OP_SYMBOL_P: - puts("OP_SYMBOL_P"); + case OP_SYMBOLP: + puts("OP_SYMBOLP"); break; - case OP_PAIR_P: - puts("OP_PAIR_P"); + case OP_PAIRP: + puts("OP_PAIRP"); break; case OP_CDR: puts("OP_CDR"); diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 43a44934..a69c2331 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -117,8 +117,8 @@ pic_open(int argc, char *argv[], char **envp) S(sCAR, "car"); S(sCDR, "cdr"); S(sNILP, "null?"); - S(sSYMBOL_P, "symbol?"); - S(sPAIR_P, "pair?"); + S(sSYMBOLP, "symbol?"); + S(sPAIRP, "pair?"); S(sADD, "+"); S(sSUB, "-"); S(sMUL, "*"); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 7bbaaf24..cc0aa9b7 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -706,7 +706,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) &&L_OP_GREF, &&L_OP_GSET, &&L_OP_LREF, &&L_OP_LSET, &&L_OP_CREF, &&L_OP_CSET, &&L_OP_JMP, &&L_OP_JMPIF, &&L_OP_NOT, &&L_OP_CALL, &&L_OP_TAILCALL, &&L_OP_RET, &&L_OP_LAMBDA, &&L_OP_CONS, &&L_OP_CAR, &&L_OP_CDR, &&L_OP_NILP, - &&L_OP_SYMBOL_P, &&L_OP_PAIR_P, + &&L_OP_SYMBOLP, &&L_OP_PAIRP, &&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL, &&L_OP_DIV, &&L_OP_MINUS, &&L_OP_EQ, &&L_OP_LT, &&L_OP_LE, &&L_OP_STOP }; @@ -1046,14 +1046,14 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) NEXT; } - CASE(OP_SYMBOL_P) { + CASE(OP_SYMBOLP) { pic_value p; p = POP(); PUSH(pic_bool_value(pic_sym_p(p))); NEXT; } - CASE(OP_PAIR_P) { + CASE(OP_PAIRP) { pic_value p; p = POP(); PUSH(pic_bool_value(pic_pair_p(p))); From 44ff702e60ee003d55f7a6779c8efa004399c91a Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 14:09:25 +0900 Subject: [PATCH 18/26] rename internal object --- extlib/benz/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index eab53fd0..2014a35e 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -341,7 +341,7 @@ static pic_value analyze_defer(analyze_state *state, pic_value name, pic_value formal, pic_value body) { pic_state *pic = state->pic; - const pic_sym sNOWHERE = pic_intern_cstr(pic, " nowhere "); + const pic_sym sNOWHERE = pic_intern_cstr(pic, "<>"); pic_value skel; skel = pic_list2(pic, pic_obj_value(state->sGREF), pic_obj_value(sNOWHERE)); From 772a5ceae56fc911a4d70b1aadd1d9eb985c1ed4 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 14:09:47 +0900 Subject: [PATCH 19/26] [bugfix] pic_intern must count up reference of the return value --- extlib/benz/symbol.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 879f48ae..7acbbece 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -25,7 +25,9 @@ pic_intern(pic_state *pic, pic_str *str) e = xh_get_str(&pic->syms, pic_str_cstr(str)); if (e) { - return xh_val(e, pic_sym); + sym = xh_val(e, pic_sym); + pic_gc_protect(pic, pic_obj_value(sym)); + return sym; } cstr = pic_malloc(pic, pic_strlen(str) + 1); From b9df96499df51d6b18a9c9b015c8f24eba526258 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 14:35:42 +0900 Subject: [PATCH 20/26] move symbol constants to pic_state --- extlib/benz/codegen.c | 67 ++++++++++++------------------------ extlib/benz/gc.c | 2 ++ extlib/benz/include/picrin.h | 3 ++ extlib/benz/state.c | 9 +++++ 4 files changed, 36 insertions(+), 45 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 2014a35e..704fb863 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -41,8 +41,6 @@ typedef struct analyze_state { pic_sym rADD, rSUB, rMUL, rDIV; pic_sym rEQ, rLT, rLE, rGT, rGE, rNOT; pic_sym rVALUES, rCALL_WITH_VALUES; - pic_sym sCALL, sTAILCALL, sCALL_WITH_VALUES, sTAILCALL_WITH_VALUES; - pic_sym sGREF, sLREF, sCREF, sRETURN; } analyze_state; static bool push_scope(analyze_state *, pic_value); @@ -91,15 +89,6 @@ new_analyze_state(pic_state *pic) register_renamed_symbol(pic, state, rVALUES, pic->PICRIN_BASE, "values"); register_renamed_symbol(pic, state, rCALL_WITH_VALUES, pic->PICRIN_BASE, "call-with-values"); - register_symbol(pic, state, sCALL, "call"); - register_symbol(pic, state, sTAILCALL, "tail-call"); - register_symbol(pic, state, sCALL_WITH_VALUES, "call-with-values"); - register_symbol(pic, state, sTAILCALL_WITH_VALUES, "tailcall-with-values"); - register_symbol(pic, state, sGREF, "gref"); - register_symbol(pic, state, sLREF, "lref"); - register_symbol(pic, state, sCREF, "cref"); - register_symbol(pic, state, sRETURN, "return"); - /* push initial scope */ push_scope(state, pic_nil_value()); @@ -280,11 +269,11 @@ analyze(analyze_state *state, pic_value obj, bool tailpos) tag = pic_sym(pic_car(pic, res)); if (tailpos) { - if (tag == pic->sIF || tag == pic->sBEGIN || tag == state->sTAILCALL || tag == state->sTAILCALL_WITH_VALUES || tag == state->sRETURN) { + if (tag == pic->sIF || tag == pic->sBEGIN || tag == pic->sTAILCALL || tag == pic->sTAILCALL_WITH_VALUES || tag == pic->sRETURN) { /* pass through */ } else { - res = pic_list2(pic, pic_obj_value(state->sRETURN), res); + res = pic_list2(pic, pic_obj_value(pic->sRETURN), res); } } @@ -299,7 +288,7 @@ analyze_global_var(analyze_state *state, pic_sym sym) { pic_state *pic = state->pic; - return pic_list2(pic, pic_obj_value(state->sGREF), pic_obj_value(sym)); + return pic_list2(pic, pic_obj_value(pic->sGREF), pic_obj_value(sym)); } static pic_value @@ -307,7 +296,7 @@ analyze_local_var(analyze_state *state, pic_sym sym) { pic_state *pic = state->pic; - return pic_list2(pic, pic_obj_value(state->sLREF), pic_obj_value(sym)); + return pic_list2(pic, pic_obj_value(pic->sLREF), pic_obj_value(sym)); } static pic_value @@ -315,7 +304,7 @@ analyze_free_var(analyze_state *state, pic_sym sym, int depth) { pic_state *pic = state->pic; - return pic_list3(pic, pic_obj_value(state->sCREF), pic_int_value(depth), pic_obj_value(sym)); + return pic_list3(pic, pic_obj_value(pic->sCREF), pic_int_value(depth), pic_obj_value(sym)); } static pic_value @@ -344,7 +333,7 @@ analyze_defer(analyze_state *state, pic_value name, pic_value formal, pic_value const pic_sym sNOWHERE = pic_intern_cstr(pic, "<>"); pic_value skel; - skel = pic_list2(pic, pic_obj_value(state->sGREF), pic_obj_value(sNOWHERE)); + skel = pic_list2(pic, pic_obj_value(pic->sGREF), pic_obj_value(sNOWHERE)); pic_push(pic, pic_list4(pic, name, formal, body, skel), state->scope->defer); @@ -666,9 +655,9 @@ analyze_call(analyze_state *state, pic_value obj, bool tailpos) pic_sym call; if (! tailpos) { - call = state->sCALL; + call = pic->sCALL; } else { - call = state->sTAILCALL; + call = pic->sTAILCALL; } seq = pic_list1(pic, pic_obj_value(call)); pic_for_each (elt, obj) { @@ -687,7 +676,7 @@ analyze_values(analyze_state *state, pic_value obj, bool tailpos) return analyze_call(state, obj, false); } - seq = pic_list1(pic, pic_obj_value(state->sRETURN)); + seq = pic_list1(pic, pic_obj_value(pic->sRETURN)); pic_for_each (v, pic_cdr(pic, obj)) { seq = pic_cons(pic, analyze(state, v, false), seq); } @@ -706,9 +695,9 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) } if (! tailpos) { - call = state->sCALL_WITH_VALUES; + call = pic->sCALL_WITH_VALUES; } else { - call = state->sTAILCALL_WITH_VALUES; + call = pic->sTAILCALL_WITH_VALUES; } prod = analyze(state, pic_list_ref(pic, obj, 1), false); cnsm = analyze(state, pic_list_ref(pic, obj, 2), false); @@ -899,9 +888,6 @@ typedef struct codegen_context { typedef struct codegen_state { pic_state *pic; codegen_context *cxt; - pic_sym sGREF, sCREF, sLREF; - pic_sym sCALL, sTAILCALL, sRETURN; - pic_sym sCALL_WITH_VALUES, sTAILCALL_WITH_VALUES; } codegen_state; static void push_codegen_context(codegen_state *, pic_value, pic_value, pic_value, bool, pic_value); @@ -916,15 +902,6 @@ new_codegen_state(pic_state *pic) state->pic = pic; state->cxt = NULL; - register_symbol(pic, state, sCALL, "call"); - register_symbol(pic, state, sTAILCALL, "tail-call"); - register_symbol(pic, state, sGREF, "gref"); - register_symbol(pic, state, sLREF, "lref"); - register_symbol(pic, state, sCREF, "cref"); - register_symbol(pic, state, sRETURN, "return"); - register_symbol(pic, state, sCALL_WITH_VALUES, "call-with-values"); - register_symbol(pic, state, sTAILCALL_WITH_VALUES, "tailcall-with-values"); - push_codegen_context(state, pic_false_value(), pic_nil_value(), pic_nil_value(), false, pic_nil_value()); return state; @@ -1144,12 +1121,12 @@ codegen(codegen_state *state, pic_value obj) pic_sym sym; sym = pic_sym(pic_car(pic, obj)); - if (sym == state->sGREF) { + if (sym == pic->sGREF) { cxt->code[cxt->clen].insn = OP_GREF; cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, obj, 1))); cxt->clen++; return; - } else if (sym == state->sCREF) { + } else if (sym == pic->sCREF) { pic_sym name; int depth; @@ -1160,7 +1137,7 @@ codegen(codegen_state *state, pic_value obj) cxt->code[cxt->clen].u.r.idx = index_capture(state, name, depth); cxt->clen++; return; - } else if (sym == state->sLREF) { + } else if (sym == pic->sLREF) { pic_sym name; int i; @@ -1184,7 +1161,7 @@ codegen(codegen_state *state, pic_value obj) var = pic_list_ref(pic, obj, 1); type = pic_sym(pic_list_ref(pic, var, 0)); - if (type == state->sGREF) { + if (type == pic->sGREF) { cxt->code[cxt->clen].insn = OP_GSET; cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, var, 1))); cxt->clen++; @@ -1192,7 +1169,7 @@ codegen(codegen_state *state, pic_value obj) cxt->clen++; return; } - else if (type == state->sCREF) { + else if (type == pic->sCREF) { pic_sym name; int depth; @@ -1206,7 +1183,7 @@ codegen(codegen_state *state, pic_value obj) cxt->clen++; return; } - else if (type == state->sLREF) { + else if (type == pic->sLREF) { pic_sym name; int i; @@ -1427,19 +1404,19 @@ codegen(codegen_state *state, pic_value obj) cxt->clen++; return; } - else if (sym == state->sCALL || sym == state->sTAILCALL) { + else if (sym == pic->sCALL || sym == pic->sTAILCALL) { int len = (int)pic_length(pic, obj); pic_value elt; pic_for_each (elt, pic_cdr(pic, obj)) { codegen(state, elt); } - cxt->code[cxt->clen].insn = (sym == state->sCALL) ? OP_CALL : OP_TAILCALL; + cxt->code[cxt->clen].insn = (sym == pic->sCALL) ? OP_CALL : OP_TAILCALL; cxt->code[cxt->clen].u.i = len - 1; cxt->clen++; return; } - else if (sym == state->sCALL_WITH_VALUES || sym == state->sTAILCALL_WITH_VALUES) { + else if (sym == pic->sCALL_WITH_VALUES || sym == pic->sTAILCALL_WITH_VALUES) { /* stack consumer at first */ codegen(state, pic_list_ref(pic, obj, 2)); codegen(state, pic_list_ref(pic, obj, 1)); @@ -1448,12 +1425,12 @@ codegen(codegen_state *state, pic_value obj) cxt->code[cxt->clen].u.i = 1; cxt->clen++; /* call consumer */ - cxt->code[cxt->clen].insn = (sym == state->sCALL_WITH_VALUES) ? OP_CALL : OP_TAILCALL; + cxt->code[cxt->clen].insn = (sym == pic->sCALL_WITH_VALUES) ? OP_CALL : OP_TAILCALL; cxt->code[cxt->clen].u.i = -1; cxt->clen++; return; } - else if (sym == state->sRETURN) { + else if (sym == pic->sRETURN) { int len = (int)pic_length(pic, obj); pic_value elt; diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 9c89682e..c3d601d8 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -539,6 +539,8 @@ gc_mark_global_symbols(pic_state *pic) M(sADD); M(sSUB); M(sMUL); M(sDIV); M(sMINUS); M(sEQ); M(sLT); M(sLE); M(sGT); M(sGE); M(sNOT); M(sREAD); M(sFILE); + M(sCALL); M(sTAILCALL); M(sCALL_WITH_VALUES); M(sTAILCALL_WITH_VALUES); + M(sGREF); M(sLREF); M(sCREF); M(sRETURN); M(rDEFINE); M(rLAMBDA); M(rIF); M(rBEGIN); M(rQUOTE); M(rSETBANG); M(rDEFINE_SYNTAX); M(rIMPORT); M(rEXPORT); M(rDEFINE_LIBRARY); M(rIN_LIBRARY); diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index a0a87575..9c2ef399 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -100,6 +100,9 @@ typedef struct { pic_sym sADD, sSUB, sMUL, sDIV, sMINUS; pic_sym sEQ, sLT, sLE, sGT, sGE, sNOT; pic_sym sREAD, sFILE; + pic_sym sGREF, sCREF, sLREF; + pic_sym sCALL, sTAILCALL, sRETURN; + pic_sym sCALL_WITH_VALUES, sTAILCALL_WITH_VALUES; pic_sym rDEFINE, rLAMBDA, rIF, rBEGIN, rQUOTE, rSETBANG; pic_sym rDEFINE_SYNTAX, rIMPORT, rEXPORT; diff --git a/extlib/benz/state.c b/extlib/benz/state.c index a69c2331..a680c3ba 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -132,6 +132,15 @@ pic_open(int argc, char *argv[], char **envp) S(sNOT, "not"); S(sREAD, "read"); S(sFILE, "file"); + S(sCALL, "call"); + S(sTAILCALL, "tail-call"); + S(sGREF, "gref"); + S(sLREF, "lref"); + S(sCREF, "cref"); + S(sRETURN, "return"); + S(sCALL_WITH_VALUES, "call-with-values"); + S(sTAILCALL_WITH_VALUES, "tailcall-with-values"); + pic_gc_arena_restore(pic, ai); #define R(slot,name) pic->slot = pic_gensym(pic, pic_intern_cstr(pic, name)); From 7964c4f5bb6ff03e65d99879ebbee9d82c47e71c Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 19 Jan 2015 14:41:27 +0900 Subject: [PATCH 21/26] mark only interned symbols and some specisl uninterned symbols --- extlib/benz/gc.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index c3d601d8..f8eb1798 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -528,19 +528,6 @@ gc_mark_trie(pic_state *pic, struct pic_trie *trie) static void gc_mark_global_symbols(pic_state *pic) { - M(sDEFINE); M(sLAMBDA); M(sIF); M(sBEGIN); M(sQUOTE); M(sSETBANG); - M(sQUASIQUOTE); M(sUNQUOTE); M(sUNQUOTE_SPLICING); - M(sDEFINE_SYNTAX); M(sIMPORT); M(sEXPORT); - M(sDEFINE_LIBRARY); M(sIN_LIBRARY); - M(sCOND_EXPAND); M(sAND); M(sOR); M(sELSE); M(sLIBRARY); - M(sONLY); M(sRENAME); M(sPREFIX); M(sEXCEPT); - M(sCONS); M(sCAR); M(sCDR); M(sNILP); - M(sSYMBOLP); M(sPAIRP); - M(sADD); M(sSUB); M(sMUL); M(sDIV); M(sMINUS); - M(sEQ); M(sLT); M(sLE); M(sGT); M(sGE); M(sNOT); - M(sREAD); M(sFILE); - M(sCALL); M(sTAILCALL); M(sCALL_WITH_VALUES); M(sTAILCALL_WITH_VALUES); - M(sGREF); M(sLREF); M(sCREF); M(sRETURN); M(rDEFINE); M(rLAMBDA); M(rIF); M(rBEGIN); M(rQUOTE); M(rSETBANG); M(rDEFINE_SYNTAX); M(rIMPORT); M(rEXPORT); M(rDEFINE_LIBRARY); M(rIN_LIBRARY); @@ -584,9 +571,10 @@ gc_mark_phase(pic_state *pic) gc_mark_object(pic, pic->arena[j]); } + /* mark reserved uninterned symbols */ gc_mark_global_symbols(pic); - /* symbol table */ + /* mark all interned symbols */ for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { gc_mark_object(pic, (struct pic_object *)xh_val(it, pic_sym)); } From 914242a53117bf979fe21353979503868b5b4709 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 20 Jan 2015 02:51:10 +0900 Subject: [PATCH 22/26] [bugfix] wrong type specified for cxt->syms --- extlib/benz/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 704fb863..9b3f8e9f 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -1005,7 +1005,7 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v cxt->plen = 0; cxt->pcapa = PIC_POOL_SIZE; - cxt->syms = pic_calloc(pic, PIC_POOL_SIZE, sizeof(pic_value)); + cxt->syms = pic_calloc(pic, PIC_POOL_SIZE, sizeof(pic_sym)); cxt->slen = 0; cxt->scapa = PIC_POOL_SIZE; From c5f711ddd65bc1d03ce0702637c79262d0411f08 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 20 Jan 2015 02:51:51 +0900 Subject: [PATCH 23/26] [bugfix] irep->name is missed to mark --- extlib/benz/gc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index f8eb1798..a59c5b4c 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -440,6 +440,8 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) struct pic_irep *irep = (struct pic_irep *)obj; size_t i; + gc_mark_object(pic, (struct pic_object *)irep->name); + for (i = 0; i < irep->ilen; ++i) { gc_mark_object(pic, (struct pic_object *)irep->irep[i]); } From 2d1ddb9a5ab0dc0c2074ac3a2f01f2728adaed46 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 20 Jan 2015 15:31:17 +0900 Subject: [PATCH 24/26] s/pic_sym/pic_sym_ptr/g --- extlib/benz/codegen.c | 38 ++++++++++++++--------------- extlib/benz/dict.c | 6 ++--- extlib/benz/include/picrin/symbol.h | 2 +- extlib/benz/lib.c | 22 ++++++++--------- extlib/benz/macro.c | 16 ++++++------ extlib/benz/read.c | 8 +++--- extlib/benz/vm.c | 2 +- extlib/benz/write.c | 2 +- 8 files changed, 48 insertions(+), 48 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 9b3f8e9f..0e89c4b1 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -117,7 +117,7 @@ analyze_args(pic_state *pic, pic_value formals, bool *varg, xvect *args, xvect * if (! pic_sym_p(t)) { return false; } - sym = pic_sym(t); + sym = pic_sym_ptr(t); xv_push(args, &sym); } if (pic_nil_p(v)) { @@ -125,7 +125,7 @@ analyze_args(pic_state *pic, pic_value formals, bool *varg, xvect *args, xvect * } else if (pic_sym_p(v)) { *varg = true; - sym = pic_sym(v); + sym = pic_sym_ptr(v); xv_push(locals, &sym); } else { @@ -267,7 +267,7 @@ analyze(analyze_state *state, pic_value obj, bool tailpos) res = analyze_node(state, obj, tailpos); - tag = pic_sym(pic_car(pic, res)); + tag = pic_sym_ptr(pic_car(pic, res)); if (tailpos) { if (tag == pic->sIF || tag == pic->sBEGIN || tag == pic->sTAILCALL || tag == pic->sTAILCALL_WITH_VALUES || tag == pic->sRETURN) { /* pass through */ @@ -450,13 +450,13 @@ analyze_define(analyze_state *state, pic_value obj) if (! pic_sym_p(var)) { pic_errorf(pic, "syntax error"); } else { - sym = pic_sym(var); + sym = pic_sym_ptr(var); } var = analyze_declare(state, sym); if (pic_pair_p(pic_list_ref(pic, obj, 2)) && pic_sym_p(pic_list_ref(pic, pic_list_ref(pic, obj, 2), 0)) - && pic_sym(pic_list_ref(pic, pic_list_ref(pic, obj, 2), 0)) == pic->rLAMBDA) { + && pic_sym_ptr(pic_list_ref(pic, pic_list_ref(pic, obj, 2), 0)) == pic->rLAMBDA) { pic_value formals, body_exprs; formals = pic_list_ref(pic, pic_list_ref(pic, obj, 2), 1); @@ -734,7 +734,7 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) switch (pic_type(obj)) { case PIC_TT_SYMBOL: { - return analyze_var(state, pic_sym(obj)); + return analyze_var(state, pic_sym_ptr(obj)); } case PIC_TT_PAIR: { pic_value proc; @@ -745,7 +745,7 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) proc = pic_list_ref(pic, obj, 0); if (pic_sym_p(proc)) { - pic_sym sym = pic_sym(proc); + pic_sym sym = pic_sym_ptr(proc); if (sym == pic->rDEFINE) { return analyze_define(state, obj); @@ -973,7 +973,7 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v cxt->up = state->cxt; cxt->name = pic_false_p(name) ? pic_intern_cstr(pic, "(anonymous lambda)") - : pic_sym(name); + : pic_sym_ptr(name); cxt->varg = varg; xv_init(&cxt->args, sizeof(pic_sym)); @@ -981,15 +981,15 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v xv_init(&cxt->captures, sizeof(pic_sym)); pic_for_each (var, args) { - sym = pic_sym(var); + sym = pic_sym_ptr(var); xv_push(&cxt->args, &sym); } pic_for_each (var, locals) { - sym = pic_sym(var); + sym = pic_sym_ptr(var); xv_push(&cxt->locals, &sym); } pic_for_each (var, captures) { - sym = pic_sym(var); + sym = pic_sym_ptr(var); xv_push(&cxt->captures, &sym); } @@ -1120,10 +1120,10 @@ codegen(codegen_state *state, pic_value obj) codegen_context *cxt = state->cxt; pic_sym sym; - sym = pic_sym(pic_car(pic, obj)); + sym = pic_sym_ptr(pic_car(pic, obj)); if (sym == pic->sGREF) { cxt->code[cxt->clen].insn = OP_GREF; - cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, obj, 1))); + cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym_ptr(pic_list_ref(pic, obj, 1))); cxt->clen++; return; } else if (sym == pic->sCREF) { @@ -1131,7 +1131,7 @@ codegen(codegen_state *state, pic_value obj) int depth; depth = pic_int(pic_list_ref(pic, obj, 1)); - name = pic_sym(pic_list_ref(pic, obj, 2)); + name = pic_sym_ptr(pic_list_ref(pic, obj, 2)); cxt->code[cxt->clen].insn = OP_CREF; cxt->code[cxt->clen].u.r.depth = depth; cxt->code[cxt->clen].u.r.idx = index_capture(state, name, depth); @@ -1141,7 +1141,7 @@ codegen(codegen_state *state, pic_value obj) pic_sym name; int i; - name = pic_sym(pic_list_ref(pic, obj, 1)); + name = pic_sym_ptr(pic_list_ref(pic, obj, 1)); if ((i = index_capture(state, name, 0)) != -1) { cxt->code[cxt->clen].insn = OP_LREF; cxt->code[cxt->clen].u.i = i + (int)xv_size(&cxt->args) + (int)xv_size(&cxt->locals) + 1; @@ -1160,10 +1160,10 @@ codegen(codegen_state *state, pic_value obj) codegen(state, val); var = pic_list_ref(pic, obj, 1); - type = pic_sym(pic_list_ref(pic, var, 0)); + type = pic_sym_ptr(pic_list_ref(pic, var, 0)); if (type == pic->sGREF) { cxt->code[cxt->clen].insn = OP_GSET; - cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, var, 1))); + cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym_ptr(pic_list_ref(pic, var, 1))); cxt->clen++; cxt->code[cxt->clen].insn = OP_PUSHNONE; cxt->clen++; @@ -1174,7 +1174,7 @@ codegen(codegen_state *state, pic_value obj) int depth; depth = pic_int(pic_list_ref(pic, var, 1)); - name = pic_sym(pic_list_ref(pic, var, 2)); + name = pic_sym_ptr(pic_list_ref(pic, var, 2)); cxt->code[cxt->clen].insn = OP_CSET; cxt->code[cxt->clen].u.r.depth = depth; cxt->code[cxt->clen].u.r.idx = index_capture(state, name, depth); @@ -1187,7 +1187,7 @@ codegen(codegen_state *state, pic_value obj) pic_sym name; int i; - name = pic_sym(pic_list_ref(pic, var, 1)); + name = pic_sym_ptr(pic_list_ref(pic, var, 1)); if ((i = index_capture(state, name, 0)) != -1) { cxt->code[cxt->clen].insn = OP_LSET; cxt->code[cxt->clen].u.i = i + (int)xv_size(&cxt->args) + (int)xv_size(&cxt->locals) + 1; diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index b9c18cce..1e1331e6 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -91,7 +91,7 @@ pic_dict_dictionary(pic_state *pic) for (i = 0; i < argc; i += 2) { pic_assert_type(pic, argv[i], sym); - pic_dict_set(pic, dict, pic_sym(argv[i]), argv[i+1]); + pic_dict_set(pic, dict, pic_sym_ptr(argv[i]), argv[i+1]); } return pic_obj_value(dict); @@ -281,7 +281,7 @@ pic_dict_alist_to_dictionary(pic_state *pic) pic_for_each (e, pic_reverse(pic, alist)) { pic_assert_type(pic, pic_car(pic, e), sym); - pic_dict_set(pic, dict, pic_sym(pic_car(pic, e)), pic_cdr(pic, e)); + pic_dict_set(pic, dict, pic_sym_ptr(pic_car(pic, e)), pic_cdr(pic, e)); } return pic_obj_value(dict); @@ -316,7 +316,7 @@ pic_dict_plist_to_dictionary(pic_state *pic) for (e = pic_reverse(pic, plist); ! pic_nil_p(e); e = pic_cddr(pic, e)) { pic_assert_type(pic, pic_cadr(pic, e), sym); - pic_dict_set(pic, dict, pic_sym(pic_cadr(pic, e)), pic_car(pic, e)); + pic_dict_set(pic, dict, pic_sym_ptr(pic_cadr(pic, e)), pic_car(pic, e)); } return pic_obj_value(dict); diff --git a/extlib/benz/include/picrin/symbol.h b/extlib/benz/include/picrin/symbol.h index 629633e7..bb588d0d 100644 --- a/extlib/benz/include/picrin/symbol.h +++ b/extlib/benz/include/picrin/symbol.h @@ -14,8 +14,8 @@ struct pic_symbol { pic_str *str; }; -#define pic_sym(v) pic_ptr(v) #define pic_sym_p(v) (pic_type(v) == PIC_TT_SYMBOL) +#define pic_sym_ptr(v) ((struct pic_symbol *)pic_ptr(v)) #if defined(__cplusplus) } diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 217ba8d7..ca738790 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -80,13 +80,13 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) if (pic_pair_p(spec) && pic_sym_p(pic_car(pic, spec))) { - tag = pic_sym(pic_car(pic, spec)); + tag = pic_sym_ptr(pic_car(pic, spec)); if (tag == pic->sONLY) { import_table(pic, pic_cadr(pic, spec), table); pic_for_each (val, pic_cddr(pic, spec)) { - pic_dict_set(pic, imports, pic_sym(val), pic_dict_ref(pic, table, pic_sym(val))); + pic_dict_set(pic, imports, pic_sym_ptr(val), pic_dict_ref(pic, table, pic_sym_ptr(val))); } return; } @@ -94,9 +94,9 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) import_table(pic, pic_cadr(pic, spec), imports); pic_for_each (val, pic_cddr(pic, spec)) { - tmp = pic_dict_ref(pic, imports, pic_sym(pic_car(pic, val))); - pic_dict_del(pic, imports, pic_sym(pic_car(pic, val))); - pic_dict_set(pic, imports, pic_sym(pic_cadr(pic, val)), tmp); + tmp = pic_dict_ref(pic, imports, pic_sym_ptr(pic_car(pic, val))); + pic_dict_del(pic, imports, pic_sym_ptr(pic_car(pic, val))); + pic_dict_set(pic, imports, pic_sym_ptr(pic_cadr(pic, val)), tmp); } return; } @@ -113,7 +113,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) if (tag == pic->sEXCEPT) { import_table(pic, pic_cadr(pic, spec), imports); pic_for_each (val, pic_cddr(pic, spec)) { - pic_dict_del(pic, imports, pic_sym(val)); + pic_dict_del(pic, imports, pic_sym_ptr(val)); } return; } @@ -138,7 +138,7 @@ import(pic_state *pic, pic_value spec) import_table(pic, spec, imports); pic_dict_for_each (sym, imports) { - pic_put_rename(pic, pic->lib->env, sym, pic_sym(pic_dict_ref(pic, imports, sym))); + pic_put_rename(pic, pic->lib->env, sym, pic_sym_ptr(pic_dict_ref(pic, imports, sym))); } } @@ -164,15 +164,15 @@ export(pic_state *pic, pic_value spec) goto fail; } - if (! pic_find_rename(pic, pic->lib->env, pic_sym(a), &rename)) { - pic_errorf(pic, "export: symbol not defined %s", pic_symbol_name(pic, pic_sym(a))); + if (! pic_find_rename(pic, pic->lib->env, pic_sym_ptr(a), &rename)) { + pic_errorf(pic, "export: symbol not defined %s", pic_symbol_name(pic, pic_sym_ptr(a))); } #if DEBUG printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym(b)), pic_symbol_name(pic, rename)); #endif - pic_dict_set(pic, pic->lib->exports, pic_sym(b), pic_obj_value(rename)); + pic_dict_set(pic, pic->lib->exports, pic_sym_ptr(b), pic_obj_value(rename)); return; @@ -218,7 +218,7 @@ condexpand(pic_state *pic, pic_value clause) if (! (pic_pair_p(clause) && pic_sym_p(pic_car(pic, clause)))) { pic_errorf(pic, "invalid 'cond-expand' clause ~s", clause); } else { - tag = pic_sym(pic_car(pic, clause)); + tag = pic_sym_ptr(pic_car(pic, clause)); } if (tag == pic->sLIBRARY) { diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index 5286f7d8..f20b775f 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -36,7 +36,7 @@ pic_find_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym *ren return false; } if (rename != NULL) { - *rename = pic_sym(pic_dict_ref(pic, senv->map, sym)); + *rename = pic_sym_ptr(pic_dict_ref(pic, senv->map, sym)); } return true; } @@ -159,10 +159,10 @@ macroexpand_lambda(pic_state *pic, pic_value expr, struct pic_senv *senv) if (! pic_sym_p(v)) { pic_errorf(pic, "syntax error"); } - pic_add_rename(pic, in, pic_sym(v)); + pic_add_rename(pic, in, pic_sym_ptr(v)); } if (pic_sym_p(a)) { - pic_add_rename(pic, in, pic_sym(a)); + pic_add_rename(pic, in, pic_sym_ptr(a)); } else if (! pic_nil_p(a)) { pic_errorf(pic, "syntax error"); @@ -197,7 +197,7 @@ macroexpand_define(pic_state *pic, pic_value expr, struct pic_senv *senv) if (! pic_sym_p(var)) { pic_errorf(pic, "binding to non-symbol object"); } - sym = pic_sym(var); + sym = pic_sym_ptr(var); if (! pic_find_rename(pic, senv, sym, &rename)) { rename = pic_add_rename(pic, senv, sym); } @@ -220,7 +220,7 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) if (! pic_sym_p(var)) { pic_errorf(pic, "binding to non-symbol object"); } - sym = pic_sym(var); + sym = pic_sym_ptr(var); if (! pic_find_rename(pic, senv, sym, &rename)) { rename = pic_add_rename(pic, senv, sym); } else { @@ -283,7 +283,7 @@ macroexpand_node(pic_state *pic, pic_value expr, struct pic_senv *senv) { switch (pic_type(expr)) { case PIC_TT_SYMBOL: { - return macroexpand_symbol(pic, pic_sym(expr), senv); + return macroexpand_symbol(pic, pic_sym_ptr(expr), senv); } case PIC_TT_PAIR: { pic_value car; @@ -295,7 +295,7 @@ macroexpand_node(pic_state *pic, pic_value expr, struct pic_senv *senv) car = macroexpand(pic, pic_car(pic, expr), senv); if (pic_sym_p(car)) { - pic_sym tag = pic_sym(car); + pic_sym tag = pic_sym_ptr(car); if (tag == pic->rDEFINE_SYNTAX) { return macroexpand_defsyntax(pic, expr, senv); @@ -451,7 +451,7 @@ pic_defmacro(pic_state *pic, pic_sym name, pic_sym id, pic_func_t func) bool pic_identifier_p(pic_state *pic, pic_value obj) { - return pic_sym_p(obj) && ! pic_interned_p(pic, pic_sym(obj)); + return pic_sym_p(obj) && ! pic_interned_p(pic, pic_sym_ptr(obj)); } bool diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 00e6fe8c..f54427a0 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -320,10 +320,10 @@ read_minus(pic_state *pic, struct pic_port *port, const char *str) } else { sym = read_symbol(pic, port, str); - if (strcaseeq(pic_symbol_name(pic, pic_sym(sym)), "-inf.0")) { + if (strcaseeq(pic_symbol_name(pic, pic_sym_ptr(sym)), "-inf.0")) { return pic_float_value(-INFINITY); } - if (strcaseeq(pic_symbol_name(pic, pic_sym(sym)), "-nan.0")) { + if (strcaseeq(pic_symbol_name(pic, pic_sym_ptr(sym)), "-nan.0")) { return pic_float_value(-NAN); } return sym; @@ -340,10 +340,10 @@ read_plus(pic_state *pic, struct pic_port *port, const char *str) } else { sym = read_symbol(pic, port, str); - if (strcaseeq(pic_symbol_name(pic, pic_sym(sym)), "+inf.0")) { + if (strcaseeq(pic_symbol_name(pic, pic_sym_ptr(sym)), "+inf.0")) { return pic_float_value(INFINITY); } - if (strcaseeq(pic_symbol_name(pic, pic_sym(sym)), "+nan.0")) { + if (strcaseeq(pic_symbol_name(pic, pic_sym_ptr(sym)), "+nan.0")) { return pic_float_value(NAN); } return sym; diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index cc0aa9b7..ea46c9d2 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -262,7 +262,7 @@ pic_get_args(pic_state *pic, const char *format, ...) if (i < argc) { v = GET_OPERAND(pic,i); if (pic_sym_p(v)) { - *m = pic_sym(v); + *m = pic_sym_ptr(v); } else { pic_errorf(pic, "pic_get_args: expected symbol, but got ~s", v); diff --git a/extlib/benz/write.c b/extlib/benz/write.c index ac374fe8..3fecb4bc 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -266,7 +266,7 @@ write_core(struct writer_control *p, pic_value obj) xfprintf(file, ")"); break; case PIC_TT_SYMBOL: - xfprintf(file, "%s", pic_symbol_name(pic, pic_sym(obj))); + xfprintf(file, "%s", pic_symbol_name(pic, pic_sym_ptr(obj))); break; case PIC_TT_CHAR: if (p->mode == DISPLAY_MODE) { From 6e6e1de7a5eaeeaef40db1a6b0eba7f327de3188 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 20 Jan 2015 16:02:28 +0900 Subject: [PATCH 25/26] pic_sym is not a pointer --- extlib/benz/codegen.c | 100 ++++++++++++++-------------- extlib/benz/dict.c | 22 +++--- extlib/benz/error.c | 6 +- extlib/benz/gc.c | 4 +- extlib/benz/include/picrin.h | 48 ++++++------- extlib/benz/include/picrin/dict.h | 10 +-- extlib/benz/include/picrin/error.h | 6 +- extlib/benz/include/picrin/irep.h | 4 +- extlib/benz/include/picrin/macro.h | 10 +-- extlib/benz/include/picrin/proc.h | 4 +- extlib/benz/include/picrin/record.h | 4 +- extlib/benz/include/picrin/value.h | 2 +- extlib/benz/lib.c | 14 ++-- extlib/benz/macro.c | 40 +++++------ extlib/benz/proc.c | 2 +- extlib/benz/read.c | 4 +- extlib/benz/record.c | 8 +-- extlib/benz/state.c | 2 +- extlib/benz/symbol.c | 26 ++++---- extlib/benz/vm.c | 16 ++--- extlib/benz/write.c | 6 +- 21 files changed, 169 insertions(+), 169 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 0e89c4b1..fa3125a7 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -36,11 +36,11 @@ typedef struct analyze_scope { typedef struct analyze_state { pic_state *pic; analyze_scope *scope; - pic_sym rCONS, rCAR, rCDR, rNILP; - pic_sym rSYMBOLP, rPAIRP; - pic_sym rADD, rSUB, rMUL, rDIV; - pic_sym rEQ, rLT, rLE, rGT, rGE, rNOT; - pic_sym rVALUES, rCALL_WITH_VALUES; + pic_sym *rCONS, *rCAR, *rCDR, *rNILP; + pic_sym *rSYMBOLP, *rPAIRP; + pic_sym *rADD, *rSUB, *rMUL, *rDIV; + pic_sym *rEQ, *rLT, *rLE, *rGT, *rGE, *rNOT; + pic_sym *rVALUES, *rCALL_WITH_VALUES; } analyze_state; static bool push_scope(analyze_state *, pic_value); @@ -51,7 +51,7 @@ static void pop_scope(analyze_state *); } while (0) #define register_renamed_symbol(pic, state, slot, lib, id) do { \ - pic_sym sym, gsym; \ + pic_sym *sym, *gsym; \ sym = pic_intern_cstr(pic, id); \ if (! pic_find_rename(pic, lib->env, sym, &gsym)) { \ pic_errorf(pic, "internal error! native VM procedure not found: %s", id); \ @@ -63,7 +63,7 @@ static analyze_state * new_analyze_state(pic_state *pic) { analyze_state *state; - pic_sym sym; + pic_sym *sym; state = pic_alloc(pic, sizeof(analyze_state)); state->pic = pic; @@ -110,7 +110,7 @@ static bool analyze_args(pic_state *pic, pic_value formals, bool *varg, xvect *args, xvect *locals) { pic_value v, t; - pic_sym sym; + pic_sym *sym; for (v = formals; pic_pair_p(v); v = pic_cdr(pic, v)) { t = pic_car(pic, v); @@ -143,9 +143,9 @@ push_scope(analyze_state *state, pic_value formals) bool varg; xvect args, locals, captures; - xv_init(&args, sizeof(pic_sym)); - xv_init(&locals, sizeof(pic_sym)); - xv_init(&captures, sizeof(pic_sym)); + xv_init(&args, sizeof(pic_sym *)); + xv_init(&locals, sizeof(pic_sym *)); + xv_init(&captures, sizeof(pic_sym *)); if (analyze_args(pic, formals, &varg, &args, &locals)) { scope = pic_alloc(pic, sizeof(analyze_scope)); @@ -184,9 +184,9 @@ pop_scope(analyze_state *state) } static bool -lookup_scope(analyze_scope *scope, pic_sym sym) +lookup_scope(analyze_scope *scope, pic_sym *sym) { - pic_sym *arg, *local; + pic_sym **arg, **local; size_t i; /* args */ @@ -205,9 +205,9 @@ lookup_scope(analyze_scope *scope, pic_sym sym) } static void -capture_var(analyze_scope *scope, pic_sym sym) +capture_var(analyze_scope *scope, pic_sym *sym) { - pic_sym *var; + pic_sym **var; size_t i; for (i = 0; i < xv_size(&scope->captures); ++i) { @@ -222,7 +222,7 @@ capture_var(analyze_scope *scope, pic_sym sym) } static int -find_var(analyze_state *state, pic_sym sym) +find_var(analyze_state *state, pic_sym *sym) { analyze_scope *scope = state->scope; int depth = 0; @@ -241,7 +241,7 @@ find_var(analyze_state *state, pic_sym sym) } static void -define_var(analyze_state *state, pic_sym sym) +define_var(analyze_state *state, pic_sym *sym) { pic_state *pic = state->pic; analyze_scope *scope = state->scope; @@ -263,7 +263,7 @@ analyze(analyze_state *state, pic_value obj, bool tailpos) pic_state *pic = state->pic; size_t ai = pic_gc_arena_preserve(pic); pic_value res; - pic_sym tag; + pic_sym *tag; res = analyze_node(state, obj, tailpos); @@ -284,7 +284,7 @@ analyze(analyze_state *state, pic_value obj, bool tailpos) } static pic_value -analyze_global_var(analyze_state *state, pic_sym sym) +analyze_global_var(analyze_state *state, pic_sym *sym) { pic_state *pic = state->pic; @@ -292,7 +292,7 @@ analyze_global_var(analyze_state *state, pic_sym sym) } static pic_value -analyze_local_var(analyze_state *state, pic_sym sym) +analyze_local_var(analyze_state *state, pic_sym *sym) { pic_state *pic = state->pic; @@ -300,7 +300,7 @@ analyze_local_var(analyze_state *state, pic_sym sym) } static pic_value -analyze_free_var(analyze_state *state, pic_sym sym, int depth) +analyze_free_var(analyze_state *state, pic_sym *sym, int depth) { pic_state *pic = state->pic; @@ -308,7 +308,7 @@ analyze_free_var(analyze_state *state, pic_sym sym, int depth) } static pic_value -analyze_var(analyze_state *state, pic_sym sym) +analyze_var(analyze_state *state, pic_sym *sym) { pic_state *pic = state->pic; int depth; @@ -330,7 +330,7 @@ static pic_value analyze_defer(analyze_state *state, pic_value name, pic_value formal, pic_value body) { pic_state *pic = state->pic; - const pic_sym sNOWHERE = pic_intern_cstr(pic, "<>"); + pic_sym *sNOWHERE = pic_intern_cstr(pic, "<>"); pic_value skel; skel = pic_list2(pic, pic_obj_value(pic->sGREF), pic_obj_value(sNOWHERE)); @@ -372,7 +372,7 @@ analyze_procedure(analyze_state *state, pic_value name, pic_value formals, pic_v if (push_scope(state, formals)) { analyze_scope *scope = state->scope; - pic_sym *var; + pic_sym **var; size_t i; args = pic_nil_value(); @@ -428,7 +428,7 @@ analyze_lambda(analyze_state *state, pic_value obj) } static pic_value -analyze_declare(analyze_state *state, pic_sym var) +analyze_declare(analyze_state *state, pic_sym *var) { define_var(state, var); @@ -440,7 +440,7 @@ analyze_define(analyze_state *state, pic_value obj) { pic_state *pic = state->pic; pic_value var, val; - pic_sym sym; + pic_sym *sym; if (pic_length(pic, obj) != 3) { pic_errorf(pic, "syntax error"); @@ -652,7 +652,7 @@ analyze_call(analyze_state *state, pic_value obj, bool tailpos) { pic_state *pic = state->pic; pic_value seq, elt; - pic_sym call; + pic_sym *call; if (! tailpos) { call = pic->sCALL; @@ -688,7 +688,7 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) { pic_state *pic = state->pic; pic_value prod, cnsm; - pic_sym call; + pic_sym *call; if (pic_length(pic, obj) != 3) { pic_errorf(pic, "wrong number of arguments"); @@ -745,7 +745,7 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) proc = pic_list_ref(pic, obj, 0); if (pic_sym_p(proc)) { - pic_sym sym = pic_sym_ptr(proc); + pic_sym *sym = pic_sym_ptr(proc); if (sym == pic->rDEFINE) { return analyze_define(state, obj); @@ -861,7 +861,7 @@ pic_analyze(pic_state *pic, pic_value obj) */ typedef struct codegen_context { - pic_sym name; + pic_sym *name; /* rest args variable is counted as a local */ bool varg; xvect args, locals, captures; @@ -875,7 +875,7 @@ typedef struct codegen_context { pic_value *pool; size_t plen, pcapa; /* symbol pool */ - pic_sym *syms; + pic_sym **syms; size_t slen, scapa; struct codegen_context *up; @@ -924,7 +924,7 @@ create_activation(codegen_context *cxt) { size_t i, n; xhash regs; - pic_sym *var; + pic_sym **var; size_t offset; xh_init_ptr(®s, sizeof(size_t)); @@ -965,7 +965,7 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v pic_state *pic = state->pic; codegen_context *cxt; pic_value var; - pic_sym sym; + pic_sym *sym; assert(pic_sym_p(name) || pic_false_p(name)); @@ -976,9 +976,9 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v : pic_sym_ptr(name); cxt->varg = varg; - xv_init(&cxt->args, sizeof(pic_sym)); - xv_init(&cxt->locals, sizeof(pic_sym)); - xv_init(&cxt->captures, sizeof(pic_sym)); + xv_init(&cxt->args, sizeof(pic_sym *)); + xv_init(&cxt->locals, sizeof(pic_sym *)); + xv_init(&cxt->captures, sizeof(pic_sym *)); pic_for_each (var, args) { sym = pic_sym_ptr(var); @@ -1005,7 +1005,7 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v cxt->plen = 0; cxt->pcapa = PIC_POOL_SIZE; - cxt->syms = pic_calloc(pic, PIC_POOL_SIZE, sizeof(pic_sym)); + cxt->syms = pic_calloc(pic, PIC_POOL_SIZE, sizeof(pic_sym *)); cxt->slen = 0; cxt->scapa = PIC_POOL_SIZE; @@ -1034,7 +1034,7 @@ pop_codegen_context(codegen_state *state) irep->ilen = state->cxt->ilen; irep->pool = pic_realloc(pic, state->cxt->pool, sizeof(pic_value) * state->cxt->plen); irep->plen = state->cxt->plen; - irep->syms = pic_realloc(pic, state->cxt->syms, sizeof(pic_sym) * state->cxt->slen); + irep->syms = pic_realloc(pic, state->cxt->syms, sizeof(pic_sym *) * state->cxt->slen); irep->slen = state->cxt->slen; /* finalize */ @@ -1051,11 +1051,11 @@ pop_codegen_context(codegen_state *state) } static int -index_capture(codegen_state *state, pic_sym sym, int depth) +index_capture(codegen_state *state, pic_sym *sym, int depth) { codegen_context *cxt = state->cxt; size_t i; - pic_sym *var; + pic_sym **var; while (depth-- > 0) { cxt = cxt->up; @@ -1070,11 +1070,11 @@ index_capture(codegen_state *state, pic_sym sym, int depth) } static int -index_local(codegen_state *state, pic_sym sym) +index_local(codegen_state *state, pic_sym *sym) { codegen_context *cxt = state->cxt; size_t i, offset; - pic_sym *var; + pic_sym **var; offset = 1; for (i = 0; i < xv_size(&cxt->args); ++i) { @@ -1092,7 +1092,7 @@ index_local(codegen_state *state, pic_sym sym) } static int -index_symbol(codegen_state *state, pic_sym sym) +index_symbol(codegen_state *state, pic_sym *sym) { pic_state *pic = state->pic; codegen_context *cxt = state->cxt; @@ -1105,7 +1105,7 @@ index_symbol(codegen_state *state, pic_sym sym) } if (cxt->slen >= cxt->scapa) { cxt->scapa *= 2; - cxt->syms = pic_realloc(pic, cxt->syms, sizeof(pic_sym) * cxt->scapa); + cxt->syms = pic_realloc(pic, cxt->syms, sizeof(pic_sym *) * cxt->scapa); } cxt->syms[cxt->slen++] = sym; return i; @@ -1118,7 +1118,7 @@ codegen(codegen_state *state, pic_value obj) { pic_state *pic = state->pic; codegen_context *cxt = state->cxt; - pic_sym sym; + pic_sym *sym; sym = pic_sym_ptr(pic_car(pic, obj)); if (sym == pic->sGREF) { @@ -1127,7 +1127,7 @@ codegen(codegen_state *state, pic_value obj) cxt->clen++; return; } else if (sym == pic->sCREF) { - pic_sym name; + pic_sym *name; int depth; depth = pic_int(pic_list_ref(pic, obj, 1)); @@ -1138,7 +1138,7 @@ codegen(codegen_state *state, pic_value obj) cxt->clen++; return; } else if (sym == pic->sLREF) { - pic_sym name; + pic_sym *name; int i; name = pic_sym_ptr(pic_list_ref(pic, obj, 1)); @@ -1154,7 +1154,7 @@ codegen(codegen_state *state, pic_value obj) return; } else if (sym == pic->sSETBANG) { pic_value var, val; - pic_sym type; + pic_sym *type; val = pic_list_ref(pic, obj, 2); codegen(state, val); @@ -1170,7 +1170,7 @@ codegen(codegen_state *state, pic_value obj) return; } else if (type == pic->sCREF) { - pic_sym name; + pic_sym *name; int depth; depth = pic_int(pic_list_ref(pic, var, 1)); @@ -1184,7 +1184,7 @@ codegen(codegen_state *state, pic_value obj) return; } else if (type == pic->sLREF) { - pic_sym name; + pic_sym *name; int i; name = pic_sym_ptr(pic_list_ref(pic, var, 1)); diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index 1e1331e6..d677e935 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -21,7 +21,7 @@ pic_make_dict(pic_state *pic) } pic_value -pic_dict_ref(pic_state *pic, struct pic_dict *dict, pic_sym key) +pic_dict_ref(pic_state *pic, struct pic_dict *dict, pic_sym *key) { xh_entry *e; @@ -33,7 +33,7 @@ pic_dict_ref(pic_state *pic, struct pic_dict *dict, pic_sym key) } void -pic_dict_set(pic_state *pic, struct pic_dict *dict, pic_sym key, pic_value val) +pic_dict_set(pic_state *pic, struct pic_dict *dict, pic_sym *key, pic_value val) { PIC_UNUSED(pic); @@ -49,7 +49,7 @@ pic_dict_size(pic_state *pic, struct pic_dict *dict) } bool -pic_dict_has(pic_state *pic, struct pic_dict *dict, pic_sym key) +pic_dict_has(pic_state *pic, struct pic_dict *dict, pic_sym *key) { PIC_UNUSED(pic); @@ -57,7 +57,7 @@ pic_dict_has(pic_state *pic, struct pic_dict *dict, pic_sym key) } void -pic_dict_del(pic_state *pic, struct pic_dict *dict, pic_sym key) +pic_dict_del(pic_state *pic, struct pic_dict *dict, pic_sym *key) { if (xh_get_ptr(&dict->hash, key) == NULL) { pic_errorf(pic, "no slot named ~s found in dictionary", pic_obj_value(key)); @@ -111,7 +111,7 @@ static pic_value pic_dict_dictionary_ref(pic_state *pic) { struct pic_dict *dict; - pic_sym key; + pic_sym *key; pic_get_args(pic, "dm", &dict, &key); @@ -126,7 +126,7 @@ static pic_value pic_dict_dictionary_set(pic_state *pic) { struct pic_dict *dict; - pic_sym key; + pic_sym *key; pic_value val; pic_get_args(pic, "dmo", &dict, &key, &val); @@ -140,7 +140,7 @@ static pic_value pic_dict_dictionary_del(pic_state *pic) { struct pic_dict *dict; - pic_sym key; + pic_sym *key; pic_get_args(pic, "dm", &dict, &key); @@ -187,7 +187,7 @@ pic_dict_dictionary_map(pic_state *pic) if (it[i] == NULL) { break; } - pic_push(pic, pic_obj_value(xh_key(it[i], pic_sym)), arg); + pic_push(pic, pic_obj_value(xh_key(it[i], pic_sym *)), arg); it[i] = xh_next(it[i]); } if (i != argc) { @@ -233,7 +233,7 @@ pic_dict_dictionary_for_each(pic_state *pic) if (it[i] == NULL) { break; } - pic_push(pic, pic_obj_value(xh_key(it[i], pic_sym)), arg); + pic_push(pic, pic_obj_value(xh_key(it[i], pic_sym *)), arg); it[i] = xh_next(it[i]); } if (i != argc) { @@ -262,7 +262,7 @@ pic_dict_dictionary_to_alist(pic_state *pic) pic_get_args(pic, "d", &dict); for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { - item = pic_cons(pic, pic_obj_value(xh_key(it, pic_sym)), xh_val(it, pic_value)); + item = pic_cons(pic, pic_obj_value(xh_key(it, pic_sym *)), xh_val(it, pic_value)); pic_push(pic, item, alist); } @@ -297,7 +297,7 @@ pic_dict_dictionary_to_plist(pic_state *pic) pic_get_args(pic, "d", &dict); for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { - pic_push(pic, pic_obj_value(xh_key(it, pic_sym)), plist); + pic_push(pic, pic_obj_value(xh_key(it, pic_sym *)), plist); pic_push(pic, xh_val(it, pic_value), plist); } diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 9a1ccac7..5df91233 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -125,7 +125,7 @@ pic_pop_try(pic_state *pic) } struct pic_error * -pic_make_error(pic_state *pic, pic_sym type, const char *msg, pic_value irrs) +pic_make_error(pic_state *pic, pic_sym *type, const char *msg, pic_value irrs) { struct pic_error *e; pic_str *stack; @@ -175,7 +175,7 @@ pic_raise(pic_state *pic, pic_value err) } void -pic_throw(pic_state *pic, pic_sym type, const char *msg, pic_value irrs) +pic_throw(pic_state *pic, pic_sym *type, const char *msg, pic_value irrs) { struct pic_error *e; @@ -253,7 +253,7 @@ static pic_value pic_error_make_error_object(pic_state *pic) { struct pic_error *e; - pic_sym type; + pic_sym *type; pic_str *msg; size_t argc; pic_value *argv; diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index a59c5b4c..5c5ef412 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -470,7 +470,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) xh_entry *it; for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { - gc_mark_object(pic, (struct pic_object *)xh_key(it, pic_sym)); + gc_mark_object(pic, (struct pic_object *)xh_key(it, pic_sym *)); gc_mark(pic, xh_val(it, pic_value)); } break; @@ -578,7 +578,7 @@ gc_mark_phase(pic_state *pic) /* mark all interned symbols */ for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { - gc_mark_object(pic, (struct pic_object *)xh_val(it, pic_sym)); + gc_mark_object(pic, (struct pic_object *)xh_val(it, pic_sym *)); } /* global variables */ diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 9c2ef399..0c950425 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -89,25 +89,25 @@ typedef struct { struct pic_lib *lib; - pic_sym sDEFINE, sLAMBDA, sIF, sBEGIN, sQUOTE, sSETBANG; - pic_sym sQUASIQUOTE, sUNQUOTE, sUNQUOTE_SPLICING; - pic_sym sDEFINE_SYNTAX, sIMPORT, sEXPORT; - pic_sym sDEFINE_LIBRARY, sIN_LIBRARY; - pic_sym sCOND_EXPAND, sAND, sOR, sELSE, sLIBRARY; - pic_sym sONLY, sRENAME, sPREFIX, sEXCEPT; - pic_sym sCONS, sCAR, sCDR, sNILP; - pic_sym sSYMBOLP, sPAIRP; - pic_sym sADD, sSUB, sMUL, sDIV, sMINUS; - pic_sym sEQ, sLT, sLE, sGT, sGE, sNOT; - pic_sym sREAD, sFILE; - pic_sym sGREF, sCREF, sLREF; - pic_sym sCALL, sTAILCALL, sRETURN; - pic_sym sCALL_WITH_VALUES, sTAILCALL_WITH_VALUES; + pic_sym *sDEFINE, *sLAMBDA, *sIF, *sBEGIN, *sQUOTE, *sSETBANG; + pic_sym *sQUASIQUOTE, *sUNQUOTE, *sUNQUOTE_SPLICING; + pic_sym *sDEFINE_SYNTAX, *sIMPORT, *sEXPORT; + pic_sym *sDEFINE_LIBRARY, *sIN_LIBRARY; + pic_sym *sCOND_EXPAND, *sAND, *sOR, *sELSE, *sLIBRARY; + pic_sym *sONLY, *sRENAME, *sPREFIX, *sEXCEPT; + pic_sym *sCONS, *sCAR, *sCDR, *sNILP; + pic_sym *sSYMBOLP, *sPAIRP; + pic_sym *sADD, *sSUB, *sMUL, *sDIV, *sMINUS; + pic_sym *sEQ, *sLT, *sLE, *sGT, *sGE, *sNOT; + pic_sym *sREAD, *sFILE; + pic_sym *sGREF, *sCREF, *sLREF; + pic_sym *sCALL, *sTAILCALL, *sRETURN; + pic_sym *sCALL_WITH_VALUES, *sTAILCALL_WITH_VALUES; - pic_sym rDEFINE, rLAMBDA, rIF, rBEGIN, rQUOTE, rSETBANG; - pic_sym rDEFINE_SYNTAX, rIMPORT, rEXPORT; - pic_sym rDEFINE_LIBRARY, rIN_LIBRARY; - pic_sym rCOND_EXPAND; + pic_sym *rDEFINE, *rLAMBDA, *rIF, *rBEGIN, *rQUOTE, *rSETBANG; + pic_sym *rDEFINE_SYNTAX, *rIMPORT, *rEXPORT; + pic_sym *rDEFINE_LIBRARY, *rIN_LIBRARY; + pic_sym *rCOND_EXPAND; struct pic_lib *PICRIN_BASE; struct pic_lib *PICRIN_USER; @@ -175,11 +175,11 @@ bool pic_eq_p(pic_value, pic_value); bool pic_eqv_p(pic_value, pic_value); bool pic_equal_p(pic_state *, pic_value, pic_value); -pic_sym pic_intern(pic_state *, pic_str *); -pic_sym pic_intern_cstr(pic_state *, const char *); -const char *pic_symbol_name(pic_state *, pic_sym); -pic_sym pic_gensym(pic_state *, pic_sym); -bool pic_interned_p(pic_state *, pic_sym); +pic_sym *pic_intern(pic_state *, pic_str *); +pic_sym *pic_intern_cstr(pic_state *, const char *); +const char *pic_symbol_name(pic_state *, pic_sym *); +pic_sym *pic_gensym(pic_state *, pic_sym *); +bool pic_interned_p(pic_state *, pic_sym *); pic_value pic_read(pic_state *, struct pic_port *); pic_value pic_read_cstr(pic_state *, const char *); @@ -216,7 +216,7 @@ struct pic_lib *pic_find_library(pic_state *, pic_value); void pic_import(pic_state *, pic_value); void pic_import_library(pic_state *, struct pic_lib *); -void pic_export(pic_state *, pic_sym); +void pic_export(pic_state *, pic_sym *); pic_noreturn void pic_panic(pic_state *, const char *); pic_noreturn void pic_errorf(pic_state *, const char *, ...); diff --git a/extlib/benz/include/picrin/dict.h b/extlib/benz/include/picrin/dict.h index cfbd4855..13379bf5 100644 --- a/extlib/benz/include/picrin/dict.h +++ b/extlib/benz/include/picrin/dict.h @@ -23,14 +23,14 @@ struct pic_dict *pic_make_dict(pic_state *); pic_dict_for_each_helper_((sym), PIC_GENSYM(tmp), (dict)) #define pic_dict_for_each_helper_(var, tmp, dict) \ for (xh_entry *tmp = xh_begin(&dict->hash); \ - (tmp && ((var = xh_key(tmp, pic_sym)), 1)); \ + (tmp && ((var = xh_key(tmp, pic_sym *)), 1)); \ tmp = xh_next(tmp)) -pic_value pic_dict_ref(pic_state *, struct pic_dict *, pic_sym); -void pic_dict_set(pic_state *, struct pic_dict *, pic_sym, pic_value); -void pic_dict_del(pic_state *, struct pic_dict *, pic_sym); +pic_value pic_dict_ref(pic_state *, struct pic_dict *, pic_sym *); +void pic_dict_set(pic_state *, struct pic_dict *, pic_sym *, pic_value); +void pic_dict_del(pic_state *, struct pic_dict *, pic_sym *); size_t pic_dict_size(pic_state *, struct pic_dict *); -bool pic_dict_has(pic_state *, struct pic_dict *, pic_sym); +bool pic_dict_has(pic_state *, struct pic_dict *, pic_sym *); #if defined(__cplusplus) } diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index e4cc630a..3a575cfe 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -13,7 +13,7 @@ extern "C" { struct pic_error { PIC_OBJECT_HEADER - pic_sym type; + pic_sym *type; pic_str *msg; pic_value irrs; pic_str *stack; @@ -22,7 +22,7 @@ struct pic_error { #define pic_error_p(v) (pic_type(v) == PIC_TT_ERROR) #define pic_error_ptr(v) ((struct pic_error *)pic_ptr(v)) -struct pic_error *pic_make_error(pic_state *, pic_sym, const char *, pic_list); +struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list); /* do not return from try block! */ @@ -44,7 +44,7 @@ void pic_pop_try(pic_state *); pic_value pic_raise_continuable(pic_state *, pic_value); pic_noreturn void pic_raise(pic_state *, pic_value); -pic_noreturn void pic_throw(pic_state *, pic_sym, const char *, pic_list); +pic_noreturn void pic_throw(pic_state *, pic_sym *, const char *, pic_list); pic_noreturn void pic_error(pic_state *, const char *, pic_list); #if defined(__cplusplus) diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/irep.h index 80159547..9c7932da 100644 --- a/extlib/benz/include/picrin/irep.h +++ b/extlib/benz/include/picrin/irep.h @@ -62,13 +62,13 @@ struct pic_code { struct pic_irep { PIC_OBJECT_HEADER - pic_sym name; + pic_sym *name; pic_code *code; int argc, localc, capturec; bool varg; struct pic_irep **irep; pic_value *pool; - pic_sym *syms; + pic_sym **syms; size_t clen, ilen, plen, slen; }; diff --git a/extlib/benz/include/picrin/macro.h b/extlib/benz/include/picrin/macro.h index e79c4251..07ca86d1 100644 --- a/extlib/benz/include/picrin/macro.h +++ b/extlib/benz/include/picrin/macro.h @@ -22,15 +22,15 @@ struct pic_senv { struct pic_senv *pic_null_syntactic_environment(pic_state *); bool pic_identifier_p(pic_state *pic, pic_value obj); -bool pic_identifier_eq_p(pic_state *, struct pic_senv *, pic_sym, struct pic_senv *, pic_sym); +bool pic_identifier_eq_p(pic_state *, struct pic_senv *, pic_sym *, struct pic_senv *, pic_sym *); struct pic_senv *pic_make_senv(pic_state *, struct pic_senv *); -pic_sym pic_add_rename(pic_state *, struct pic_senv *, pic_sym); -bool pic_find_rename(pic_state *, struct pic_senv *, pic_sym, pic_sym * /* = NULL */); -void pic_put_rename(pic_state *, struct pic_senv *, pic_sym, pic_sym); +pic_sym *pic_add_rename(pic_state *, struct pic_senv *, pic_sym *); +bool pic_find_rename(pic_state *, struct pic_senv *, pic_sym *, pic_sym ** /* = NULL */); +void pic_put_rename(pic_state *, struct pic_senv *, pic_sym *, pic_sym *); -void pic_define_syntactic_keyword(pic_state *, struct pic_senv *, pic_sym, pic_sym); +void pic_define_syntactic_keyword(pic_state *, struct pic_senv *, pic_sym *, pic_sym *); #if defined(__cplusplus) } diff --git a/extlib/benz/include/picrin/proc.h b/extlib/benz/include/picrin/proc.h index e64cd6fc..ebe13a82 100644 --- a/extlib/benz/include/picrin/proc.h +++ b/extlib/benz/include/picrin/proc.h @@ -12,7 +12,7 @@ extern "C" { /* native C function */ struct pic_func { pic_func_t f; - pic_sym name; + pic_sym *name; }; struct pic_env { @@ -48,7 +48,7 @@ struct pic_proc { struct pic_proc *pic_make_proc(pic_state *, pic_func_t, const char *); struct pic_proc *pic_make_proc_irep(pic_state *, struct pic_irep *, struct pic_env *); -pic_sym pic_proc_name(struct pic_proc *); +pic_sym *pic_proc_name(struct pic_proc *); #if defined(__cplusplus) } diff --git a/extlib/benz/include/picrin/record.h b/extlib/benz/include/picrin/record.h index 97476ce4..e3edcd01 100644 --- a/extlib/benz/include/picrin/record.h +++ b/extlib/benz/include/picrin/record.h @@ -20,8 +20,8 @@ struct pic_record { struct pic_record *pic_make_record(pic_state *, pic_value); pic_value pic_record_type(pic_state *, struct pic_record *); -pic_value pic_record_ref(pic_state *, struct pic_record *, pic_sym); -void pic_record_set(pic_state *, struct pic_record *, pic_sym, pic_value); +pic_value pic_record_ref(pic_state *, struct pic_record *, pic_sym *); +void pic_record_set(pic_state *, struct pic_record *, pic_sym *, pic_value); #if defined(__cplusplus) } diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index 8eb407e4..a6db5b98 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -133,7 +133,7 @@ struct pic_error; /* set aliases to basic types */ typedef pic_value pic_list; -typedef struct pic_symbol *pic_sym; +typedef struct pic_symbol pic_sym; typedef struct pic_pair pic_pair; typedef struct pic_string pic_str; typedef struct pic_vector pic_vec; diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index ca738790..4a82a981 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -74,7 +74,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) struct pic_lib *lib; struct pic_dict *table; pic_value val, tmp, prefix; - pic_sym sym, id, tag; + pic_sym *sym, *id, *tag; table = pic_make_dict(pic); @@ -131,7 +131,7 @@ static void import(pic_state *pic, pic_value spec) { struct pic_dict *imports; - pic_sym sym; + pic_sym *sym; imports = pic_make_dict(pic); @@ -145,9 +145,9 @@ import(pic_state *pic, pic_value spec) static void export(pic_state *pic, pic_value spec) { - const pic_sym sRENAME = pic_intern_cstr(pic, "rename"); + pic_sym *sRENAME = pic_intern_cstr(pic, "rename"); pic_value a, b; - pic_sym rename; + pic_sym *rename; if (pic_sym_p(spec)) { /* (export a) */ a = b = spec; @@ -193,7 +193,7 @@ pic_import_library(pic_state *pic, struct pic_lib *lib) } void -pic_export(pic_state *pic, pic_sym sym) +pic_export(pic_state *pic, pic_sym *sym) { export(pic, pic_obj_value(sym)); } @@ -201,7 +201,7 @@ pic_export(pic_state *pic, pic_sym sym) static bool condexpand(pic_state *pic, pic_value clause) { - pic_sym tag; + pic_sym *tag; pic_value c, feature; if (pic_eq_p(clause, pic_obj_value(pic->sELSE))) { @@ -335,7 +335,7 @@ pic_lib_in_library(pic_state *pic) void pic_init_lib(pic_state *pic) { - void pic_defmacro(pic_state *, pic_sym, pic_sym, pic_func_t); + void pic_defmacro(pic_state *, pic_sym *, pic_sym *, pic_func_t); pic_defmacro(pic, pic->sCOND_EXPAND, pic->rCOND_EXPAND, pic_lib_condexpand); pic_defmacro(pic, pic->sIMPORT, pic->rIMPORT, pic_lib_import); diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index f20b775f..622a28d3 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -13,10 +13,10 @@ #include "picrin/cont.h" #include "picrin/symbol.h" -pic_sym -pic_add_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym) +pic_sym * +pic_add_rename(pic_state *pic, struct pic_senv *senv, pic_sym *sym) { - pic_sym rename; + pic_sym *rename; rename = pic_gensym(pic, sym); pic_put_rename(pic, senv, sym, rename); @@ -24,13 +24,13 @@ pic_add_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym) } void -pic_put_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym rename) +pic_put_rename(pic_state *pic, struct pic_senv *senv, pic_sym *sym, pic_sym *rename) { pic_dict_set(pic, senv->map, sym, pic_obj_value(rename)); } bool -pic_find_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym *rename) +pic_find_rename(pic_state *pic, struct pic_senv *senv, pic_sym *sym, pic_sym **rename) { if (! pic_dict_has(pic, senv->map, sym)) { return false; @@ -42,13 +42,13 @@ pic_find_rename(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym *ren } static void -define_macro(pic_state *pic, pic_sym rename, struct pic_proc *mac) +define_macro(pic_state *pic, pic_sym *rename, struct pic_proc *mac) { pic_dict_set(pic, pic->macros, rename, pic_obj_value(mac)); } static struct pic_proc * -find_macro(pic_state *pic, pic_sym rename) +find_macro(pic_state *pic, pic_sym *rename) { if (! pic_dict_has(pic, pic->macros, rename)) { return NULL; @@ -56,10 +56,10 @@ find_macro(pic_state *pic, pic_sym rename) return pic_proc_ptr(pic_dict_ref(pic, pic->macros, rename)); } -static pic_sym -make_identifier(pic_state *pic, pic_sym sym, struct pic_senv *senv) +static pic_sym * +make_identifier(pic_state *pic, pic_sym *sym, struct pic_senv *senv) { - pic_sym rename; + pic_sym *rename; while (true) { if (pic_find_rename(pic, senv, sym, &rename)) { @@ -81,7 +81,7 @@ static pic_value macroexpand(pic_state *, pic_value, struct pic_senv *); static pic_value macroexpand_lambda(pic_state *, pic_value, struct pic_senv *); static pic_value -macroexpand_symbol(pic_state *pic, pic_sym sym, struct pic_senv *senv) +macroexpand_symbol(pic_state *pic, pic_sym *sym, struct pic_senv *senv) { return pic_obj_value(make_identifier(pic, sym, senv)); } @@ -179,7 +179,7 @@ macroexpand_lambda(pic_state *pic, pic_value expr, struct pic_senv *senv) static pic_value macroexpand_define(pic_state *pic, pic_value expr, struct pic_senv *senv) { - pic_sym sym, rename; + pic_sym *sym, *rename; pic_value var, val; while (pic_length(pic, expr) >= 2 && pic_pair_p(pic_cadr(pic, expr))) { @@ -210,7 +210,7 @@ static pic_value macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) { pic_value var, val; - pic_sym sym, rename; + pic_sym *sym, *rename; if (pic_length(pic, expr) != 3) { pic_errorf(pic, "syntax error"); @@ -295,7 +295,7 @@ macroexpand_node(pic_state *pic, pic_value expr, struct pic_senv *senv) car = macroexpand(pic, pic_car(pic, expr), senv); if (pic_sym_p(car)) { - pic_sym tag = pic_sym_ptr(car); + pic_sym *tag = pic_sym_ptr(car); if (tag == pic->rDEFINE_SYNTAX) { return macroexpand_defsyntax(pic, expr, senv); @@ -407,7 +407,7 @@ pic_null_syntactic_environment(pic_state *pic) } void -pic_define_syntactic_keyword(pic_state *pic, struct pic_senv *senv, pic_sym sym, pic_sym rsym) +pic_define_syntactic_keyword(pic_state *pic, struct pic_senv *senv, pic_sym *sym, pic_sym *rsym) { pic_put_rename(pic, senv, sym, rsym); @@ -430,7 +430,7 @@ defmacro_call(pic_state *pic) } void -pic_defmacro(pic_state *pic, pic_sym name, pic_sym id, pic_func_t func) +pic_defmacro(pic_state *pic, pic_sym *name, pic_sym *id, pic_func_t func) { struct pic_proc *proc, *trans; @@ -455,9 +455,9 @@ pic_identifier_p(pic_state *pic, pic_value obj) } bool -pic_identifier_eq_p(pic_state *pic, struct pic_senv *env1, pic_sym sym1, struct pic_senv *env2, pic_sym sym2) +pic_identifier_eq_p(pic_state *pic, struct pic_senv *env1, pic_sym *sym1, struct pic_senv *env2, pic_sym *sym2) { - pic_sym a, b; + pic_sym *a, *b; a = make_identifier(pic, sym1, env1); if (a != make_identifier(pic, sym1, env1)) { @@ -486,7 +486,7 @@ static pic_value pic_macro_make_identifier(pic_state *pic) { pic_value obj; - pic_sym sym; + pic_sym *sym; pic_get_args(pic, "mo", &sym, &obj); @@ -498,7 +498,7 @@ pic_macro_make_identifier(pic_state *pic) static pic_value pic_macro_identifier_eq_p(pic_state *pic) { - pic_sym sym1, sym2; + pic_sym *sym1, *sym2; pic_value env1, env2; pic_get_args(pic, "omom", &env1, &sym1, &env2, &sym2); diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index 2b94201b..321a362e 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -34,7 +34,7 @@ pic_make_proc_irep(pic_state *pic, struct pic_irep *irep, struct pic_env *env) return proc; } -pic_sym +pic_sym * pic_proc_name(struct pic_proc *proc) { switch (proc->kind) { diff --git a/extlib/benz/read.c b/extlib/benz/read.c index f54427a0..979113c5 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -199,7 +199,7 @@ read_symbol(pic_state *pic, struct pic_port *port, const char *str) { size_t len, i; char *buf; - pic_sym sym; + pic_sym *sym; int c; len = strlen(str); @@ -452,7 +452,7 @@ read_pipe(pic_state *pic, struct pic_port *port, const char *str) { char *buf; size_t size, cnt; - pic_sym sym; + pic_sym *sym; /* Currently supports only ascii chars */ char HEX_BUF[3]; size_t i = 0; diff --git a/extlib/benz/record.c b/extlib/benz/record.c index 331b43d4..2a6e85cc 100644 --- a/extlib/benz/record.c +++ b/extlib/benz/record.c @@ -29,7 +29,7 @@ pic_record_type(pic_state *pic, struct pic_record *rec) } pic_value -pic_record_ref(pic_state *pic, struct pic_record *rec, pic_sym slot) +pic_record_ref(pic_state *pic, struct pic_record *rec, pic_sym *slot) { if (! pic_dict_has(pic, rec->data, slot)) { pic_errorf(pic, "slot named ~s is not found for record: ~s", pic_obj_value(slot), rec); @@ -38,7 +38,7 @@ pic_record_ref(pic_state *pic, struct pic_record *rec, pic_sym slot) } void -pic_record_set(pic_state *pic, struct pic_record *rec, pic_sym slot, pic_value val) +pic_record_set(pic_state *pic, struct pic_record *rec, pic_sym *slot, pic_value val) { pic_dict_set(pic, rec->data, slot, val); } @@ -80,7 +80,7 @@ static pic_value pic_record_record_ref(pic_state *pic) { struct pic_record *rec; - pic_sym slot; + pic_sym *slot; pic_get_args(pic, "rm", &rec, &slot); @@ -91,7 +91,7 @@ static pic_value pic_record_record_set(pic_state *pic) { struct pic_record *rec; - pic_sym slot; + pic_sym *slot; pic_value val; pic_get_args(pic, "rmo", &rec, &slot, &val); diff --git a/extlib/benz/state.c b/extlib/benz/state.c index a680c3ba..195f07ab 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -52,7 +52,7 @@ pic_open(int argc, char *argv[], char **envp) pic->heap = pic_heap_open(); /* symbol table */ - xh_init_str(&pic->syms, sizeof(pic_sym)); + xh_init_str(&pic->syms, sizeof(pic_sym *)); /* global variables */ pic->globals = NULL; diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 7acbbece..f8f091bd 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -6,26 +6,26 @@ #include "picrin/symbol.h" #include "picrin/string.h" -pic_sym +pic_sym * pic_make_symbol(pic_state *pic, pic_str *str) { - pic_sym sym; + pic_sym *sym; - sym = (pic_sym)pic_obj_alloc(pic, sizeof(struct pic_symbol), PIC_TT_SYMBOL); + sym = (pic_sym *)pic_obj_alloc(pic, sizeof(struct pic_symbol), PIC_TT_SYMBOL); sym->str = str; return sym; } -pic_sym +pic_sym * pic_intern(pic_state *pic, pic_str *str) { xh_entry *e; - pic_sym sym; + pic_sym *sym; char *cstr; e = xh_get_str(&pic->syms, pic_str_cstr(str)); if (e) { - sym = xh_val(e, pic_sym); + sym = xh_val(e, pic_sym *); pic_gc_protect(pic, pic_obj_value(sym)); return sym; } @@ -38,33 +38,33 @@ pic_intern(pic_state *pic, pic_str *str) return sym; } -pic_sym +pic_sym * pic_intern_cstr(pic_state *pic, const char *str) { return pic_intern(pic, pic_make_str(pic, str, strlen(str))); } -pic_sym -pic_gensym(pic_state *pic, pic_sym base) +pic_sym * +pic_gensym(pic_state *pic, pic_sym *base) { return pic_make_symbol(pic, base->str); } bool -pic_interned_p(pic_state *pic, pic_sym sym) +pic_interned_p(pic_state *pic, pic_sym *sym) { xh_entry *e; e = xh_get_str(&pic->syms, pic_str_cstr(sym->str)); if (e) { - return sym == xh_val(e, pic_sym); + return sym == xh_val(e, pic_sym *); } else { return false; } } const char * -pic_symbol_name(pic_state *pic, pic_sym sym) +pic_symbol_name(pic_state *pic, pic_sym *sym) { PIC_UNUSED(pic); @@ -103,7 +103,7 @@ pic_symbol_symbol_eq_p(pic_state *pic) static pic_value pic_symbol_symbol_to_string(pic_state *pic) { - pic_sym sym; + pic_sym *sym; pic_get_args(pic, "m", &sym); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index ea46c9d2..0c82bdff 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -41,7 +41,7 @@ pic_get_proc(pic_state *pic) * F double *, bool * float with exactness * s pic_str ** string object * z char ** c string - * m pic_sym * symbol + * m pic_sym ** symbol * v pic_vec ** vector object * b pic_blob ** bytevector object * c char * char @@ -255,10 +255,10 @@ pic_get_args(pic_state *pic, const char *format, ...) break; } case 'm': { - pic_sym *m; + pic_sym **m; pic_value v; - m = va_arg(ap, pic_sym *); + m = va_arg(ap, pic_sym **); if (i < argc) { v = GET_OPERAND(pic,i); if (pic_sym_p(v)) { @@ -433,7 +433,7 @@ pic_get_args(pic_state *pic, const char *format, ...) void pic_define_noexport(pic_state *pic, const char *name, pic_value val) { - pic_sym sym, rename; + pic_sym *sym, *rename; sym = pic_intern_cstr(pic, name); @@ -457,7 +457,7 @@ pic_define(pic_state *pic, const char *name, pic_value val) pic_value pic_ref(pic_state *pic, struct pic_lib *lib, const char *name) { - pic_sym sym, rename; + pic_sym *sym, *rename; sym = pic_intern_cstr(pic, name); @@ -471,7 +471,7 @@ pic_ref(pic_state *pic, struct pic_lib *lib, const char *name) void pic_set(pic_state *pic, struct pic_lib *lib, const char *name, pic_value val) { - pic_sym sym, rename; + pic_sym *sym, *rename; sym = pic_intern_cstr(pic, name); @@ -776,7 +776,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) } CASE(OP_GREF) { struct pic_irep *irep = vm_get_irep(pic); - pic_sym sym; + pic_sym *sym; sym = irep->syms[c.u.i]; if (! pic_dict_has(pic, pic->globals, sym)) { @@ -787,7 +787,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) } CASE(OP_GSET) { struct pic_irep *irep = vm_get_irep(pic); - pic_sym sym; + pic_sym *sym; pic_value val; sym = irep->syms[c.u.i]; diff --git a/extlib/benz/write.c b/extlib/benz/write.c index 3fecb4bc..5fe657e2 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -14,7 +14,7 @@ #include "picrin/symbol.h" static bool -is_tagged(pic_state *pic, pic_sym tag, pic_value pair) +is_tagged(pic_state *pic, pic_sym *tag, pic_value pair) { return pic_pair_p(pic_cdr(pic, pair)) && pic_nil_p(pic_cddr(pic, pair)) @@ -176,7 +176,7 @@ write_str(pic_state *pic, struct pic_string *str, xFILE *file) static void write_record(pic_state *pic, struct pic_record *rec, xFILE *file) { - const pic_sym sWRITER = pic_intern_cstr(pic, "writer"); + pic_sym *sWRITER = pic_intern_cstr(pic, "writer"); pic_value type, writer, str; #if DEBUG @@ -333,7 +333,7 @@ write_core(struct writer_control *p, pic_value obj) case PIC_TT_DICT: xfprintf(file, "#.(dictionary"); for (it = xh_begin(&pic_dict_ptr(obj)->hash); it != NULL; it = xh_next(it)) { - xfprintf(file, " '%s ", pic_symbol_name(pic, xh_key(it, pic_sym))); + xfprintf(file, " '%s ", pic_symbol_name(pic, xh_key(it, pic_sym *))); write_core(p, xh_val(it, pic_value)); } xfprintf(file, ")"); From 1270787344846e277b4dd2a538a763988b73a95c Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 20 Jan 2015 16:02:44 +0900 Subject: [PATCH 26/26] [bugfix] build failure in debug mode --- extlib/benz/lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 4a82a981..234f3833 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -169,7 +169,7 @@ export(pic_state *pic, pic_value spec) } #if DEBUG - printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym(b)), pic_symbol_name(pic, rename)); + printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym_ptr(b)), pic_symbol_name(pic, rename)); #endif pic_dict_set(pic, pic->lib->exports, pic_sym_ptr(b), pic_obj_value(rename));