From a3db19c1bfb6791891bbb83d2818f0ae447ecd86 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 18 Jan 2015 15:48:05 +0900 Subject: [PATCH 001/177] remove 'struct pic_macro'. define-syntax spec is changed. --- extlib/benz/boot.c | 56 +++++++++--------- extlib/benz/gc.c | 14 ----- extlib/benz/include/picrin/macro.h | 9 --- extlib/benz/include/picrin/value.h | 3 - extlib/benz/macro.c | 54 +++++++++++------- piclib/picrin/macro.scm | 91 ++++++++++++++++-------------- piclib/picrin/syntax-rules.scm | 3 +- 7 files changed, 115 insertions(+), 115 deletions(-) diff --git a/extlib/benz/boot.c b/extlib/benz/boot.c index 6fb9bff3..8918625c 100644 --- a/extlib/benz/boot.c +++ b/extlib/benz/boot.c @@ -24,21 +24,22 @@ my $src = <<'EOL'; val)))))) (define (er-macro-transformer f) - (lambda (expr use-env mac-env) + (lambda (mac-env) + (lambda (expr use-env) - (define rename - (memoize - (lambda (sym) - (make-identifier sym mac-env)))) + (define rename + (memoize + (lambda (sym) + (make-identifier sym mac-env)))) - (define (compare x y) - (if (not (symbol? x)) - #f - (if (not (symbol? y)) - #f - (identifier=? use-env x use-env y)))) + (define (compare x y) + (if (not (symbol? x)) + #f + (if (not (symbol? y)) + #f + (identifier=? use-env x use-env y)))) - (f expr rename compare))) + (f expr rename compare)))) (define-syntax syntax-error (er-macro-transformer @@ -50,7 +51,8 @@ my $src = <<'EOL'; (lambda (expr r c) (list (r 'define-syntax) (cadr expr) (list (r 'lambda) '_ - (list (r 'error) "invalid use of auxiliary syntax")))))) + (list (r 'lambda) '_ + (list (r 'error) "invalid use of auxiliary syntax"))))))) (define-auxiliary-syntax else) (define-auxiliary-syntax =>) @@ -422,21 +424,22 @@ const char pic_boot[] = " val))))))\n" "\n" " (define (er-macro-transformer f)\n" -" (lambda (expr use-env mac-env)\n" +" (lambda (mac-env)\n" +" (lambda (expr use-env)\n" "\n" -" (define rename\n" -" (memoize\n" -" (lambda (sym)\n" -" (make-identifier sym mac-env))))\n" +" (define rename\n" +" (memoize\n" +" (lambda (sym)\n" +" (make-identifier sym mac-env))))\n" "\n" -" (define (compare x y)\n" -" (if (not (symbol? x))\n" -" #f\n" -" (if (not (symbol? y))\n" -" #f\n" -" (identifier=? use-env x use-env y))))\n" +" (define (compare x y)\n" +" (if (not (symbol? x))\n" +" #f\n" +" (if (not (symbol? y))\n" +" #f\n" +" (identifier=? use-env x use-env y))))\n" "\n" -" (f expr rename compare)))\n" +" (f expr rename compare))))\n" "\n" " (define-syntax syntax-error\n" " (er-macro-transformer\n" @@ -448,7 +451,8 @@ const char pic_boot[] = " (lambda (expr r c)\n" " (list (r 'define-syntax) (cadr expr)\n" " (list (r 'lambda) '_\n" -" (list (r 'error) \"invalid use of auxiliary syntax\"))))))\n" +" (list (r 'lambda) '_\n" +" (list (r 'error) \"invalid use of auxiliary syntax\")))))))\n" "\n" " (define-auxiliary-syntax else)\n" " (define-auxiliary-syntax =>)\n" diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index c09765fd..e209ddda 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -415,17 +415,6 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) case PIC_TT_BLOB: { break; } - case PIC_TT_MACRO: { - struct pic_macro *mac = (struct pic_macro *)obj; - - if (mac->proc) { - gc_mark_object(pic, (struct pic_object *)mac->proc); - } - if (mac->senv) { - gc_mark_object(pic, (struct pic_object *)mac->senv); - } - break; - } case PIC_TT_SENV: { struct pic_senv *senv = (struct pic_senv *)obj; @@ -650,9 +639,6 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) xh_destroy(&senv->map); break; } - case PIC_TT_MACRO: { - break; - } case PIC_TT_LIB: { struct pic_lib *lib = (struct pic_lib *)obj; xh_destroy(&lib->exports); diff --git a/extlib/benz/include/picrin/macro.h b/extlib/benz/include/picrin/macro.h index 79148e51..fe4074f5 100644 --- a/extlib/benz/include/picrin/macro.h +++ b/extlib/benz/include/picrin/macro.h @@ -16,15 +16,6 @@ struct pic_senv { struct pic_senv *up; }; -struct pic_macro { - PIC_OBJECT_HEADER - struct pic_proc *proc; - struct pic_senv *senv; -}; - -#define pic_macro_p(v) (pic_type(v) == PIC_TT_MACRO) -#define pic_macro_ptr(v) ((struct pic_macro *)pic_ptr(v)) - #define pic_senv_p(v) (pic_type(v) == PIC_TT_SENV) #define pic_senv_ptr(v) ((struct pic_senv *)pic_ptr(v)) diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index d21a8418..493cb033 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -125,7 +125,6 @@ enum pic_tt { PIC_TT_ERROR, PIC_TT_ENV, PIC_TT_SENV, - PIC_TT_MACRO, PIC_TT_LIB, PIC_TT_IREP, PIC_TT_DATA, @@ -266,8 +265,6 @@ pic_type_repr(enum pic_tt tt) return "proc"; case PIC_TT_SENV: return "senv"; - case PIC_TT_MACRO: - return "macro"; case PIC_TT_LIB: return "lib"; case PIC_TT_IREP: diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index eb811253..d5604635 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -47,18 +47,12 @@ 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 *proc, struct pic_senv *senv) +define_macro(pic_state *pic, pic_sym rename, struct pic_proc *mac) { - struct pic_macro *mac; - - mac = (struct pic_macro *)pic_obj_alloc(pic, sizeof(struct pic_macro), PIC_TT_MACRO); - mac->senv = senv; - mac->proc = proc; - xh_put_int(&pic->macros, rename, &mac); } -static struct pic_macro * +static struct pic_proc * find_macro(pic_state *pic, pic_sym rename) { xh_entry *e; @@ -66,7 +60,7 @@ find_macro(pic_state *pic, pic_sym rename) if ((e = xh_get_int(&pic->macros, rename)) == NULL) { return NULL; } - return xh_val(e, struct pic_macro *); + return xh_val(e, struct pic_proc *); } static pic_sym @@ -252,13 +246,19 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", var); } - define_macro(pic, rename, pic_proc_ptr(val), senv); + val = pic_apply1(pic, pic_proc_ptr(val), pic_obj_value(senv)); + + if (! pic_proc_p(val)) { + pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", var); + } + + define_macro(pic, rename, pic_proc_ptr(val)); return pic_none_value(); } static pic_value -macroexpand_macro(pic_state *pic, struct pic_macro *mac, pic_value expr, struct pic_senv *senv) +macroexpand_macro(pic_state *pic, struct pic_proc *mac, pic_value expr, struct pic_senv *senv) { pic_value v, args; @@ -268,14 +268,10 @@ macroexpand_macro(pic_state *pic, struct pic_macro *mac, pic_value expr, struct puts(""); #endif - if (mac->senv == NULL) { /* legacy macro */ - args = pic_cdr(pic, expr); - } else { - args = pic_list3(pic, expr, pic_obj_value(senv), pic_obj_value(mac->senv)); - } + args = pic_list2(pic, expr, pic_obj_value(senv)); pic_try { - v = pic_apply(pic, mac->proc, args); + v = pic_apply(pic, mac, args); } pic_catch { pic_errorf(pic, "macroexpand error while application: %s", pic_errmsg(pic)); } @@ -298,7 +294,7 @@ macroexpand_node(pic_state *pic, pic_value expr, struct pic_senv *senv) } case PIC_TT_PAIR: { pic_value car; - struct pic_macro *mac; + struct pic_proc *mac; if (! pic_list_p(expr)) { pic_errorf(pic, "cannot macroexpand improper list: ~s", expr); @@ -424,13 +420,33 @@ pic_define_syntactic_keyword(pic_state *pic, struct pic_senv *senv, pic_sym sym, } } +static pic_value +defmacro_call(pic_state *pic) +{ + struct pic_proc *self = pic_get_proc(pic); + pic_value args, tmp, proc; + + pic_get_args(pic, "oo", &args, &tmp); + + proc = pic_attr_ref(pic, pic_obj_value(self), "@@transformer"); + + return pic_apply_trampoline(pic, pic_proc_ptr(proc), pic_cdr(pic, args)); +} + void pic_defmacro(pic_state *pic, pic_sym name, pic_sym id, pic_func_t func) { + struct pic_proc *proc, *trans; + + trans = pic_make_proc(pic, func, pic_symbol_name(pic, name)); + pic_put_rename(pic, pic->lib->env, name, id); + proc = pic_make_proc(pic, defmacro_call, "defmacro_call"); + pic_attr_set(pic, pic_obj_value(proc), "@@transformer", pic_obj_value(trans)); + /* symbol registration */ - define_macro(pic, id, pic_make_proc(pic, func, pic_symbol_name(pic, name)), NULL); + define_macro(pic, id, proc); /* auto export! */ pic_export(pic, name); diff --git a/piclib/picrin/macro.scm b/piclib/picrin/macro.scm index 22bdf097..e0942dd3 100644 --- a/piclib/picrin/macro.scm +++ b/piclib/picrin/macro.scm @@ -47,65 +47,70 @@ (make-syntactic-closure env '() form)) (define-syntax capture-syntactic-environment - (lambda (form use-env mac-env) - (list (cadr form) (list (make-identifier 'quote mac-env) mac-env)))) + (lambda (mac-env) + (lambda (form use-env) + (list (cadr form) (list (make-identifier 'quote mac-env) mac-env))))) (define (sc-macro-transformer f) - (lambda (expr use-env mac-env) - (make-syntactic-closure mac-env '() (f expr use-env)))) + (lambda (mac-env) + (lambda (expr use-env) + (make-syntactic-closure mac-env '() (f expr use-env))))) (define (rsc-macro-transformer f) - (lambda (expr use-env mac-env) - (make-syntactic-closure use-env '() (f expr mac-env)))) + (lambda (mac-env) + (lambda (expr use-env) + (make-syntactic-closure use-env '() (f expr mac-env))))) (define (er-macro-transformer f) - (lambda (expr use-env mac-env) + (lambda (mac-env) + (lambda (expr use-env) - (define rename - (memoize - (lambda (sym) - (make-identifier sym mac-env)))) + (define rename + (memoize + (lambda (sym) + (make-identifier sym mac-env)))) - (define (compare x y) - (if (not (symbol? x)) - #f - (if (not (symbol? y)) - #f - (identifier=? use-env x use-env y)))) + (define (compare x y) + (if (not (symbol? x)) + #f + (if (not (symbol? y)) + #f + (identifier=? use-env x use-env y)))) - (f expr rename compare))) + (f expr rename compare)))) (define (ir-macro-transformer f) - (lambda (expr use-env mac-env) + (lambda (mac-env) + (lambda (expr use-env) - (define icache* (make-dictionary)) + (define icache* (make-dictionary)) - (define inject - (memoize - (lambda (sym) - (define id (make-identifier sym use-env)) - (dictionary-set! icache* id sym) - id))) + (define inject + (memoize + (lambda (sym) + (define id (make-identifier sym use-env)) + (dictionary-set! icache* id sym) + id))) - (define rename - (memoize - (lambda (sym) - (make-identifier sym mac-env)))) + (define rename + (memoize + (lambda (sym) + (make-identifier sym mac-env)))) - (define (compare x y) - (if (not (symbol? x)) - #f - (if (not (symbol? y)) - #f - (identifier=? mac-env x mac-env y)))) + (define (compare x y) + (if (not (symbol? x)) + #f + (if (not (symbol? y)) + #f + (identifier=? mac-env x mac-env y)))) - (walk (lambda (sym) - (call-with-values (lambda () (dictionary-ref icache* sym)) - (lambda (value exists) - (if exists - value - (rename sym))))) - (f (walk inject expr) inject compare)))) + (walk (lambda (sym) + (call-with-values (lambda () (dictionary-ref icache* sym)) + (lambda (value exists) + (if exists + value + (rename sym))))) + (f (walk inject expr) inject compare))))) ;; (define (strip-syntax form) ;; (walk ungensym form)) diff --git a/piclib/picrin/syntax-rules.scm b/piclib/picrin/syntax-rules.scm index 342650a5..8b444085 100644 --- a/piclib/picrin/syntax-rules.scm +++ b/piclib/picrin/syntax-rules.scm @@ -7,7 +7,8 @@ (lambda (expr r c) (list (r 'define-syntax) (cadr expr) (list (r 'lambda) '_ - (list (r 'error) "invalid use of auxiliary syntax")))))) + (list (r 'lambda) '_ + (list (r 'error) "invalid use of auxiliary syntax"))))))) (define-auxiliary-syntax _) (define-auxiliary-syntax ...) From a0a35d189f39d9bbb4dc76915bc717a681b31e3b Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Sun, 18 Jan 2015 11:39:04 +0000 Subject: [PATCH 002/177] improve error message for record accessor and setter --- piclib/picrin/record.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/piclib/picrin/record.scm b/piclib/picrin/record.scm index 6784524b..7559cbbe 100644 --- a/piclib/picrin/record.scm +++ b/piclib/picrin/record.scm @@ -80,16 +80,16 @@ `(define (,accessor record) (if (,pred record) (record-ref record ',field-name) - (error "wrong record type"))) + (error (string-append (symbol->string ',accessor) ": wrong record type") record))) `(begin (define (,accessor record) (if (,pred record) (record-ref record ',field-name) - (error "wrong record type"))) + (error (string-append (symbol->string ',accessor) ": wrong record type") record))) (define (,(car modifier?) record val) (if (,pred record) (record-set! record ',field-name val) - (error "wrong record type"))))))))) + (error (string-append (symbol->string ',(car modifier?)) ": wrong record type") record))))))))) (define-syntax define-record-type (ir-macro-transformer From 9209722a5b981c84b88419583ba4b63212efde58 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 18 Jan 2015 21:25:34 +0900 Subject: [PATCH 003/177] 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 004/177] 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 005/177] 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 006/177] 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 007/177] 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 008/177] 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 009/177] 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 010/177] 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 011/177] 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 012/177] 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 013/177] 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 014/177] 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 015/177] 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 016/177] 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 017/177] 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 018/177] 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 019/177] 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 020/177] 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 021/177] [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 022/177] 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 023/177] 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 6dbf52812d26d89df29c990c886bb1043e6be59d Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Mon, 19 Jan 2015 06:02:39 +0000 Subject: [PATCH 024/177] better error messages against invalid use of auxiliary syntax --- extlib/benz/boot.c | 4 ++-- piclib/picrin/syntax-rules.scm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extlib/benz/boot.c b/extlib/benz/boot.c index 8918625c..324104c5 100644 --- a/extlib/benz/boot.c +++ b/extlib/benz/boot.c @@ -52,7 +52,7 @@ my $src = <<'EOL'; (list (r 'define-syntax) (cadr expr) (list (r 'lambda) '_ (list (r 'lambda) '_ - (list (r 'error) "invalid use of auxiliary syntax"))))))) + (list (r 'error) (list (r 'string-append) "invalid use of auxiliary syntax: '" (symbol->string (cadr expr)) "'")))))))) (define-auxiliary-syntax else) (define-auxiliary-syntax =>) @@ -452,7 +452,7 @@ const char pic_boot[] = " (list (r 'define-syntax) (cadr expr)\n" " (list (r 'lambda) '_\n" " (list (r 'lambda) '_\n" -" (list (r 'error) \"invalid use of auxiliary syntax\")))))))\n" +" (list (r 'error) (list (r 'string-append) \"invalid use of auxiliary syntax: '\" (symbol->string (cadr expr)) \"'\"))))))))\n" "\n" " (define-auxiliary-syntax else)\n" " (define-auxiliary-syntax =>)\n" diff --git a/piclib/picrin/syntax-rules.scm b/piclib/picrin/syntax-rules.scm index 8b444085..59d2b8e9 100644 --- a/piclib/picrin/syntax-rules.scm +++ b/piclib/picrin/syntax-rules.scm @@ -8,7 +8,7 @@ (list (r 'define-syntax) (cadr expr) (list (r 'lambda) '_ (list (r 'lambda) '_ - (list (r 'error) "invalid use of auxiliary syntax"))))))) + (list (r 'error) (list (r 'string-append) "invalid use of auxiliary syntax: '" (symbol->string (cadr expr)) "'")))))))) (define-auxiliary-syntax _) (define-auxiliary-syntax ...) From 914242a53117bf979fe21353979503868b5b4709 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 20 Jan 2015 02:51:10 +0900 Subject: [PATCH 025/177] [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 026/177] [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 027/177] 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 028/177] 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 029/177] [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)); From 5b7f5ad1f9b6a2e0e22bda75022d2eafc49f01b4 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 20 Jan 2015 17:44:06 +0900 Subject: [PATCH 030/177] Squashed 'extlib/benz/' changes from 414f790..057b5f2 057b5f2 Merge pull request #245 from picrin-scheme/heap-symbol c91f6cd [bugfix] build failure in debug mode b1849c4 pic_sym is not a pointer e353b07 s/pic_sym/pic_sym_ptr/g a11fb91 [bugfix] irep->name is missed to mark 1820a25 [bugfix] wrong type specified for cxt->syms b8d2b8e better error messages against invalid use of auxiliary syntax d9ade33 mark only interned symbols and some specisl uninterned symbols da2217b move symbol constants to pic_state 78b035b [bugfix] pic_intern must count up reference of the return value bbdc663 rename internal object ba01821 s/SYMBOL_P/SYMBOLP/g, s/PAIR_P/PAIRP/g 1af32d1 improve error message dd09fbf don't malloc in pic_interned_p 7f51070 turn on GC 7460e81 add gc on/off flag f3742db move symbol-related macros to symbol.h ded6759 remove pic_sym_value ec97d07 remove pic_symbol_value 28bd059 heap symbol seems working (with GC stopped) e0d6fe9 change pic_intern interface 6750693 remove pic_ungensym 4ea7d3c add irep->syms ede7a99 use dictionary for senv->map b3cb50c use dictionaries for temporary import table fc698b5 use dictionary for rec->data 1b814d4 use dictionary for lib->exports 7ae1af4 use dictionaries for pic->globals and pic->macros 74f9979 remove 'struct pic_macro'. define-syntax spec is changed. 86136c5 some procedures are moved to contrib/ da99761 gather all includes of standard headers into picrin.h 7df8d77 add dictionary-map and dictionary-for-each b625ff8 revert 48f0ec90. dicitonary is now symbol-to-object structure f7657d7 [prepare] dictionary is to be changed to have only symbols for its keys git-subtree-dir: extlib/benz git-subtree-split: 057b5f29110ab3f75513573d291ea18acb782357 --- attr.c | 4 +- blob.c | 2 - bool.c | 2 - boot.c | 78 +++++---- codegen.c | 353 ++++++++++++++++++++-------------------- cont.c | 4 - debug.c | 2 +- dict.c | 212 ++++++++++++++---------- error.c | 12 +- file.c | 117 ------------- gc.c | 87 ++++++---- include/picrin.h | 67 ++++---- include/picrin/dict.h | 15 +- include/picrin/error.h | 6 +- include/picrin/irep.h | 17 +- include/picrin/lib.h | 2 +- include/picrin/macro.h | 21 +-- include/picrin/proc.h | 4 +- include/picrin/record.h | 6 +- include/picrin/symbol.h | 24 +++ include/picrin/util.h | 1 - include/picrin/value.h | 58 +------ include/picrin/xfile.h | 6 - include/picrin/xhash.h | 6 - include/picrin/xrope.h | 5 - include/picrin/xvect.h | 5 - init.c | 10 +- lib.c | 108 ++++++------ load.c | 43 +---- macro.c | 146 +++++++++-------- number.c | 4 - pair.c | 2 - port.c | 4 - proc.c | 2 +- read.c | 31 ++-- record.c | 27 ++- state.c | 79 +++++---- string.c | 2 - symbol.c | 138 ++++++---------- system.c | 134 --------------- time.c | 47 ------ var.c | 20 +-- vm.c | 76 +++++---- write.c | 15 +- 44 files changed, 820 insertions(+), 1184 deletions(-) delete mode 100644 file.c create mode 100644 include/picrin/symbol.h delete mode 100644 system.c delete mode 100644 time.c diff --git a/attr.c b/attr.c index e005bec2..169f1e8b 100644 --- a/attr.c +++ b/attr.c @@ -24,13 +24,13 @@ pic_attr(pic_state *pic, pic_value obj) pic_value pic_attr_ref(pic_state *pic, pic_value obj, const char *key) { - return pic_dict_ref(pic, pic_attr(pic, obj), pic_sym_value(pic_intern_cstr(pic, key))); + return pic_dict_ref(pic, pic_attr(pic, obj), pic_intern_cstr(pic, key)); } void pic_attr_set(pic_state *pic, pic_value obj, const char *key, pic_value v) { - pic_dict_set(pic, pic_attr(pic, obj), pic_sym_value(pic_intern_cstr(pic, key)), v); + pic_dict_set(pic, pic_attr(pic, obj), pic_intern_cstr(pic, key), v); } static pic_value diff --git a/blob.c b/blob.c index 3e5b7723..cd5be767 100644 --- a/blob.c +++ b/blob.c @@ -2,8 +2,6 @@ * See Copyright Notice in picrin.h */ -#include - #include "picrin.h" #include "picrin/blob.h" #include "picrin/pair.h" diff --git a/bool.c b/bool.c index 0b196f51..b102f9de 100644 --- a/bool.c +++ b/bool.c @@ -2,8 +2,6 @@ * See Copyright Notice in picrin.h */ -#include - #include "picrin.h" #include "picrin/pair.h" #include "picrin/vector.h" diff --git a/boot.c b/boot.c index 2c0d06b6..324104c5 100644 --- a/boot.c +++ b/boot.c @@ -24,21 +24,22 @@ my $src = <<'EOL'; val)))))) (define (er-macro-transformer f) - (lambda (expr use-env mac-env) + (lambda (mac-env) + (lambda (expr use-env) - (define rename - (memoize - (lambda (sym) - (make-identifier sym mac-env)))) + (define rename + (memoize + (lambda (sym) + (make-identifier sym mac-env)))) - (define (compare x y) - (if (not (symbol? x)) - #f - (if (not (symbol? y)) - #f - (identifier=? use-env x use-env y)))) + (define (compare x y) + (if (not (symbol? x)) + #f + (if (not (symbol? y)) + #f + (identifier=? use-env x use-env y)))) - (f expr rename compare))) + (f expr rename compare)))) (define-syntax syntax-error (er-macro-transformer @@ -50,7 +51,8 @@ my $src = <<'EOL'; (lambda (expr r c) (list (r 'define-syntax) (cadr expr) (list (r 'lambda) '_ - (list (r 'error) "invalid use of auxiliary syntax")))))) + (list (r 'lambda) '_ + (list (r 'error) (list (r 'string-append) "invalid use of auxiliary syntax: '" (symbol->string (cadr expr)) "'")))))))) (define-auxiliary-syntax else) (define-auxiliary-syntax =>) @@ -308,13 +310,10 @@ my $src = <<'EOL'; (let* ((old-bindings (current-dynamic-environment)) (binding - (let ((dict (dictionary))) - (for-each - (lambda (parameter value) - (dictionary-set! dict parameter (list (parameter value #f)))) - parameters - values) - dict)) + (map (lambda (parameter value) + (cons parameter (parameter value #f))) + parameters + values)) (new-bindings (cons binding old-bindings))) (dynamic-wind @@ -425,21 +424,22 @@ const char pic_boot[] = " val))))))\n" "\n" " (define (er-macro-transformer f)\n" -" (lambda (expr use-env mac-env)\n" +" (lambda (mac-env)\n" +" (lambda (expr use-env)\n" "\n" -" (define rename\n" -" (memoize\n" -" (lambda (sym)\n" -" (make-identifier sym mac-env))))\n" +" (define rename\n" +" (memoize\n" +" (lambda (sym)\n" +" (make-identifier sym mac-env))))\n" "\n" -" (define (compare x y)\n" -" (if (not (symbol? x))\n" -" #f\n" -" (if (not (symbol? y))\n" -" #f\n" -" (identifier=? use-env x use-env y))))\n" +" (define (compare x y)\n" +" (if (not (symbol? x))\n" +" #f\n" +" (if (not (symbol? y))\n" +" #f\n" +" (identifier=? use-env x use-env y))))\n" "\n" -" (f expr rename compare)))\n" +" (f expr rename compare))))\n" "\n" " (define-syntax syntax-error\n" " (er-macro-transformer\n" @@ -451,7 +451,8 @@ const char pic_boot[] = " (lambda (expr r c)\n" " (list (r 'define-syntax) (cadr expr)\n" " (list (r 'lambda) '_\n" -" (list (r 'error) \"invalid use of auxiliary syntax\"))))))\n" +" (list (r 'lambda) '_\n" +" (list (r 'error) (list (r 'string-append) \"invalid use of auxiliary syntax: '\" (symbol->string (cadr expr)) \"'\"))))))))\n" "\n" " (define-auxiliary-syntax else)\n" " (define-auxiliary-syntax =>)\n" @@ -709,13 +710,10 @@ const char pic_boot[] = " (let* ((old-bindings\n" " (current-dynamic-environment))\n" " (binding\n" -" (let ((dict (dictionary)))\n" -" (for-each\n" -" (lambda (parameter value)\n" -" (dictionary-set! dict parameter (list (parameter value #f))))\n" -" parameters\n" -" values)\n" -" dict))\n" +" (map (lambda (parameter value)\n" +" (cons parameter (parameter value #f)))\n" +" parameters\n" +" values))\n" " (new-bindings\n" " (cons binding old-bindings)))\n" " (dynamic-wind\n" diff --git a/codegen.c b/codegen.c index 39b4bfc4..fa3125a7 100644 --- a/codegen.c +++ b/codegen.c @@ -8,6 +8,8 @@ #include "picrin/proc.h" #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 @@ -34,13 +36,11 @@ typedef struct analyze_scope { typedef struct analyze_state { pic_state *pic; analyze_scope *scope; - pic_sym rCONS, rCAR, rCDR, rNILP; - pic_sym rSYMBOL_P, rPAIR_P; - 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; + 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; - xh_entry *it; + pic_sym *sym; state = pic_alloc(pic, sizeof(analyze_state)); state->pic = pic; @@ -74,8 +74,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, "*"); @@ -89,20 +89,10 @@ 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()); - 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); } @@ -120,14 +110,14 @@ 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); 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)) { @@ -135,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 { @@ -153,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)); @@ -194,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 */ @@ -215,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) { @@ -232,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; @@ -251,13 +241,13 @@ 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; 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; } @@ -273,17 +263,17 @@ 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); - 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 == 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_symbol_value(state->sRETURN), res); + res = pic_list2(pic, pic_obj_value(pic->sRETURN), res); } } @@ -294,31 +284,31 @@ 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; - return pic_list2(pic, pic_symbol_value(state->sGREF), pic_sym_value(sym)); + return pic_list2(pic, pic_obj_value(pic->sGREF), pic_obj_value(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; - return pic_list2(pic, pic_symbol_value(state->sLREF), pic_sym_value(sym)); + return pic_list2(pic, pic_obj_value(pic->sLREF), pic_obj_value(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; - return pic_list3(pic, pic_symbol_value(state->sCREF), pic_int_value(depth), pic_sym_value(sym)); + return pic_list3(pic, pic_obj_value(pic->sCREF), pic_int_value(depth), pic_obj_value(sym)); } 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; @@ -340,10 +330,10 @@ 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 "); + pic_sym *sNOWHERE = pic_intern_cstr(pic, "<>"); pic_value skel; - skel = pic_list2(pic, pic_sym_value(state->sGREF), pic_sym_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); @@ -382,13 +372,13 @@ 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(); 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 +386,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 +408,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 @@ -438,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); @@ -450,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"); @@ -460,19 +450,19 @@ 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); 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 +470,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_obj_value(pic->sSETBANG), var, val); } static pic_value @@ -505,7 +495,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_obj_value(pic->sIF), cond, if_true, if_false); } static pic_value @@ -521,7 +511,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_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 +544,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_obj_value(pic->sSETBANG), var, val); } static pic_value @@ -565,22 +555,22 @@ 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 { \ - 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_obj_value(sym), obj, \ + analyze(state, arg, false)); \ + } \ + } while (0) static pic_value analyze_add(analyze_state *state, pic_value obj, bool tailpos) @@ -591,7 +581,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_obj_value(pic->sQUOTE), pic_int_value(0)); case 2: return analyze(state, pic_car(pic, pic_cdr(pic, obj)), tailpos); default: @@ -610,7 +600,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_obj_value(pic->sMINUS), analyze(state, pic_car(pic, pic_cdr(pic, obj)), false)); default: args = pic_cdr(pic, obj); @@ -628,7 +618,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_obj_value(pic->sQUOTE), pic_int_value(1)); case 2: return analyze(state, pic_car(pic, pic_cdr(pic, obj)), tailpos); default: @@ -662,14 +652,14 @@ 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 = state->sCALL; + call = pic->sCALL; } else { - call = state->sTAILCALL; + call = pic->sTAILCALL; } - seq = pic_list1(pic, pic_symbol_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 +676,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_obj_value(pic->sRETURN)); pic_for_each (v, pic_cdr(pic, obj)) { seq = pic_cons(pic, analyze(state, v, false), seq); } @@ -698,44 +688,44 @@ 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"); } 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); - return pic_list3(pic, pic_symbol_value(call), prod, cnsm); + return pic_list3(pic, pic_obj_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_obj_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_obj_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) @@ -744,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; @@ -755,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); @@ -791,13 +781,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); @@ -842,12 +832,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_obj_value(pic->sQUOTE), obj); } } @@ -871,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; @@ -884,6 +874,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; @@ -895,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); @@ -912,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; @@ -943,27 +924,27 @@ create_activation(codegen_context *cxt) { size_t i, n; xhash regs; - pic_sym *var; + 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; @@ -984,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)); @@ -992,23 +973,23 @@ 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)); - 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(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); } @@ -1024,6 +1005,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_sym *)); + cxt->slen = 0; + cxt->scapa = PIC_POOL_SIZE; + state->cxt = cxt; create_activation(cxt); @@ -1049,6 +1034,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); @@ -1064,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; @@ -1083,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) { @@ -1104,6 +1091,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 @@ -1111,30 +1118,30 @@ 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(pic_car(pic, obj)); - if (sym == state->sGREF) { + 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 = 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 == state->sCREF) { - pic_sym name; + } else if (sym == pic->sCREF) { + pic_sym *name; 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); cxt->clen++; return; - } else if (sym == state->sLREF) { - pic_sym name; + } else if (sym == pic->sLREF) { + 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; @@ -1147,27 +1154,27 @@ 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); var = pic_list_ref(pic, obj, 1); - type = pic_sym(pic_list_ref(pic, var, 0)); - if (type == state->sGREF) { + 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 = pic_int(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++; return; } - else if (type == state->sCREF) { - pic_sym name; + else if (type == pic->sCREF) { + pic_sym *name; 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); @@ -1176,11 +1183,11 @@ codegen(codegen_state *state, pic_value obj) cxt->clen++; return; } - else if (type == state->sLREF) { - pic_sym name; + else if (type == pic->sLREF) { + 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; @@ -1310,15 +1317,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; } @@ -1397,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)); @@ -1418,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; @@ -1435,7 +1442,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 * diff --git a/cont.c b/cont.c index b1af6eca..2678fb0b 100644 --- a/cont.c +++ b/cont.c @@ -2,10 +2,6 @@ * See Copyright Notice in picrin.h */ -#include -#include -#include - #include "picrin.h" #include "picrin/proc.h" #include "picrin/cont.h" diff --git a/debug.c b/debug.c index bb9f711d..bcd95546 100644 --- a/debug.c +++ b/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/dict.c b/dict.c index ca411551..d677e935 100644 --- a/dict.c +++ b/dict.c @@ -6,69 +6,8 @@ #include "picrin/dict.h" #include "picrin/cont.h" #include "picrin/pair.h" - -static int -xh_value_hash(const void *key, void *data) -{ - union { double f; int i; } u; - pic_value val = *(pic_value *)key; - int hash, vtype; - - PIC_UNUSED(data); - - vtype = pic_vtype(val); - - switch (vtype) { - default: - hash = 0; - break; - case PIC_VTYPE_SYMBOL: - hash = pic_sym(val); - break; - case PIC_VTYPE_FLOAT: - u.f = pic_float(val); - hash = u.i; - break; - case PIC_VTYPE_INT: - hash = pic_int(val); - break; - case PIC_VTYPE_HEAP: - hash = (int)(intptr_t)pic_ptr(val); - break; - } - - return hash + vtype; -} - -static int -xh_value_equal(const void *key1, const void *key2, void *pic) -{ - return pic_equal_p(pic, *(pic_value *)key1, *(pic_value *)key2); -} - -static void -xh_init_value(pic_state *pic, xhash *x) -{ - xh_init_(x, sizeof(pic_value), sizeof(pic_value), xh_value_hash, xh_value_equal, pic); -} - -static inline xh_entry * -xh_get_value(xhash *x, pic_value key) -{ - return xh_get_(x, &key); -} - -static inline xh_entry * -xh_put_value(xhash *x, pic_value key, void *val) -{ - return xh_put_(x, &key, val); -} - -static inline void -xh_del_value(xhash *x, pic_value key) -{ - xh_del_(x, &key); -} +#include "picrin/error.h" +#include "picrin/symbol.h" struct pic_dict * pic_make_dict(pic_state *pic) @@ -76,29 +15,29 @@ 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_value(pic, &dict->hash); + xh_init_ptr(&dict->hash, sizeof(pic_value)); return dict; } pic_value -pic_dict_ref(pic_state *pic, struct pic_dict *dict, pic_value key) +pic_dict_ref(pic_state *pic, struct pic_dict *dict, pic_sym *key) { xh_entry *e; - e = xh_get_value(&dict->hash, key); + e = xh_get_ptr(&dict->hash, key); if (! e) { - pic_errorf(pic, "element not found for a key: ~s", key); + pic_errorf(pic, "element not found for a key: ~s", pic_obj_value(key)); } return xh_val(e, pic_value); } void -pic_dict_set(pic_state *pic, struct pic_dict *dict, pic_value key, pic_value val) +pic_dict_set(pic_state *pic, struct pic_dict *dict, pic_sym *key, pic_value val) { PIC_UNUSED(pic); - xh_put_value(&dict->hash, key, &val); + xh_put_ptr(&dict->hash, key, &val); } size_t @@ -110,21 +49,21 @@ pic_dict_size(pic_state *pic, struct pic_dict *dict) } bool -pic_dict_has(pic_state *pic, struct pic_dict *dict, pic_value key) +pic_dict_has(pic_state *pic, struct pic_dict *dict, pic_sym *key) { PIC_UNUSED(pic); - return xh_get_value(&dict->hash, key) != NULL; + return xh_get_ptr(&dict->hash, key) != NULL; } void -pic_dict_del(pic_state *pic, struct pic_dict *dict, pic_value key) +pic_dict_del(pic_state *pic, struct pic_dict *dict, pic_sym *key) { - if (xh_get_value(&dict->hash, key) == NULL) { - pic_errorf(pic, "no slot named ~s found in dictionary", key); + if (xh_get_ptr(&dict->hash, key) == NULL) { + pic_errorf(pic, "no slot named ~s found in dictionary", pic_obj_value(key)); } - xh_del_value(&dict->hash, key); + xh_del_ptr(&dict->hash, key); } static pic_value @@ -151,7 +90,8 @@ pic_dict_dictionary(pic_state *pic) dict = pic_make_dict(pic); for (i = 0; i < argc; i += 2) { - pic_dict_set(pic, dict, argv[i], argv[i+1]); + pic_assert_type(pic, argv[i], sym); + pic_dict_set(pic, dict, pic_sym_ptr(argv[i]), argv[i+1]); } return pic_obj_value(dict); @@ -171,9 +111,9 @@ static pic_value pic_dict_dictionary_ref(pic_state *pic) { struct pic_dict *dict; - pic_value key; + pic_sym *key; - pic_get_args(pic, "do", &dict, &key); + pic_get_args(pic, "dm", &dict, &key); if (pic_dict_has(pic, dict, key)) { return pic_values2(pic, pic_dict_ref(pic, dict, key), pic_true_value()); @@ -186,9 +126,10 @@ static pic_value pic_dict_dictionary_set(pic_state *pic) { struct pic_dict *dict; - pic_value key, val; + pic_sym *key; + pic_value val; - pic_get_args(pic, "doo", &dict, &key, &val); + pic_get_args(pic, "dmo", &dict, &key, &val); pic_dict_set(pic, dict, key, val); @@ -199,9 +140,9 @@ static pic_value pic_dict_dictionary_del(pic_state *pic) { struct pic_dict *dict; - pic_value key; + pic_sym *key; - pic_get_args(pic, "do", &dict, &key); + pic_get_args(pic, "dm", &dict, &key); pic_dict_del(pic, dict, key); @@ -215,7 +156,100 @@ pic_dict_dictionary_size(pic_state *pic) pic_get_args(pic, "d", &dict); - return pic_size_value(pic_dict_size(pic, dict)); + return pic_int_value(pic_dict_size(pic, dict)); +} + +static pic_value +pic_dict_dictionary_map(pic_state *pic) +{ + struct pic_proc *proc; + size_t argc, i; + pic_value *args; + pic_value arg, ret; + xh_entry **it; + + pic_get_args(pic, "l*", &proc, &argc, &args); + + it = pic_alloc(pic, argc * sizeof(xh_entry)); + for (i = 0; i < argc; ++i) { + if (! pic_dict_p(args[i])) { + pic_free(pic, it); + pic_errorf(pic, "expected dict, but got %s", pic_type_repr(pic_type(args[i]))); + } + it[i] = xh_begin(&pic_dict_ptr(args[i])->hash); + } + + pic_try { + ret = pic_nil_value(); + do { + arg = pic_nil_value(); + for (i = 0; i < argc; ++i) { + if (it[i] == NULL) { + break; + } + pic_push(pic, pic_obj_value(xh_key(it[i], pic_sym *)), arg); + it[i] = xh_next(it[i]); + } + if (i != argc) { + break; + } + pic_push(pic, pic_apply(pic, proc, pic_reverse(pic, arg)), ret); + } while (1); + } + pic_catch { + pic_free(pic, it); + pic_raise(pic, pic->err); + } + + pic_free(pic, it); + + return pic_reverse(pic, ret); +} + +static pic_value +pic_dict_dictionary_for_each(pic_state *pic) +{ + struct pic_proc *proc; + size_t argc, i; + pic_value *args; + pic_value arg; + xh_entry **it; + + pic_get_args(pic, "l*", &proc, &argc, &args); + + it = pic_alloc(pic, argc * sizeof(xh_entry)); + for (i = 0; i < argc; ++i) { + if (! pic_dict_p(args[i])) { + pic_free(pic, it); + pic_errorf(pic, "expected dict, but got %s", pic_type_repr(pic_type(args[i]))); + } + it[i] = xh_begin(&pic_dict_ptr(args[i])->hash); + } + + pic_try { + do { + arg = pic_nil_value(); + for (i = 0; i < argc; ++i) { + if (it[i] == NULL) { + break; + } + pic_push(pic, pic_obj_value(xh_key(it[i], pic_sym *)), arg); + it[i] = xh_next(it[i]); + } + if (i != argc) { + break; + } + pic_void(pic_apply(pic, proc, pic_reverse(pic, arg))); + } while (1); + } + pic_catch { + pic_free(pic, it); + pic_raise(pic, pic->err); + } + + pic_free(pic, it); + + return pic_none_value(); } static pic_value @@ -228,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, xh_key(it, pic_value), 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); } @@ -246,7 +280,8 @@ pic_dict_alist_to_dictionary(pic_state *pic) dict = pic_make_dict(pic); pic_for_each (e, pic_reverse(pic, alist)) { - pic_dict_set(pic, dict, pic_car(pic, e), pic_cdr(pic, e)); + pic_assert_type(pic, pic_car(pic, e), sym); + pic_dict_set(pic, dict, pic_sym_ptr(pic_car(pic, e)), pic_cdr(pic, e)); } return pic_obj_value(dict); @@ -262,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, xh_key(it, pic_value), plist); + pic_push(pic, pic_obj_value(xh_key(it, pic_sym *)), plist); pic_push(pic, xh_val(it, pic_value), plist); } @@ -280,7 +315,8 @@ pic_dict_plist_to_dictionary(pic_state *pic) dict = pic_make_dict(pic); for (e = pic_reverse(pic, plist); ! pic_nil_p(e); e = pic_cddr(pic, e)) { - pic_dict_set(pic, dict, pic_cadr(pic, e), pic_car(pic, e)); + pic_assert_type(pic, pic_cadr(pic, e), sym); + pic_dict_set(pic, dict, pic_sym_ptr(pic_cadr(pic, e)), pic_car(pic, e)); } return pic_obj_value(dict); @@ -296,6 +332,8 @@ pic_init_dict(pic_state *pic) pic_defun(pic, "dictionary-set!", pic_dict_dictionary_set); pic_defun(pic, "dictionary-delete!", pic_dict_dictionary_del); pic_defun(pic, "dictionary-size", pic_dict_dictionary_size); + pic_defun(pic, "dictionary-map", pic_dict_dictionary_map); + pic_defun(pic, "dictionary-for-each", pic_dict_dictionary_for_each); pic_defun(pic, "dictionary->alist", pic_dict_dictionary_to_alist); pic_defun(pic, "alist->dictionary", pic_dict_alist_to_dictionary); pic_defun(pic, "dictionary->plist", pic_dict_dictionary_to_plist); diff --git a/error.c b/error.c index 69c12206..5df91233 100644 --- a/error.c +++ b/error.c @@ -2,10 +2,6 @@ * See Copyright Notice in picrin.h */ -#include -#include -#include - #include "picrin.h" #include "picrin/pair.h" #include "picrin/proc.h" @@ -129,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; @@ -179,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; @@ -257,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; @@ -306,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/file.c b/file.c deleted file mode 100644 index d438c23a..00000000 --- a/file.c +++ /dev/null @@ -1,117 +0,0 @@ -/** - * See Copyright Notice in picrin.h - */ - -#include "picrin.h" -#include "picrin/port.h" -#include "picrin/error.h" - -pic_noreturn static void -file_error(pic_state *pic, const char *msg) -{ - pic_throw(pic, pic->sFILE, msg, pic_nil_value()); -} - -static pic_value -generic_open_file(pic_state *pic, const char *fname, char *mode, short flags) -{ - struct pic_port *port; - xFILE *file; - - file = xfopen(fname, mode); - if (! file) { - file_error(pic, "could not open file"); - } - - port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port), PIC_TT_PORT); - port->file = file; - port->flags = flags; - port->status = PIC_PORT_OPEN; - - return pic_obj_value(port); -} - -pic_value -pic_file_open_input_file(pic_state *pic) -{ - static const short flags = PIC_PORT_IN | PIC_PORT_TEXT; - char *fname; - - pic_get_args(pic, "z", &fname); - - return generic_open_file(pic, fname, "r", flags); -} - -pic_value -pic_file_open_binary_input_file(pic_state *pic) -{ - static const short flags = PIC_PORT_IN | PIC_PORT_BINARY; - char *fname; - - pic_get_args(pic, "z", &fname); - - return generic_open_file(pic, fname, "rb", flags); -} - -pic_value -pic_file_open_output_file(pic_state *pic) -{ - static const short flags = PIC_PORT_OUT | PIC_PORT_TEXT; - char *fname; - - pic_get_args(pic, "z", &fname); - - return generic_open_file(pic, fname, "w", flags); -} - -pic_value -pic_file_open_binary_output_file(pic_state *pic) -{ - static const short flags = PIC_PORT_OUT | PIC_PORT_BINARY; - char *fname; - - pic_get_args(pic, "z", &fname); - - return generic_open_file(pic, fname, "wb", flags); -} - -pic_value -pic_file_exists_p(pic_state *pic) -{ - char *fname; - FILE *fp; - - pic_get_args(pic, "z", &fname); - - fp = fopen(fname, "r"); - if (fp) { - fclose(fp); - return pic_true_value(); - } else { - return pic_false_value(); - } -} - -pic_value -pic_file_delete(pic_state *pic) -{ - char *fname; - - pic_get_args(pic, "z", &fname); - - if (remove(fname) != 0) { - file_error(pic, "file cannot be deleted"); - } - return pic_none_value(); -} - -void -pic_init_file(pic_state *pic) -{ - pic_defun(pic, "open-input-file", pic_file_open_input_file); - pic_defun(pic, "open-binary-input-file", pic_file_open_binary_input_file); - pic_defun(pic, "open-output-file", pic_file_open_output_file); - pic_defun(pic, "open-binary-output-file", pic_file_open_binary_output_file); - pic_defun(pic, "file-exists?", pic_file_exists_p); - pic_defun(pic, "delete-file", pic_file_delete); -} diff --git a/gc.c b/gc.c index 1e50649e..5c5ef412 100644 --- a/gc.c +++ b/gc.c @@ -19,10 +19,7 @@ #include "picrin/dict.h" #include "picrin/record.h" #include "picrin/read.h" - -#if GC_DEBUG -# include -#endif +#include "picrin/symbol.h" union header { struct { @@ -393,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; } @@ -401,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; @@ -419,17 +419,6 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) case PIC_TT_BLOB: { break; } - case PIC_TT_MACRO: { - struct pic_macro *mac = (struct pic_macro *)obj; - - if (mac->proc) { - gc_mark_object(pic, (struct pic_object *)mac->proc); - } - if (mac->senv) { - gc_mark_object(pic, (struct pic_object *)mac->senv); - } - break; - } case PIC_TT_SENV: { struct pic_senv *senv = (struct pic_senv *)obj; @@ -437,24 +426,31 @@ 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: { 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: { 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]); } 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: { @@ -474,25 +470,27 @@ 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(pic, xh_key(it, pic_value)); + gc_mark_object(pic, (struct pic_object *)xh_key(it, pic_sym *)); gc_mark(pic, xh_val(it, pic_value)); } break; } 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_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: @@ -527,6 +525,17 @@ 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(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) { @@ -564,14 +573,22 @@ gc_mark_phase(pic_state *pic) gc_mark_object(pic, pic->arena[j]); } + /* mark reserved uninterned symbols */ + gc_mark_global_symbols(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 *)); + } + /* 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 */ @@ -651,16 +668,9 @@ 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_MACRO: { break; } case PIC_TT_LIB: { - struct pic_lib *lib = (struct pic_lib *)obj; - xh_destroy(&lib->exports); break; } case PIC_TT_IREP: { @@ -668,6 +678,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: { @@ -682,15 +693,15 @@ 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_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: @@ -777,6 +788,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/include/picrin.h b/include/picrin.h index 98b96d0c..0c950425 100644 --- a/include/picrin.h +++ b/include/picrin.h @@ -30,10 +30,17 @@ extern "C" { #include #include -#include #include #include +#include + +#include +#include #include +#include +#include +#include +#include #include "picrin/xvect.h" #include "picrin/xhash.h" @@ -82,22 +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 sSYMBOL_P, sPAIR_P; - pic_sym sADD, sSUB, sMUL, sDIV, sMINUS; - pic_sym sEQ, sLT, sLE, sGT, sGE, sNOT; - pic_sym sREAD, sFILE; + 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; @@ -105,17 +115,14 @@ typedef struct { pic_value features; xhash syms; /* name to symbol */ - xhash sym_names; /* symbol to name */ - int sym_cnt; - int uniq_sym_cnt; - - xhash globals; - xhash macros; + struct pic_dict *globals; + struct pic_dict *macros; pic_value libs; xhash attrs; struct pic_reader *reader; + bool gc_enable; struct pic_heap *heap; struct pic_object **arena; size_t arena_size, arena_idx; @@ -168,18 +175,16 @@ 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_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_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 *); -void pic_load(pic_state *, const char *); +void pic_load_port(pic_state *, struct pic_port *); void pic_load_cstr(pic_state *, const char *); pic_value pic_funcall(pic_state *pic, struct pic_lib *, const char *, pic_list); @@ -211,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/include/picrin/dict.h b/include/picrin/dict.h index 36160c24..13379bf5 100644 --- a/include/picrin/dict.h +++ b/include/picrin/dict.h @@ -19,11 +19,18 @@ struct pic_dict { struct pic_dict *pic_make_dict(pic_state *); -pic_value pic_dict_ref(pic_state *, struct pic_dict *, pic_value); -void pic_dict_set(pic_state *, struct pic_dict *, pic_value, pic_value); -void pic_dict_del(pic_state *, struct pic_dict *, pic_value); +#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 *); size_t pic_dict_size(pic_state *, struct pic_dict *); -bool pic_dict_has(pic_state *, struct pic_dict *, pic_value); +bool pic_dict_has(pic_state *, struct pic_dict *, pic_sym *); #if defined(__cplusplus) } diff --git a/include/picrin/error.h b/include/picrin/error.h index e4cc630a..3a575cfe 100644 --- a/include/picrin/error.h +++ b/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/include/picrin/irep.h b/include/picrin/irep.h index 5b10628a..9c7932da 100644 --- a/include/picrin/irep.h +++ b/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, @@ -62,13 +62,14 @@ 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; - size_t clen, ilen, plen; + pic_sym **syms; + size_t clen, ilen, plen, slen; }; pic_value pic_analyze(pic_state *, pic_value); @@ -151,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/include/picrin/lib.h b/include/picrin/lib.h index 98ab3ae8..d0611425 100644 --- a/include/picrin/lib.h +++ b/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/include/picrin/macro.h b/include/picrin/macro.h index 79148e51..07ca86d1 100644 --- a/include/picrin/macro.h +++ b/include/picrin/macro.h @@ -11,35 +11,26 @@ extern "C" { struct pic_senv { PIC_OBJECT_HEADER - xhash map; + struct pic_dict *map; pic_value defer; struct pic_senv *up; }; -struct pic_macro { - PIC_OBJECT_HEADER - struct pic_proc *proc; - struct pic_senv *senv; -}; - -#define pic_macro_p(v) (pic_type(v) == PIC_TT_MACRO) -#define pic_macro_ptr(v) ((struct pic_macro *)pic_ptr(v)) - #define pic_senv_p(v) (pic_type(v) == PIC_TT_SENV) #define pic_senv_ptr(v) ((struct pic_senv *)pic_ptr(v)) 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/include/picrin/proc.h b/include/picrin/proc.h index e64cd6fc..ebe13a82 100644 --- a/include/picrin/proc.h +++ b/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/include/picrin/record.h b/include/picrin/record.h index d2944c06..e3edcd01 100644 --- a/include/picrin/record.h +++ b/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) @@ -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/include/picrin/symbol.h b/include/picrin/symbol.h new file mode 100644 index 00000000..bb588d0d --- /dev/null +++ b/include/picrin/symbol.h @@ -0,0 +1,24 @@ +/** + * 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; +}; + +#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) +} +#endif + +#endif diff --git a/include/picrin/util.h b/include/picrin/util.h index afa0e037..6f39b759 100644 --- a/include/picrin/util.h +++ b/include/picrin/util.h @@ -32,7 +32,6 @@ extern "C" { #if GCC_VERSION >= 40500 || __clang__ # define PIC_UNREACHABLE() (__builtin_unreachable()) #else -# include # define PIC_UNREACHABLE() (assert(false)) #endif diff --git a/include/picrin/value.h b/include/picrin/value.h index d21a8418..a6db5b98 100644 --- a/include/picrin/value.h +++ b/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, @@ -125,7 +107,6 @@ enum pic_tt { PIC_TT_ERROR, PIC_TT_ENV, PIC_TT_SENV, - PIC_TT_MACRO, PIC_TT_LIB, PIC_TT_IREP, PIC_TT_DATA, @@ -140,6 +121,7 @@ struct pic_object { PIC_OBJECT_HEADER }; +struct pic_symbol; struct pic_pair; struct pic_string; struct pic_vector; @@ -151,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; @@ -165,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) @@ -190,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); @@ -215,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: @@ -266,8 +243,6 @@ pic_type_repr(enum pic_tt tt) return "proc"; case PIC_TT_SENV: return "senv"; - case PIC_TT_MACRO: - return "macro"; case PIC_TT_LIB: return "lib"; case PIC_TT_IREP: @@ -373,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) { @@ -428,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) { @@ -496,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); } @@ -514,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/include/picrin/xfile.h b/include/picrin/xfile.h index 4db6f836..4c96a9f8 100644 --- a/include/picrin/xfile.h +++ b/include/picrin/xfile.h @@ -5,12 +5,6 @@ extern "C" { #endif -#include -#include -#include -#include -#include - typedef struct { int ungot; int flags; diff --git a/include/picrin/xhash.h b/include/picrin/xhash.h index e25302ed..1dadc7ff 100644 --- a/include/picrin/xhash.h +++ b/include/picrin/xhash.h @@ -9,12 +9,6 @@ extern "C" { #endif -#include -#include -#include -#include -#include - /* simple object to object hash table */ #define XHASH_INIT_SIZE 11 diff --git a/include/picrin/xrope.h b/include/picrin/xrope.h index 89842de0..20199b85 100644 --- a/include/picrin/xrope.h +++ b/include/picrin/xrope.h @@ -5,11 +5,6 @@ extern "C" { #endif -#include -#include -#include -#include - /* public APIs */ typedef struct xrope xrope; diff --git a/include/picrin/xvect.h b/include/picrin/xvect.h index 3701205e..a04d227a 100644 --- a/include/picrin/xvect.h +++ b/include/picrin/xvect.h @@ -9,11 +9,6 @@ extern "C" { #endif -#include -#include -#include -#include - typedef struct xvect { char *data; size_t size, mask, head, tail, width; diff --git a/init.c b/init.c index 06e97ca2..68a58484 100644 --- a/init.c +++ b/init.c @@ -11,16 +11,13 @@ 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 *); void pic_init_pair(pic_state *); void pic_init_port(pic_state *); void pic_init_number(pic_state *); -void pic_init_time(pic_state *); -void pic_init_system(pic_state *); -void pic_init_file(pic_state *); void pic_init_proc(pic_state *); void pic_init_symbol(pic_state *); void pic_init_vector(pic_state *); @@ -31,7 +28,6 @@ void pic_init_error(pic_state *); void pic_init_str(pic_state *); void pic_init_macro(pic_state *); void pic_init_var(pic_state *); -void pic_init_load(pic_state *); void pic_init_write(pic_state *); void pic_init_read(pic_state *); void pic_init_dict(pic_state *); @@ -119,9 +115,6 @@ pic_init_core(pic_state *pic) pic_init_pair(pic); DONE; pic_init_port(pic); DONE; pic_init_number(pic); DONE; - pic_init_time(pic); DONE; - pic_init_system(pic); DONE; - pic_init_file(pic); DONE; pic_init_proc(pic); DONE; pic_init_symbol(pic); DONE; pic_init_vector(pic); DONE; @@ -132,7 +125,6 @@ pic_init_core(pic_state *pic) pic_init_str(pic); DONE; pic_init_macro(pic); DONE; pic_init_var(pic); DONE; - pic_init_load(pic); DONE; pic_init_write(pic); DONE; pic_init_read(pic); DONE; pic_init_dict(pic); DONE; diff --git a/lib.c b/lib.c index 37cba2bd..234f3833 100644 --- a/lib.c +++ b/lib.c @@ -9,12 +9,15 @@ #include "picrin/error.h" #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) { struct pic_lib *lib; struct pic_senv *senv; + struct pic_dict *exports; if ((lib = pic_find_library(pic, name)) != NULL) { @@ -28,11 +31,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); @@ -65,93 +69,85 @@ 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; - pic_sym sym, id, tag; - xh_entry *it; + struct pic_dict *table; + pic_value val, tmp, prefix; + pic_sym *sym, *id, *tag; - 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)); + tag = pic_sym_ptr(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_ptr(val), pic_dict_ref(pic, table, pic_sym_ptr(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_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); } - 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(pic, pic_format(pic, "~s~s", prefix, pic_obj_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_ptr(val)); } - goto exit; + return; } } lib = pic_find_library(pic, spec); 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) { + 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_ptr(pic_dict_ref(pic, imports, sym))); } - - xh_destroy(&imports); } 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; @@ -160,7 +156,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; @@ -168,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)); + printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym_ptr(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_ptr(b), pic_obj_value(rename)); return; @@ -197,18 +193,18 @@ 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_sym_value(sym)); + export(pic, pic_obj_value(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_sym_value(pic->sELSE))) { + if (pic_eq_p(clause, pic_obj_value(pic->sELSE))) { return true; } if (pic_sym_p(clause)) { @@ -222,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) { @@ -259,7 +255,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])); } } @@ -339,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/load.c b/load.c index 83deb212..a6f2eb8d 100644 --- a/load.c +++ b/load.c @@ -3,11 +3,10 @@ */ #include "picrin.h" -#include "picrin/pair.h" #include "picrin/port.h" #include "picrin/error.h" -static void +void pic_load_port(pic_state *pic, struct pic_port *port) { pic_value form; @@ -35,43 +34,3 @@ pic_load_cstr(pic_state *pic, const char *src) pic_close_port(pic, port); } - -void -pic_load(pic_state *pic, const char *filename) -{ - struct pic_port *port; - xFILE *file; - - file = xfopen(filename, "r"); - if (file == NULL) { - pic_errorf(pic, "could not open file: %s", filename); - } - - port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port), PIC_TT_PORT); - port->file = file; - port->flags = PIC_PORT_IN | PIC_PORT_TEXT; - port->status = PIC_PORT_OPEN; - - pic_load_port(pic, port); - - pic_close_port(pic, port); -} - -static pic_value -pic_load_load(pic_state *pic) -{ - pic_value envid; - char *fn; - - pic_get_args(pic, "z|o", &fn, &envid); - - pic_load(pic, fn); - - return pic_none_value(); -} - -void -pic_init_load(pic_state *pic) -{ - pic_defun(pic, "load", pic_load_load); -} diff --git a/macro.c b/macro.c index eb811253..622a28d3 100644 --- a/macro.c +++ b/macro.c @@ -11,11 +11,12 @@ #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) +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); @@ -23,56 +24,42 @@ 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_UNUSED(pic); - - xh_put_int(&senv->map, 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) { - 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_ptr(pic_dict_ref(pic, senv->map, sym)); } return true; } static void -define_macro(pic_state *pic, pic_sym rename, struct pic_proc *proc, struct pic_senv *senv) +define_macro(pic_state *pic, pic_sym *rename, struct pic_proc *mac) { - struct pic_macro *mac; - - mac = (struct pic_macro *)pic_obj_alloc(pic, sizeof(struct pic_macro), PIC_TT_MACRO); - mac->senv = senv; - mac->proc = proc; - - xh_put_int(&pic->macros, rename, &mac); + pic_dict_set(pic, pic->macros, rename, pic_obj_value(mac)); } -static struct pic_macro * -find_macro(pic_state *pic, pic_sym rename) +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_macro *); + 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)) { @@ -94,15 +81,15 @@ 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_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,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"); @@ -186,20 +173,20 @@ 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 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))) { 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) { @@ -210,20 +197,20 @@ 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); } 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 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"); @@ -233,11 +220,11 @@ 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 { - 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)); @@ -252,13 +239,19 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", var); } - define_macro(pic, rename, pic_proc_ptr(val), senv); + val = pic_apply1(pic, pic_proc_ptr(val), pic_obj_value(senv)); + + if (! pic_proc_p(val)) { + pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", var); + } + + define_macro(pic, rename, pic_proc_ptr(val)); return pic_none_value(); } static pic_value -macroexpand_macro(pic_state *pic, struct pic_macro *mac, pic_value expr, struct pic_senv *senv) +macroexpand_macro(pic_state *pic, struct pic_proc *mac, pic_value expr, struct pic_senv *senv) { pic_value v, args; @@ -268,14 +261,10 @@ macroexpand_macro(pic_state *pic, struct pic_macro *mac, pic_value expr, struct puts(""); #endif - if (mac->senv == NULL) { /* legacy macro */ - args = pic_cdr(pic, expr); - } else { - args = pic_list3(pic, expr, pic_obj_value(senv), pic_obj_value(mac->senv)); - } + args = pic_list2(pic, expr, pic_obj_value(senv)); pic_try { - v = pic_apply(pic, mac->proc, args); + v = pic_apply(pic, mac, args); } pic_catch { pic_errorf(pic, "macroexpand error while application: %s", pic_errmsg(pic)); } @@ -294,11 +283,11 @@ 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; - struct pic_macro *mac; + struct pic_proc *mac; if (! pic_list_p(expr)) { pic_errorf(pic, "cannot macroexpand improper list: ~s", expr); @@ -306,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); @@ -389,11 +378,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; } @@ -415,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); @@ -424,13 +416,33 @@ pic_define_syntactic_keyword(pic_state *pic, struct pic_senv *senv, pic_sym sym, } } -void -pic_defmacro(pic_state *pic, pic_sym name, pic_sym id, pic_func_t func) +static pic_value +defmacro_call(pic_state *pic) { + struct pic_proc *self = pic_get_proc(pic); + pic_value args, tmp, proc; + + pic_get_args(pic, "oo", &args, &tmp); + + proc = pic_attr_ref(pic, pic_obj_value(self), "@@transformer"); + + return pic_apply_trampoline(pic, pic_proc_ptr(proc), pic_cdr(pic, args)); +} + +void +pic_defmacro(pic_state *pic, pic_sym *name, pic_sym *id, pic_func_t func) +{ + struct pic_proc *proc, *trans; + + trans = pic_make_proc(pic, func, pic_symbol_name(pic, name)); + pic_put_rename(pic, pic->lib->env, name, id); + proc = pic_make_proc(pic, defmacro_call, "defmacro_call"); + pic_attr_set(pic, pic_obj_value(proc), "@@transformer", pic_obj_value(trans)); + /* symbol registration */ - define_macro(pic, id, pic_make_proc(pic, func, pic_symbol_name(pic, name)), NULL); + define_macro(pic, id, proc); /* auto export! */ pic_export(pic, name); @@ -439,13 +451,13 @@ 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 -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)) { @@ -457,7 +469,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 @@ -474,19 +486,19 @@ 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); 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 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/number.c b/number.c index be819bbd..6e84dadf 100644 --- a/number.c +++ b/number.c @@ -2,10 +2,6 @@ * See Copyright Notice in picrin.h */ -#include -#include -#include - #include "picrin.h" #include "picrin/string.h" #include "picrin/cont.h" diff --git a/pair.c b/pair.c index b662534a..03621ec1 100644 --- a/pair.c +++ b/pair.c @@ -2,8 +2,6 @@ * See Copyright Notice in picrin.h */ -#include - #include "picrin.h" #include "picrin/pair.h" diff --git a/port.c b/port.c index ec61d984..5032104b 100644 --- a/port.c +++ b/port.c @@ -2,10 +2,6 @@ * See Copyright Notice in picrin.h */ -#include -#include -#include - #include "picrin.h" #include "picrin/proc.h" #include "picrin/port.h" diff --git a/proc.c b/proc.c index 2b94201b..321a362e 100644 --- a/proc.c +++ b/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/read.c b/read.c index 46a056f8..979113c5 100644 --- a/read.c +++ b/read.c @@ -2,9 +2,6 @@ * See Copyright Notice in picrin.h */ -#include -#include -#include #include "picrin.h" #include "picrin/read.h" #include "picrin/error.h" @@ -14,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); @@ -169,7 +167,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 @@ -177,7 +175,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 @@ -185,7 +183,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 @@ -193,7 +191,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 @@ -201,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); @@ -225,10 +223,11 @@ 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); + return pic_obj_value(sym); } static size_t @@ -321,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; @@ -341,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; @@ -453,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; @@ -492,7 +491,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/record.c b/record.c index 7ba4be29..2a6e85cc 100644 --- a/record.c +++ b/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); @@ -25,23 +29,18 @@ 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) { - xh_entry *e; - - e = xh_get_int(&rec->hash, slot); - if (! e) { - pic_errorf(pic, "slot named ~s is not found for record: ~s", pic_sym_value(slot), rec); + 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); } - 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_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 @@ -81,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); @@ -92,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/state.c b/state.c index 75e940f3..195f07ab 100644 --- a/state.c +++ b/state.c @@ -2,8 +2,6 @@ * See Copyright Notice in picrin.h */ -#include - #include "picrin.h" #include "picrin/gc.h" #include "picrin/read.h" @@ -12,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 *); @@ -26,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; @@ -50,16 +52,13 @@ 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_int(&pic->sym_names, sizeof(const char *)); - pic->sym_cnt = 0; - pic->uniq_sym_cnt = 0; + xh_init_str(&pic->syms, sizeof(pic_sym *)); /* 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 *)); @@ -71,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(); @@ -85,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"); @@ -123,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, "*"); @@ -138,11 +132,19 @@ 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)); - ai = pic_gc_arena_preserve(pic); R(rDEFINE, "define"); R(rLAMBDA, "lambda"); R(rIF, "if"); @@ -157,12 +159,22 @@ 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; 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 +188,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; @@ -194,14 +211,20 @@ 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; 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->syms); xh_clear(&pic->attrs); pic->features = pic_nil_value(); pic->libs = pic_nil_value(); @@ -224,18 +247,10 @@ 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 */ 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/string.c b/string.c index 63f301d8..43514b2d 100644 --- a/string.c +++ b/string.c @@ -2,8 +2,6 @@ * See Copyright Notice in picrin.h */ -#include - #include "picrin.h" #include "picrin/string.h" #include "picrin/pair.h" diff --git a/symbol.c b/symbol.c index 115582c8..f8f091bd 100644 --- a/symbol.c +++ b/symbol.c @@ -2,97 +2,73 @@ * See Copyright Notice in picrin.h */ -#include -#include -#include - #include "picrin.h" +#include "picrin/symbol.h" #include "picrin/string.h" -pic_sym -pic_intern(pic_state *pic, const char *str, size_t len) +pic_sym * +pic_make_symbol(pic_state *pic, pic_str *str) { - char *cstr; - xh_entry *e; - pic_sym id; + pic_sym *sym; - cstr = (char *)pic_malloc(pic, len + 1); - cstr[len] = '\0'; - memcpy(cstr, str, len); - - e = xh_get_str(&pic->syms, cstr); - if (e) { - return xh_val(e, pic_sym); - } - - id = pic->sym_cnt++; - xh_put_str(&pic->syms, cstr, &id); - xh_put_int(&pic->sym_names, id, &cstr); - return id; + 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; + char *cstr; + + e = xh_get_str(&pic->syms, pic_str_cstr(str)); + if (e) { + sym = xh_val(e, pic_sym *); + pic_gc_protect(pic, pic_obj_value(sym)); + return sym; + } + + cstr = pic_malloc(pic, pic_strlen(str) + 1); + strcpy(cstr, pic_str_cstr(str)); + + sym = pic_make_symbol(pic, str); + xh_put_str(&pic->syms, cstr, &sym); + return sym; +} + +pic_sym * pic_intern_cstr(pic_state *pic, const char *str) { - return pic_intern(pic, str, strlen(str)); + return pic_intern(pic, pic_make_str(pic, str, strlen(str))); } -pic_sym -pic_intern_str(pic_state *pic, pic_str *str) +pic_sym * +pic_gensym(pic_state *pic, pic_sym *base) { - return pic_intern_cstr(pic, pic_str_cstr(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; -} - -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)); + 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) { - return sym == pic_intern_cstr(pic, pic_symbol_name(pic, sym)); + 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 * -pic_symbol_name(pic_state *pic, pic_sym sym) +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 @@ -127,29 +103,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_obj_value(pic_intern(pic, str)); } void diff --git a/system.c b/system.c deleted file mode 100644 index 1b251661..00000000 --- a/system.c +++ /dev/null @@ -1,134 +0,0 @@ -/** - * See Copyright Notice in picrin.h - */ - -#include - -#include "picrin.h" -#include "picrin/string.h" -#include "picrin/pair.h" -#include "picrin/cont.h" - -static pic_value -pic_system_cmdline(pic_state *pic) -{ - pic_value v = pic_nil_value(); - int i; - - pic_get_args(pic, ""); - - for (i = 0; i < pic->argc; ++i) { - size_t ai = pic_gc_arena_preserve(pic); - - v = pic_cons(pic, pic_obj_value(pic_make_str_cstr(pic, pic->argv[i])), v); - pic_gc_arena_restore(pic, ai); - } - - return pic_reverse(pic, v); -} - -static pic_value -pic_system_exit(pic_state *pic) -{ - pic_value v; - int argc, status = EXIT_SUCCESS; - - argc = pic_get_args(pic, "|o", &v); - if (argc == 1) { - switch (pic_type(v)) { - case PIC_TT_FLOAT: - status = (int)pic_float(v); - break; - case PIC_TT_INT: - status = pic_int(v); - break; - default: - break; - } - } - - pic_close(pic); - - exit(status); -} - -static pic_value -pic_system_emergency_exit(pic_state *pic) -{ - pic_value v; - int argc, status = EXIT_FAILURE; - - argc = pic_get_args(pic, "|o", &v); - if (argc == 1) { - switch (pic_type(v)) { - case PIC_TT_FLOAT: - status = (int)pic_float(v); - break; - case PIC_TT_INT: - status = pic_int(v); - break; - default: - break; - } - } - - _Exit(status); -} - -static pic_value -pic_system_getenv(pic_state *pic) -{ - char *str, *val; - - pic_get_args(pic, "z", &str); - - val = getenv(str); - - if (val == NULL) - return pic_nil_value(); - else - return pic_obj_value(pic_make_str_cstr(pic, val)); -} - -static pic_value -pic_system_getenvs(pic_state *pic) -{ - char **envp; - pic_value data = pic_nil_value(); - size_t ai = pic_gc_arena_preserve(pic); - - pic_get_args(pic, ""); - - if (! pic->envp) { - return pic_nil_value(); - } - - for (envp = pic->envp; *envp; ++envp) { - pic_str *key, *val; - size_t i; - - for (i = 0; (*envp)[i] != '='; ++i) - ; - - key = pic_make_str(pic, *envp, i); - val = pic_make_str_cstr(pic, getenv(pic_str_cstr(key))); - - /* push */ - data = pic_acons(pic, pic_obj_value(key), pic_obj_value(val), data); - - pic_gc_arena_restore(pic, ai); - pic_gc_protect(pic, data); - } - - return data; -} - -void -pic_init_system(pic_state *pic) -{ - pic_defun(pic, "command-line", pic_system_cmdline); - pic_defun(pic, "exit", pic_system_exit); - pic_defun(pic, "emergency-exit", pic_system_emergency_exit); - pic_defun(pic, "get-environment-variable", pic_system_getenv); - pic_defun(pic, "get-environment-variables", pic_system_getenvs); -} diff --git a/time.c b/time.c deleted file mode 100644 index 83716db8..00000000 --- a/time.c +++ /dev/null @@ -1,47 +0,0 @@ -/** - * See Copyright Notice in picrin.h - */ - -#include - -#include "picrin.h" - -#define UTC_TAI_DIFF 35 - -static pic_value -pic_current_second(pic_state *pic) -{ - time_t t; - - pic_get_args(pic, ""); - - time(&t); - return pic_float_value((double)t + UTC_TAI_DIFF); -} - -static pic_value -pic_current_jiffy(pic_state *pic) -{ - clock_t c; - - pic_get_args(pic, ""); - - c = clock(); - return pic_int_value((int)c); /* The year 2038 problem :-| */ -} - -static pic_value -pic_jiffies_per_second(pic_state *pic) -{ - pic_get_args(pic, ""); - - return pic_int_value(CLOCKS_PER_SEC); -} - -void -pic_init_time(pic_state *pic) -{ - pic_defun(pic, "current-second", pic_current_second); - pic_defun(pic, "current-jiffy", pic_current_jiffy); - pic_defun(pic, "jiffies-per-second", pic_jiffies_per_second); -} diff --git a/var.c b/var.c index 84ecda61..7eb4e08a 100644 --- a/var.c +++ b/var.c @@ -5,13 +5,11 @@ #include "picrin.h" #include "picrin/pair.h" #include "picrin/proc.h" -#include "picrin/dict.h" static pic_value var_lookup(pic_state *pic, pic_value var) { - pic_value val, env; - struct pic_dict *binding; + pic_value val, env, binding; val = pic_ref(pic, pic->PICRIN_BASE, "current-dynamic-environment"); if (pic_eq_p(val, var)) { @@ -20,11 +18,13 @@ var_lookup(pic_state *pic, pic_value var) env = pic_apply0(pic, pic_proc_ptr(val)); while (! pic_nil_p(env)) { - pic_assert_type(pic, pic_car(pic, env), dict); + binding = pic_car(pic, env); - binding = pic_dict_ptr(pic_car(pic, env)); - if (pic_dict_has(pic, binding, var)) { - return pic_dict_ref(pic, binding, var); + while (! pic_nil_p(binding)) { + if (pic_eq_p(pic_caar(pic, binding), var)) { + return pic_car(pic, binding); + } + binding = pic_cdr(pic, binding); } env = pic_cdr(pic, env); } @@ -48,7 +48,7 @@ var_call(pic_state *pic) switch (n) { case 0: - return pic_car(pic, box); + return pic_cdr(pic, box); case 1: conv = pic_attr_ref(pic, pic_obj_value(self), "@@converter"); @@ -57,7 +57,7 @@ var_call(pic_state *pic) val = pic_apply1(pic, pic_proc_ptr(conv), val); } - pic_set_car(pic, box, val); + pic_set_cdr(pic, box, val); return pic_none_value(); @@ -82,7 +82,7 @@ pic_make_var(pic_state *pic, pic_value init, struct pic_proc *conv) struct pic_proc *var; var = pic_make_proc(pic, var_call, ""); - pic_attr_set(pic, pic_obj_value(var), "@@box", pic_list1(pic, init)); + pic_attr_set(pic, pic_obj_value(var), "@@box", pic_cons(pic, pic_false_value(), init)); pic_attr_set(pic, pic_obj_value(var), "@@converter", conv ? pic_obj_value(conv) : pic_false_value()); return var; diff --git a/vm.c b/vm.c index 66ed3871..0c82bdff 100644 --- a/vm.c +++ b/vm.c @@ -2,11 +2,6 @@ * See Copyright Notice in picrin.h */ -#include -#include -#include -#include - #include "picrin.h" #include "picrin/pair.h" #include "picrin/string.h" @@ -20,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)]) @@ -45,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 @@ -259,14 +255,14 @@ 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)) { - *m = pic_sym(v); + *m = pic_sym_ptr(v); } else { pic_errorf(pic, "pic_get_args: expected symbol, but got ~s", v); @@ -437,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); @@ -447,7 +443,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 @@ -461,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); @@ -469,13 +465,13 @@ 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 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); @@ -483,7 +479,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 @@ -555,6 +551,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) { @@ -693,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 }; @@ -756,34 +769,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) { - xh_entry *e; + struct pic_irep *irep = vm_get_irep(pic); + pic_sym *sym; - if ((e = xh_get_int(&pic->globals, c.u.i)) == NULL) { - pic_errorf(pic, "logic flaw; reference to uninitialized global variable: %s", pic_symbol_name(pic, c.u.i)); + 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(xh_val(e, pic_value)); + 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(); - xh_put_int(&pic->globals, c.u.i, &val); + pic_dict_set(pic, pic->globals, sym, val); NEXT; } CASE(OP_LREF) { @@ -1036,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))); diff --git a/write.c b/write.c index dde4b3a7..5fe657e2 100644 --- a/write.c +++ b/write.c @@ -2,8 +2,6 @@ * See Copyright Notice in picrin.h */ -#include - #include "picrin.h" #include "picrin/port.h" #include "picrin/pair.h" @@ -13,13 +11,14 @@ #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) +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_obj_value(tag)); } static bool @@ -177,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 @@ -267,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) { @@ -334,9 +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, " '"); - write_core(p, xh_key(it, pic_value)); - xfprintf(file, " '"); + xfprintf(file, " '%s ", pic_symbol_name(pic, xh_key(it, pic_sym *))); write_core(p, xh_val(it, pic_value)); } xfprintf(file, ")"); From 06c998e0b2eba0522e83113e31619945eef9ad1b Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 20 Jan 2015 17:38:34 +0900 Subject: [PATCH 031/177] add symbol gc --- extlib/benz/gc.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 5c5ef412..0db0c4c1 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -530,6 +530,20 @@ 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); @@ -573,14 +587,9 @@ gc_mark_phase(pic_state *pic) gc_mark_object(pic, pic->arena[j]); } - /* mark reserved uninterned symbols */ + /* mark reserved symbols */ gc_mark_global_symbols(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 *)); - } - /* global variables */ if (pic->globals) { gc_mark_object(pic, (struct pic_object *)pic->globals); @@ -709,6 +718,31 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) } } +static void +gc_sweep_symbols(pic_state *pic) +{ + xh_entry *it; + xvect xv; + size_t i; + char *cstr; + + xv_init(&xv, sizeof(xh_entry *)); + + for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { + if (! gc_obj_is_marked((struct pic_object *)xh_val(it, pic_sym *))) { + xv_push(&xv, &it); + } + } + + for (i = 0; i < xv_size(&xv); ++i) { + cstr = xh_key(*(xh_entry **)xv_get(&xv, i), char *); + + xh_del_str(&pic->syms, cstr); + + pic_free(pic, cstr); + } +} + static void gc_sweep_page(pic_state *pic, struct heap_page *page) { @@ -775,6 +809,8 @@ gc_sweep_phase(pic_state *pic) } } while (it != NULL); + gc_sweep_symbols(pic); + while (page) { gc_sweep_page(pic, page); page = page->next; From f7836402401b29a688f95fc97a6d1e555b677a27 Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Mon, 19 Jan 2015 18:03:48 +0000 Subject: [PATCH 032/177] improve error message for arith op --- extlib/benz/codegen.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index fa3125a7..87cc833d 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -558,10 +558,14 @@ analyze_quote(analyze_state *state, pic_value obj) return pic_list2(pic, pic_obj_value(pic->sQUOTE), pic_list_ref(pic, obj, 1)); } -#define ARGC_ASSERT_GE(n) do { \ - if (pic_length(pic, obj) < (n) + 1) { \ - pic_errorf(pic, "wrong number of arguments"); \ - } \ + +#define ARGC_ASSERT_GE(n, name) do { \ + if (pic_length(pic, obj) < (n) + 1) { \ + pic_errorf(pic, \ + #name ": wrong number of arguments (%d for equal to or more than %d)", \ + pic_length(pic, obj) - 1, \ + n); \ + } \ } while (0) #define FOLD_ARGS(sym) do { \ @@ -572,13 +576,14 @@ analyze_quote(analyze_state *state, pic_value obj) } \ } while (0) + static pic_value analyze_add(analyze_state *state, pic_value obj, bool tailpos) { pic_state *pic = state->pic; pic_value args, arg; - ARGC_ASSERT_GE(0); + ARGC_ASSERT_GE(0, "+"); switch (pic_length(pic, obj)) { case 1: return pic_list2(pic, pic_obj_value(pic->sQUOTE), pic_int_value(0)); @@ -597,7 +602,7 @@ analyze_sub(analyze_state *state, pic_value obj) pic_state *pic = state->pic; pic_value args, arg; - ARGC_ASSERT_GE(1); + ARGC_ASSERT_GE(1, "-"); switch (pic_length(pic, obj)) { case 2: return pic_list2(pic, pic_obj_value(pic->sMINUS), @@ -615,7 +620,7 @@ analyze_mul(analyze_state *state, pic_value obj, bool tailpos) pic_state *pic = state->pic; pic_value args, arg; - ARGC_ASSERT_GE(0); + ARGC_ASSERT_GE(0, "*"); switch (pic_length(pic, obj)) { case 1: return pic_list2(pic, pic_obj_value(pic->sQUOTE), pic_int_value(1)); @@ -634,7 +639,7 @@ analyze_div(analyze_state *state, pic_value obj) pic_state *pic = state->pic; pic_value args, arg; - ARGC_ASSERT_GE(1); + ARGC_ASSERT_GE(1, "/"); switch (pic_length(pic, obj)) { case 2: args = pic_cdr(pic, obj); From fd762b8edde1fa5279f0b0fa9a413e5c9ec64c2f Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Mon, 19 Jan 2015 18:06:37 +0000 Subject: [PATCH 033/177] improve erroro message for call-with-values --- 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 87cc833d..6bb4150a 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -696,7 +696,7 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) pic_sym *call; if (pic_length(pic, obj) != 3) { - pic_errorf(pic, "wrong number of arguments"); + pic_errorf(pic, "call-with-values: wrong number of arguments (%d for 2)", pic_length(pic, obj) - 1); } if (! tailpos) { From 794ab892c53b7a63678877e05672ea1c6dcb1ff4 Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Mon, 19 Jan 2015 18:15:31 +0000 Subject: [PATCH 034/177] show callee, expected argc and actual argc --- extlib/benz/codegen.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 6bb4150a..5b4a6f62 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -709,10 +709,11 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) return pic_list3(pic, pic_obj_value(call), prod, cnsm); } -#define ARGC_ASSERT(n) do { \ - if (pic_length(pic, obj) != (n) + 1) { \ - pic_errorf(pic, "wrong number of arguments"); \ - } \ +#define ARGC_ASSERT(n, name) do { \ + if (pic_length(pic, obj) != (n) + 1) { \ + pic_errorf(pic, #name ": wrong number of arguments (%d for %d)", \ + pic_length(pic, obj) - 1, n); \ + } \ } while (0) #define ARGC_ASSERT_WITH_FALLBACK(n) do { \ @@ -732,6 +733,7 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) 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) { @@ -771,27 +773,27 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) return analyze_quote(state, obj); } else if (sym == state->rCONS) { - ARGC_ASSERT(2); + ARGC_ASSERT(2, "cons"); return CONSTRUCT_OP2(pic->sCONS); } else if (sym == state->rCAR) { - ARGC_ASSERT(1); + ARGC_ASSERT(1, "car"); return CONSTRUCT_OP1(pic->sCAR); } else if (sym == state->rCDR) { - ARGC_ASSERT(1); + ARGC_ASSERT(1, "cdr"); return CONSTRUCT_OP1(pic->sCDR); } else if (sym == state->rNILP) { - ARGC_ASSERT(1); + ARGC_ASSERT(1, "nil?"); return CONSTRUCT_OP1(pic->sNILP); } else if (sym == state->rSYMBOLP) { - ARGC_ASSERT(1); + ARGC_ASSERT(1, "symbol?"); return CONSTRUCT_OP1(pic->sSYMBOLP); } else if (sym == state->rPAIRP) { - ARGC_ASSERT(1); + ARGC_ASSERT(1, "pair?"); return CONSTRUCT_OP1(pic->sPAIRP); } else if (sym == state->rADD) { @@ -827,7 +829,7 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) return CONSTRUCT_OP2(pic->sGE); } else if (sym == state->rNOT) { - ARGC_ASSERT(1); + ARGC_ASSERT(1, "not"); return CONSTRUCT_OP1(pic->sNOT); } else if (sym == state->rVALUES) { From 1ff8672a11f8031868b5c0e40bbce78a9bc55d5b Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 21 Jan 2015 21:59:50 +0900 Subject: [PATCH 035/177] add PIC_SYMS_SIZE constant --- extlib/benz/codegen.c | 4 ++-- extlib/benz/include/picrin/config.h | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index fa3125a7..51d94e6a 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -1005,9 +1005,9 @@ 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_SYMS_SIZE, sizeof(pic_sym *)); cxt->slen = 0; - cxt->scapa = PIC_POOL_SIZE; + cxt->scapa = PIC_SYMS_SIZE; state->cxt = cxt; diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index 889e268b..7a24f77e 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -26,6 +26,8 @@ /* #define PIC_POOL_SIZE 8 */ +/* #define PIC_SYMS_SIZE 32 */ + /* #define PIC_ISEQ_SIZE 1024 */ /** enable all debug flags */ @@ -85,6 +87,10 @@ # define PIC_POOL_SIZE 8 #endif +#ifndef PIC_SYMS_SIZE +# define PIC_SYMS_SIZE 32 +#endif + #ifndef PIC_ISEQ_SIZE # define PIC_ISEQ_SIZE 1024 #endif From 8c67ad863b327508004357fa08b66b1787d7362e Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 16:53:11 +0900 Subject: [PATCH 036/177] stop using trie tree-based reader table --- extlib/benz/gc.c | 18 -- extlib/benz/include/picrin/read.h | 23 +- extlib/benz/read.c | 355 +++++++++++------------------- extlib/benz/state.c | 2 - 4 files changed, 132 insertions(+), 266 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 0db0c4c1..39c94351 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -510,21 +510,6 @@ gc_mark(pic_state *pic, pic_value v) gc_mark_object(pic, obj); } -static void -gc_mark_trie(pic_state *pic, struct pic_trie *trie) -{ - size_t i; - - for (i = 0; i < sizeof trie->table / sizeof(struct pic_trie *); ++i) { - if (trie->table[i] != NULL) { - gc_mark_trie(pic, trie->table[i]); - } - } - if (trie->proc != NULL) { - gc_mark_object(pic, (struct pic_object *)trie->proc); - } -} - #define M(x) gc_mark_object(pic, (struct pic_object *)pic->x) static void @@ -606,9 +591,6 @@ gc_mark_phase(pic_state *pic) /* features */ gc_mark(pic, pic->features); - /* readers */ - gc_mark_trie(pic, pic->reader->trie); - /* library table */ gc_mark(pic, pic->libs); diff --git a/extlib/benz/include/picrin/read.h b/extlib/benz/include/picrin/read.h index 18d46ff7..7a3d4f55 100644 --- a/extlib/benz/include/picrin/read.h +++ b/extlib/benz/include/picrin/read.h @@ -9,29 +9,20 @@ extern "C" { #endif -enum pic_typecase { - PIC_CASE_DEFAULT, - PIC_CASE_FOLD, -}; - -struct pic_trie { - struct pic_trie *table[256]; - struct pic_proc *proc; -}; +typedef pic_value (*pic_reader_t)(pic_state *, struct pic_port *port, int c); struct pic_reader { - short typecase; + enum pic_typecase { + PIC_CASE_DEFAULT, + PIC_CASE_FOLD, + } typecase; xhash labels; - struct pic_trie *trie; + pic_reader_t table[256]; + pic_reader_t dispatch[256]; }; void pic_init_reader(pic_state *); -void pic_define_reader(pic_state *, const char *, pic_func_t); - -struct pic_trie *pic_make_trie(pic_state *); -void pic_trie_delete(pic_state *, struct pic_trie *); - #if defined(__cplusplus) } #endif diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 979113c5..07b87b2b 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -80,12 +80,9 @@ strcaseeq(const char *s1, const char *s2) } static pic_value -read_comment(pic_state *pic, struct pic_port *port, const char *str) +read_comment(pic_state *pic, struct pic_port *port, int c) { - int c; - PIC_UNUSED(pic); - PIC_UNUSED(str); do { c = next(port); @@ -95,13 +92,13 @@ read_comment(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_block_comment(pic_state *pic, struct pic_port *port, const char *str) +read_block_comment(pic_state *pic, struct pic_port *port, int c) { int x, y; int i = 1; PIC_UNUSED(pic); - PIC_UNUSED(str); + PIC_UNUSED(c); y = next(port); @@ -120,9 +117,9 @@ read_block_comment(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_datum_comment(pic_state *pic, struct pic_port *port, const char *str) +read_datum_comment(pic_state *pic, struct pic_port *port, int c) { - PIC_UNUSED(str); + PIC_UNUSED(c); read(pic, port, next(port)); @@ -130,7 +127,7 @@ read_datum_comment(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_directive(pic_state *pic, struct pic_port *port, const char *str) +read_directive(pic_state *pic, struct pic_port *port, int c) { switch (peek(port)) { case 'n': @@ -147,15 +144,15 @@ read_directive(pic_state *pic, struct pic_port *port, const char *str) break; } - return read_comment(pic, port, str); + return read_comment(pic, port, c); } static pic_value -read_eval(pic_state *pic, struct pic_port *port, const char *str) +read_eval(pic_state *pic, struct pic_port *port, int c) { pic_value form; - PIC_UNUSED(str); + PIC_UNUSED(c); form = read(pic, port, next(port)); @@ -163,55 +160,46 @@ read_eval(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_quote(pic_state *pic, struct pic_port *port, const char *str) +read_quote(pic_state *pic, struct pic_port *port, int c) { - PIC_UNUSED(str); + PIC_UNUSED(c); return pic_list2(pic, pic_obj_value(pic->sQUOTE), read(pic, port, next(port))); } static pic_value -read_quasiquote(pic_state *pic, struct pic_port *port, const char *str) +read_quasiquote(pic_state *pic, struct pic_port *port, int c) { - PIC_UNUSED(str); + PIC_UNUSED(c); return pic_list2(pic, pic_obj_value(pic->sQUASIQUOTE), read(pic, port, next(port))); } static pic_value -read_unquote(pic_state *pic, struct pic_port *port, const char *str) +read_unquote(pic_state *pic, struct pic_port *port, int c) { - PIC_UNUSED(str); + pic_sym *tag = pic->sUNQUOTE; - return pic_list2(pic, pic_obj_value(pic->sUNQUOTE), read(pic, port, next(port))); + PIC_UNUSED(c); + + if (peek(port) == '@') { + tag = pic->sUNQUOTE_SPLICING; + next(port); + } + return pic_list2(pic, pic_obj_value(tag), read(pic, port, next(port))); } static pic_value -read_unquote_splicing(pic_state *pic, struct pic_port *port, const char *str) +read_symbol(pic_state *pic, struct pic_port *port, int c) { - PIC_UNUSED(str); - - return pic_list2(pic, pic_obj_value(pic->sUNQUOTE_SPLICING), read(pic, port, next(port))); -} - -static pic_value -read_symbol(pic_state *pic, struct pic_port *port, const char *str) -{ - size_t len, i; + size_t len; char *buf; pic_sym *sym; - int c; - len = strlen(str); - buf = pic_calloc(pic, 1, len + 1); - - for (i = 0; i < len; ++i) { - if (pic->reader->typecase == PIC_CASE_FOLD) { - buf[i] = (char)tolower(str[i]); - } else { - buf[i] = str[i]; - } - } + len = 1; + buf = pic_alloc(pic, len + 1); + buf[0] = c; + buf[1] = 0; while (! isdelim(peek(port))) { c = next(port); @@ -220,10 +208,10 @@ read_symbol(pic_state *pic, struct pic_port *port, const char *str) } len += 1; buf = pic_realloc(pic, buf, len + 1); - buf[len - 1] = (char)c; + buf[len - 1] = c; + buf[len] = 0; } - buf[len] = 0; sym = pic_intern_cstr(pic, buf); pic_free(pic, buf); @@ -295,9 +283,9 @@ read_unsigned(pic_state *pic, struct pic_port *port, int c) } static pic_value -read_number(pic_state *pic, struct pic_port *port, const char *str) +read_number(pic_state *pic, struct pic_port *port, int c) { - return read_unsigned(pic, port, str[0]); + return read_unsigned(pic, port, c); } static pic_value @@ -311,7 +299,7 @@ negate(pic_value n) } static pic_value -read_minus(pic_state *pic, struct pic_port *port, const char *str) +read_minus(pic_state *pic, struct pic_port *port, int c) { pic_value sym; @@ -319,7 +307,7 @@ read_minus(pic_state *pic, struct pic_port *port, const char *str) return negate(read_unsigned(pic, port, next(port))); } else { - sym = read_symbol(pic, port, str); + sym = read_symbol(pic, port, c); if (strcaseeq(pic_symbol_name(pic, pic_sym_ptr(sym)), "-inf.0")) { return pic_float_value(-INFINITY); } @@ -331,7 +319,7 @@ read_minus(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_plus(pic_state *pic, struct pic_port *port, const char *str) +read_plus(pic_state *pic, struct pic_port *port, int c) { pic_value sym; @@ -339,7 +327,7 @@ read_plus(pic_state *pic, struct pic_port *port, const char *str) return read_unsigned(pic, port, next(port)); } else { - sym = read_symbol(pic, port, str); + sym = read_symbol(pic, port, c); if (strcaseeq(pic_symbol_name(pic, pic_sym_ptr(sym)), "+inf.0")) { return pic_float_value(INFINITY); } @@ -351,32 +339,40 @@ read_plus(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_true(pic_state *pic, struct pic_port *port, const char *str) +read_true(pic_state *pic, struct pic_port *port, int c) { PIC_UNUSED(pic); - PIC_UNUSED(port); - PIC_UNUSED(str); + + if ((c = peek(port)) == 'r') { + if (! expect(port, "rue")) { + read_error(pic, "unexpected character while reading #true"); + } + } else if (! isdelim(c)) { + read_error(pic, "non-delimiter character given after #t"); + } return pic_true_value(); } static pic_value -read_false(pic_state *pic, struct pic_port *port, const char *str) +read_false(pic_state *pic, struct pic_port *port, int c) { PIC_UNUSED(pic); - PIC_UNUSED(port); - PIC_UNUSED(str); + + if ((c = peek(port)) == 'a') { + if (! expect(port, "alse")) { + read_error(pic, "unexpected character while reading #false"); + } + } else if (! isdelim(c)) { + read_error(pic, "non-delimiter character given after #f"); + } return pic_false_value(); } static pic_value -read_char(pic_state *pic, struct pic_port *port, const char *str) +read_char(pic_state *pic, struct pic_port *port, int c) { - int c; - - PIC_UNUSED(str); - c = next(port); if (! isdelim(peek(port))) { @@ -410,15 +406,12 @@ read_char(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_string(pic_state *pic, struct pic_port *port, const char *name) +read_string(pic_state *pic, struct pic_port *port, int c) { - int c; char *buf; size_t size, cnt; pic_str *str; - PIC_UNUSED(name); - size = 256; buf = pic_alloc(pic, size); cnt = 0; @@ -448,7 +441,7 @@ read_string(pic_state *pic, struct pic_port *port, const char *name) } static pic_value -read_pipe(pic_state *pic, struct pic_port *port, const char *str) +read_pipe(pic_state *pic, struct pic_port *port, int c) { char *buf; size_t size, cnt; @@ -456,9 +449,6 @@ read_pipe(pic_state *pic, struct pic_port *port, const char *str) /* Currently supports only ascii chars */ char HEX_BUF[3]; size_t i = 0; - int c; - - PIC_UNUSED(str); size = 256; buf = pic_alloc(pic, size); @@ -495,16 +485,14 @@ read_pipe(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_blob(pic_state *pic, struct pic_port *port, const char *str) +read_blob(pic_state *pic, struct pic_port *port, int c) { - int nbits, n, c; + int nbits, n; size_t len, i; char buf[256]; unsigned char *dat; pic_blob *blob; - PIC_UNUSED(str); - nbits = 0; while (isdigit(c = next(port))) { @@ -544,11 +532,11 @@ read_blob(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_pair(pic_state *pic, struct pic_port *port, const char *str) +read_pair(pic_state *pic, struct pic_port *port, int c) { - const int tCLOSE = (str[0] == '(') ? ')' : ']'; + const int tOPEN = c; + const int tCLOSE = (c == '(') ? ')' : ']'; pic_value car, cdr; - int c; retry: @@ -576,17 +564,17 @@ read_pair(pic_state *pic, struct pic_port *port, const char *str) goto retry; } - cdr = read_pair(pic, port, str); + cdr = read_pair(pic, port, tOPEN); return pic_cons(pic, car, cdr); } } static pic_value -read_vector(pic_state *pic, struct pic_port *port, const char *str) +read_vector(pic_state *pic, struct pic_port *port, int c) { pic_value list; - list = read(pic, port, str[1]); + list = read(pic, port, c); return pic_obj_value(pic_make_vec_from_list(pic, list)); } @@ -664,14 +652,13 @@ read_label_ref(pic_state *pic, struct pic_port *port, int i) } static pic_value -read_label(pic_state *pic, struct pic_port *port, const char *str) +read_label(pic_state *pic, struct pic_port *port, int c) { - int i, c; + int i; i = 0; - c = str[1]; /* initial index letter */ do { - i = i * 10 + c; + i = i * 10 + c - '0'; } while (isdigit(c = next(port))); if (c == '=') { @@ -684,54 +671,44 @@ read_label(pic_state *pic, struct pic_port *port, const char *str) } static pic_value -read_unmatch(pic_state *pic, struct pic_port *port, const char *str) +read_unmatch(pic_state *pic, struct pic_port *port, int c) { PIC_UNUSED(port); - PIC_UNUSED(str); + PIC_UNUSED(c); read_error(pic, "unmatched parenthesis"); } +static pic_value +read_dispatch(pic_state *pic, struct pic_port *port, int c) +{ + c = next(port); + + if (c == EOF) { + read_error(pic, "unexpected EOF"); + } + + if (pic->reader->dispatch[c] == NULL) { + read_error(pic, "invalid character at the seeker head"); + } + + return pic->reader->dispatch[c](pic, port, c); +} + static pic_value read_nullable(pic_state *pic, struct pic_port *port, int c) { - struct pic_trie *trie = pic->reader->trie; - char buf[128]; - size_t i = 0; - pic_str *str; - c = skip(port, c); if (c == EOF) { read_error(pic, "unexpected EOF"); } - if (trie->table[c] == NULL) { + if (pic->reader->table[c] == NULL) { read_error(pic, "invalid character at the seeker head"); } - buf[i++] = (char)c; - - while (i < sizeof buf) { - trie = trie->table[c]; - - if ((c = peek(port)) == EOF) { - break; - } - if (trie->table[c] == NULL) { - break; - } - buf[i++] = (char)next(port); - } - if (i == sizeof buf) { - read_error(pic, "too long dispatch string"); - } - - if (trie->proc == NULL) { - read_error(pic, "no reader registered for current string"); - } - str = pic_make_str(pic, buf, i); - return pic_apply2(pic, trie->proc, pic_obj_value(port), pic_obj_value(str)); + return pic->reader->table[c](pic, port, c); } static pic_value @@ -750,136 +727,54 @@ read(pic_state *pic, struct pic_port *port, int c) return val; } -struct pic_trie * -pic_make_trie(pic_state *pic) -{ - struct pic_trie *trie; - - trie = pic_alloc(pic, sizeof(struct pic_trie)); - trie->proc = NULL; - memset(trie->table, 0, sizeof trie->table); - - return trie; -} - -void -pic_trie_delete(pic_state *pic, struct pic_trie *trie) -{ - size_t i; - - for (i = 0; i < sizeof trie->table / sizeof(struct pic_trie *); ++i) { - if (trie->table[i] != NULL) { - pic_trie_delete(pic, trie->table[i]); - } - } - - pic_free(pic, trie); -} - -void -pic_define_reader(pic_state *pic, const char *str, pic_func_t reader) -{ - struct pic_trie *trie = pic->reader->trie; - int c; - - while ((c = *str++)) { - if (trie->table[c] == NULL) { - trie->table[c] = pic_make_trie(pic); - } - trie = trie->table[c]; - } - trie->proc = pic_make_proc(pic, reader, "reader"); -} - -#define DEFINE_READER(name) \ - static pic_value \ - pic_##name(pic_state *pic) \ - { \ - struct pic_port *port; \ - const char *str; \ - \ - pic_get_args(pic, "pz", &port, &str); \ - \ - return name(pic, port, str); \ - } - -DEFINE_READER(read_unmatch) -DEFINE_READER(read_comment) -DEFINE_READER(read_quote) -DEFINE_READER(read_quasiquote) -DEFINE_READER(read_unquote) -DEFINE_READER(read_unquote_splicing) -DEFINE_READER(read_string) -DEFINE_READER(read_pipe) -DEFINE_READER(read_plus) -DEFINE_READER(read_minus) -DEFINE_READER(read_pair) -DEFINE_READER(read_directive) -DEFINE_READER(read_block_comment) -DEFINE_READER(read_datum_comment) -DEFINE_READER(read_true) -DEFINE_READER(read_false) -DEFINE_READER(read_char) -DEFINE_READER(read_vector) -DEFINE_READER(read_blob) -DEFINE_READER(read_eval) -DEFINE_READER(read_symbol) -DEFINE_READER(read_number) -DEFINE_READER(read_label) - void pic_init_reader(pic_state *pic) { - static const char INIT[] = "!$%&*./:<=>?@^_~"; - char buf[3] = { 0 }; - size_t i; + int c; - pic_define_reader(pic, ")", pic_read_unmatch); - pic_define_reader(pic, ";", pic_read_comment); - pic_define_reader(pic, "'", pic_read_quote); - pic_define_reader(pic, "`", pic_read_quasiquote); - pic_define_reader(pic, ",", pic_read_unquote); - pic_define_reader(pic, ",@", pic_read_unquote_splicing); - pic_define_reader(pic, "\"", pic_read_string); - pic_define_reader(pic, "|", pic_read_pipe); - pic_define_reader(pic, "+", pic_read_plus); - pic_define_reader(pic, "-", pic_read_minus); - pic_define_reader(pic, "(", pic_read_pair); - pic_define_reader(pic, "[", pic_read_pair); + pic->reader->table[0] = NULL; - pic_define_reader(pic, "#!", pic_read_directive); - pic_define_reader(pic, "#|", pic_read_block_comment); - pic_define_reader(pic, "#;", pic_read_datum_comment); - pic_define_reader(pic, "#t", pic_read_true); - pic_define_reader(pic, "#true", pic_read_true); - pic_define_reader(pic, "#f", pic_read_false); - pic_define_reader(pic, "#false", pic_read_false); - pic_define_reader(pic, "#\\", pic_read_char); - pic_define_reader(pic, "#(", pic_read_vector); - pic_define_reader(pic, "#u", pic_read_blob); - pic_define_reader(pic, "#.", pic_read_eval); + /* default reader */ + for (c = 1; c < 256; ++c) { + pic->reader->table[c] = read_symbol; + } + + pic->reader->table[')'] = read_unmatch; + pic->reader->table[';'] = read_comment; + pic->reader->table['\''] = read_quote; + pic->reader->table['`'] = read_quasiquote; + pic->reader->table[','] = read_unquote; + pic->reader->table['"'] = read_string; + pic->reader->table['|'] = read_pipe; + pic->reader->table['+'] = read_plus; + pic->reader->table['-'] = read_minus; + pic->reader->table['('] = read_pair; + pic->reader->table['['] = read_pair; + pic->reader->table['#'] = read_dispatch; /* read number */ - for (buf[0] = '0'; buf[0] <= '9'; ++buf[0]) { - pic_define_reader(pic, buf, pic_read_number); + for (c = '0'; c <= '9'; ++c) { + pic->reader->table[c] = read_number; } - /* read symbol */ - for (buf[0] = 'a'; buf[0] <= 'z'; ++buf[0]) { - pic_define_reader(pic, buf, pic_read_symbol); - } - for (buf[0] = 'A'; buf[0] <= 'Z'; ++buf[0]) { - pic_define_reader(pic, buf, pic_read_symbol); - } - for (i = 0; i < sizeof INIT; ++i) { - buf[0] = INIT[i]; - pic_define_reader(pic, buf, pic_read_symbol); + /* default dispatch reader */ + for (c = 0; c < 256; ++c) { + pic->reader->dispatch[c] = NULL; } - /* read label */ - buf[0] = '#'; - for (buf[1] = '0'; buf[1] <= '9'; ++buf[1]) { - pic_define_reader(pic, buf, pic_read_label); + pic->reader->dispatch['!'] = read_directive; + pic->reader->dispatch['|'] = read_block_comment; + pic->reader->dispatch[';'] = read_datum_comment; + pic->reader->dispatch['t'] = read_true; + pic->reader->dispatch['f'] = read_false; + pic->reader->dispatch['\\'] = read_char; + pic->reader->dispatch['('] = read_vector; + pic->reader->dispatch['u'] = read_blob; + pic->reader->dispatch['.'] = read_eval; + + /* read labels */ + for (c = '0'; c <= '9'; ++c) { + pic->reader->dispatch[c] = read_label; } } diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 195f07ab..51f8189e 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -172,7 +172,6 @@ pic_open(int argc, char *argv[], char **envp) /* 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 */ @@ -242,7 +241,6 @@ pic_close(pic_state *pic) /* free reader struct */ xh_destroy(&pic->reader->labels); - pic_trie_delete(pic, pic->reader->trie); free(pic->reader); /* free global stacks */ From 42cc5042f31440a81530cee9d08fa480f1366b46 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 17:08:41 +0900 Subject: [PATCH 037/177] use pic_alloc/pic_free in initializing struct pic_heap --- extlib/benz/gc.c | 8 ++++---- extlib/benz/include/picrin/gc.h | 4 ++-- extlib/benz/state.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 39c94351..2fc69b74 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -57,24 +57,24 @@ heap_init(struct pic_heap *heap) } struct pic_heap * -pic_heap_open() +pic_heap_open(pic_state *pic) { struct pic_heap *heap; - heap = (struct pic_heap *)calloc(1, sizeof(struct pic_heap)); + heap = pic_calloc(pic, 1, sizeof(struct pic_heap)); heap_init(heap); return heap; } void -pic_heap_close(struct pic_heap *heap) +pic_heap_close(pic_state *pic, struct pic_heap *heap) { struct heap_page *page; while (heap->pages) { page = heap->pages; heap->pages = heap->pages->next; - free(page); + pic_free(pic, page); } } diff --git a/extlib/benz/include/picrin/gc.h b/extlib/benz/include/picrin/gc.h index 9f165d80..c7ed0426 100644 --- a/extlib/benz/include/picrin/gc.h +++ b/extlib/benz/include/picrin/gc.h @@ -14,8 +14,8 @@ extern "C" { struct pic_heap; -struct pic_heap *pic_heap_open(); -void pic_heap_close(struct pic_heap *); +struct pic_heap *pic_heap_open(pic_state *); +void pic_heap_close(pic_state *, struct pic_heap *); #if defined(__cplusplus) } diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 51f8189e..cc2042f6 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -49,7 +49,7 @@ pic_open(int argc, char *argv[], char **envp) pic->xpend = pic->xpbase + PIC_RESCUE_SIZE; /* memory heap */ - pic->heap = pic_heap_open(); + pic->heap = pic_heap_open(pic); /* symbol table */ xh_init_str(&pic->syms, sizeof(pic_sym *)); @@ -232,7 +232,7 @@ pic_close(pic_state *pic) pic_gc_run(pic); /* free heaps */ - pic_heap_close(pic->heap); + pic_heap_close(pic, pic->heap); /* free runtime context */ free(pic->stbase); From 3d1098967c220407cea89edb004abd557c66c3e3 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 17:18:38 +0900 Subject: [PATCH 038/177] use pic_alloc/pic_free in initializing struct pic_reader --- extlib/benz/include/picrin/read.h | 3 +- extlib/benz/read.c | 89 ++++++++++++++++++++----------- extlib/benz/state.c | 14 ++--- 3 files changed, 63 insertions(+), 43 deletions(-) diff --git a/extlib/benz/include/picrin/read.h b/extlib/benz/include/picrin/read.h index 7a3d4f55..705b4589 100644 --- a/extlib/benz/include/picrin/read.h +++ b/extlib/benz/include/picrin/read.h @@ -21,7 +21,8 @@ struct pic_reader { pic_reader_t dispatch[256]; }; -void pic_init_reader(pic_state *); +struct pic_reader *pic_reader_open(pic_state *); +void pic_reader_close(pic_state *, struct pic_reader *); #if defined(__cplusplus) } diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 07b87b2b..5644e739 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -727,57 +727,82 @@ read(pic_state *pic, struct pic_port *port, int c) return val; } -void -pic_init_reader(pic_state *pic) +static void +reader_table_init(struct pic_reader *reader) { int c; - pic->reader->table[0] = NULL; + reader->table[0] = NULL; /* default reader */ for (c = 1; c < 256; ++c) { - pic->reader->table[c] = read_symbol; + reader->table[c] = read_symbol; } - pic->reader->table[')'] = read_unmatch; - pic->reader->table[';'] = read_comment; - pic->reader->table['\''] = read_quote; - pic->reader->table['`'] = read_quasiquote; - pic->reader->table[','] = read_unquote; - pic->reader->table['"'] = read_string; - pic->reader->table['|'] = read_pipe; - pic->reader->table['+'] = read_plus; - pic->reader->table['-'] = read_minus; - pic->reader->table['('] = read_pair; - pic->reader->table['['] = read_pair; - pic->reader->table['#'] = read_dispatch; + reader->table[')'] = read_unmatch; + reader->table[';'] = read_comment; + reader->table['\''] = read_quote; + reader->table['`'] = read_quasiquote; + reader->table[','] = read_unquote; + reader->table['"'] = read_string; + reader->table['|'] = read_pipe; + reader->table['+'] = read_plus; + reader->table['-'] = read_minus; + reader->table['('] = read_pair; + reader->table['['] = read_pair; + reader->table['#'] = read_dispatch; /* read number */ for (c = '0'; c <= '9'; ++c) { - pic->reader->table[c] = read_number; + reader->table[c] = read_number; } - /* default dispatch reader */ - for (c = 0; c < 256; ++c) { - pic->reader->dispatch[c] = NULL; - } - - pic->reader->dispatch['!'] = read_directive; - pic->reader->dispatch['|'] = read_block_comment; - pic->reader->dispatch[';'] = read_datum_comment; - pic->reader->dispatch['t'] = read_true; - pic->reader->dispatch['f'] = read_false; - pic->reader->dispatch['\\'] = read_char; - pic->reader->dispatch['('] = read_vector; - pic->reader->dispatch['u'] = read_blob; - pic->reader->dispatch['.'] = read_eval; + reader->dispatch['!'] = read_directive; + reader->dispatch['|'] = read_block_comment; + reader->dispatch[';'] = read_datum_comment; + reader->dispatch['t'] = read_true; + reader->dispatch['f'] = read_false; + reader->dispatch['\\'] = read_char; + reader->dispatch['('] = read_vector; + reader->dispatch['u'] = read_blob; + reader->dispatch['.'] = read_eval; /* read labels */ for (c = '0'; c <= '9'; ++c) { - pic->reader->dispatch[c] = read_label; + reader->dispatch[c] = read_label; } } +struct pic_reader * +pic_reader_open(pic_state *pic) +{ + struct pic_reader *reader; + int c; + + reader = pic_alloc(pic, sizeof(struct pic_reader)); + reader->typecase = PIC_CASE_DEFAULT; + xh_init_int(&reader->labels, sizeof(pic_value)); + + for (c = 0; c < 256; ++c) { + reader->table[c] = NULL; + } + + for (c = 0; c < 256; ++c) { + reader->dispatch[c] = NULL; + } + + reader_table_init(reader); + + return reader; +} + +void +pic_reader_close(pic_state *pic, struct pic_reader *reader) +{ + xh_destroy(&reader->labels); + pic_free(pic, reader); +} + pic_value pic_read(pic_state *pic, struct pic_port *port) { diff --git a/extlib/benz/state.c b/extlib/benz/state.c index cc2042f6..c17c841c 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -170,12 +170,7 @@ pic_open(int argc, char *argv[], char **envp) pic->wind->in = pic->wind->out = NULL; /* reader */ - pic->reader = malloc(sizeof(struct pic_reader)); - pic->reader->typecase = PIC_CASE_DEFAULT; - xh_init_int(&pic->reader->labels, sizeof(pic_value)); - - /* init readers */ - pic_init_reader(pic); + pic->reader = pic_reader_open(pic); /* standard libraries */ pic->PICRIN_BASE = pic_open_library(pic, pic_read_cstr(pic, "(picrin base)")); @@ -234,15 +229,14 @@ pic_close(pic_state *pic) /* free heaps */ pic_heap_close(pic, pic->heap); + /* free reader struct */ + pic_reader_close(pic, pic->reader); + /* free runtime context */ free(pic->stbase); free(pic->cibase); free(pic->xpbase); - /* free reader struct */ - xh_destroy(&pic->reader->labels); - free(pic->reader); - /* free global stacks */ xh_destroy(&pic->syms); xh_destroy(&pic->attrs); From 14175138053775c5434584046150ec0bb2e84643 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 17:34:23 +0900 Subject: [PATCH 039/177] remove trailing comma --- extlib/benz/include/picrin/value.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index a6db5b98..b5dc84f5 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -111,7 +111,7 @@ enum pic_tt { PIC_TT_IREP, PIC_TT_DATA, PIC_TT_DICT, - PIC_TT_RECORD, + PIC_TT_RECORD }; #define PIC_OBJECT_HEADER \ From ec87adb90bf6599dd2dd9d376baf17b4bb2ed21e Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Fri, 23 Jan 2015 07:46:05 +0000 Subject: [PATCH 040/177] add test against #250 --- t/issue/250.scm | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 t/issue/250.scm diff --git a/t/issue/250.scm b/t/issue/250.scm new file mode 100644 index 00000000..38c1fe72 --- /dev/null +++ b/t/issue/250.scm @@ -0,0 +1,5 @@ +(import (scheme base) + (scheme file)) + +(with-output-to-file "test.txt" + (write "TEST")) From 6ee0fd2852dc11a3f18b99d3fc9ea2a83bce9057 Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Sun, 25 Jan 2015 06:37:09 +0000 Subject: [PATCH 041/177] change error message according to discussion --- 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 5b4a6f62..8d5a227d 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -562,7 +562,7 @@ analyze_quote(analyze_state *state, pic_value obj) #define ARGC_ASSERT_GE(n, name) do { \ if (pic_length(pic, obj) < (n) + 1) { \ pic_errorf(pic, \ - #name ": wrong number of arguments (%d for equal to or more than %d)", \ + #name ": wrong number of arguments (%d for at least %d)", \ pic_length(pic, obj) - 1, \ n); \ } \ From 1b637d17630c934949979950c6c9f96d1e4622d0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 18:06:10 +0900 Subject: [PATCH 042/177] refactor pic_deflibrary macro. don't declare variables in for statements --- contrib/03.callcc/callcc.c | 6 ++++-- extlib/benz/include/picrin.h | 13 +++++++------ extlib/benz/state.c | 1 + src/main.c | 6 +++--- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index eb519331..fef68f77 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -287,6 +287,8 @@ pic_callcc_callcc(pic_state *pic) void pic_init_callcc(pic_state *pic) { - pic_redefun(pic, pic->PICRIN_BASE, "call-with-current-continuation", pic_callcc_callcc); - pic_redefun(pic, pic->PICRIN_BASE, "call/cc", pic_callcc_callcc); + pic_deflibrary (pic, "(scheme base)") { + pic_redefun(pic, pic->PICRIN_BASE, "call-with-current-continuation", pic_callcc_callcc); + pic_redefun(pic, pic->PICRIN_BASE, "call/cc", pic_callcc_callcc); + } } diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 0c950425..d7124e39 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -87,7 +87,7 @@ typedef struct { pic_code *ip; - struct pic_lib *lib; + struct pic_lib *lib, *prev_lib; pic_sym *sDEFINE, *sLAMBDA, *sIF, *sBEGIN, *sQUOTE, *sSETBANG; pic_sym *sQUASIQUOTE, *sUNQUOTE, *sUNQUOTE_SPLICING; @@ -208,11 +208,12 @@ struct pic_lib *pic_open_library(pic_state *, pic_value); struct pic_lib *pic_find_library(pic_state *, pic_value); #define pic_deflibrary(pic, spec) \ - pic_deflibrary_helper_(pic, PIC_GENSYM(i), PIC_GENSYM(prev_lib), spec) -#define pic_deflibrary_helper_(pic, i, prev_lib, spec) \ - for (int i = 0; ! i; ) \ - for (struct pic_lib *prev_lib; ! i; ) \ - for ((prev_lib = pic->lib), pic_open_library(pic, pic_read_cstr(pic, spec)), pic_in_library(pic, pic_read_cstr(pic, spec)); ! i++; pic->lib = prev_lib) + for (((assert(pic->prev_lib == NULL)), \ + (pic->prev_lib = pic->lib), \ + (pic->lib = pic_open_library(pic, pic_read_cstr(pic, (spec))))); \ + pic->prev_lib != NULL; \ + ((pic->lib = pic->prev_lib), \ + (pic->prev_lib = NULL))) void pic_import(pic_state *, pic_value); void pic_import_library(pic_state *, struct pic_lib *); diff --git a/extlib/benz/state.c b/extlib/benz/state.c index c17c841c..18b8e438 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -176,6 +176,7 @@ pic_open(int argc, char *argv[], char **envp) pic->PICRIN_BASE = pic_open_library(pic, pic_read_cstr(pic, "(picrin base)")); pic->PICRIN_USER = pic_open_library(pic, pic_read_cstr(pic, "(picrin user)")); pic->lib = pic->PICRIN_USER; + pic->prev_lib = NULL; /* standard I/O */ pic->xSTDIN = pic_make_standard_port(pic, xstdin, PIC_PORT_IN); diff --git a/src/main.c b/src/main.c index 7d4f6fd1..03431ac4 100644 --- a/src/main.c +++ b/src/main.c @@ -42,10 +42,10 @@ pic_init_picrin(pic_state *pic) pic_deflibrary (pic, "(scheme base)") { pic_defun(pic, "features", pic_features); - - pic_init_contrib(pic); - pic_load_piclib(pic); } + + pic_init_contrib(pic); + pic_load_piclib(pic); } int From e3833eb039fdb96e6187d32705bb46c6c07c81d8 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 19:28:31 +0900 Subject: [PATCH 043/177] change pic_for_each interface --- extlib/benz/blob.c | 4 +-- extlib/benz/codegen.c | 42 +++++++++++++++---------------- extlib/benz/cont.c | 4 +-- extlib/benz/dict.c | 4 +-- extlib/benz/include/picrin/pair.h | 9 +++---- extlib/benz/lib.c | 16 ++++++------ extlib/benz/macro.c | 4 +-- extlib/benz/pair.c | 8 +++--- extlib/benz/string.c | 4 +-- extlib/benz/vector.c | 4 +-- extlib/benz/vm.c | 4 +-- src/main.c | 4 +-- 12 files changed, 52 insertions(+), 55 deletions(-) diff --git a/extlib/benz/blob.c b/extlib/benz/blob.c index cd5be767..4ca4006d 100644 --- a/extlib/benz/blob.c +++ b/extlib/benz/blob.c @@ -203,7 +203,7 @@ pic_blob_list_to_bytevector(pic_state *pic) { pic_blob *blob; unsigned char *data; - pic_value list, e; + pic_value list, e, it; pic_get_args(pic, "o", &list); @@ -211,7 +211,7 @@ pic_blob_list_to_bytevector(pic_state *pic) data = blob->data; - pic_for_each (e, list) { + pic_for_each (e, list, it) { pic_assert_type(pic, e, int); if (pic_int(e) < 0 || pic_int(e) > 255) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 51d94e6a..91e0a4f0 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -344,9 +344,9 @@ static void analyze_deferred(analyze_state *state) { pic_state *pic = state->pic; - pic_value defer, val, name, formal, body, dst; + pic_value defer, val, name, formal, body, dst, it; - pic_for_each (defer, pic_reverse(pic, state->scope->defer)) { + pic_for_each (defer, pic_reverse(pic, state->scope->defer), it) { name = pic_list_ref(pic, defer, 0); formal = pic_list_ref(pic, defer, 1); body = pic_list_ref(pic, defer, 2); @@ -566,7 +566,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)) { \ + pic_for_each (arg, pic_cdr(pic, args), it) { \ obj = pic_list3(pic, pic_obj_value(sym), obj, \ analyze(state, arg, false)); \ } \ @@ -576,7 +576,7 @@ static pic_value analyze_add(analyze_state *state, pic_value obj, bool tailpos) { pic_state *pic = state->pic; - pic_value args, arg; + pic_value args, arg, it; ARGC_ASSERT_GE(0); switch (pic_length(pic, obj)) { @@ -595,7 +595,7 @@ static pic_value analyze_sub(analyze_state *state, pic_value obj) { pic_state *pic = state->pic; - pic_value args, arg; + pic_value args, arg, it; ARGC_ASSERT_GE(1); switch (pic_length(pic, obj)) { @@ -613,7 +613,7 @@ static pic_value analyze_mul(analyze_state *state, pic_value obj, bool tailpos) { pic_state *pic = state->pic; - pic_value args, arg; + pic_value args, arg, it; ARGC_ASSERT_GE(0); switch (pic_length(pic, obj)) { @@ -632,7 +632,7 @@ static pic_value analyze_div(analyze_state *state, pic_value obj) { pic_state *pic = state->pic; - pic_value args, arg; + pic_value args, arg, it; ARGC_ASSERT_GE(1); switch (pic_length(pic, obj)) { @@ -651,7 +651,7 @@ static pic_value analyze_call(analyze_state *state, pic_value obj, bool tailpos) { pic_state *pic = state->pic; - pic_value seq, elt; + pic_value seq, elt, it; pic_sym *call; if (! tailpos) { @@ -660,7 +660,7 @@ analyze_call(analyze_state *state, pic_value obj, bool tailpos) call = pic->sTAILCALL; } seq = pic_list1(pic, pic_obj_value(call)); - pic_for_each (elt, obj) { + pic_for_each (elt, obj, it) { seq = pic_cons(pic, analyze(state, elt, false), seq); } return pic_reverse(pic, seq); @@ -670,14 +670,14 @@ static pic_value analyze_values(analyze_state *state, pic_value obj, bool tailpos) { pic_state *pic = state->pic; - pic_value v, seq; + pic_value v, seq, it; if (! tailpos) { return analyze_call(state, obj, false); } seq = pic_list1(pic, pic_obj_value(pic->sRETURN)); - pic_for_each (v, pic_cdr(pic, obj)) { + pic_for_each (v, pic_cdr(pic, obj), it) { seq = pic_cons(pic, analyze(state, v, false), seq); } return pic_reverse(pic, seq); @@ -964,7 +964,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_value var, it; pic_sym *sym; assert(pic_sym_p(name) || pic_false_p(name)); @@ -980,15 +980,15 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v xv_init(&cxt->locals, sizeof(pic_sym *)); xv_init(&cxt->captures, sizeof(pic_sym *)); - pic_for_each (var, args) { + pic_for_each (var, args, it) { sym = pic_sym_ptr(var); xv_push(&cxt->args, &sym); } - pic_for_each (var, locals) { + pic_for_each (var, locals, it) { sym = pic_sym_ptr(var); xv_push(&cxt->locals, &sym); } - pic_for_each (var, captures) { + pic_for_each (var, captures, it) { sym = pic_sym_ptr(var); xv_push(&cxt->captures, &sym); } @@ -1240,10 +1240,10 @@ codegen(codegen_state *state, pic_value obj) return; } else if (sym == pic->sBEGIN) { - pic_value elt; + pic_value elt, it; int i = 0; - pic_for_each (elt, pic_cdr(pic, obj)) { + pic_for_each (elt, pic_cdr(pic, obj), it) { if (i++ != 0) { cxt->code[cxt->clen].insn = OP_POP; cxt->clen++; @@ -1406,9 +1406,9 @@ codegen(codegen_state *state, pic_value obj) } else if (sym == pic->sCALL || sym == pic->sTAILCALL) { int len = (int)pic_length(pic, obj); - pic_value elt; + pic_value elt, it; - pic_for_each (elt, pic_cdr(pic, obj)) { + pic_for_each (elt, pic_cdr(pic, obj), it) { codegen(state, elt); } cxt->code[cxt->clen].insn = (sym == pic->sCALL) ? OP_CALL : OP_TAILCALL; @@ -1432,9 +1432,9 @@ codegen(codegen_state *state, pic_value obj) } else if (sym == pic->sRETURN) { int len = (int)pic_length(pic, obj); - pic_value elt; + pic_value elt, it; - pic_for_each (elt, pic_cdr(pic, obj)) { + pic_for_each (elt, pic_cdr(pic, obj), it) { codegen(state, elt); } cxt->code[cxt->clen].insn = OP_RET; diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 2678fb0b..17587e95 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -195,11 +195,11 @@ pic_values_by_array(pic_state *pic, size_t argc, pic_value *argv) pic_value pic_values_by_list(pic_state *pic, pic_value list) { - pic_value v; + pic_value v, it; int i; i = 0; - pic_for_each (v, list) { + pic_for_each (v, list, it) { pic->sp[i++] = v; } pic->ci->retc = i; diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index d677e935..4312c40f 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -273,13 +273,13 @@ static pic_value pic_dict_alist_to_dictionary(pic_state *pic) { struct pic_dict *dict; - pic_value alist, e; + pic_value alist, e, it; pic_get_args(pic, "o", &alist); dict = pic_make_dict(pic); - pic_for_each (e, pic_reverse(pic, alist)) { + pic_for_each (e, pic_reverse(pic, alist), it) { pic_assert_type(pic, pic_car(pic, e), sym); pic_dict_set(pic, dict, pic_sym_ptr(pic_car(pic, e)), pic_cdr(pic, e)); } diff --git a/extlib/benz/include/picrin/pair.h b/extlib/benz/include/picrin/pair.h index 11859482..3b3e29b0 100644 --- a/extlib/benz/include/picrin/pair.h +++ b/extlib/benz/include/picrin/pair.h @@ -59,12 +59,9 @@ pic_value pic_list7(pic_state *, pic_value, pic_value, pic_value, pic_value, pic pic_value pic_list_by_array(pic_state *, size_t, pic_value *); pic_value pic_make_list(pic_state *, size_t, pic_value); -#define pic_for_each(var, list) \ - pic_for_each_helper_(var, PIC_GENSYM(tmp), list) -#define pic_for_each_helper_(var, tmp, list) \ - for (pic_value tmp = (list); \ - pic_nil_p(tmp) ? false : ((var = pic_car(pic, tmp)), true); \ - tmp = pic_cdr(pic, tmp)) +#define pic_for_each(var, list, it) \ + for (it = (list); ! pic_nil_p(it); it = pic_cdr(pic, it)) \ + if ((var = pic_car(pic, it)), true) #define pic_push(pic, item, place) (place = pic_cons(pic, item, place)) #define pic_pop(pic, place) (place = pic_cdr(pic, place)) diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 234f3833..0c4ad001 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -73,7 +73,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_value val, tmp, prefix, it; pic_sym *sym, *id, *tag; table = pic_make_dict(pic); @@ -85,7 +85,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) if (tag == pic->sONLY) { import_table(pic, pic_cadr(pic, spec), table); - pic_for_each (val, pic_cddr(pic, spec)) { + pic_for_each (val, pic_cddr(pic, spec), it) { pic_dict_set(pic, imports, pic_sym_ptr(val), pic_dict_ref(pic, table, pic_sym_ptr(val))); } return; @@ -93,7 +93,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) if (tag == pic->sRENAME) { import_table(pic, pic_cadr(pic, spec), imports); - pic_for_each (val, pic_cddr(pic, spec)) { + pic_for_each (val, pic_cddr(pic, spec), it) { 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); @@ -112,7 +112,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_for_each (val, pic_cddr(pic, spec), it) { pic_dict_del(pic, imports, pic_sym_ptr(val)); } return; @@ -202,13 +202,13 @@ static bool condexpand(pic_state *pic, pic_value clause) { pic_sym *tag; - pic_value c, feature; + pic_value c, feature, it; if (pic_eq_p(clause, pic_obj_value(pic->sELSE))) { return true; } if (pic_sym_p(clause)) { - pic_for_each (feature, pic->features) { + pic_for_each (feature, pic->features, it) { if(pic_eq_p(feature, clause)) return true; } @@ -228,14 +228,14 @@ condexpand(pic_state *pic, pic_value clause) return ! condexpand(pic, pic_list_ref(pic, clause, 1)); } if (tag == pic->sAND) { - pic_for_each (c, pic_cdr(pic, clause)) { + pic_for_each (c, pic_cdr(pic, clause), it) { if (! condexpand(pic, c)) return false; } return true; } if (tag == pic->sOR) { - pic_for_each (c, pic_cdr(pic, clause)) { + pic_for_each (c, pic_cdr(pic, clause), it) { if (condexpand(pic, c)) return true; } diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index 622a28d3..f934cdd3 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -124,9 +124,9 @@ macroexpand_defer(pic_state *pic, pic_value expr, struct pic_senv *senv) static void macroexpand_deferred(pic_state *pic, struct pic_senv *senv) { - pic_value defer, val, src, dst; + pic_value defer, val, src, dst, it; - pic_for_each (defer, pic_reverse(pic, senv->defer)) { + pic_for_each (defer, pic_reverse(pic, senv->defer), it) { src = pic_car(pic, defer); dst = pic_cdr(pic, defer); diff --git a/extlib/benz/pair.c b/extlib/benz/pair.c index 03621ec1..fc865921 100644 --- a/extlib/benz/pair.c +++ b/extlib/benz/pair.c @@ -204,10 +204,10 @@ pic_value pic_reverse(pic_state *pic, pic_value list) { size_t ai = pic_gc_arena_preserve(pic); - pic_value v, acc; + pic_value v, acc, it; acc = pic_nil_value(); - pic_for_each(v, list) { + pic_for_each(v, list, it) { acc = pic_cons(pic, v, acc); pic_gc_arena_restore(pic, ai); @@ -220,10 +220,10 @@ pic_value pic_append(pic_state *pic, pic_value xs, pic_value ys) { size_t ai = pic_gc_arena_preserve(pic); - pic_value x; + pic_value x, it; xs = pic_reverse(pic, xs); - pic_for_each (x, xs) { + pic_for_each (x, xs, it) { ys = pic_cons(pic, x, ys); pic_gc_arena_restore(pic, ai); diff --git a/extlib/benz/string.c b/extlib/benz/string.c index 43514b2d..abdefad0 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -425,7 +425,7 @@ static pic_value pic_str_list_to_string(pic_state *pic) { pic_str *str; - pic_value list, e; + pic_value list, e, it; size_t i = 0; pic_get_args(pic, "o", &list); @@ -435,7 +435,7 @@ pic_str_list_to_string(pic_state *pic) } else { char buf[pic_length(pic, list)]; - pic_for_each (e, list) { + pic_for_each (e, list, it) { pic_assert_type(pic, e, char); buf[i++] = pic_char(e); diff --git a/extlib/benz/vector.c b/extlib/benz/vector.c index 33070d24..60004cc8 100644 --- a/extlib/benz/vector.c +++ b/extlib/benz/vector.c @@ -302,7 +302,7 @@ static pic_value pic_vec_list_to_vector(pic_state *pic) { struct pic_vector *vec; - pic_value list, e, *data; + pic_value list, e, it, *data; pic_get_args(pic, "o", &list); @@ -310,7 +310,7 @@ pic_vec_list_to_vector(pic_state *pic) data = vec->data; - pic_for_each (e, list) { + pic_for_each (e, list, it) { *data++ = e; } return pic_obj_value(vec); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 0c82bdff..12862f9f 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -1153,13 +1153,13 @@ pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, pic_value args) { OP_TAILCALL, { .i = -1 } } }; - pic_value v, *sp; + pic_value v, it, *sp; pic_callinfo *ci; *pic->sp++ = pic_obj_value(proc); sp = pic->sp; - pic_for_each (v, args) { + pic_for_each (v, args, it) { *sp++ = v; } diff --git a/src/main.c b/src/main.c index 03431ac4..f43419f1 100644 --- a/src/main.c +++ b/src/main.c @@ -20,11 +20,11 @@ pic_features(pic_state *pic) static pic_value pic_libraries(pic_state *pic) { - pic_value libs = pic_nil_value(), lib; + pic_value libs = pic_nil_value(), lib, it; pic_get_args(pic, ""); - pic_for_each (lib, pic->libs) { + pic_for_each (lib, pic->libs, it) { libs = pic_cons(pic, pic_car(pic, lib), libs); } From 499b68c835c47f894c1ae1bfea83785df5cf2b2e Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 19:33:42 +0900 Subject: [PATCH 044/177] change pic_dict_for_each interface --- extlib/benz/codegen.c | 3 ++- extlib/benz/include/picrin/dict.h | 9 +++------ extlib/benz/lib.c | 8 +++++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 91e0a4f0..c0d87419 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -64,6 +64,7 @@ new_analyze_state(pic_state *pic) { analyze_state *state; pic_sym *sym; + xh_entry *it; state = pic_alloc(pic, sizeof(analyze_state)); state->pic = pic; @@ -92,7 +93,7 @@ new_analyze_state(pic_state *pic) /* push initial scope */ push_scope(state, pic_nil_value()); - pic_dict_for_each (sym, pic->globals) { + pic_dict_for_each (sym, pic->globals, it) { xv_push(&state->scope->locals, &sym); } diff --git a/extlib/benz/include/picrin/dict.h b/extlib/benz/include/picrin/dict.h index 13379bf5..4a3bd7ce 100644 --- a/extlib/benz/include/picrin/dict.h +++ b/extlib/benz/include/picrin/dict.h @@ -19,12 +19,9 @@ 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)) +#define pic_dict_for_each(sym, dict, it) \ + for (it = xh_begin(&(dict)->hash); it != NULL; it = xh_next(it)) \ + if ((sym = xh_key(it, pic_sym *)), true) 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); diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 0c4ad001..30362ef2 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -75,6 +75,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) struct pic_dict *table; pic_value val, tmp, prefix, it; pic_sym *sym, *id, *tag; + xh_entry *iter; table = pic_make_dict(pic); @@ -104,7 +105,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) import_table(pic, pic_cadr(pic, spec), table); prefix = pic_list_ref(pic, spec, 2); - pic_dict_for_each (sym, table) { + pic_dict_for_each (sym, table, iter) { 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)); } @@ -122,7 +123,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) if (! lib) { pic_errorf(pic, "library not found: ~a", spec); } - pic_dict_for_each (sym, lib->exports) { + pic_dict_for_each (sym, lib->exports, iter) { pic_dict_set(pic, imports, sym, pic_dict_ref(pic, lib->exports, sym)); } } @@ -132,12 +133,13 @@ import(pic_state *pic, pic_value spec) { struct pic_dict *imports; pic_sym *sym; + xh_entry *it; imports = pic_make_dict(pic); import_table(pic, spec, imports); - pic_dict_for_each (sym, imports) { + pic_dict_for_each (sym, imports, it) { pic_put_rename(pic, pic->lib->env, sym, pic_sym_ptr(pic_dict_ref(pic, imports, sym))); } } From 9af074d80332af1c7d670e69d307d4cc783d0baa Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 20:16:26 +0900 Subject: [PATCH 045/177] remove trailing commas --- extlib/benz/include/picrin/port.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extlib/benz/include/picrin/port.h b/extlib/benz/include/picrin/port.h index 4f763902..98dcff83 100644 --- a/extlib/benz/include/picrin/port.h +++ b/extlib/benz/include/picrin/port.h @@ -13,12 +13,12 @@ enum pic_port_flag { PIC_PORT_IN = 1, PIC_PORT_OUT = 2, PIC_PORT_TEXT = 4, - PIC_PORT_BINARY = 8, + PIC_PORT_BINARY = 8 }; enum pic_port_status { PIC_PORT_OPEN, - PIC_PORT_CLOSE, + PIC_PORT_CLOSE }; struct pic_port { From f7d506cd359af14e8b99b5d7b55897dc6526cdff Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 22 Jan 2015 22:15:12 +0900 Subject: [PATCH 046/177] xvect.h is now based on kvec.h --- extlib/benz/codegen.c | 136 +++++++--------- extlib/benz/gc.c | 10 +- extlib/benz/include/picrin/xvect.h | 244 +++++++---------------------- 3 files changed, 124 insertions(+), 266 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index c0d87419..63f3ab87 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -17,6 +17,10 @@ # error enable PIC_NONE_IS_FALSE #endif +typedef xvect_t(pic_sym *) xvect; + +#define xv_push_sym(v, x) xv_push(pic_sym *, (v), (x)) + /** * scope object */ @@ -94,7 +98,7 @@ new_analyze_state(pic_state *pic) push_scope(state, pic_nil_value()); pic_dict_for_each (sym, pic->globals, it) { - xv_push(&state->scope->locals, &sym); + xv_push_sym(state->scope->locals, sym); } return state; @@ -119,7 +123,7 @@ analyze_args(pic_state *pic, pic_value formals, bool *varg, xvect *args, xvect * return false; } sym = pic_sym_ptr(t); - xv_push(args, &sym); + xv_push_sym(*args, sym); } if (pic_nil_p(v)) { *varg = false; @@ -127,7 +131,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_ptr(v); - xv_push(locals, &sym); + xv_push_sym(*locals, sym); } else { return false; @@ -144,9 +148,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); + xv_init(locals); + xv_init(captures); if (analyze_args(pic, formals, &varg, &args, &locals)) { scope = pic_alloc(pic, sizeof(analyze_scope)); @@ -163,8 +167,8 @@ push_scope(analyze_state *state, pic_value formals) return true; } else { - xv_destroy(&args); - xv_destroy(&locals); + xv_destroy(args); + xv_destroy(locals); return false; } } @@ -172,12 +176,13 @@ push_scope(analyze_state *state, pic_value formals) static void pop_scope(analyze_state *state) { + pic_state *pic = state->pic; analyze_scope *scope; scope = state->scope; - xv_destroy(&scope->args); - xv_destroy(&scope->locals); - xv_destroy(&scope->captures); + xv_destroy(scope->args); + xv_destroy(scope->locals); + xv_destroy(scope->captures); scope = scope->up; pic_free(state->pic, state->scope); @@ -187,38 +192,33 @@ pop_scope(analyze_state *state) static bool lookup_scope(analyze_scope *scope, pic_sym *sym) { - pic_sym **arg, **local; size_t i; /* args */ - for (i = 0; i < xv_size(&scope->args); ++i) { - arg = xv_get(&scope->args, i); - if (*arg == sym) + for (i = 0; i < xv_size(scope->args); ++i) { + if (xv_A(scope->args, i) == sym) return true; } /* locals */ - for (i = 0; i < xv_size(&scope->locals); ++i) { - local = xv_get(&scope->locals, i); - if (*local == sym) + for (i = 0; i < xv_size(scope->locals); ++i) { + if (xv_A(scope->locals, i) == sym) return true; } return false; } static void -capture_var(analyze_scope *scope, pic_sym *sym) +capture_var(pic_state *pic, analyze_scope *scope, pic_sym *sym) { - pic_sym **var; size_t i; - for (i = 0; i < xv_size(&scope->captures); ++i) { - var = xv_get(&scope->captures, i); - if (*var == sym) { + for (i = 0; i < xv_size(scope->captures); ++i) { + if (xv_A(scope->captures, i) == sym) { break; } } - if (i == xv_size(&scope->captures)) { - xv_push(&scope->captures, &sym); + if (i == xv_size(scope->captures)) { + xv_push_sym(scope->captures, sym); } } @@ -231,7 +231,7 @@ find_var(analyze_state *state, pic_sym *sym) while (scope) { if (lookup_scope(scope, sym)) { if (depth > 0) { - capture_var(scope, sym); + capture_var(state->pic, scope, sym); } return depth; } @@ -252,7 +252,7 @@ define_var(analyze_state *state, pic_sym *sym) return; } - xv_push(&scope->locals, &sym); + xv_push_sym(scope->locals, sym); } static pic_value analyze_node(analyze_state *, pic_value, bool); @@ -373,13 +373,11 @@ 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; size_t i; args = pic_nil_value(); - for (i = xv_size(&scope->args); i > 0; --i) { - var = xv_get(&scope->args, i - 1); - pic_push(pic, pic_obj_value(*var), args); + for (i = xv_size(scope->args); i > 0; --i) { + pic_push(pic, pic_obj_value(xv_A(scope->args, i - 1)), args); } varg = scope->varg @@ -392,15 +390,13 @@ analyze_procedure(analyze_state *state, pic_value name, pic_value formals, pic_v 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_obj_value(*var), locals); + for (i = xv_size(scope->locals); i > 0; --i) { + pic_push(pic, pic_obj_value(xv_A(scope->locals, i - 1)), 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_obj_value(*var), captures); + for (i = xv_size(scope->captures); i > 0; --i) { + pic_push(pic, pic_obj_value(xv_A(scope->captures, i - 1)), captures); } pop_scope(state); @@ -925,27 +921,24 @@ create_activation(codegen_context *cxt) { size_t i, n; xhash regs; - pic_sym **var; size_t offset; xh_init_ptr(®s, sizeof(size_t)); offset = 1; - for (i = 0; i < xv_size(&cxt->args); ++i) { - var = xv_get(&cxt->args, i); + for (i = 0; i < xv_size(cxt->args); ++i) { n = i + offset; - xh_put_ptr(®s, *var, &n); + xh_put_ptr(®s, xv_A(cxt->args, i), &n); } offset += i; - for (i = 0; i < xv_size(&cxt->locals); ++i) { - var = xv_get(&cxt->locals, i); + for (i = 0; i < xv_size(cxt->locals); ++i) { n = i + offset; - xh_put_ptr(®s, *var, &n); + xh_put_ptr(®s, xv_A(cxt->locals, i), &n); } - for (i = 0; i < xv_size(&cxt->captures); ++i) { - var = xv_get(&cxt->captures, i); - if ((n = xh_val(xh_get_ptr(®s, *var), size_t)) <= xv_size(&cxt->args) || (cxt->varg && n == xv_size(&cxt->args) + 1)) { + for (i = 0; i < xv_size(cxt->captures); ++i) { + n = xh_val(xh_get_ptr(®s, xv_A(cxt->captures, i)), size_t); + if (n <= 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; @@ -966,7 +959,6 @@ 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, it; - pic_sym *sym; assert(pic_sym_p(name) || pic_false_p(name)); @@ -977,21 +969,18 @@ 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); + xv_init(cxt->locals); + xv_init(cxt->captures); pic_for_each (var, args, it) { - sym = pic_sym_ptr(var); - xv_push(&cxt->args, &sym); + xv_push_sym(cxt->args, pic_sym_ptr(var)); } pic_for_each (var, locals, it) { - sym = pic_sym_ptr(var); - xv_push(&cxt->locals, &sym); + xv_push_sym(cxt->locals, pic_sym_ptr(var)); } pic_for_each (var, captures, it) { - sym = pic_sym_ptr(var); - xv_push(&cxt->captures, &sym); + xv_push_sym(cxt->captures, pic_sym_ptr(var)); } cxt->code = pic_calloc(pic, PIC_ISEQ_SIZE, sizeof(pic_code)); @@ -1026,9 +1015,9 @@ pop_codegen_context(codegen_state *state) irep = (struct pic_irep *)pic_obj_alloc(pic, sizeof(struct pic_irep), PIC_TT_IREP); irep->name = state->cxt->name; irep->varg = state->cxt->varg; - irep->argc = (int)xv_size(&state->cxt->args) + 1; - irep->localc = (int)xv_size(&state->cxt->locals); - irep->capturec = (int)xv_size(&state->cxt->captures); + irep->argc = (int)xv_size(state->cxt->args) + 1; + irep->localc = (int)xv_size(state->cxt->locals); + irep->capturec = (int)xv_size(state->cxt->captures); irep->code = pic_realloc(pic, state->cxt->code, sizeof(pic_code) * state->cxt->clen); irep->clen = state->cxt->clen; irep->irep = pic_realloc(pic, state->cxt->irep, sizeof(struct pic_irep *) * state->cxt->ilen); @@ -1039,9 +1028,9 @@ pop_codegen_context(codegen_state *state) irep->slen = state->cxt->slen; /* finalize */ - xv_destroy(&cxt->args); - xv_destroy(&cxt->locals); - xv_destroy(&cxt->captures); + xv_destroy(cxt->args); + xv_destroy(cxt->locals); + xv_destroy(cxt->captures); /* destroy context */ cxt = cxt->up; @@ -1056,15 +1045,13 @@ index_capture(codegen_state *state, pic_sym *sym, int depth) { codegen_context *cxt = state->cxt; size_t i; - pic_sym **var; while (depth-- > 0) { cxt = cxt->up; } - for (i = 0; i < xv_size(&cxt->captures); ++i) { - var = xv_get(&cxt->captures, i); - if (*var == sym) + for (i = 0; i < xv_size(cxt->captures); ++i) { + if (xv_A(cxt->captures, i) == sym) return (int)i; } return -1; @@ -1075,18 +1062,15 @@ index_local(codegen_state *state, pic_sym *sym) { codegen_context *cxt = state->cxt; size_t i, offset; - pic_sym **var; offset = 1; - for (i = 0; i < xv_size(&cxt->args); ++i) { - var = xv_get(&cxt->args, i); - if (*var == sym) + for (i = 0; i < xv_size(cxt->args); ++i) { + if (xv_A(cxt->args, i) == sym) return (int)(i + offset); } offset += i; - for (i = 0; i < xv_size(&cxt->locals); ++i) { - var = xv_get(&cxt->locals, i); - if (*var == sym) + for (i = 0; i < xv_size(cxt->locals); ++i) { + if (xv_A(cxt->locals, i) == sym) return (int)(i + offset); } return -1; @@ -1145,7 +1129,7 @@ codegen(codegen_state *state, pic_value obj) 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; + cxt->code[cxt->clen].u.i = i + (int)xv_size(cxt->args) + (int)xv_size(cxt->locals) + 1; cxt->clen++; return; } @@ -1191,7 +1175,7 @@ codegen(codegen_state *state, pic_value obj) 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; + cxt->code[cxt->clen].u.i = i + (int)xv_size(cxt->args) + (int)xv_size(cxt->locals) + 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 2fc69b74..6dc2be85 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -704,20 +704,20 @@ static void gc_sweep_symbols(pic_state *pic) { xh_entry *it; - xvect xv; + xvect_t(xh_entry *) xv; size_t i; char *cstr; - xv_init(&xv, sizeof(xh_entry *)); + xv_init(xv); for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { if (! gc_obj_is_marked((struct pic_object *)xh_val(it, pic_sym *))) { - xv_push(&xv, &it); + xv_push(xh_entry *, xv, it); } } - for (i = 0; i < xv_size(&xv); ++i) { - cstr = xh_key(*(xh_entry **)xv_get(&xv, i), char *); + for (i = 0; i < xv_size(xv); ++i) { + cstr = xh_key(xv_A(xv, i), char *); xh_del_str(&pic->syms, cstr); diff --git a/extlib/benz/include/picrin/xvect.h b/extlib/benz/include/picrin/xvect.h index a04d227a..6dcabb1c 100644 --- a/extlib/benz/include/picrin/xvect.h +++ b/extlib/benz/include/picrin/xvect.h @@ -1,202 +1,76 @@ #ifndef XVECT_H__ #define XVECT_H__ -/* - * Copyright (c) 2014 by Yuichi Nishiwaki - */ +/* The MIT License -#if defined(__cplusplus) -extern "C" { -#endif + Copyright (c) 2008, by Attractive Chaos + Copyright (c) 2014, by Yuichi Nishiwaki -typedef struct xvect { - char *data; - size_t size, mask, head, tail, width; -} xvect; + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: -static inline void xv_init(xvect *, size_t); -static inline void xv_destroy(xvect *); + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. -static inline size_t xv_size(xvect *); + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ -static inline void xv_reserve(xvect *, size_t); -static inline void xv_shrink(xvect *, size_t); +#define xv_realloc(P,Z) pic_realloc(pic,P,Z) +#define xv_free(P) pic_free(pic,P) -static inline void *xv_get(xvect *, size_t); -static inline void xv_set(xvect *, size_t, void *); +#define xv_roundup32(x) \ + (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) -static inline void xv_push(xvect *, void *); -static inline void *xv_pop(xvect *); +#define xvect_t(type) struct { size_t n, m; type *a; } +#define xv_init(v) ((v).n = (v).m = 0, (v).a = 0) +#define xv_destroy(v) xv_free((v).a) +#define xv_A(v, i) ((v).a[(i)]) +#define xv_pop(v) ((v).a[--(v).n]) +#define xv_size(v) ((v).n) +#define xv_max(v) ((v).m) -static inline void *xv_shift(xvect *); -static inline void xv_unshift(xvect *, void *); +#define xv_resize(type, v, s) \ + ((v).m = (s), (v).a = (type*)xv_realloc((v).a, sizeof(type) * (v).m)) -static inline void xv_splice(xvect *, size_t, size_t); -static inline void xv_insert(xvect *, size_t, void *); +#define xv_copy(type, v1, v0) \ + do { \ + if ((v1).m < (v0).n) xv_resize(type, v1, (v0).n); \ + (v1).n = (v0).n; \ + memcpy((v1).a, (v0).a, sizeof(type) * (v0).n); \ + } while (0) \ -static inline void -xv_init(xvect *x, size_t width) -{ - x->data = NULL; - x->width = width; - x->size = 0; - x->mask = (size_t)-1; - x->head = 0; - x->tail = 0; -} +#define xv_push(type, v, x) \ + do { \ + if ((v).n == (v).m) { \ + (v).m = (v).m? (v).m<<1 : 2; \ + (v).a = (type*)xv_realloc((v).a, sizeof(type) * (v).m); \ + } \ + (v).a[(v).n++] = (x); \ + } while (0) -static inline void -xv_destroy(xvect *x) -{ - free(x->data); -} +#define xv_pushp(type, v) \ + (((v).n == (v).m)? \ + ((v).m = ((v).m? (v).m<<1 : 2), \ + (v).a = (type*)xv_realloc((v).a, sizeof(type) * (v).m), 0) \ + : 0), ((v).a + ((v).n++)) -static inline size_t -xv_size(xvect *x) -{ - return x->tail < x->head - ? x->tail + x->size - x->head - : x->tail - x->head; -} - -static inline size_t -xv_round2(size_t x) -{ - x -= 1; - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - x |= (x >> 32); - x++; - return x; -} - -static inline void -xv_rotate(xvect *x) -{ - if (x->tail < x->head) { - char buf[x->size * x->width]; - - /* perform rotation */ - memcpy(buf, x->data, sizeof buf); - memcpy(x->data, buf + x->head * x->width, (x->size - x->head) * x->width); - memcpy(x->data + (x->size - x->head) * x->width, buf, x->tail * x->width); - x->tail = x->size - x->head + x->tail; - x->head = 0; - } -} - -static inline void -xv_adjust(xvect *x, size_t size) -{ - size = xv_round2(size); - if (size != x->size) { - xv_rotate(x); - x->data = realloc(x->data, size * x->width); - x->size = size; - x->mask = size - 1; - } -} - -static inline void -xv_reserve(xvect *x, size_t mincapa) -{ - if (x->size < mincapa + 1) { - xv_adjust(x, mincapa + 1); /* capa == size - 1 */ - } -} - -static inline void -xv_shrink(xvect *x, size_t maxcapa) -{ - if (x->size > maxcapa + 1) { - xv_adjust(x, maxcapa + 1); /* capa == size - 1 */ - } -} - -static inline void * -xv_get(xvect *x, size_t i) -{ - assert(i < xv_size(x)); - - return x->data + ((x->head + i) & x->mask) * x->width; -} - -static inline void -xv_set(xvect *x, size_t i, void *src) -{ - memcpy(xv_get(x, i), src, x->width); -} - -static inline void -xv_push(xvect *x, void *src) -{ - xv_reserve(x, xv_size(x) + 1); - x->tail = (x->tail + 1) & x->mask; - xv_set(x, xv_size(x) - 1, src); -} - -static inline void * -xv_pop(xvect *x) -{ - void *dat; - - assert(xv_size(x) >= 1); - - dat = xv_get(x, xv_size(x) - 1); - x->tail = (x->tail - 1) & x->mask; - return dat; -} - -static inline void * -xv_shift(xvect *x) -{ - void *dat; - - assert(xv_size(x) >= 1); - - dat = xv_get(x, 0); - x->head = (x->head + 1) & x->mask; - return dat; -} - -static inline void -xv_unshift(xvect *x, void *src) -{ - xv_reserve(x, xv_size(x) + 1); - x->head = (x->head - 1) & x->mask; - xv_set(x, 0, src); -} - -static inline void -xv_splice(xvect *x, size_t i, size_t j) -{ - assert(i <= j && j < xv_size(x)); - - xv_rotate(x); - memmove(xv_get(x, i), xv_get(x, j), (xv_size(x) - j) * x->width); - x->tail = (x->tail - j + i) & x->mask; -} - -static inline void -xv_insert(xvect *x, size_t i, void *src) -{ - assert(i <= xv_size(x)); - - xv_reserve(x, xv_size(x) + 1); - xv_rotate(x); - x->tail = (x->tail + 1) & x->mask; - - if (xv_size(x) - 1 != i) { - memmove(xv_get(x, i + 1), xv_get(x, i), (xv_size(x) - 1 - i) * x->width); - } - xv_set(x, i, src); -} - -#if defined(__cplusplus) -} -#endif +#define xv_a(type, v, i) \ + (((v).m <= (size_t)(i)? \ + ((v).m = (v).n = (i) + 1, xv_roundup32((v).m), \ + (v).a = (type*)xv_realloc((v).a, sizeof(type) * (v).m), 0) \ + : (v).n <= (size_t)(i)? (v).n = (i) + 1 \ + : 0), (v).a[(i)]) #endif From 15ce163782ff98bc561f5ccb4d6df53e094fa6b1 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Fri, 23 Jan 2015 02:08:49 +0900 Subject: [PATCH 047/177] enable -O0 switch on debug mode --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 41bfb13e..cf856238 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY lib) set(CMAKE_C_FLAGS "-O2 -Wall -Wextra") -set(CMAKE_C_FLAGS_DEBUG "-g -DDEBUG=1") +set(CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG=1") option(USE_C11_FEATURE "Enable c11 feature" OFF) if(USE_C11_FEATURE) From 6bdfac4ec0bdda8b5e9ee5009d5f473043eb70be Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 11:42:24 +0900 Subject: [PATCH 048/177] don't declare variables in middle of block --- extlib/benz/include/picrin/error.h | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index 3a575cfe..819c077e 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -28,16 +28,24 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) #define pic_try \ pic_try_(PIC_GENSYM(escape)) +#define pic_catch \ + pic_catch_(PIC_GENSYM(label)) #define pic_try_(escape) \ - struct pic_escape *escape = pic_alloc(pic, sizeof(struct pic_escape)); \ - pic_save_point(pic, escape); \ - if (setjmp(escape->jmp) == 0) { \ - pic_push_try(pic, escape); \ - do -#define pic_catch \ - while (0); \ - pic_pop_try(pic); \ - } else + do { \ + struct pic_escape *escape = pic_alloc(pic, sizeof(struct pic_escape)); \ + pic_save_point(pic, escape); \ + if (setjmp(escape->jmp) == 0) { \ + pic_push_try(pic, escape); \ + do +#define pic_catch_(label) \ + while (0); \ + pic_pop_try(pic); \ + } else { \ + goto label; \ + } \ + } while (0); \ + if (0) \ + label: void pic_push_try(pic_state *, struct pic_escape *); void pic_pop_try(pic_state *); From d390fc44ca44da9cd4efb821b89289d4d62deae6 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 12:20:32 +0900 Subject: [PATCH 049/177] add PIC_INLINE macro --- extlib/benz/include/picrin.h | 7 +- extlib/benz/include/picrin/data.h | 2 +- extlib/benz/include/picrin/irep.h | 4 +- extlib/benz/include/picrin/pair.h | 4 +- extlib/benz/include/picrin/util.h | 8 ++ extlib/benz/include/picrin/value.h | 76 ++++++++-------- extlib/benz/include/picrin/xfile.h | 134 ++++++++++++++--------------- extlib/benz/include/picrin/xhash.h | 92 ++++++++++---------- extlib/benz/include/picrin/xrope.h | 46 +++++----- 9 files changed, 191 insertions(+), 182 deletions(-) diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index d7124e39..7c2cf41c 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -42,13 +42,14 @@ extern "C" { #include #include +#include "picrin/config.h" +#include "picrin/util.h" + #include "picrin/xvect.h" #include "picrin/xhash.h" #include "picrin/xfile.h" #include "picrin/xrope.h" -#include "picrin/config.h" -#include "picrin/util.h" #include "picrin/value.h" typedef struct pic_code pic_code; @@ -227,7 +228,7 @@ pic_str *pic_get_backtrace(pic_state *); void pic_print_backtrace(pic_state *); /* obsoleted */ -static inline void pic_warn(pic_state *pic, const char *msg) +PIC_INLINE void pic_warn(pic_state *pic, const char *msg) { pic_warnf(pic, msg); } diff --git a/extlib/benz/include/picrin/data.h b/extlib/benz/include/picrin/data.h index fec4cd7d..38a20c3d 100644 --- a/extlib/benz/include/picrin/data.h +++ b/extlib/benz/include/picrin/data.h @@ -25,7 +25,7 @@ struct pic_data { #define pic_data_p(o) (pic_type(o) == PIC_TT_DATA) #define pic_data_ptr(o) ((struct pic_data *)pic_ptr(o)) -static inline bool pic_data_type_p(const pic_value obj, const pic_data_type *type) { +PIC_INLINE bool pic_data_type_p(const pic_value obj, const pic_data_type *type) { return pic_data_p(obj) && pic_data_ptr(obj)->type == type; } diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/irep.h index 9c7932da..cf612c0e 100644 --- a/extlib/benz/include/picrin/irep.h +++ b/extlib/benz/include/picrin/irep.h @@ -75,7 +75,7 @@ struct pic_irep { pic_value pic_analyze(pic_state *, pic_value); struct pic_irep *pic_codegen(pic_state *, pic_value); -static inline void +PIC_INLINE void pic_dump_code(pic_code c) { printf("[%2d] ", c.insn); @@ -191,7 +191,7 @@ pic_dump_code(pic_code c) } } -static inline void +PIC_INLINE void pic_dump_irep(struct pic_irep *irep) { unsigned i; diff --git a/extlib/benz/include/picrin/pair.h b/extlib/benz/include/picrin/pair.h index 3b3e29b0..a05b23b6 100644 --- a/extlib/benz/include/picrin/pair.h +++ b/extlib/benz/include/picrin/pair.h @@ -18,7 +18,7 @@ struct pic_pair { #define pic_pair_p(v) (pic_type(v) == PIC_TT_PAIR) #define pic_pair_ptr(o) ((struct pic_pair *)pic_ptr(o)) -static inline pic_value +PIC_INLINE pic_value pic_car(pic_state *pic, pic_value obj) { struct pic_pair *pair; @@ -31,7 +31,7 @@ pic_car(pic_state *pic, pic_value obj) return pair->car; } -static inline pic_value +PIC_INLINE pic_value pic_cdr(pic_state *pic, pic_value obj) { struct pic_pair *pair; diff --git a/extlib/benz/include/picrin/util.h b/extlib/benz/include/picrin/util.h index 6f39b759..8e587e62 100644 --- a/extlib/benz/include/picrin/util.h +++ b/extlib/benz/include/picrin/util.h @@ -18,6 +18,14 @@ extern "C" { # define pic_noreturn #endif +#if __STDC_VERSION__ >= 199901L +# define PIC_INLINE static inline +#elif __GNUC__ || __clang__ +# define PIC_INLINE static __attribute__((unused)) +#else +# define PIC_INLINE static +#endif + #define PIC_FALLTHROUGH ((void)0) #define PIC_UNUSED(v) ((void)(v)) diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index b5dc84f5..21a3e54d 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -153,32 +153,32 @@ typedef struct pic_blob pic_blob; #define pic_test(v) (! pic_false_p(v)) -static inline enum pic_tt pic_type(pic_value); -static inline const char *pic_type_repr(enum pic_tt); +PIC_INLINE enum pic_tt pic_type(pic_value); +PIC_INLINE const char *pic_type_repr(enum pic_tt); #define pic_assert_type(pic, v, type) \ if (! pic_##type##_p(v)) { \ pic_errorf(pic, "expected " #type ", but got ~s", v); \ } -static inline bool pic_valid_int(double); +PIC_INLINE bool pic_valid_int(double); -static inline pic_value pic_nil_value(); -static inline pic_value pic_true_value(); -static inline pic_value pic_false_value(); -static inline pic_value pic_bool_value(bool); -static inline pic_value pic_undef_value(); -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_char_value(char c); -static inline pic_value pic_none_value(); +PIC_INLINE pic_value pic_nil_value(); +PIC_INLINE pic_value pic_true_value(); +PIC_INLINE pic_value pic_false_value(); +PIC_INLINE pic_value pic_bool_value(bool); +PIC_INLINE pic_value pic_undef_value(); +PIC_INLINE pic_value pic_obj_value(void *); +PIC_INLINE pic_value pic_float_value(double); +PIC_INLINE pic_value pic_int_value(int); +PIC_INLINE pic_value pic_size_value(size_t); +PIC_INLINE pic_value pic_char_value(char c); +PIC_INLINE pic_value pic_none_value(); -static inline bool pic_eq_p(pic_value, pic_value); -static inline bool pic_eqv_p(pic_value, pic_value); +PIC_INLINE bool pic_eq_p(pic_value, pic_value); +PIC_INLINE bool pic_eqv_p(pic_value, pic_value); -static inline enum pic_tt +PIC_INLINE enum pic_tt pic_type(pic_value v) { switch (pic_vtype(v)) { @@ -205,7 +205,7 @@ pic_type(pic_value v) PIC_UNREACHABLE(); } -static inline const char * +PIC_INLINE const char * pic_type_repr(enum pic_tt tt) { switch (tt) { @@ -257,13 +257,13 @@ pic_type_repr(enum pic_tt tt) PIC_UNREACHABLE(); } -static inline bool +PIC_INLINE bool pic_valid_int(double v) { return INT_MIN <= v && v <= INT_MAX; } -static inline pic_value +PIC_INLINE pic_value pic_nil_value() { pic_value v; @@ -272,7 +272,7 @@ pic_nil_value() return v; } -static inline pic_value +PIC_INLINE pic_value pic_true_value() { pic_value v; @@ -281,7 +281,7 @@ pic_true_value() return v; } -static inline pic_value +PIC_INLINE pic_value pic_false_value() { pic_value v; @@ -290,7 +290,7 @@ pic_false_value() return v; } -static inline pic_value +PIC_INLINE pic_value pic_bool_value(bool b) { pic_value v; @@ -299,7 +299,7 @@ pic_bool_value(bool b) return v; } -static inline pic_value +PIC_INLINE pic_value pic_size_value(size_t s) { if (sizeof(unsigned) < sizeof(size_t)) { @@ -312,7 +312,7 @@ pic_size_value(size_t s) #if PIC_NAN_BOXING -static inline pic_value +PIC_INLINE pic_value pic_obj_value(void *ptr) { pic_value v; @@ -322,7 +322,7 @@ pic_obj_value(void *ptr) return v; } -static inline pic_value +PIC_INLINE pic_value pic_float_value(double f) { union { double f; uint64_t i; } u; @@ -335,7 +335,7 @@ pic_float_value(double f) } } -static inline pic_value +PIC_INLINE pic_value pic_int_value(int i) { union { int i; unsigned u; } u; @@ -348,7 +348,7 @@ pic_int_value(int i) return v; } -static inline pic_value +PIC_INLINE pic_value pic_char_value(char c) { pic_value v; @@ -360,7 +360,7 @@ pic_char_value(char c) #else -static inline pic_value +PIC_INLINE pic_value pic_obj_value(void *ptr) { pic_value v; @@ -370,7 +370,7 @@ pic_obj_value(void *ptr) return v; } -static inline pic_value +PIC_INLINE pic_value pic_float_value(double f) { pic_value v; @@ -380,7 +380,7 @@ pic_float_value(double f) return v; } -static inline pic_value +PIC_INLINE pic_value pic_int_value(int i) { pic_value v; @@ -390,7 +390,7 @@ pic_int_value(int i) return v; } -static inline pic_value +PIC_INLINE pic_value pic_char_value(char c) { pic_value v; @@ -402,7 +402,7 @@ pic_char_value(char c) #endif -static inline pic_value +PIC_INLINE pic_value pic_undef_value() { pic_value v; @@ -411,7 +411,7 @@ pic_undef_value() return v; } -static inline pic_value +PIC_INLINE pic_value pic_none_value() { #if PIC_NONE_IS_FALSE @@ -423,13 +423,13 @@ pic_none_value() #if PIC_NAN_BOXING -static inline bool +PIC_INLINE bool pic_eq_p(pic_value x, pic_value y) { return x == y; } -static inline bool +PIC_INLINE bool pic_eqv_p(pic_value x, pic_value y) { return x == y; @@ -437,7 +437,7 @@ pic_eqv_p(pic_value x, pic_value y) #else -static inline bool +PIC_INLINE bool pic_eq_p(pic_value x, pic_value y) { if (pic_type(x) != pic_type(y)) @@ -453,7 +453,7 @@ pic_eq_p(pic_value x, pic_value y) } } -static inline bool +PIC_INLINE bool pic_eqv_p(pic_value x, pic_value y) { if (pic_type(x) != pic_type(y)) diff --git a/extlib/benz/include/picrin/xfile.h b/extlib/benz/include/picrin/xfile.h index 4c96a9f8..0633cfae 100644 --- a/extlib/benz/include/picrin/xfile.h +++ b/extlib/benz/include/picrin/xfile.h @@ -20,47 +20,47 @@ typedef struct { } xFILE; /* generic file constructor */ -static inline xFILE *xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(void *, const char *, int), long (*seek)(void *, long, int), int (*flush)(void *), int (*close)(void *)); +PIC_INLINE xFILE *xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(void *, const char *, int), long (*seek)(void *, long, int), int (*flush)(void *), int (*close)(void *)); /* resource aquisition */ -static inline xFILE *xfpopen(FILE *); -static inline xFILE *xmopen(); -static inline xFILE *xfopen(const char *, const char *); -static inline int xfclose(xFILE *); +PIC_INLINE xFILE *xfpopen(FILE *); +PIC_INLINE xFILE *xmopen(); +PIC_INLINE xFILE *xfopen(const char *, const char *); +PIC_INLINE int xfclose(xFILE *); /* buffer management */ -static inline int xfflush(xFILE *); +PIC_INLINE int xfflush(xFILE *); /* direct IO with buffering */ -static inline size_t xfread(void *, size_t, size_t, xFILE *); -static inline size_t xfwrite(const void *, size_t, size_t, xFILE *); +PIC_INLINE size_t xfread(void *, size_t, size_t, xFILE *); +PIC_INLINE size_t xfwrite(const void *, size_t, size_t, xFILE *); /* indicator positioning */ -static inline long xfseek(xFILE *, long offset, int whence); -static inline long xftell(xFILE *); -static inline void xrewind(xFILE *); +PIC_INLINE long xfseek(xFILE *, long offset, int whence); +PIC_INLINE long xftell(xFILE *); +PIC_INLINE void xrewind(xFILE *); /* stream status */ -static inline void xclearerr(xFILE *); -static inline int xfeof(xFILE *); -static inline int xferror(xFILE *); +PIC_INLINE void xclearerr(xFILE *); +PIC_INLINE int xfeof(xFILE *); +PIC_INLINE int xferror(xFILE *); /* character IO */ -static inline int xfgetc(xFILE *); -static inline char *xfgets(char *, int, xFILE *); -static inline int xfputc(int, xFILE *); -static inline int xfputs(const char *, xFILE *); -static inline int xgetc(xFILE *); -static inline int xgetchar(void); -static inline int xputc(int, xFILE *); -static inline int xputchar(int); -static inline int xputs(const char *); -static inline int xungetc(int, xFILE *); +PIC_INLINE int xfgetc(xFILE *); +PIC_INLINE char *xfgets(char *, int, xFILE *); +PIC_INLINE int xfputc(int, xFILE *); +PIC_INLINE int xfputs(const char *, xFILE *); +PIC_INLINE int xgetc(xFILE *); +PIC_INLINE int xgetchar(void); +PIC_INLINE int xputc(int, xFILE *); +PIC_INLINE int xputchar(int); +PIC_INLINE int xputs(const char *); +PIC_INLINE int xungetc(int, xFILE *); /* formatted I/O */ -static inline int xprintf(const char *, ...); -static inline int xfprintf(xFILE *, const char *, ...); -static inline int xvfprintf(xFILE *, const char *, va_list); +PIC_INLINE int xprintf(const char *, ...); +PIC_INLINE int xfprintf(xFILE *, const char *, ...); +PIC_INLINE int xvfprintf(xFILE *, const char *, va_list); /* standard I/O */ #define xstdin (xstdin_()) @@ -73,7 +73,7 @@ static inline int xvfprintf(xFILE *, const char *, va_list); #define XF_EOF 1 #define XF_ERR 2 -static inline xFILE * +PIC_INLINE xFILE * xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(void *, const char *, int), long (*seek)(void *, long, int), int (*flush)(void *), int (*close)(void *)) { xFILE *file; @@ -99,7 +99,7 @@ xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(void *, co * Derieved xFILE Classes */ -static inline int +PIC_INLINE int xf_file_read(void *cookie, char *ptr, int size) { FILE *file = cookie; @@ -115,7 +115,7 @@ xf_file_read(void *cookie, char *ptr, int size) return r; } -static inline int +PIC_INLINE int xf_file_write(void *cookie, const char *ptr, int size) { FILE *file = cookie; @@ -128,25 +128,25 @@ xf_file_write(void *cookie, const char *ptr, int size) return r; } -static inline long +PIC_INLINE long xf_file_seek(void *cookie, long pos, int whence) { return fseek(cookie, pos, whence); } -static inline int +PIC_INLINE int xf_file_flush(void *cookie) { return fflush(cookie); } -static inline int +PIC_INLINE int xf_file_close(void *cookie) { return fclose(cookie); } -static inline xFILE * +PIC_INLINE xFILE * xfpopen(FILE *fp) { xFILE *file; @@ -161,7 +161,7 @@ xfpopen(FILE *fp) #define XF_FILE_VTABLE xf_file_read, xf_file_write, xf_file_seek, xf_file_flush, xf_file_close -static inline xFILE * +PIC_INLINE xFILE * xstdin_() { static xFILE x = { -1, 0, { NULL, XF_FILE_VTABLE } }; @@ -172,7 +172,7 @@ xstdin_() return &x; } -static inline xFILE * +PIC_INLINE xFILE * xstdout_() { static xFILE x = { -1, 0, { NULL, XF_FILE_VTABLE } }; @@ -183,7 +183,7 @@ xstdout_() return &x; } -static inline xFILE * +PIC_INLINE xFILE * xstderr_() { static xFILE x = { -1, 0, { NULL, XF_FILE_VTABLE } }; @@ -199,7 +199,7 @@ struct xf_membuf { long pos, end, capa; }; -static inline int +PIC_INLINE int xf_mem_read(void *cookie, char *ptr, int size) { struct xf_membuf *mem; @@ -213,7 +213,7 @@ xf_mem_read(void *cookie, char *ptr, int size) return size; } -static inline int +PIC_INLINE int xf_mem_write(void *cookie, const char *ptr, int size) { struct xf_membuf *mem; @@ -231,7 +231,7 @@ xf_mem_write(void *cookie, const char *ptr, int size) return size; } -static inline long +PIC_INLINE long xf_mem_seek(void *cookie, long pos, int whence) { struct xf_membuf *mem; @@ -253,7 +253,7 @@ xf_mem_seek(void *cookie, long pos, int whence) return mem->pos; } -static inline int +PIC_INLINE int xf_mem_flush(void *cookie) { (void)cookie; @@ -261,7 +261,7 @@ xf_mem_flush(void *cookie) return 0; } -static inline int +PIC_INLINE int xf_mem_close(void *cookie) { struct xf_membuf *mem; @@ -272,7 +272,7 @@ xf_mem_close(void *cookie) return 0; } -static inline xFILE * +PIC_INLINE xFILE * xmopen() { struct xf_membuf *mem; @@ -288,7 +288,7 @@ xmopen() #undef XF_FILE_VTABLE -static inline xFILE * +PIC_INLINE xFILE * xfopen(const char *filename, const char *mode) { FILE *fp; @@ -307,7 +307,7 @@ xfopen(const char *filename, const char *mode) return file; } -static inline int +PIC_INLINE int xfclose(xFILE *file) { int r; @@ -321,13 +321,13 @@ xfclose(xFILE *file) return 0; } -static inline int +PIC_INLINE int xfflush(xFILE *file) { return file->vtable.flush(file->vtable.cookie); } -static inline size_t +PIC_INLINE size_t xfread(void *ptr, size_t block, size_t nitems, xFILE *file) { char *dst = (char *)ptr; @@ -362,7 +362,7 @@ xfread(void *ptr, size_t block, size_t nitems, xFILE *file) return i; } -static inline size_t +PIC_INLINE size_t xfwrite(const void *ptr, size_t block, size_t nitems, xFILE *file) { char *dst = (char *)ptr; @@ -386,44 +386,44 @@ xfwrite(const void *ptr, size_t block, size_t nitems, xFILE *file) return i; } -static inline long +PIC_INLINE long xfseek(xFILE *file, long offset, int whence) { file->ungot = -1; return file->vtable.seek(file->vtable.cookie, offset, whence); } -static inline long +PIC_INLINE long xftell(xFILE *file) { return xfseek(file, 0, SEEK_CUR); } -static inline void +PIC_INLINE void xrewind(xFILE *file) { xfseek(file, 0, SEEK_SET); } -static inline void +PIC_INLINE void xclearerr(xFILE *file) { file->flags = 0; } -static inline int +PIC_INLINE int xfeof(xFILE *file) { return file->flags & XF_EOF; } -static inline int +PIC_INLINE int xferror(xFILE *file) { return file->flags & XF_ERR; } -static inline int +PIC_INLINE int xfgetc(xFILE *file) { char buf[1]; @@ -437,13 +437,13 @@ xfgetc(xFILE *file) return buf[0]; } -static inline int +PIC_INLINE int xgetc(xFILE *file) { return xfgetc(file); } -static inline char * +PIC_INLINE char * xfgets(char *str, int size, xFILE *file) { int c = EOF, i; @@ -465,7 +465,7 @@ xfgets(char *str, int size, xFILE *file) return str; } -static inline int +PIC_INLINE int xungetc(int c, xFILE *file) { file->ungot = c; @@ -475,13 +475,13 @@ xungetc(int c, xFILE *file) return c; } -static inline int +PIC_INLINE int xgetchar(void) { return xfgetc(xstdin); } -static inline int +PIC_INLINE int xfputc(int c, xFILE *file) { char buf[1]; @@ -495,19 +495,19 @@ xfputc(int c, xFILE *file) return buf[0]; } -static inline int +PIC_INLINE int xputc(int c, xFILE *file) { return xfputc(c, file); } -static inline int +PIC_INLINE int xputchar(int c) { return xfputc(c, xstdout); } -static inline int +PIC_INLINE int xfputs(const char *str, xFILE *file) { size_t len; @@ -521,13 +521,13 @@ xfputs(const char *str, xFILE *file) return 0; } -static inline int +PIC_INLINE int xputs(const char *s) { return xfputs(s, xstdout); } -static inline int +PIC_INLINE int xprintf(const char *fmt, ...) { va_list ap; @@ -539,7 +539,7 @@ xprintf(const char *fmt, ...) return n; } -static inline int +PIC_INLINE int xfprintf(xFILE *stream, const char *fmt, ...) { va_list ap; @@ -551,7 +551,7 @@ xfprintf(xFILE *stream, const char *fmt, ...) return n; } -static inline int +PIC_INLINE int xvfprintf(xFILE *stream, const char *fmt, va_list ap) { va_list ap2; diff --git a/extlib/benz/include/picrin/xhash.h b/extlib/benz/include/picrin/xhash.h index 1dadc7ff..60e3847d 100644 --- a/extlib/benz/include/picrin/xhash.h +++ b/extlib/benz/include/picrin/xhash.h @@ -50,32 +50,32 @@ typedef struct xhash { */ /* string map */ -static inline void xh_init_str(xhash *x, size_t width); -static inline xh_entry *xh_get_str(xhash *x, const char *key); -static inline xh_entry *xh_put_str(xhash *x, const char *key, void *); -static inline void xh_del_str(xhash *x, const char *key); +PIC_INLINE void xh_init_str(xhash *x, size_t width); +PIC_INLINE xh_entry *xh_get_str(xhash *x, const char *key); +PIC_INLINE xh_entry *xh_put_str(xhash *x, const char *key, void *); +PIC_INLINE void xh_del_str(xhash *x, const char *key); /* object map */ -static inline void xh_init_ptr(xhash *x, size_t width); -static inline xh_entry *xh_get_ptr(xhash *x, const void *key); -static inline xh_entry *xh_put_ptr(xhash *x, const void *key, void *); -static inline void xh_del_ptr(xhash *x, const void *key); +PIC_INLINE void xh_init_ptr(xhash *x, size_t width); +PIC_INLINE xh_entry *xh_get_ptr(xhash *x, const void *key); +PIC_INLINE xh_entry *xh_put_ptr(xhash *x, const void *key, void *); +PIC_INLINE void xh_del_ptr(xhash *x, const void *key); /* int map */ -static inline void xh_init_int(xhash *x, size_t width); -static inline xh_entry *xh_get_int(xhash *x, int key); -static inline xh_entry *xh_put_int(xhash *x, int key, void *); -static inline void xh_del_int(xhash *x, int key); +PIC_INLINE void xh_init_int(xhash *x, size_t width); +PIC_INLINE xh_entry *xh_get_int(xhash *x, int key); +PIC_INLINE xh_entry *xh_put_int(xhash *x, int key, void *); +PIC_INLINE void xh_del_int(xhash *x, int key); -static inline size_t xh_size(xhash *x); -static inline void xh_clear(xhash *x); -static inline void xh_destroy(xhash *x); +PIC_INLINE size_t xh_size(xhash *x); +PIC_INLINE void xh_clear(xhash *x); +PIC_INLINE void xh_destroy(xhash *x); -static inline xh_entry *xh_begin(xhash *x); -static inline xh_entry *xh_next(xh_entry *e); +PIC_INLINE xh_entry *xh_begin(xhash *x); +PIC_INLINE xh_entry *xh_next(xh_entry *e); -static inline void +PIC_INLINE void xh_bucket_realloc(xhash *x, size_t newsize) { x->size = newsize; @@ -83,7 +83,7 @@ xh_bucket_realloc(xhash *x, size_t newsize) memset(x->buckets, 0, (x->size + 1) * sizeof(xh_entry *)); } -static inline void +PIC_INLINE void xh_init_(xhash *x, size_t kwidth, size_t vwidth, xh_hashf hashf, xh_equalf equalf, void *data) { x->size = 0; @@ -102,7 +102,7 @@ xh_init_(xhash *x, size_t kwidth, size_t vwidth, xh_hashf hashf, xh_equalf equal xh_bucket_realloc(x, XHASH_INIT_SIZE); } -static inline xh_entry * +PIC_INLINE xh_entry * xh_get_(xhash *x, const void *key) { int hash; @@ -118,7 +118,7 @@ xh_get_(xhash *x, const void *key) return e; } -static inline void +PIC_INLINE void xh_resize_(xhash *x, size_t newsize) { xhash y; @@ -145,7 +145,7 @@ xh_resize_(xhash *x, size_t newsize) memcpy(x, &y, sizeof(xhash)); } -static inline xh_entry * +PIC_INLINE xh_entry * xh_put_(xhash *x, const void *key, void *val) { int hash; @@ -186,7 +186,7 @@ xh_put_(xhash *x, const void *key, void *val) return x->buckets[idx] = e; } -static inline void +PIC_INLINE void xh_del_(xhash *x, const void *key) { int hash; @@ -235,13 +235,13 @@ xh_del_(xhash *x, const void *key) x->count--; } -static inline size_t +PIC_INLINE size_t xh_size(xhash *x) { return x->count; } -static inline void +PIC_INLINE void xh_clear(xhash *x) { size_t i; @@ -261,7 +261,7 @@ xh_clear(xhash *x) x->count = 0; } -static inline void +PIC_INLINE void xh_destroy(xhash *x) { xh_clear(x); @@ -270,7 +270,7 @@ xh_destroy(xhash *x) /* string map */ -static inline int +PIC_INLINE int xh_str_hash(const void *key, void *data) { const char *str = *(const char **)key; @@ -284,7 +284,7 @@ xh_str_hash(const void *key, void *data) return hash; } -static inline int +PIC_INLINE int xh_str_equal(const void *key1, const void *key2, void *data) { (void)data; @@ -292,25 +292,25 @@ xh_str_equal(const void *key1, const void *key2, void *data) return strcmp(*(const char **)key1, *(const char **)key2) == 0; } -static inline void +PIC_INLINE void xh_init_str(xhash *x, size_t width) { xh_init_(x, sizeof(const char *), width, xh_str_hash, xh_str_equal, NULL); } -static inline xh_entry * +PIC_INLINE xh_entry * xh_get_str(xhash *x, const char *key) { return xh_get_(x, &key); } -static inline xh_entry * +PIC_INLINE xh_entry * xh_put_str(xhash *x, const char *key, void *val) { return xh_put_(x, &key, val); } -static inline void +PIC_INLINE void xh_del_str(xhash *x, const char *key) { xh_del_(x, &key); @@ -318,7 +318,7 @@ xh_del_str(xhash *x, const char *key) /* object map */ -static inline int +PIC_INLINE int xh_ptr_hash(const void *key, void *data) { (void)data; @@ -326,7 +326,7 @@ xh_ptr_hash(const void *key, void *data) return (int)(size_t)*(const void **)key; } -static inline int +PIC_INLINE int xh_ptr_equal(const void *key1, const void *key2, void *data) { (void) data; @@ -334,25 +334,25 @@ xh_ptr_equal(const void *key1, const void *key2, void *data) return *(const void **)key1 == *(const void **)key2; } -static inline void +PIC_INLINE void xh_init_ptr(xhash *x, size_t width) { xh_init_(x, sizeof(const void *), width, xh_ptr_hash, xh_ptr_equal, NULL); } -static inline xh_entry * +PIC_INLINE xh_entry * xh_get_ptr(xhash *x, const void *key) { return xh_get_(x, &key); } -static inline xh_entry * +PIC_INLINE xh_entry * xh_put_ptr(xhash *x, const void *key, void *val) { return xh_put_(x, &key, val); } -static inline void +PIC_INLINE void xh_del_ptr(xhash *x, const void *key) { xh_del_(x, &key); @@ -360,7 +360,7 @@ xh_del_ptr(xhash *x, const void *key) /* int map */ -static inline int +PIC_INLINE int xh_int_hash(const void *key, void *data) { (void)data; @@ -368,7 +368,7 @@ xh_int_hash(const void *key, void *data) return *(int *)key; } -static inline int +PIC_INLINE int xh_int_equal(const void *key1, const void *key2, void *data) { (void)data; @@ -376,25 +376,25 @@ xh_int_equal(const void *key1, const void *key2, void *data) return *(int *)key1 == *(int *)key2; } -static inline void +PIC_INLINE void xh_init_int(xhash *x, size_t width) { xh_init_(x, sizeof(int), width, xh_int_hash, xh_int_equal, NULL); } -static inline xh_entry * +PIC_INLINE xh_entry * xh_get_int(xhash *x, int key) { return xh_get_(x, &key); } -static inline xh_entry * +PIC_INLINE xh_entry * xh_put_int(xhash *x, int key, void *val) { return xh_put_(x, &key, val); } -static inline void +PIC_INLINE void xh_del_int(xhash *x, int key) { xh_del_(x, &key); @@ -402,13 +402,13 @@ xh_del_int(xhash *x, int key) /** iteration */ -static inline xh_entry * +PIC_INLINE xh_entry * xh_begin(xhash *x) { return x->head; } -static inline xh_entry * +PIC_INLINE xh_entry * xh_next(xh_entry *e) { return e->bw; diff --git a/extlib/benz/include/picrin/xrope.h b/extlib/benz/include/picrin/xrope.h index 20199b85..fcdeb446 100644 --- a/extlib/benz/include/picrin/xrope.h +++ b/extlib/benz/include/picrin/xrope.h @@ -20,19 +20,19 @@ typedef struct xrope xrope; #define xr_new(cstr) xr_new_cstr(cstr, strlen(cstr)) #define xr_new_lit(cstr) xr_new_cstr(cstr, sizeof(cstr) - 1) -static inline xrope *xr_new_cstr(const char *, size_t); -static inline xrope *xr_new_imbed(const char *, size_t); -static inline xrope *xr_new_move(const char *, size_t); -static inline xrope *xr_new_copy(const char *, size_t); +PIC_INLINE xrope *xr_new_cstr(const char *, size_t); +PIC_INLINE xrope *xr_new_imbed(const char *, size_t); +PIC_INLINE xrope *xr_new_move(const char *, size_t); +PIC_INLINE xrope *xr_new_copy(const char *, size_t); -static inline void XROPE_INCREF(xrope *); -static inline void XROPE_DECREF(xrope *); +PIC_INLINE void XROPE_INCREF(xrope *); +PIC_INLINE void XROPE_DECREF(xrope *); -static inline size_t xr_len(xrope *); -static inline char xr_at(xrope *, size_t); -static inline xrope *xr_cat(xrope *, xrope *); -static inline xrope *xr_sub(xrope *, size_t, size_t); -static inline const char *xr_cstr(xrope *); /* returns NULL-terminated string */ +PIC_INLINE size_t xr_len(xrope *); +PIC_INLINE char xr_at(xrope *, size_t); +PIC_INLINE xrope *xr_cat(xrope *, xrope *); +PIC_INLINE xrope *xr_sub(xrope *, size_t, size_t); +PIC_INLINE const char *xr_cstr(xrope *); /* returns NULL-terminated string */ /* impl */ @@ -65,12 +65,12 @@ struct xrope { struct xrope *left, *right; }; -static inline void +PIC_INLINE void XROPE_INCREF(xrope *x) { x->refcnt++; } -static inline void +PIC_INLINE void XROPE_DECREF(xrope *x) { if (! --x->refcnt) { if (x->chunk) { @@ -84,7 +84,7 @@ XROPE_DECREF(xrope *x) { } } -static inline xrope * +PIC_INLINE xrope * xr_new_cstr(const char *cstr, size_t len) { xr_chunk *c; @@ -108,7 +108,7 @@ xr_new_cstr(const char *cstr, size_t len) return x; } -static inline xrope * +PIC_INLINE xrope * xr_new_imbed(const char *str, size_t len) { xr_chunk *c; @@ -132,7 +132,7 @@ xr_new_imbed(const char *str, size_t len) return x; } -static inline xrope * +PIC_INLINE xrope * xr_new_move(const char *cstr, size_t len) { xr_chunk *c; @@ -156,7 +156,7 @@ xr_new_move(const char *cstr, size_t len) return x; } -static inline xrope * +PIC_INLINE xrope * xr_new_copy(const char *str, size_t len) { char *buf; @@ -185,13 +185,13 @@ xr_new_copy(const char *str, size_t len) return x; } -static inline size_t +PIC_INLINE size_t xr_len(xrope *x) { return x->weight; } -static inline char +PIC_INLINE char xr_at(xrope *x, size_t i) { if (x->weight <= i) { @@ -205,7 +205,7 @@ xr_at(xrope *x, size_t i) : xr_at(x->right, i - x->left->weight); } -static inline xrope * +PIC_INLINE xrope * xr_cat(xrope *x, xrope *y) { xrope *z; @@ -224,7 +224,7 @@ xr_cat(xrope *x, xrope *y) return z; } -static inline struct xrope * +PIC_INLINE struct xrope * xr_sub(xrope *x, size_t i, size_t j) { assert(i <= j); @@ -271,7 +271,7 @@ xr_sub(xrope *x, size_t i, size_t j) } } -static inline void +PIC_INLINE void xr_fold(xrope *x, xr_chunk *c, size_t offset) { if (x->chunk) { @@ -294,7 +294,7 @@ xr_fold(xrope *x, xr_chunk *c, size_t offset) XR_CHUNK_INCREF(c); } -static inline const char * +PIC_INLINE const char * xr_cstr(xrope *x) { xr_chunk *c; From 1e8f49872e8a64b5f2fa8bb8a9f51865ecb66f42 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 12:22:38 +0900 Subject: [PATCH 050/177] s/pic_noreturn/PIC_NORETURN/g --- contrib/03.callcc/callcc.c | 4 ++-- contrib/03.file/src/file.c | 2 +- extlib/benz/include/picrin.h | 4 ++-- extlib/benz/include/picrin/error.h | 6 +++--- extlib/benz/include/picrin/util.h | 6 +++--- extlib/benz/read.c | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index fef68f77..8342f0f2 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -161,7 +161,7 @@ native_stack_extend(pic_state *pic, struct pic_cont *cont) restore_cont(pic, cont); } -pic_noreturn static void +PIC_NORETURN static void restore_cont(pic_state *pic, struct pic_cont *cont) { char v; @@ -203,7 +203,7 @@ restore_cont(pic_state *pic, struct pic_cont *cont) longjmp(tmp->jmp, 1); } -pic_noreturn static pic_value +PIC_NORETURN static pic_value cont_call(pic_state *pic) { struct pic_proc *proc; diff --git a/contrib/03.file/src/file.c b/contrib/03.file/src/file.c index e3aa1739..8efd2a77 100644 --- a/contrib/03.file/src/file.c +++ b/contrib/03.file/src/file.c @@ -6,7 +6,7 @@ #include "picrin/port.h" #include "picrin/error.h" -pic_noreturn static void +PIC_NORETURN static void file_error(pic_state *pic, const char *msg) { pic_throw(pic, pic->sFILE, msg, pic_nil_value()); diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 7c2cf41c..c5980e73 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -220,8 +220,8 @@ void pic_import(pic_state *, pic_value); void pic_import_library(pic_state *, struct pic_lib *); 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 *, ...); +PIC_NORETURN void pic_panic(pic_state *, const char *); +PIC_NORETURN void pic_errorf(pic_state *, const char *, ...); void pic_warnf(pic_state *, const char *, ...); const char *pic_errmsg(pic_state *); pic_str *pic_get_backtrace(pic_state *); diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index 819c077e..9a290bae 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -51,9 +51,9 @@ void pic_push_try(pic_state *, struct pic_escape *); 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_error(pic_state *, const char *, pic_list); +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_error(pic_state *, const char *, pic_list); #if defined(__cplusplus) } diff --git a/extlib/benz/include/picrin/util.h b/extlib/benz/include/picrin/util.h index 8e587e62..2b69b206 100644 --- a/extlib/benz/include/picrin/util.h +++ b/extlib/benz/include/picrin/util.h @@ -11,11 +11,11 @@ extern "C" { #if __STDC_VERSION__ >= 201112L # include -# define pic_noreturn noreturn +# define PIC_NORETURN noreturn #elif __GNUC__ || __clang__ -# define pic_noreturn __attribute__((noreturn)) +# define PIC_NORETURN __attribute__((noreturn)) #else -# define pic_noreturn +# define PIC_NORETURN #endif #if __STDC_VERSION__ >= 199901L diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 5644e739..95f5011f 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -16,7 +16,7 @@ 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); -pic_noreturn static void +PIC_NORETURN static void read_error(pic_state *pic, const char *msg) { pic_throw(pic, pic->sREAD, msg, pic_nil_value()); From f96579805cb0c483c261612352e31d633f23a668 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 12:29:29 +0900 Subject: [PATCH 051/177] reserve square brackets --- extlib/benz/read.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 95f5011f..eeef81f2 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -534,8 +534,7 @@ read_blob(pic_state *pic, struct pic_port *port, int c) static pic_value read_pair(pic_state *pic, struct pic_port *port, int c) { - const int tOPEN = c; - const int tCLOSE = (c == '(') ? ')' : ']'; + static const int tCLOSE = ')'; pic_value car, cdr; retry: @@ -564,7 +563,7 @@ read_pair(pic_state *pic, struct pic_port *port, int c) goto retry; } - cdr = read_pair(pic, port, tOPEN); + cdr = read_pair(pic, port, '('); return pic_cons(pic, car, cdr); } } @@ -586,7 +585,7 @@ read_label_set(pic_state *pic, struct pic_port *port, int i) int c; switch ((c = skip(port, ' '))) { - case '(': case '[': + case '(': { pic_value tmp; @@ -749,7 +748,6 @@ reader_table_init(struct pic_reader *reader) reader->table['+'] = read_plus; reader->table['-'] = read_minus; reader->table['('] = read_pair; - reader->table['['] = read_pair; reader->table['#'] = read_dispatch; /* read number */ From 336fc21761be50da62c026213a450ebddcf2a248 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 14:31:36 +0900 Subject: [PATCH 052/177] merge init.c into state.c --- extlib/benz/init.c | 140 -------------------------------------------- extlib/benz/state.c | 133 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 132 insertions(+), 141 deletions(-) delete mode 100644 extlib/benz/init.c diff --git a/extlib/benz/init.c b/extlib/benz/init.c deleted file mode 100644 index 68a58484..00000000 --- a/extlib/benz/init.c +++ /dev/null @@ -1,140 +0,0 @@ -/** - * See Copyright Notice in picrin.h - */ - -#include "picrin.h" -#include "picrin/pair.h" -#include "picrin/lib.h" -#include "picrin/macro.h" -#include "picrin/error.h" - -void -pic_add_feature(pic_state *pic, const char *feature) -{ - pic_push(pic, pic_obj_value(pic_intern_cstr(pic, feature)), pic->features); -} - -void pic_init_bool(pic_state *); -void pic_init_pair(pic_state *); -void pic_init_port(pic_state *); -void pic_init_number(pic_state *); -void pic_init_proc(pic_state *); -void pic_init_symbol(pic_state *); -void pic_init_vector(pic_state *); -void pic_init_blob(pic_state *); -void pic_init_cont(pic_state *); -void pic_init_char(pic_state *); -void pic_init_error(pic_state *); -void pic_init_str(pic_state *); -void pic_init_macro(pic_state *); -void pic_init_var(pic_state *); -void pic_init_write(pic_state *); -void pic_init_read(pic_state *); -void pic_init_dict(pic_state *); -void pic_init_record(pic_state *); -void pic_init_eval(pic_state *); -void pic_init_lib(pic_state *); -void pic_init_attr(pic_state *); - -extern const char pic_boot[]; - -static void -pic_init_features(pic_state *pic) -{ - pic_add_feature(pic, "picrin"); - pic_add_feature(pic, "ieee-float"); - -#if _POSIX_SOURCE - pic_add_feature(pic, "posix"); -#endif - -#if _WIN32 - pic_add_feature(pic, "windows"); -#endif - -#if __unix__ - pic_add_feature(pic, "unix"); -#endif -#if __gnu_linux__ - pic_add_feature(pic, "gnu-linux"); -#endif -#if __FreeBSD__ - pic_add_feature(pic, "freebsd"); -#endif - -#if __i386__ - pic_add_feature(pic, "i386"); -#elif __x86_64__ - pic_add_feature(pic, "x86-64"); -#elif __ppc__ - pic_add_feature(pic, "ppc"); -#elif __sparc__ - pic_add_feature(pic, "sparc"); -#endif - -#if __ILP32__ - pic_add_feature(pic, "ilp32"); -#elif __LP64__ - pic_add_feature(pic, "lp64"); -#endif - -#if defined(__BYTE_ORDER__) -# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - pic_add_feature(pic, "little-endian"); -# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ - pic_add_feature(pic, "big-endian"); -# endif -#else -# if __LITTLE_ENDIAN__ - pic_add_feature(pic, "little-endian"); -# elif __BIG_ENDIAN__ - pic_add_feature(pic, "big-endian"); -# endif -#endif -} - -#define DONE pic_gc_arena_restore(pic, ai); - -void -pic_init_core(pic_state *pic) -{ - size_t ai = pic_gc_arena_preserve(pic); - - pic_init_features(pic); - - pic_deflibrary (pic, "(picrin base)") { - pic_define_syntactic_keyword(pic, pic->lib->env, pic->sDEFINE, pic->rDEFINE); - pic_define_syntactic_keyword(pic, pic->lib->env, pic->sSETBANG, pic->rSETBANG); - pic_define_syntactic_keyword(pic, pic->lib->env, pic->sQUOTE, pic->rQUOTE); - pic_define_syntactic_keyword(pic, pic->lib->env, pic->sLAMBDA, pic->rLAMBDA); - pic_define_syntactic_keyword(pic, pic->lib->env, pic->sIF, pic->rIF); - pic_define_syntactic_keyword(pic, pic->lib->env, pic->sBEGIN, pic->rBEGIN); - pic_define_syntactic_keyword(pic, pic->lib->env, pic->sDEFINE_SYNTAX, pic->rDEFINE_SYNTAX); - - pic_init_bool(pic); DONE; - pic_init_pair(pic); DONE; - pic_init_port(pic); DONE; - pic_init_number(pic); DONE; - pic_init_proc(pic); DONE; - pic_init_symbol(pic); DONE; - pic_init_vector(pic); DONE; - pic_init_blob(pic); DONE; - pic_init_cont(pic); DONE; - pic_init_char(pic); DONE; - pic_init_error(pic); DONE; - pic_init_str(pic); DONE; - pic_init_macro(pic); DONE; - pic_init_var(pic); DONE; - pic_init_write(pic); DONE; - pic_init_read(pic); DONE; - pic_init_dict(pic); DONE; - pic_init_record(pic); DONE; - pic_init_eval(pic); DONE; - pic_init_lib(pic); DONE; - pic_init_attr(pic); DONE; - - pic_load_cstr(pic, pic_boot); - } - - pic_import_library(pic, pic->PICRIN_BASE); -} diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 18b8e438..3c74f4f4 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -11,8 +11,139 @@ #include "picrin/port.h" #include "picrin/error.h" #include "picrin/dict.h" +#include "picrin/pair.h" +#include "picrin/lib.h" -void pic_init_core(pic_state *); +void +pic_add_feature(pic_state *pic, const char *feature) +{ + pic_push(pic, pic_obj_value(pic_intern_cstr(pic, feature)), pic->features); +} + +void pic_init_bool(pic_state *); +void pic_init_pair(pic_state *); +void pic_init_port(pic_state *); +void pic_init_number(pic_state *); +void pic_init_proc(pic_state *); +void pic_init_symbol(pic_state *); +void pic_init_vector(pic_state *); +void pic_init_blob(pic_state *); +void pic_init_cont(pic_state *); +void pic_init_char(pic_state *); +void pic_init_error(pic_state *); +void pic_init_str(pic_state *); +void pic_init_macro(pic_state *); +void pic_init_var(pic_state *); +void pic_init_write(pic_state *); +void pic_init_read(pic_state *); +void pic_init_dict(pic_state *); +void pic_init_record(pic_state *); +void pic_init_eval(pic_state *); +void pic_init_lib(pic_state *); +void pic_init_attr(pic_state *); + +extern const char pic_boot[]; + +static void +pic_init_features(pic_state *pic) +{ + pic_add_feature(pic, "picrin"); + pic_add_feature(pic, "ieee-float"); + +#if _POSIX_SOURCE + pic_add_feature(pic, "posix"); +#endif + +#if _WIN32 + pic_add_feature(pic, "windows"); +#endif + +#if __unix__ + pic_add_feature(pic, "unix"); +#endif +#if __gnu_linux__ + pic_add_feature(pic, "gnu-linux"); +#endif +#if __FreeBSD__ + pic_add_feature(pic, "freebsd"); +#endif + +#if __i386__ + pic_add_feature(pic, "i386"); +#elif __x86_64__ + pic_add_feature(pic, "x86-64"); +#elif __ppc__ + pic_add_feature(pic, "ppc"); +#elif __sparc__ + pic_add_feature(pic, "sparc"); +#endif + +#if __ILP32__ + pic_add_feature(pic, "ilp32"); +#elif __LP64__ + pic_add_feature(pic, "lp64"); +#endif + +#if defined(__BYTE_ORDER__) +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + pic_add_feature(pic, "little-endian"); +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + pic_add_feature(pic, "big-endian"); +# endif +#else +# if __LITTLE_ENDIAN__ + pic_add_feature(pic, "little-endian"); +# elif __BIG_ENDIAN__ + pic_add_feature(pic, "big-endian"); +# endif +#endif +} + +#define DONE pic_gc_arena_restore(pic, ai); + +static void +pic_init_core(pic_state *pic) +{ + size_t ai = pic_gc_arena_preserve(pic); + + pic_init_features(pic); + + pic_deflibrary (pic, "(picrin base)") { + pic_define_syntactic_keyword(pic, pic->lib->env, pic->sDEFINE, pic->rDEFINE); + pic_define_syntactic_keyword(pic, pic->lib->env, pic->sSETBANG, pic->rSETBANG); + pic_define_syntactic_keyword(pic, pic->lib->env, pic->sQUOTE, pic->rQUOTE); + pic_define_syntactic_keyword(pic, pic->lib->env, pic->sLAMBDA, pic->rLAMBDA); + pic_define_syntactic_keyword(pic, pic->lib->env, pic->sIF, pic->rIF); + pic_define_syntactic_keyword(pic, pic->lib->env, pic->sBEGIN, pic->rBEGIN); + pic_define_syntactic_keyword(pic, pic->lib->env, pic->sDEFINE_SYNTAX, pic->rDEFINE_SYNTAX); + + pic_init_bool(pic); DONE; + pic_init_pair(pic); DONE; + pic_init_port(pic); DONE; + pic_init_number(pic); DONE; + pic_init_proc(pic); DONE; + pic_init_symbol(pic); DONE; + pic_init_vector(pic); DONE; + pic_init_blob(pic); DONE; + pic_init_cont(pic); DONE; + pic_init_char(pic); DONE; + pic_init_error(pic); DONE; + pic_init_str(pic); DONE; + pic_init_macro(pic); DONE; + pic_init_var(pic); DONE; + pic_init_write(pic); DONE; + pic_init_read(pic); DONE; + pic_init_dict(pic); DONE; + pic_init_record(pic); DONE; + pic_init_eval(pic); DONE; + pic_init_lib(pic); DONE; + pic_init_attr(pic); DONE; + + pic_load_cstr(pic, pic_boot); + } + + pic_import_library(pic, pic->PICRIN_BASE); +} pic_state * pic_open(int argc, char *argv[], char **envp) From 303041abc594bae2b88270428fc800a6e3567b80 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 14:33:48 +0900 Subject: [PATCH 053/177] fix degade --- extlib/benz/read.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index eeef81f2..8e2f2c01 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -79,6 +79,15 @@ strcaseeq(const char *s1, const char *s2) return a == b; } +static int +case_fold(pic_state *pic, int c) +{ + if (pic->reader->typecase == PIC_CASE_FOLD) { + c = tolower(c); + } + return c; +} + static pic_value read_comment(pic_state *pic, struct pic_port *port, int c) { @@ -198,17 +207,14 @@ read_symbol(pic_state *pic, struct pic_port *port, int c) len = 1; buf = pic_alloc(pic, len + 1); - buf[0] = c; + buf[0] = case_fold(pic, c); buf[1] = 0; while (! isdelim(peek(port))) { c = next(port); - if (pic->reader->typecase == PIC_CASE_FOLD) { - c = tolower(c); - } len += 1; buf = pic_realloc(pic, buf, len + 1); - buf[len - 1] = c; + buf[len - 1] = case_fold(pic, c); buf[len] = 0; } From 4972de640fae81de5b8b9786c27b4399917749a6 Mon Sep 17 00:00:00 2001 From: zeptometer Date: Mon, 26 Jan 2015 15:03:04 +0900 Subject: [PATCH 054/177] rename benz's call/cc to escape in (picrin control) --- contrib/03.callcc/callcc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index 8342f0f2..f516e8c7 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -287,6 +287,10 @@ pic_callcc_callcc(pic_state *pic) void pic_init_callcc(pic_state *pic) { + pic_deflibrary (pic, "(picrin control)") { + pic_define(pic, "escape", pic_ref(pic, pic->PICRIN_BASE, "call-with-current-continuation")); + } + pic_deflibrary (pic, "(scheme base)") { pic_redefun(pic, pic->PICRIN_BASE, "call-with-current-continuation", pic_callcc_callcc); pic_redefun(pic, pic->PICRIN_BASE, "call/cc", pic_callcc_callcc); From 9417b45005e17ea9d7d000daff4df90e58fd383b Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 15:10:26 +0900 Subject: [PATCH 055/177] [bugfix] pic_load_point must store escape->results --- extlib/benz/cont.c | 1 + 1 file changed, 1 insertion(+) diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 17587e95..391e766e 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -99,6 +99,7 @@ escape_call(pic_state *pic) pic_get_args(pic, "*", &argc, &argv); e = pic_data_ptr(pic_attr_ref(pic, pic_obj_value(pic_get_proc(pic)), "@@escape")); + ((struct pic_escape *)e->data)->results = pic_list_by_array(pic, argc, argv); pic_load_point(pic, e->data); From b2a539fb69f9b403702a4de23643d422b8cc601d Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 15:25:40 +0900 Subject: [PATCH 056/177] update error message --- extlib/benz/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 0c82bdff..4e84c299 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -912,7 +912,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) if (ci->argc != irep->argc) { if (! (irep->varg && ci->argc >= irep->argc)) { - pic_errorf(pic, "wrong number of arguments (%d for %d%s)", ci->argc - 1, irep->argc - 1, (irep->varg ? "+" : "")); + pic_errorf(pic, "wrong number of arguments (%d for %s%d)", ci->argc - 1, (irep->varg ? "at least " : ""), irep->argc - 1); } } /* prepare rest args */ From 781f27dd4800bb8b42fa7ef206f41da8e230bc43 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 15:41:15 +0900 Subject: [PATCH 057/177] remove docs/contrib.rst --- docs/contrib.rst | 141 ----------------------------------------------- 1 file changed, 141 deletions(-) delete mode 100644 docs/contrib.rst diff --git a/docs/contrib.rst b/docs/contrib.rst deleted file mode 100644 index be9e7ef4..00000000 --- a/docs/contrib.rst +++ /dev/null @@ -1,141 +0,0 @@ -Contrib Libraries (a.k.a nitros) -================================ - -Scheme standard libraries -------------------------- - -- (scheme write) -- (scheme cxr) -- (scheme file) -- (scheme inexact) -- (scheme time) -- (scheme process-context) -- (scheme load) -- (scheme lazy) - -(picrin control) ----------------- - -Delimited control operators. - -- **(reset h)** -- **(shift k)** - -(picrin pretty-print) ---------------------- - -Pretty-printer. - -- **(pretty-print obj)** - - Prints obj with human-readable indention to current-output-port. - - -(picrin regexp) ---------------- - -- **(regexp ptrn [flags])** - - Compiles pattern string into a regexp object. A string flags may contain any of #\g, #\i, #\m. - -- **(regexp? obj)** - - Judges if obj is a regexp object or not. - -- **(regexp-match re input)** - - Returns two values: a list of match strings, and a list of match indeces. - -- **(regexp-replace re input txt)** -- **(regexp-split re input)** - - -SRFI libraries --------------- - -- `(srfi 1) - `_ - - List library. - -- `(srfi 8) - `_ - - ``receive`` macro. - -- `(srfi 17) - `_ - - Generalized set! - -- `(srfi 26) - `_ - - Cut/cute macros. - -- `(srfi 43) - `_ - - Vector library. - -- `(srfi 60) - `_ - - Bitwise operations. - -- `(srfi 95) - `_ - - Sorting and Marging. - -- `(srfi 111) - `_ - - Boxes - -(picrin control list) ---------------------- - -Monadic list operators. - -The triple of for/in/yield enables you to write a list operation in a very easy and simple code. One of the best examples is list composition:: - - (for (let ((a (in '(1 2 3))) - (b (in '(2 3 4)))) - (yield (+ a b)))) - - ;=> (5 6 7 6 7 8 7 8 9) - -All monadic operations are done in *for* macro. In this example, *in* operators choose an element from the given lists, a and b are bound here, then *yielding* the sum of them. Because a and b are values moving around in the list elements, the expression (+ a b) can become every possible result. *yield* operator is a operator that gathers the possibilities into a list, so *for* macro returns a list of 3 * 3 results in total. Since expression inside *for* macro is a normal expression, you can write everything that you can write elsewhere. The code below has perfectly the same effect to above one:: - - (for (yield (+ (in '(1 2 3)) - (in '(4 5 6))))) - -The second best exmaple is filtering. In the next case, we show that you can do something depending on the condition of chosen elements:: - - (for (let ((x (in (iota 10)))) - (if (even? x) - (yield x) - (null)))) - - ;=> (0 2 4 6 8) - -This expression is equivalent to ``(filter even? (iota 10))`` but it is more procedual and non-magical. - -- **(for expr)** - - [Macro] Executes expr in a list monad context. - -- **(in list)** - - Choose a value from list. *in* function must only appear in *for* macro. The delimited continuation from the position of *in* function to the outside *for* macro is executed for each element in list. If list contains no values, that is ``(in '())``, the continuation is discarded. - -- **(yield value)** - - Yields value from the monad context. The result of *for* will be a list of yielded values. - -- **(null . value)** - - Returns ``()`` whatever value is given. The identity element of list composition. This operator corresponds to Haskell's fail method of Monad class. - - From 58f856a3e9b3fa596c87e58db220c9c0befc0eda Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 15:41:38 +0900 Subject: [PATCH 058/177] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d13a2485..7e3e70a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ build/* src/load_piclib.c src/init_contrib.c +docs/contrib.rst .dir-locals.el GPATH GRTAGS From 369bc4c944494ff376b7b63f4f89ffff03657337 Mon Sep 17 00:00:00 2001 From: zeptometer Date: Mon, 26 Jan 2015 15:42:46 +0900 Subject: [PATCH 059/177] add eest for escape --- t/escape.scm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 t/escape.scm diff --git a/t/escape.scm b/t/escape.scm new file mode 100644 index 00000000..8f495a95 --- /dev/null +++ b/t/escape.scm @@ -0,0 +1,16 @@ +(import (scheme base) + (picrin control) + (picrin test)) + +(test-begin) + +(test 1 (escape (lambda (exit) (begin (exit 1) 2)))) + +(define cont #f) + +(test "calling dead escape continuation" + (guard (c ((error-object? c) (error-object-message c))) + (escape (lambda (exit) (set! cont exit))) + (cont 3))) + +(test-end) From 7d772fc904944e678f5087bd0de018c777b42005 Mon Sep 17 00:00:00 2001 From: zeptometer Date: Mon, 26 Jan 2015 15:46:19 +0900 Subject: [PATCH 060/177] add document for escape --- contrib/10.partcont/docs/doc.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/10.partcont/docs/doc.rst b/contrib/10.partcont/docs/doc.rst index 08355948..78b5945f 100644 --- a/contrib/10.partcont/docs/doc.rst +++ b/contrib/10.partcont/docs/doc.rst @@ -6,3 +6,6 @@ Delimited control operators. - **(reset h)** - **(shift k)** +Escape Continuation + +- **(escape f)** From e49f9836f67cd65776eb4bfa5710c68b3ad8560c Mon Sep 17 00:00:00 2001 From: zeptometer Date: Mon, 26 Jan 2015 16:03:34 +0900 Subject: [PATCH 061/177] use escape instead of call/cc in syntax-rules.scm --- piclib/picrin/syntax-rules.scm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/piclib/picrin/syntax-rules.scm b/piclib/picrin/syntax-rules.scm index 59d2b8e9..6eeef05b 100644 --- a/piclib/picrin/syntax-rules.scm +++ b/piclib/picrin/syntax-rules.scm @@ -1,5 +1,6 @@ (define-library (picrin syntax-rules) (import (picrin base) + (picrin control) (picrin macro)) (define-syntax define-auxiliary-syntax @@ -74,7 +75,7 @@ (define _unquote (r 'unquote)) (define _unquote-splicing (r 'unquote-splicing)) (define _syntax-error (r 'syntax-error)) - (define _call/cc (r 'call/cc)) + (define _escape (r 'escape)) (define _er-macro-transformer (r 'er-macro-transformer)) (define (var->sym v) @@ -303,7 +304,7 @@ (match (list-ref (car clauses) 1)) (expand (list-ref (car clauses) 2))) `(,_let ,(map (lambda (v) (list (var->sym v) '())) vars) - (,_let ((result (,_call/cc (,_lambda (exit) ,match)))) + (,_let ((result (,_escape (,_lambda (exit) ,match)))) (,_if result ,expand ,(expand-clauses (cdr clauses) rename)))))))) From dab403a0650ef7b4d9b55183ca19de4d71d2c4e2 Mon Sep 17 00:00:00 2001 From: zeptometer Date: Mon, 26 Jan 2015 16:14:59 +0900 Subject: [PATCH 062/177] fix document --- contrib/10.partcont/docs/doc.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/10.partcont/docs/doc.rst b/contrib/10.partcont/docs/doc.rst index 78b5945f..d1b1decc 100644 --- a/contrib/10.partcont/docs/doc.rst +++ b/contrib/10.partcont/docs/doc.rst @@ -9,3 +9,4 @@ Delimited control operators. Escape Continuation - **(escape f)** + From be29b69c0c43823aaada0581d20af5f963065b16 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 22:50:26 +0900 Subject: [PATCH 063/177] don't require c99 --- CMakeLists.txt | 8 +++----- extlib/benz/include/picrin/config.h | 4 ---- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf856238..cb3743fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,11 +14,9 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY lib) set(CMAKE_C_FLAGS "-O2 -Wall -Wextra") set(CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG=1") -option(USE_C11_FEATURE "Enable c11 feature" OFF) -if(USE_C11_FEATURE) - add_definitions(-std=c11) -else() - add_definitions(-std=c99) # at least c99 is required +option(STRICT_C89_MODE "Strict c89 mode" OFF) +if(STRICT_C89_MODE) + add_definitions(-std=c89 -ansi -pedantic) endif() include_directories(extlib/benz/include) diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index 7a24f77e..6f0294be 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -39,10 +39,6 @@ /* #define GC_DEBUG 1 */ /* #define GC_DEBUG_DETAIL 1 */ -#if __STDC_VERSION__ < 199901L -# error please activate c99 features -#endif - #ifndef PIC_DIRECT_THREADED_VM # if defined(__GNUC__) || defined(__clang__) # define PIC_DIRECT_THREADED_VM 1 From 0b67ec47f3d984a8c965d7e683c963bb5c07c263 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 22:50:44 +0900 Subject: [PATCH 064/177] don't use indirect gotos in strict mode --- extlib/benz/include/picrin/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index 6f0294be..d994c2c4 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -40,7 +40,7 @@ /* #define GC_DEBUG_DETAIL 1 */ #ifndef PIC_DIRECT_THREADED_VM -# if defined(__GNUC__) || defined(__clang__) +# if (defined(__GNUC__) || defined(__clang__)) && __STRICT_ANSI__ != 1 # define PIC_DIRECT_THREADED_VM 1 # endif #endif From 9968b152641f7dbae0d6df89255d035ba6a0ef83 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 22:55:59 +0900 Subject: [PATCH 065/177] change PIC_NAN_BOXING enabling condition --- extlib/benz/include/picrin/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index d994c2c4..e03c6819 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -46,7 +46,7 @@ #endif #ifndef PIC_NAN_BOXING -# if __x86_64__ && __STDC_VERSION__ >= 201112L +# if __x86_64__ && (defined(__GNUC__) || defined(__clang__)) && __STRICT_ANSI__ != 1 # define PIC_NAN_BOXING 1 # endif #endif From c1d4ea9d0041f3f5adcbc459ab0dcf1885e889aa Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 23:06:52 +0900 Subject: [PATCH 066/177] remove trailing comma --- extlib/benz/include/picrin/read.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/include/picrin/read.h b/extlib/benz/include/picrin/read.h index 705b4589..a3f01100 100644 --- a/extlib/benz/include/picrin/read.h +++ b/extlib/benz/include/picrin/read.h @@ -14,7 +14,7 @@ typedef pic_value (*pic_reader_t)(pic_state *, struct pic_port *port, int c); struct pic_reader { enum pic_typecase { PIC_CASE_DEFAULT, - PIC_CASE_FOLD, + PIC_CASE_FOLD } typecase; xhash labels; pic_reader_t table[256]; From 03a4f1a8717b51ffc5582f06365ed992285dbf66 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 23:07:27 +0900 Subject: [PATCH 067/177] don't use flexible array member --- extlib/benz/include/picrin/proc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/include/picrin/proc.h b/extlib/benz/include/picrin/proc.h index ebe13a82..edf128ae 100644 --- a/extlib/benz/include/picrin/proc.h +++ b/extlib/benz/include/picrin/proc.h @@ -20,7 +20,7 @@ struct pic_env { pic_value *regs; int regc; struct pic_env *up; - pic_value storage[]; + pic_value storage[1]; }; struct pic_proc { From de294b07846756a02c01ec993aab1a5035e96007 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 26 Jan 2015 23:55:28 +0900 Subject: [PATCH 068/177] dont use loop initial declaration --- extlib/benz/vm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 12862f9f..23412278 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -666,12 +666,13 @@ pic_apply5(pic_state *pic, struct pic_proc *proc, pic_value arg1, pic_value arg2 #if VM_DEBUG # define VM_CALL_PRINT \ do { \ + short i; \ puts("\n== calling proc..."); \ printf(" proc = "); \ pic_debug(pic, pic_obj_value(proc)); \ puts(""); \ printf(" argv = ("); \ - for (short i = 1; i < c.u.i; ++i) { \ + for (i = 1; i < c.u.i; ++i) { \ if (i > 1) \ printf(" "); \ pic_debug(pic, pic->sp[-c.u.i + i]); \ From 914c29517797acc4892840ffb746547bd7eeed1a Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 27 Jan 2015 13:54:41 +0900 Subject: [PATCH 069/177] don't use variable length array --- extlib/benz/include/picrin/xfile.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/extlib/benz/include/picrin/xfile.h b/extlib/benz/include/picrin/xfile.h index 0633cfae..1deee787 100644 --- a/extlib/benz/include/picrin/xfile.h +++ b/extlib/benz/include/picrin/xfile.h @@ -330,11 +330,17 @@ xfflush(xFILE *file) PIC_INLINE size_t xfread(void *ptr, size_t block, size_t nitems, xFILE *file) { + char cbuf[256], *buf; char *dst = (char *)ptr; - char buf[block]; size_t i, offset; int n; + if (block <= 256) { + buf = cbuf; + } else { + buf = malloc(block); + } + for (i = 0; i < nitems; ++i) { offset = 0; if (file->ungot != -1 && block > 0) { @@ -359,6 +365,10 @@ xfread(void *ptr, size_t block, size_t nitems, xFILE *file) } exit: + + if (cbuf != buf) { + free(buf); + } return i; } From e4248584b68478bb49f28bba75c0645f663548c0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 27 Jan 2015 23:58:03 +0900 Subject: [PATCH 070/177] remove variable-length arrays in string.c --- extlib/benz/string.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/extlib/benz/string.c b/extlib/benz/string.c index abdefad0..57c063c5 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -6,6 +6,7 @@ #include "picrin/string.h" #include "picrin/pair.h" #include "picrin/port.h" +#include "picrin/error.h" static pic_str * make_str_rope(pic_state *pic, xrope *rope) @@ -36,14 +37,19 @@ pic_str * pic_make_str_fill(pic_state *pic, size_t len, char fill) { size_t i; - char buf[len + 1]; + char *buf = pic_malloc(pic, len); + pic_str *str; for (i = 0; i < len; ++i) { buf[i] = fill; } buf[i] = '\0'; - return pic_make_str(pic, buf, len); + str = pic_make_str(pic, buf, len); + + pic_free(pic, buf); + + return str; } size_t @@ -357,6 +363,8 @@ pic_str_string_map(pic_state *pic) struct pic_proc *proc; pic_value *argv, vals, val; size_t argc, i, len, j; + pic_str *str; + char *buf; pic_get_args(pic, "l*", &proc, &argc, &argv); @@ -371,9 +379,9 @@ pic_str_string_map(pic_state *pic) if (len == SIZE_MAX) { pic_errorf(pic, "string-map: one or more strings expected, but got zero"); } - else { - char buf[len]; + buf = pic_malloc(pic, len); + pic_try { for (i = 0; i < len; ++i) { vals = pic_nil_value(); for (j = 0; j < argc; ++j) { @@ -384,9 +392,16 @@ pic_str_string_map(pic_state *pic) pic_assert_type(pic, val, char); buf[i] = pic_char(val); } - - return pic_obj_value(pic_make_str(pic, buf, len)); + str = pic_make_str(pic, buf, len); } + pic_catch { + pic_free(pic, buf); + pic_raise(pic, pic->err); + } + + pic_free(pic, buf); + + return pic_obj_value(str); } static pic_value @@ -427,14 +442,17 @@ pic_str_list_to_string(pic_state *pic) pic_str *str; pic_value list, e, it; size_t i = 0; + char *buf; pic_get_args(pic, "o", &list); if (pic_length(pic, list) == 0) { return pic_obj_value(pic_make_str(pic, NULL, 0)); - } else { - char buf[pic_length(pic, list)]; + } + buf = pic_malloc(pic, pic_length(pic, list)); + + pic_try { pic_for_each (e, list, it) { pic_assert_type(pic, e, char); @@ -442,9 +460,14 @@ pic_str_list_to_string(pic_state *pic) } str = pic_make_str(pic, buf, i); - - return pic_obj_value(str); } + pic_catch { + pic_free(pic, buf); + pic_raise(pic, pic->err); + } + pic_free(pic, buf); + + return pic_obj_value(str); } static pic_value From 32d6760d4f25520a527d1bb17caf19755032ff18 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 28 Jan 2015 00:28:54 +0900 Subject: [PATCH 071/177] portable xprintf implementation --- extlib/benz/include/picrin/xfile.h | 75 +++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 12 deletions(-) diff --git a/extlib/benz/include/picrin/xfile.h b/extlib/benz/include/picrin/xfile.h index 1deee787..7011dcd1 100644 --- a/extlib/benz/include/picrin/xfile.h +++ b/extlib/benz/include/picrin/xfile.h @@ -561,24 +561,75 @@ xfprintf(xFILE *stream, const char *fmt, ...) return n; } +static void +xfile_printint(xFILE *stream, long x, int base) +{ + static char digits[] = "0123456789abcdef"; + char buf[20]; + int i, neg; + + neg = 0; + if (x < 0) { + neg = 1; + x = -x; + } + + i = 0; + do { + buf[i++] = digits[x % base]; + } while ((x /= base) != 0); + + if (neg) { + buf[i++] = '-'; + } + + while (i-- > 0) { + xputc(buf[i], stream); + } +} + PIC_INLINE int xvfprintf(xFILE *stream, const char *fmt, va_list ap) { - va_list ap2; + const char *p; + char *sval; + int ival; + double dval; + void *vp; + long seekr = xftell(stream); - va_copy(ap2, ap); - { - char buf[vsnprintf(NULL, 0, fmt, ap2)]; - - vsnprintf(buf, sizeof buf + 1, fmt, ap); - - if (xfwrite(buf, sizeof buf, 1, stream) < 1) { - return -1; + for (p = fmt; *p; p++) { + if (*p != '%') { + xputc(*p, stream); + continue; + } + switch (*++p) { + case 'd': + case 'i': + ival = va_arg(ap, int); + xfile_printint(stream, ival, 10); + break; + case 'f': + dval = va_arg(ap, double); + xfile_printint(stream, dval, 10); + xputc('.', stream); + xfile_printint(stream, fabs((dval - (int)dval) * 1e4), 10); + break; + case 's': + sval = va_arg(ap, char*); + xfputs(sval, stream); + break; + case 'p': + vp = va_arg(ap, void*); + xfputs("0x", stream); + xfile_printint(stream, dval, 16); + break; + default: + xputc(*(p-1), stream); + break; } - - va_end(ap2); - return (int)(sizeof buf); } + return xftell(stream) - seekr; } #if defined(__cplusplus) From 6af010f26d6f14c6a9f6a3af2e598f6540541fa7 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 28 Jan 2015 00:40:39 +0900 Subject: [PATCH 072/177] SIZE_MAX is not defined in ISO C89 --- extlib/benz/string.c | 24 ++++++++++++++---------- extlib/benz/vm.c | 4 +++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/extlib/benz/string.c b/extlib/benz/string.c index 57c063c5..da6614dd 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -368,17 +368,19 @@ pic_str_string_map(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &argv); - len = SIZE_MAX; - for (i = 0; i < argc; ++i) { + if (argc == 0) { + pic_errorf(pic, "string-map: one or more strings expected, but got zero"); + } else { + pic_assert_type(pic, argv[0], str); + len = pic_strlen(pic_str_ptr(argv[0])); + } + for (i = 1; i < argc; ++i) { pic_assert_type(pic, argv[i], str); len = len < pic_strlen(pic_str_ptr(argv[i])) ? len : pic_strlen(pic_str_ptr(argv[i])); } - if (len == SIZE_MAX) { - pic_errorf(pic, "string-map: one or more strings expected, but got zero"); - } buf = pic_malloc(pic, len); pic_try { @@ -413,17 +415,19 @@ pic_str_string_for_each(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &argv); - len = SIZE_MAX; - for (i = 0; i < argc; ++i) { + if (argc == 0) { + pic_errorf(pic, "string-map: one or more strings expected, but got zero"); + } else { + pic_assert_type(pic, argv[0], str); + len = pic_strlen(pic_str_ptr(argv[0])); + } + for (i = 1; i < argc; ++i) { pic_assert_type(pic, argv[i], str); len = len < pic_strlen(pic_str_ptr(argv[i])) ? len : pic_strlen(pic_str_ptr(argv[i])); } - if (len == SIZE_MAX) { - pic_errorf(pic, "string-map: one or more strings expected, but got zero"); - } for (i = 0; i < len; ++i) { vals = pic_nil_value(); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 23412278..682a873c 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -200,6 +200,7 @@ pic_get_args(pic_state *pic, const char *format, ...) if (i < argc) { pic_value v; int x; + size_t s; v = GET_OPERAND(pic, i); switch (pic_type(v)) { @@ -208,8 +209,9 @@ pic_get_args(pic_state *pic, const char *format, ...) if (x < 0) { pic_errorf(pic, "pic_get_args: expected non-negative int, but got ~s", v); } + s = (size_t)x; if (sizeof(unsigned) > sizeof(size_t)) { - if ((unsigned)x > (unsigned)SIZE_MAX) { + if (x != (int)s) { pic_errorf(pic, "pic_get_args: int unrepresentable with size_t ~s", v); } } From 154d9872945cc99f52058c1687b90cb6c5e1feb0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 28 Jan 2015 00:46:51 +0900 Subject: [PATCH 073/177] don't use C99's designated initializer --- extlib/benz/include/picrin/irep.h | 5 +++++ extlib/benz/vm.c | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/irep.h index cf612c0e..bba4e2f3 100644 --- a/extlib/benz/include/picrin/irep.h +++ b/extlib/benz/include/picrin/irep.h @@ -60,6 +60,11 @@ struct pic_code { } u; }; +#define PIC_INIT_CODE_I(code, op, ival) do { \ + code.insn = op; \ + code.u.i = ival; \ + } while (0) + struct pic_irep { PIC_OBJECT_HEADER pic_sym *name; diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 682a873c..5b426cd8 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -1151,14 +1151,14 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) pic_value pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, pic_value args) { - static const pic_code iseq[2] = { - { OP_NOP, { .i = 0 } }, - { OP_TAILCALL, { .i = -1 } } - }; + static pic_code iseq[2]; pic_value v, it, *sp; pic_callinfo *ci; + PIC_INIT_CODE_I(iseq[0], OP_NOP, 0); + PIC_INIT_CODE_I(iseq[1], OP_TAILCALL, -1); + *pic->sp++ = pic_obj_value(proc); sp = pic->sp; From fc6e724e8ef65e3248c2318d165b6d6f3ac5db97 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 28 Jan 2015 00:53:28 +0900 Subject: [PATCH 074/177] don't use long long --- extlib/benz/number.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/extlib/benz/number.c b/extlib/benz/number.c index 6e84dadf..5004a71c 100644 --- a/extlib/benz/number.c +++ b/extlib/benz/number.c @@ -14,13 +14,13 @@ static int number_string_length(int val, int radix) { - long long v = val; /* in case val == INT_MIN */ + unsigned long v = val; /* in case val == INT_MIN */ int count = 0; if (val == 0) { return 1; } if (val < 0) { - v = - v; + v = -val; count = 1; } while (v > 0) { @@ -39,7 +39,7 @@ number_string_length(int val, int radix) static void number_string(int val, int radix, int length, char *buffer) { const char digits[37] = "0123456789abcdefghijklmnopqrstuvwxyz"; - long long v = val; + unsigned long v = val; int i; if (val == 0) { buffer[0] = '0'; @@ -48,7 +48,7 @@ number_string(int val, int radix, int length, char *buffer) { } if (val < 0) { buffer[0] = '-'; - v = -v; + v = -val; } for(i = length - 1; v > 0; --i) { @@ -625,8 +625,8 @@ pic_init_number(pic_state *pic) pic_gc_arena_restore(pic, ai); pic_defun(pic, "abs", pic_number_abs); - pic_defun(pic, "sqrt", pic_number_sqrt); pic_defun(pic, "expt", pic_number_expt); + pic_defun(pic, "sqrt", pic_number_sqrt); pic_defun(pic, "exp", pic_number_exp); pic_defun(pic, "log", pic_number_log); pic_defun(pic, "sin", pic_number_sin); From 70b2c23ff718a960085745e127cf33c76a1b8664 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 28 Jan 2015 00:56:45 +0900 Subject: [PATCH 075/177] don't use variable-length arrays --- extlib/benz/number.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/extlib/benz/number.c b/extlib/benz/number.c index 5004a71c..98ad0ff2 100644 --- a/extlib/benz/number.c +++ b/extlib/benz/number.c @@ -525,6 +525,9 @@ pic_number_number_to_string(pic_state *pic) double f; bool e; int radix = 10; + pic_str *str; + size_t s; + char *buf; pic_get_args(pic, "F|i", &f, &e, &radix); @@ -535,19 +538,24 @@ pic_number_number_to_string(pic_state *pic) if (e) { int ival = (int) f; int ilen = number_string_length(ival, radix); - char buf[ilen + 1]; + s = ilen + 1; + + buf = pic_malloc(pic, s); number_string(ival, radix, ilen, buf); - - return pic_obj_value(pic_make_str(pic, buf, sizeof buf - 1)); } else { - char buf[snprintf(NULL, 0, "%f", f) + 1]; + s = snprintf(NULL, 0, "%f", f) + 1; - snprintf(buf, sizeof buf, "%f", f); + buf = pic_malloc(pic, s); - return pic_obj_value(pic_make_str(pic, buf, sizeof buf - 1)); + snprintf(buf, s, "%f", f); } + str = pic_make_str(pic, buf, s - 1); + + pic_free(pic, buf); + + return pic_obj_value(str); } static pic_value From 8e65a9db56a1dda8dfc1719b39956c0471558f4c Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 31 Jan 2015 21:14:14 +0900 Subject: [PATCH 076/177] split cstrings every 80 line --- etc/mkloader.pl | 18 +- extlib/benz/boot.c | 512 ++++++++++++++------------------------------ extlib/benz/state.c | 4 +- 3 files changed, 170 insertions(+), 364 deletions(-) diff --git a/etc/mkloader.pl b/etc/mkloader.pl index afbd88f2..984f4709 100755 --- a/etc/mkloader.pl +++ b/etc/mkloader.pl @@ -18,18 +18,22 @@ EOL foreach my $file (@ARGV) { my $var = &escape_v($file); - print "static const char *$var =\n"; + print "static const char ${var}[][80] = {\n"; open IN, $file; - while () { - chomp; + local $/ = undef; + my $src = ; + close IN; + + my @lines = $src =~ /.{0,80}/gs; + foreach (@lines) { s/\\/\\\\/g; s/"/\\"/g; - print "\"$_\\n\"\n"; + s/\n/\\n/g; + print "\"$_\",\n"; } - print ";\n\n"; + print "};\n\n"; } -close IN; print <string (cadr expr)) \"'\"))))))))\n" -"\n" -" (define-auxiliary-syntax else)\n" -" (define-auxiliary-syntax =>)\n" -" (define-auxiliary-syntax unquote)\n" -" (define-auxiliary-syntax unquote-splicing)\n" -"\n" -" (define-syntax let\n" -" (er-macro-transformer\n" -" (lambda (expr r compare)\n" -" (if (symbol? (cadr expr))\n" -" (begin\n" -" (define name (car (cdr expr)))\n" -" (define bindings (car (cdr (cdr expr))))\n" -" (define body (cdr (cdr (cdr expr))))\n" -" (list (r 'let) '()\n" -" (list (r 'define) name\n" -" (cons (r 'lambda) (cons (map car bindings) body)))\n" -" (cons name (map cadr bindings))))\n" -" (begin\n" -" (set! bindings (cadr expr))\n" -" (set! body (cddr expr))\n" -" (cons (cons (r 'lambda) (cons (map car bindings) body))\n" -" (map cadr bindings)))))))\n" -"\n" -" (define-syntax cond\n" -" (er-macro-transformer\n" -" (lambda (expr r compare)\n" -" (let ((clauses (cdr expr)))\n" -" (if (null? clauses)\n" -" #f\n" -" (begin\n" -" (define clause (car clauses))\n" -" (if (compare (r 'else) (car clause))\n" -" (cons (r 'begin) (cdr clause))\n" -" (if (if (>= (length clause) 2)\n" -" (compare (r '=>) (list-ref clause 1))\n" -" #f)\n" -" (list (r 'let) (list (list (r 'x) (car clause)))\n" -" (list (r 'if) (r 'x)\n" -" (list (list-ref clause 2) (r 'x))\n" -" (cons (r 'cond) (cdr clauses))))\n" -" (list (r 'if) (car clause)\n" -" (cons (r 'begin) (cdr clause))\n" -" (cons (r 'cond) (cdr clauses)))))))))))\n" -"\n" -" (define-syntax and\n" -" (er-macro-transformer\n" -" (lambda (expr r compare)\n" -" (let ((exprs (cdr expr)))\n" -" (cond\n" -" ((null? exprs)\n" -" #t)\n" -" ((= (length exprs) 1)\n" -" (car exprs))\n" -" (else\n" -" (list (r 'let) (list (list (r 'it) (car exprs)))\n" -" (list (r 'if) (r 'it)\n" -" (cons (r 'and) (cdr exprs))\n" -" (r 'it)))))))))\n" -"\n" -" (define-syntax or\n" -" (er-macro-transformer\n" -" (lambda (expr r compare)\n" -" (let ((exprs (cdr expr)))\n" -" (cond\n" -" ((null? exprs)\n" -" #t)\n" -" ((= (length exprs) 1)\n" -" (car exprs))\n" -" (else\n" -" (list (r 'let) (list (list (r 'it) (car exprs)))\n" -" (list (r 'if) (r 'it)\n" -" (r 'it)\n" -" (cons (r 'or) (cdr exprs))))))))))\n" -"\n" -" (define-syntax quasiquote\n" -" (er-macro-transformer\n" -" (lambda (form rename compare)\n" -"\n" -" (define (quasiquote? form)\n" -" (and (pair? form) (compare (car form) (rename 'quasiquote))))\n" -"\n" -" (define (unquote? form)\n" -" (and (pair? form) (compare (car form) (rename 'unquote))))\n" -"\n" -" (define (unquote-splicing? form)\n" -" (and (pair? form) (pair? (car form))\n" -" (compare (car (car form)) (rename 'unquote-splicing))))\n" -"\n" -" (define (qq depth expr)\n" -" (cond\n" -" ;; unquote\n" -" ((unquote? expr)\n" -" (if (= depth 1)\n" -" (car (cdr expr))\n" -" (list (rename 'list)\n" -" (list (rename 'quote) (rename 'unquote))\n" -" (qq (- depth 1) (car (cdr expr))))))\n" -" ;; unquote-splicing\n" -" ((unquote-splicing? expr)\n" -" (if (= depth 1)\n" -" (list (rename 'append)\n" -" (car (cdr (car expr)))\n" -" (qq depth (cdr expr)))\n" -" (list (rename 'cons)\n" -" (list (rename 'list)\n" -" (list (rename 'quote) (rename 'unquote-splicing))\n" -" (qq (- depth 1) (car (cdr (car expr)))))\n" -" (qq depth (cdr expr)))))\n" -" ;; quasiquote\n" -" ((quasiquote? expr)\n" -" (list (rename 'list)\n" -" (list (rename 'quote) (rename 'quasiquote))\n" -" (qq (+ depth 1) (car (cdr expr)))))\n" -" ;; list\n" -" ((pair? expr)\n" -" (list (rename 'cons)\n" -" (qq depth (car expr))\n" -" (qq depth (cdr expr))))\n" -" ;; vector\n" -" ((vector? expr)\n" -" (list (rename 'list->vector) (qq depth (vector->list expr))))\n" -" ;; simple datum\n" -" (else\n" -" (list (rename 'quote) expr))))\n" -"\n" -" (let ((x (cadr form)))\n" -" (qq 1 x)))))\n" -"\n" -" (define-syntax let*\n" -" (er-macro-transformer\n" -" (lambda (form r compare)\n" -" (let ((bindings (cadr form))\n" -" (body (cddr form)))\n" -" (if (null? bindings)\n" -" `(,(r 'let) () ,@body)\n" -" `(,(r 'let) ((,(caar bindings)\n" -" ,@(cdar bindings)))\n" -" (,(r 'let*) (,@(cdr bindings))\n" -" ,@body)))))))\n" -"\n" -" (define-syntax letrec*\n" -" (er-macro-transformer\n" -" (lambda (form r compare)\n" -" (let ((bindings (cadr form))\n" -" (body (cddr form)))\n" -" (let ((vars (map (lambda (v) `(,v #f)) (map car bindings)))\n" -" (initials (map (lambda (v) `(,(r 'set!) ,@v)) bindings)))\n" -" `(,(r 'let) (,@vars)\n" -" ,@initials\n" -" ,@body))))))\n" -"\n" -" (define-syntax letrec\n" -" (er-macro-transformer\n" -" (lambda (form rename compare)\n" -" `(,(rename 'letrec*) ,@(cdr form)))))\n" -"\n" -" (define-syntax let*-values\n" -" (er-macro-transformer\n" -" (lambda (form r c)\n" -" (let ((formals (cadr form)))\n" -" (if (null? formals)\n" -" `(,(r 'let) () ,@(cddr form))\n" -" `(,(r 'call-with-values) (,(r 'lambda) () ,@(cdar formals))\n" -" (,(r 'lambda) (,@(caar formals))\n" -" (,(r 'let*-values) (,@(cdr formals))\n" -" ,@(cddr form)))))))))\n" -"\n" -" (define-syntax let-values\n" -" (er-macro-transformer\n" -" (lambda (form r c)\n" -" `(,(r 'let*-values) ,@(cdr form)))))\n" -"\n" -" (define-syntax define-values\n" -" (er-macro-transformer\n" -" (lambda (form r compare)\n" -" (let ((formal (cadr form))\n" -" (exprs (cddr form)))\n" -" `(,(r 'begin)\n" -" ,@(let loop ((formal formal))\n" -" (if (not (pair? formal))\n" -" (if (symbol? formal)\n" -" `((,(r 'define) ,formal #f))\n" -" '())\n" -" `((,(r 'define) ,(car formal) #f) . ,(loop (cdr formal)))))\n" -" (,(r 'call-with-values) (,(r 'lambda) () ,@exprs)\n" -" (,(r 'lambda) ,(r 'args)\n" -" ,@(let loop ((formal formal) (args (r 'args)))\n" -" (if (not (pair? formal))\n" -" (if (symbol? formal)\n" -" `((,(r 'set!) ,formal ,args))\n" -" '())\n" -" `((,(r 'set!) ,(car formal) (,(r 'car) ,args))\n" -" ,@(loop (cdr formal) `(,(r 'cdr) ,args))))))))))))\n" -"\n" -" (define-syntax do\n" -" (er-macro-transformer\n" -" (lambda (form r compare)\n" -" (let ((bindings (car (cdr form)))\n" -" (finish (car (cdr (cdr form))))\n" -" (body (cdr (cdr (cdr form)))))\n" -" `(,(r 'let) ,(r 'loop) ,(map (lambda (x)\n" -" (list (car x) (cadr x)))\n" -" bindings)\n" -" (,(r 'if) ,(car finish)\n" -" (,(r 'begin) ,@(cdr finish))\n" -" (,(r 'begin) ,@body\n" -" (,(r 'loop) ,@(map (lambda (x)\n" -" (if (null? (cddr x))\n" -" (car x)\n" -" (car (cddr x))))\n" -" bindings)))))))))\n" -"\n" -" (define-syntax when\n" -" (er-macro-transformer\n" -" (lambda (expr rename compare)\n" -" (let ((test (cadr expr))\n" -" (body (cddr expr)))\n" -" `(,(rename 'if) ,test\n" -" (,(rename 'begin) ,@body)\n" -" #f)))))\n" -"\n" -" (define-syntax unless\n" -" (er-macro-transformer\n" -" (lambda (expr rename compare)\n" -" (let ((test (cadr expr))\n" -" (body (cddr expr)))\n" -" `(,(rename 'if) ,test\n" -" #f\n" -" (,(rename 'begin) ,@body))))))\n" -"\n" -" (define-syntax case\n" -" (er-macro-transformer\n" -" (lambda (expr r compare)\n" -" (let ((key (cadr expr))\n" -" (clauses (cddr expr)))\n" -" `(,(r 'let) ((,(r 'key) ,key))\n" -" ,(let loop ((clauses clauses))\n" -" (if (null? clauses)\n" -" #f\n" -" (begin\n" -" (define clause (car clauses))\n" -" `(,(r 'if) ,(if (compare (r 'else) (car clause))\n" -" '#t\n" -" `(,(r 'or)\n" -" ,@(map (lambda (x)\n" -" `(,(r 'eqv?) ,(r 'key) (,(r 'quote) ,x)))\n" -" (car clause))))\n" -" ,(if (compare (r '=>) (list-ref clause 1))\n" -" `(,(list-ref clause 2) ,(r 'key))\n" -" `(,(r 'begin) ,@(cdr clause)))\n" -" ,(loop (cdr clauses)))))))))))\n" -"\n" -" (define (dynamic-bind parameters values body)\n" -" (let* ((old-bindings\n" -" (current-dynamic-environment))\n" -" (binding\n" -" (map (lambda (parameter value)\n" -" (cons parameter (parameter value #f)))\n" -" parameters\n" -" values))\n" -" (new-bindings\n" -" (cons binding old-bindings)))\n" -" (dynamic-wind\n" -" (lambda () (current-dynamic-environment new-bindings))\n" -" body\n" -" (lambda () (current-dynamic-environment old-bindings)))))\n" -"\n" -" (define-syntax parameterize\n" -" (er-macro-transformer\n" -" (lambda (form r compare)\n" -" (let ((formal (cadr form))\n" -" (body (cddr form)))\n" -" `(,(r 'dynamic-bind)\n" -" (list ,@(map car formal))\n" -" (list ,@(map cadr formal))\n" -" (,(r 'lambda) () ,@body))))))\n" -"\n" -" (define-syntax letrec-syntax\n" -" (er-macro-transformer\n" -" (lambda (form r c)\n" -" (let ((formal (car (cdr form)))\n" -" (body (cdr (cdr form))))\n" -" `(let ()\n" -" ,@(map (lambda (x)\n" -" `(,(r 'define-syntax) ,(car x) ,(cadr x)))\n" -" formal)\n" -" ,@body)))))\n" -"\n" -" (define-syntax let-syntax\n" -" (er-macro-transformer\n" -" (lambda (form r c)\n" -" `(,(r 'letrec-syntax) ,@(cdr form)))))\n" -"\n" -" (export let let* letrec letrec*\n" -" let-values let*-values define-values\n" -" quasiquote unquote unquote-splicing\n" -" and or\n" -" cond case else =>\n" -" do when unless\n" -" parameterize\n" -" let-syntax letrec-syntax\n" -" syntax-error))\n" -; +const char pic_boot[][80] = { +"\n(define-library (picrin base)\n\n (define (memoize f)\n \"memoize on symbols\"\n ", +" (define cache (make-dictionary))\n (lambda (sym)\n (call-with-values (l", +"ambda () (dictionary-ref cache sym))\n (lambda (value exists)\n (i", +"f exists\n value\n (begin\n (define val (f", +" sym))\n (dictionary-set! cache sym val)\n val))))))", +"\n\n (define (er-macro-transformer f)\n (lambda (mac-env)\n (lambda (expr u", +"se-env)\n\n (define rename\n (memoize\n (lambda (sym)\n ", +" (make-identifier sym mac-env))))\n\n (define (compare x y)\n ", +" (if (not (symbol? x))\n #f\n (if (not (symbol? y))\n ", +" #f\n (identifier=? use-env x use-env y))))\n\n ", +" (f expr rename compare))))\n\n (define-syntax syntax-error\n (er-macro-tran", +"sformer\n (lambda (expr rename compare)\n (apply error (cdr expr)))))\n\n ", +" (define-syntax define-auxiliary-syntax\n (er-macro-transformer\n (lambda (", +"expr r c)\n (list (r 'define-syntax) (cadr expr)\n (list (r 'lam", +"bda) '_\n (list (r 'lambda) '_\n (list (", +"r 'error) (list (r 'string-append) \"invalid use of auxiliary syntax: '\" (symbol-", +">string (cadr expr)) \"'\"))))))))\n\n (define-auxiliary-syntax else)\n (define-aux", +"iliary-syntax =>)\n (define-auxiliary-syntax unquote)\n (define-auxiliary-syntax", +" unquote-splicing)\n\n (define-syntax let\n (er-macro-transformer\n (lambda ", +"(expr r compare)\n (if (symbol? (cadr expr))\n (begin\n ", +" (define name (car (cdr expr)))\n (define bindings (car (cdr (cdr", +" expr))))\n (define body (cdr (cdr (cdr expr))))\n (li", +"st (r 'let) '()\n (list (r 'define) name\n ", +" (cons (r 'lambda) (cons (map car bindings) body)))\n (cons n", +"ame (map cadr bindings))))\n (begin\n (set! bindings (cadr e", +"xpr))\n (set! body (cddr expr))\n (cons (cons (r 'lambda) ", +"(cons (map car bindings) body))\n (map cadr bindings)))))))\n\n ", +"(define-syntax cond\n (er-macro-transformer\n (lambda (expr r compare)\n ", +" (let ((clauses (cdr expr)))\n (if (null? clauses)\n #f\n ", +" (begin\n (define clause (car clauses))\n (if ", +"(compare (r 'else) (car clause))\n (cons (r 'begin) (cdr clause", +"))\n (if (if (>= (length clause) 2)\n ", +"(compare (r '=>) (list-ref clause 1))\n #f)\n ", +" (list (r 'let) (list (list (r 'x) (car clause)))\n ", +" (list (r 'if) (r 'x)\n (list (list-re", +"f clause 2) (r 'x))\n (cons (r 'cond) (cdr clau", +"ses))))\n (list (r 'if) (car clause)\n ", +" (cons (r 'begin) (cdr clause))\n (cons (r 'con", +"d) (cdr clauses)))))))))))\n\n (define-syntax and\n (er-macro-transformer\n ", +"(lambda (expr r compare)\n (let ((exprs (cdr expr)))\n (cond\n ", +" ((null? exprs)\n #t)\n ((= (length exprs) 1)\n (car", +" exprs))\n (else\n (list (r 'let) (list (list (r 'it) (car expr", +"s)))\n (list (r 'if) (r 'it)\n (cons (r 'and", +") (cdr exprs))\n (r 'it)))))))))\n\n (define-syntax or\n (", +"er-macro-transformer\n (lambda (expr r compare)\n (let ((exprs (cdr expr", +")))\n (cond\n ((null? exprs)\n #t)\n ((= (length", +" exprs) 1)\n (car exprs))\n (else\n (list (r 'let) (li", +"st (list (r 'it) (car exprs)))\n (list (r 'if) (r 'it)\n ", +" (r 'it)\n (cons (r 'or) (cdr exprs))))))))))\n\n", +" (define-syntax quasiquote\n (er-macro-transformer\n (lambda (form rename ", +"compare)\n\n (define (quasiquote? form)\n (and (pair? form) (compare ", +"(car form) (rename 'quasiquote))))\n\n (define (unquote? form)\n (and", +" (pair? form) (compare (car form) (rename 'unquote))))\n\n (define (unquote-", +"splicing? form)\n (and (pair? form) (pair? (car form))\n (com", +"pare (car (car form)) (rename 'unquote-splicing))))\n\n (define (qq depth ex", +"pr)\n (cond\n ;; unquote\n ((unquote? expr)\n (i", +"f (= depth 1)\n (car (cdr expr))\n (list (rename 'list", +")\n (list (rename 'quote) (rename 'unquote))\n ", +" (qq (- depth 1) (car (cdr expr))))))\n ;; unquote-splicing\n ", +" ((unquote-splicing? expr)\n (if (= depth 1)\n (list (ren", +"ame 'append)\n (car (cdr (car expr)))\n (q", +"q depth (cdr expr)))\n (list (rename 'cons)\n (l", +"ist (rename 'list)\n (list (rename 'quote) (rename 'unq", +"uote-splicing))\n (qq (- depth 1) (car (cdr (car expr))", +")))\n (qq depth (cdr expr)))))\n ;; quasiquote\n ", +" ((quasiquote? expr)\n (list (rename 'list)\n (list (", +"rename 'quote) (rename 'quasiquote))\n (qq (+ depth 1) (car (cdr ", +"expr)))))\n ;; list\n ((pair? expr)\n (list (rename 'co", +"ns)\n (qq depth (car expr))\n (qq depth (cdr expr)", +")))\n ;; vector\n ((vector? expr)\n (list (rename 'list", +"->vector) (qq depth (vector->list expr))))\n ;; simple datum\n (", +"else\n (list (rename 'quote) expr))))\n\n (let ((x (cadr form)))\n ", +" (qq 1 x)))))\n\n (define-syntax let*\n (er-macro-transformer\n (lambd", +"a (form r compare)\n (let ((bindings (cadr form))\n (body (cddr ", +"form)))\n (if (null? bindings)\n `(,(r 'let) () ,@body)\n ", +" `(,(r 'let) ((,(caar bindings)\n ,@(cdar binding", +"s)))\n (,(r 'let*) (,@(cdr bindings))\n ,@body)))))))", +"\n\n (define-syntax letrec*\n (er-macro-transformer\n (lambda (form r compar", +"e)\n (let ((bindings (cadr form))\n (body (cddr form)))\n ", +" (let ((vars (map (lambda (v) `(,v #f)) (map car bindings)))\n (ini", +"tials (map (lambda (v) `(,(r 'set!) ,@v)) bindings)))\n `(,(r 'let) (,@", +"vars)\n ,@initials\n ,@body))))))\n\n (define-syntax letrec", +"\n (er-macro-transformer\n (lambda (form rename compare)\n `(,(rename ", +"'letrec*) ,@(cdr form)))))\n\n (define-syntax let*-values\n (er-macro-transform", +"er\n (lambda (form r c)\n (let ((formals (cadr form)))\n (if (nul", +"l? formals)\n `(,(r 'let) () ,@(cddr form))\n `(,(r 'call-", +"with-values) (,(r 'lambda) () ,@(cdar formals))\n (,(r 'lambda) (,@", +"(caar formals))\n (,(r 'let*-values) (,@(cdr formals))\n ", +" ,@(cddr form)))))))))\n\n (define-syntax let-values\n (er-macro-transform", +"er\n (lambda (form r c)\n `(,(r 'let*-values) ,@(cdr form)))))\n\n (defin", +"e-syntax define-values\n (er-macro-transformer\n (lambda (form r compare)\n ", +" (let ((formal (cadr form))\n (exprs (cddr form)))\n `(,", +"(r 'begin)\n ,@(let loop ((formal formal))\n (if (not (p", +"air? formal))\n (if (symbol? formal)\n `", +"((,(r 'define) ,formal #f))\n '())\n `((", +",(r 'define) ,(car formal) #f) . ,(loop (cdr formal)))))\n (,(r 'call-", +"with-values) (,(r 'lambda) () ,@exprs)\n (,(r 'lambda) ,(r 'args)\n ", +" ,@(let loop ((formal formal) (args (r 'args)))\n ", +" (if (not (pair? formal))\n (if (symbol? formal)\n ", +" `((,(r 'set!) ,formal ,args))\n '()", +")\n `((,(r 'set!) ,(car formal) (,(r 'car) ,args))\n ", +" ,@(loop (cdr formal) `(,(r 'cdr) ,args))))))))))))\n\n (define", +"-syntax do\n (er-macro-transformer\n (lambda (form r compare)\n (let (", +"(bindings (car (cdr form)))\n (finish (car (cdr (cdr form))))\n ", +" (body (cdr (cdr (cdr form)))))\n `(,(r 'let) ,(r 'loop) ,(map", +" (lambda (x)\n (list (car x) (cadr x)))\n ", +" bindings)\n (,(r 'if) ,(car finish)", +"\n (,(r 'begin) ,@(cdr finish))\n (,(r 'begin) ,@body\n ", +" (,(r 'loop) ,@(map (lambda (x)\n (if (nul", +"l? (cddr x))\n (car x)\n ", +" (car (cddr x))))\n bindings))))))", +")))\n\n (define-syntax when\n (er-macro-transformer\n (lambda (expr rename c", +"ompare)\n (let ((test (cadr expr))\n (body (cddr expr)))\n ", +" `(,(rename 'if) ,test\n (,(rename 'begin) ,@body)\n #f", +")))))\n\n (define-syntax unless\n (er-macro-transformer\n (lambda (expr rena", +"me compare)\n (let ((test (cadr expr))\n (body (cddr expr)))\n ", +" `(,(rename 'if) ,test\n #f\n (,(rename 'begin) ,@b", +"ody))))))\n\n (define-syntax case\n (er-macro-transformer\n (lambda (expr r ", +"compare)\n (let ((key (cadr expr))\n (clauses (cddr expr)))\n ", +" `(,(r 'let) ((,(r 'key) ,key))\n ,(let loop ((clauses clauses))\n ", +" (if (null? clauses)\n #f\n (begi", +"n\n (define clause (car clauses))\n `(,(r ", +"'if) ,(if (compare (r 'else) (car clause))\n ", +"'#t\n `(,(r 'or)\n ", +" ,@(map (lambda (x)\n `(", +",(r 'eqv?) ,(r 'key) (,(r 'quote) ,x)))\n ", +" (car clause))))\n ,(if (compare (r '=>) (list-ref cla", +"use 1))\n `(,(list-ref clause 2) ,(r 'key))\n ", +" `(,(r 'begin) ,@(cdr clause)))\n ,(loop (", +"cdr clauses)))))))))))\n\n (define (dynamic-bind parameters values body)\n (let", +"* ((old-bindings\n (current-dynamic-environment))\n (binding\n", +" (map (lambda (parameter value)\n (cons parameter (p", +"arameter value #f)))\n parameters\n values))\n ", +" (new-bindings\n (cons binding old-bindings)))\n (dynamic-win", +"d\n (lambda () (current-dynamic-environment new-bindings))\n bod", +"y\n (lambda () (current-dynamic-environment old-bindings)))))\n\n (define", +"-syntax parameterize\n (er-macro-transformer\n (lambda (form r compare)\n ", +" (let ((formal (cadr form))\n (body (cddr form)))\n `(,(r '", +"dynamic-bind)\n (list ,@(map car formal))\n (list ,@(map cadr ", +"formal))\n (,(r 'lambda) () ,@body))))))\n\n (define-syntax letrec-synta", +"x\n (er-macro-transformer\n (lambda (form r c)\n (let ((formal (car (c", +"dr form)))\n (body (cdr (cdr form))))\n `(let ()\n ", +" ,@(map (lambda (x)\n `(,(r 'define-syntax) ,(car x) ,(cadr x", +")))\n formal)\n ,@body)))))\n\n (define-syntax let-syn", +"tax\n (er-macro-transformer\n (lambda (form r c)\n `(,(r 'letrec-synta", +"x) ,@(cdr form)))))\n\n (export let let* letrec letrec*\n let-values let*", +"-values define-values\n quasiquote unquote unquote-splicing\n an", +"d or\n cond case else =>\n do when unless\n parameterize", +"\n let-syntax letrec-syntax\n syntax-error))\n\n", +"", +}; #if 0 Local Variables: diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 3c74f4f4..b6d8064d 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -42,7 +42,7 @@ void pic_init_eval(pic_state *); void pic_init_lib(pic_state *); void pic_init_attr(pic_state *); -extern const char pic_boot[]; +extern const char pic_boot[][80]; static void pic_init_features(pic_state *pic) @@ -139,7 +139,7 @@ pic_init_core(pic_state *pic) pic_init_lib(pic); DONE; pic_init_attr(pic); DONE; - pic_load_cstr(pic, pic_boot); + pic_load_cstr(pic, &pic_boot[0][0]); } pic_import_library(pic, pic->PICRIN_BASE); From a7b3123405d3754d4028d95804cd07c7c93fb82c Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 31 Jan 2015 21:43:32 +0900 Subject: [PATCH 077/177] don't use dynamic variable length array --- contrib/10.regexp/src/regexp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/10.regexp/src/regexp.c b/contrib/10.regexp/src/regexp.c index 8c98bb2b..d3942ca7 100644 --- a/contrib/10.regexp/src/regexp.c +++ b/contrib/10.regexp/src/regexp.c @@ -58,7 +58,7 @@ pic_regexp_regexp(pic_state *pic) reg->flags = flags; if ((err = regcomp(®->reg, ptrn, cflags)) != 0) { - char errbuf[regerror(err, ®->reg, NULL, 0)]; + char errbuf[256]; regerror(err, ®->reg, errbuf, sizeof errbuf); regexp_dtor(pic, ®->reg); From b727567b6e33e54e936fa109b44a1e293bf7016d Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 31 Jan 2015 21:43:49 +0900 Subject: [PATCH 078/177] udpate docs --- README.md | 2 +- docs/intro.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dc81124d..1fccaac1 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Build Status](https://travis-ci.org/picrin-scheme/picrin.png)](https://travis-ci.org/picrin-scheme/picrin) [![Docs Status](https://readthedocs.org/projects/picrin/badge/?version=latest)](https://picrin.readthedocs.org/) -Picrin is a lightweight scheme implementation intended to comply with full R7RS specification. Its code is written in pure C99 and does not require any special external libraries installed on the platform. +Picrin is a lightweight scheme implementation intended to comply with full R7RS specification. Its code is written in pure C89 and does not require any special external libraries installed on the platform. ## Documentation diff --git a/docs/intro.rst b/docs/intro.rst index 429bc045..5cc22c15 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -1,7 +1,7 @@ Introduction ============ -Picrin is a lightweight scheme implementation intended to comply with full R7RS specification. Its code is written in pure C99 and does not require any special external libraries installed on the platform. +Picrin is a lightweight scheme implementation intended to comply with full R7RS specification. Its code is written in pure C89 and does not require any special external libraries installed on the platform. - R7RS compatibility - reentrant design (all VM states are stored in single global state object) From 8a7f61bf0176abaa1e59f20387d0dc271cf32807 Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Sun, 1 Feb 2015 12:25:48 +0000 Subject: [PATCH 079/177] use correct vars --- extlib/benz/codegen.c | 2 +- extlib/benz/include/picrin/xfile.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 63f3ab87..0ccf59df 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -402,7 +402,7 @@ analyze_procedure(analyze_state *state, pic_value name, pic_value formals, pic_v pop_scope(state); } else { - pic_errorf(pic, "invalid formal syntax: ~s", args); + pic_errorf(pic, "invalid formal syntax: ~s", formals); } return pic_list7(pic, pic_obj_value(pic->sLAMBDA), name, args, locals, varg, captures, body); diff --git a/extlib/benz/include/picrin/xfile.h b/extlib/benz/include/picrin/xfile.h index 7011dcd1..8849fd04 100644 --- a/extlib/benz/include/picrin/xfile.h +++ b/extlib/benz/include/picrin/xfile.h @@ -622,7 +622,7 @@ xvfprintf(xFILE *stream, const char *fmt, va_list ap) case 'p': vp = va_arg(ap, void*); xfputs("0x", stream); - xfile_printint(stream, dval, 16); + xfile_printint(stream, (int)vp, 16); break; default: xputc(*(p-1), stream); From e2f10ba3adfdbea616e54c60ac5860f97170329b Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Mon, 2 Feb 2015 18:30:14 +0000 Subject: [PATCH 080/177] rewrite pic_get_args to check nparams first --- extlib/benz/vm.c | 385 +++++++++++++++++++++-------------------------- 1 file changed, 175 insertions(+), 210 deletions(-) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 5f9aa877..b3464b2f 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -58,64 +58,78 @@ int pic_get_args(pic_state *pic, const char *format, ...) { char c; - int i = 1, argc = pic->ci->argc; + int paramc, optc, ext = 0; + int i , argc = pic->ci->argc; va_list ap; - bool opt = false; + bool rest = false; - va_start(ap, format); - while ((c = *format++)) { - switch (c) { - default: - if (argc <= i && ! opt) { - pic_errorf(pic, "wrong number of arguments"); - } - break; - case '|': - break; - case '*': + /* check nparams first */ + for (paramc = 0; format[paramc]; paramc++) { + if (format[paramc] == '|') { + /* mark to skip '|' */ + ext = 1; break; } - - /* in order to run out of all arguments passed to this function - (i.e. do va_arg for each argument), optional argument existence - check is done in every case closure */ - - if (c == '*') + if (format[paramc] == '*') { + rest = true; break; + } + } + + for (optc = 0; rest || format[paramc + optc + ext]; optc++) { + if (format[paramc + optc + ext] == '*') { + rest = true; + break; + } + } + + /* '|' should be followed by at least 1 char */ + assert(ext <= optc); + /* '*' should not be followed by any char */ + assert(format[paramc+optc+ext+rest] == '\0') + + /* check argc */ + if ((argc < paramc || paramc + optc < argc) && ! rest) { + pic_errorf(pic, "%s: wrong number of arguments (%d for %s%d)", + "procname", argc, + rest? "at least " : "", + paramc); + } + + /* start dispatching */ + va_start(ap, format); + for(i = 1; i < min(argc, paramc+optc+ext) + 1; i++) { + + /* skip '|' if exists. This is always safe because of assert and argc check */ + if ( i == paramc) + i += ext; + + c = format[i]; switch (c) { - case '|': - opt = true; - break; case 'o': { pic_value *p; p = va_arg(ap, pic_value*); - if (i < argc) { - *p = GET_OPERAND(pic,i); - i++; - } + *p = GET_OPERAND(pic,i); break; } case 'f': { double *f; f = va_arg(ap, double *); - if (i < argc) { - pic_value v; + pic_value v; - v = GET_OPERAND(pic, i); - switch (pic_type(v)) { - case PIC_TT_FLOAT: - *f = pic_float(v); - break; - case PIC_TT_INT: - *f = pic_int(v); - break; - default: - pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); - } - i++; + v = GET_OPERAND(pic, i); + switch (pic_type(v)) { + case PIC_TT_FLOAT: + *f = pic_float(v); + break; + case PIC_TT_INT: + *f = pic_int(v); + break; + default: + pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); } break; } @@ -125,23 +139,20 @@ pic_get_args(pic_state *pic, const char *format, ...) f = va_arg(ap, double *); e = va_arg(ap, bool *); - if (i < argc) { - pic_value v; + pic_value v; - v = GET_OPERAND(pic, i); - switch (pic_type(v)) { - case PIC_TT_FLOAT: - *f = pic_float(v); - *e = false; - break; - case PIC_TT_INT: - *f = pic_int(v); - *e = true; - break; - default: - pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); - } - i++; + v = GET_OPERAND(pic, i); + switch (pic_type(v)) { + case PIC_TT_FLOAT: + *f = pic_float(v); + *e = false; + break; + case PIC_TT_INT: + *f = pic_int(v); + *e = true; + break; + default: + pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); } break; } @@ -151,23 +162,20 @@ pic_get_args(pic_state *pic, const char *format, ...) k = va_arg(ap, int *); e = va_arg(ap, bool *); - if (i < argc) { - pic_value v; + pic_value v; - v = GET_OPERAND(pic, i); - switch (pic_type(v)) { - case PIC_TT_FLOAT: - *k = (int)pic_float(v); - *e = false; - break; - case PIC_TT_INT: - *k = pic_int(v); - *e = true; - break; - default: - pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); - } - i++; + v = GET_OPERAND(pic, i); + switch (pic_type(v)) { + case PIC_TT_FLOAT: + *k = (int)pic_float(v); + *e = false; + break; + case PIC_TT_INT: + *k = pic_int(v); + *e = true; + break; + default: + pic_errorf(pic, "pic_get_args: expected float or int, but got ~s", v); } break; } @@ -175,21 +183,18 @@ pic_get_args(pic_state *pic, const char *format, ...) int *k; k = va_arg(ap, int *); - if (i < argc) { - pic_value v; + pic_value v; - v = GET_OPERAND(pic, i); - switch (pic_type(v)) { - case PIC_TT_FLOAT: - *k = (int)pic_float(v); - break; - case PIC_TT_INT: - *k = pic_int(v); - break; - default: - pic_errorf(pic, "pic_get_args: expected int, but got ~s", v); - } - i++; + v = GET_OPERAND(pic, i); + switch (pic_type(v)) { + case PIC_TT_FLOAT: + *k = (int)pic_float(v); + break; + case PIC_TT_INT: + *k = pic_int(v); + break; + default: + pic_errorf(pic, "pic_get_args: expected int, but got ~s", v); } break; } @@ -197,28 +202,25 @@ pic_get_args(pic_state *pic, const char *format, ...) size_t *k; k = va_arg(ap, size_t *); - if (i < argc) { - pic_value v; - int x; + pic_value v; + int x; - v = GET_OPERAND(pic, i); - switch (pic_type(v)) { - case PIC_TT_INT: - x = pic_int(v); - if (x < 0) { - pic_errorf(pic, "pic_get_args: expected non-negative int, but got ~s", v); - } - if (sizeof(unsigned) > sizeof(size_t)) { - if ((unsigned)x > (unsigned)SIZE_MAX) { - pic_errorf(pic, "pic_get_args: int unrepresentable with size_t ~s", v); - } - } - *k = (size_t)x; - break; - default: - pic_errorf(pic, "pic_get_args: expected int, but got ~s", v); + v = GET_OPERAND(pic, i); + switch (pic_type(v)) { + case PIC_TT_INT: + x = pic_int(v); + if (x < 0) { + pic_errorf(pic, "pic_get_args: expected non-negative int, but got ~s", v); } - i++; + if (sizeof(unsigned) > sizeof(size_t)) { + if ((unsigned)x > (unsigned)SIZE_MAX) { + pic_errorf(pic, "pic_get_args: int unrepresentable with size_t ~s", v); + } + } + *k = (size_t)x; + break; + default: + pic_errorf(pic, "pic_get_args: expected int, but got ~s", v); } break; } @@ -227,15 +229,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; str = va_arg(ap, pic_str **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_str_p(v)) { - *str = pic_str_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args: expected string, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_str_p(v)) { + *str = pic_str_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args: expected string, but got ~s", v); } break; } @@ -244,14 +243,11 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; cstr = va_arg(ap, const char **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (! pic_str_p(v)) { - pic_errorf(pic, "pic_get_args: expected string, but got ~s", v); - } - *cstr = pic_str_cstr(pic_str_ptr(v)); - i++; + v = GET_OPERAND(pic,i); + if (! pic_str_p(v)) { + pic_errorf(pic, "pic_get_args: expected string, but got ~s", v); } + *cstr = pic_str_cstr(pic_str_ptr(v)); break; } case 'm': { @@ -259,15 +255,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; m = va_arg(ap, pic_sym **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_sym_p(v)) { - *m = pic_sym_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args: expected symbol, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_sym_p(v)) { + *m = pic_sym_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args: expected symbol, but got ~s", v); } break; } @@ -276,15 +269,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; vec = va_arg(ap, struct pic_vector **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_vec_p(v)) { - *vec = pic_vec_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args: expected vector, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_vec_p(v)) { + *vec = pic_vec_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args: expected vector, but got ~s", v); } break; } @@ -293,15 +283,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; b = va_arg(ap, struct pic_blob **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_blob_p(v)) { - *b = pic_blob_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args: expected bytevector, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_blob_p(v)) { + *b = pic_blob_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args: expected bytevector, but got ~s", v); } break; } @@ -310,15 +297,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; k = va_arg(ap, char *); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_char_p(v)) { - *k = pic_char(v); - } - else { - pic_errorf(pic, "pic_get_args: expected char, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_char_p(v)) { + *k = pic_char(v); + } + else { + pic_errorf(pic, "pic_get_args: expected char, but got ~s", v); } break; } @@ -327,15 +311,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; l = va_arg(ap, struct pic_proc **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_proc_p(v)) { - *l = pic_proc_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args, expected procedure, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_proc_p(v)) { + *l = pic_proc_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args, expected procedure, but got ~s", v); } break; } @@ -344,15 +325,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; p = va_arg(ap, struct pic_port **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_port_p(v)) { - *p = pic_port_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args, expected port, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_port_p(v)) { + *p = pic_port_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args, expected port, but got ~s", v); } break; } @@ -361,15 +339,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; d = va_arg(ap, struct pic_dict **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_dict_p(v)) { - *d = pic_dict_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args, expected dictionary, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_dict_p(v)) { + *d = pic_dict_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args, expected dictionary, but got ~s", v); } break; } @@ -378,15 +353,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; r = va_arg(ap, struct pic_record **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_record_p(v)) { - *r = pic_record_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args: expected record, but got ~s", v); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_record_p(v)) { + *r = pic_record_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args: expected record, but got ~s", v); } break; } @@ -395,15 +367,12 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_value v; e = va_arg(ap, struct pic_error **); - if (i < argc) { - v = GET_OPERAND(pic,i); - if (pic_error_p(v)) { - *e = pic_error_ptr(v); - } - else { - pic_errorf(pic, "pic_get_args, expected error"); - } - i++; + v = GET_OPERAND(pic,i); + if (pic_error_p(v)) { + *e = pic_error_ptr(v); + } + else { + pic_errorf(pic, "pic_get_args, expected error"); } break; } @@ -411,23 +380,19 @@ pic_get_args(pic_state *pic, const char *format, ...) pic_errorf(pic, "pic_get_args: invalid argument specifier '%c' given", c); } } - if ('*' == c) { + if ( rest ) { size_t *n; pic_value **argv; n = va_arg(ap, size_t *); argv = va_arg(ap, pic_value **); if (i <= argc) { - *n = (size_t)(argc - i); + *n = (size_t)(argc - (paramc + optc)); *argv = &GET_OPERAND(pic, i); - i = argc; } } - else if (argc > i) { - pic_errorf(pic, "wrong number of arguments"); - } va_end(ap); - return i - 1; + return argc - 1; } void From 17006107290e069199e1e79b7745d6908edfb128 Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Tue, 3 Feb 2015 16:57:39 +0000 Subject: [PATCH 081/177] rewrite to be clean --- extlib/benz/vm.c | 67 ++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index f5ce55f4..a55489b1 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -58,38 +58,43 @@ int pic_get_args(pic_state *pic, const char *format, ...) { char c; - int paramc, optc, ext = 0; - int i , argc = pic->ci->argc; + int paramc, optc, min; + int i , argc = pic->ci->argc - 1; va_list ap; - bool rest = false; + bool rest = false, opt = false; + + /* paramc: required args count as scheme proc + optc: optional args count as scheme proc + argc: passed args count as scheme proc + vargc: args count passed to this function + */ /* check nparams first */ - for (paramc = 0; format[paramc]; paramc++) { - if (format[paramc] == '|') { - /* mark to skip '|' */ - ext = 1; + for (paramc = 0, c = *format; c; c = format[++paramc]) { + if (c == '|') { + opt = true; break; } - if (format[paramc] == '*') { + else if (c == '*') { rest = true; break; } } - for (optc = 0; rest || format[paramc + optc + ext]; optc++) { - if (format[paramc + optc + ext] == '*') { + for (optc = 0; opt && c; c = format[paramc + opt + ++optc]) { + if (c == '*') { rest = true; break; } } /* '|' should be followed by at least 1 char */ - assert(ext <= optc); + assert(opt <= optc); /* '*' should not be followed by any char */ - assert(format[paramc+optc+ext+rest] == '\0') + assert(format[paramc + opt + optc + rest] == '\0'); - /* check argc */ - if ((argc < paramc || paramc + optc < argc) && ! rest) { + /* check argc. */ + if (argc < paramc || (paramc + optc < argc && ! rest)) { pic_errorf(pic, "%s: wrong number of arguments (%d for %s%d)", "procname", argc, rest? "at least " : "", @@ -98,13 +103,12 @@ pic_get_args(pic_state *pic, const char *format, ...) /* start dispatching */ va_start(ap, format); - for(i = 1; i < min(argc, paramc+optc+ext) + 1; i++) { + min = paramc + optc + rest < argc ? paramc + optc + rest : argc; + for(i = 1; i < min + 1; i++) { + c = *format++; /* skip '|' if exists. This is always safe because of assert and argc check */ - if ( i == paramc) - i += ext; - - c = format[i]; + c = c == '|' ? *format++ : c; switch (c) { case 'o': { @@ -378,23 +382,24 @@ pic_get_args(pic_state *pic, const char *format, ...) } break; } + case '*': { + size_t *n; + pic_value **argv; + + n = va_arg(ap, size_t *); + argv = va_arg(ap, pic_value **); + if ( paramc + optc < argc) { + *n = (size_t)(argc - (paramc + optc)); + *argv = &GET_OPERAND(pic, i); + } + break; + } default: pic_errorf(pic, "pic_get_args: invalid argument specifier '%c' given", c); } } - if ( rest ) { - size_t *n; - pic_value **argv; - - n = va_arg(ap, size_t *); - argv = va_arg(ap, pic_value **); - if (i <= argc) { - *n = (size_t)(argc - (paramc + optc)); - *argv = &GET_OPERAND(pic, i); - } - } va_end(ap); - return argc - 1; + return argc; } void From 65967f2e05236c7f4e4b8c7e611e0cc8de3ca0da Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Tue, 3 Feb 2015 17:19:17 +0000 Subject: [PATCH 082/177] fix a bug --- extlib/benz/vm.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index a55489b1..20165127 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -58,8 +58,8 @@ int pic_get_args(pic_state *pic, const char *format, ...) { char c; - int paramc, optc, min; - int i , argc = pic->ci->argc - 1; + size_t paramc, optc, min; + size_t i , argc = pic->ci->argc - 1; va_list ap; bool rest = false, opt = false; @@ -103,7 +103,7 @@ pic_get_args(pic_state *pic, const char *format, ...) /* start dispatching */ va_start(ap, format); - min = paramc + optc + rest < argc ? paramc + optc + rest : argc; + min = paramc + optc < argc ? paramc + optc : argc; for(i = 1; i < min + 1; i++) { c = *format++; @@ -382,22 +382,19 @@ pic_get_args(pic_state *pic, const char *format, ...) } break; } - case '*': { + default: + pic_errorf(pic, "pic_get_args: invalid argument specifier '%c' given", c); + } + } + if (rest) { size_t *n; pic_value **argv; n = va_arg(ap, size_t *); argv = va_arg(ap, pic_value **); - if ( paramc + optc < argc) { - *n = (size_t)(argc - (paramc + optc)); - *argv = &GET_OPERAND(pic, i); - } - break; + *n = (size_t)(argc - (i - 1)); + *argv = &GET_OPERAND(pic, i); } - default: - pic_errorf(pic, "pic_get_args: invalid argument specifier '%c' given", c); - } - } va_end(ap); return argc; } From 06a2b09e69475106f269026fb1e175a624833d1d Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Wed, 4 Feb 2015 13:46:29 +0000 Subject: [PATCH 083/177] display proc name in error message raised from `pic_get_args` --- extlib/benz/vm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 20165127..9db86c38 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -96,7 +96,8 @@ pic_get_args(pic_state *pic, const char *format, ...) /* check argc. */ if (argc < paramc || (paramc + optc < argc && ! rest)) { pic_errorf(pic, "%s: wrong number of arguments (%d for %s%d)", - "procname", argc, + pic_symbol_name(pic, pic_proc_name(pic_proc_ptr(GET_OPERAND(pic, 0)))) , + argc, rest? "at least " : "", paramc); } From 27a1694f51e78dc3350aa03b7eaba37277f57612 Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Wed, 4 Feb 2015 13:52:46 +0000 Subject: [PATCH 084/177] add test for #257 --- t/issue/257.scm | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 t/issue/257.scm diff --git a/t/issue/257.scm b/t/issue/257.scm new file mode 100644 index 00000000..8872be72 --- /dev/null +++ b/t/issue/257.scm @@ -0,0 +1,4 @@ +(import (scheme base) + (picrin test)) + +(map +) From 32831c11e0692e8744e768c6b022e4756d3dcab6 Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Wed, 4 Feb 2015 14:05:34 +0000 Subject: [PATCH 085/177] fix #257 --- extlib/benz/pair.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extlib/benz/pair.c b/extlib/benz/pair.c index fc865921..1f1f3043 100644 --- a/extlib/benz/pair.c +++ b/extlib/benz/pair.c @@ -643,8 +643,12 @@ pic_pair_map(pic_state *pic) pic_value *args; pic_value arg, ret; + argc = 0; pic_get_args(pic, "l*", &proc, &argc, &args); + if (argc == 0) + pic_errorf(pic, "map: wrong number of arguments (1 for at least 2)"); + ret = pic_nil_value(); do { arg = pic_nil_value(); @@ -655,6 +659,7 @@ pic_pair_map(pic_state *pic) pic_push(pic, pic_car(pic, args[i]), arg); args[i] = pic_cdr(pic, args[i]); } + if (i != argc) { break; } From dfd6e453f3be031d2358945d94fdbb9d03f17ed7 Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Thu, 5 Feb 2015 05:51:39 +0000 Subject: [PATCH 086/177] remove unneeded argc initialization --- extlib/benz/pair.c | 1 - 1 file changed, 1 deletion(-) diff --git a/extlib/benz/pair.c b/extlib/benz/pair.c index 1f1f3043..36400af2 100644 --- a/extlib/benz/pair.c +++ b/extlib/benz/pair.c @@ -643,7 +643,6 @@ pic_pair_map(pic_state *pic) pic_value *args; pic_value arg, ret; - argc = 0; pic_get_args(pic, "l*", &proc, &argc, &args); if (argc == 0) From c4174d3d5cde82a6d0ede7e3d1cab7127d22718f Mon Sep 17 00:00:00 2001 From: OGINO Masanori Date: Mon, 11 May 2015 12:54:16 +0900 Subject: [PATCH 087/177] Make CMAKE_C_FLAGS{,_DEBUG} configurable. Now you can add any options for compilers with e.g. `cmake -DCMAKE_C_FLAGS="-Werror -Wformat=2"`. Note that these options are added at first, so `cmake -DCMAKE_C_FLAGS=-O3` would not work as expected since `-O2` is specified after your `-O3`. Signed-off-by: OGINO Masanori --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cb3743fd..45a3a2b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY lib) -set(CMAKE_C_FLAGS "-O2 -Wall -Wextra") -set(CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG=1") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wall -Wextra") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g -DDEBUG=1") option(STRICT_C89_MODE "Strict c89 mode" OFF) if(STRICT_C89_MODE) From 8e932d624c54110197b1052c63446ecee86dd357 Mon Sep 17 00:00:00 2001 From: OGINO Masanori Date: Mon, 11 May 2015 13:58:58 +0900 Subject: [PATCH 088/177] Build and test 32 & 64 bit builds on Travis CI. Depends on PR #261. Fixes #213. Signed-off-by: OGINO Masanori --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index 61058537..8400d479 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,12 @@ language: c compiler: - gcc - clang +env: + - CFLAGS="-m32" + - CFLAGS="-m64" before_script: + - sudo apt-get update -qq + - sudo apt-get install -y libc6:i386 libgcc1:i386 gcc-4.6-base:i386 gcc-multilib - cd build script: - perl --version From e3d2330df7ad676d876d6740e42fb4f0003694fe Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Mon, 11 May 2015 16:05:40 +0900 Subject: [PATCH 089/177] Use strict ERE --- contrib/10.regexp/t/test.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/10.regexp/t/test.scm b/contrib/10.regexp/t/test.scm index 3c90493f..45da3bcf 100644 --- a/contrib/10.regexp/t/test.scm +++ b/contrib/10.regexp/t/test.scm @@ -8,5 +8,5 @@ (test '("a" "b" "c" "d") (regexp-split (regexp ",") "a,b,c,d")) (test '("a" "b" "c" "d") (regexp-split (regexp "\\.+") "a.b....c.....d")) (test "a b c d" (regexp-replace (regexp ",") "a,b,c,d" " ")) -(test "newline tab space " (regexp-replace (regexp "\\s") "newline +(test "newline tab space " (regexp-replace (regexp "[\n\t ]") "newline tab space " " ")) From a8520fe5953c453cf773e0c4a41ead6cbcb0234b Mon Sep 17 00:00:00 2001 From: "Sunrin SHIMURA (keen)" <3han5chou7@gmail.com> Date: Mon, 11 May 2015 16:26:55 +0900 Subject: [PATCH 090/177] number->string: remove trailing 0s --- extlib/benz/number.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extlib/benz/number.c b/extlib/benz/number.c index 98ad0ff2..c3ec4dcf 100644 --- a/extlib/benz/number.c +++ b/extlib/benz/number.c @@ -549,7 +549,12 @@ pic_number_number_to_string(pic_state *pic) buf = pic_malloc(pic, s); + snprintf(buf, s, "%f", f); + + while(buf[s - 2] == '0') + s -= 1; + } str = pic_make_str(pic, buf, s - 1); From 48faa9ac986ea1cd9e94dbac9e0fdd8e953b62f0 Mon Sep 17 00:00:00 2001 From: stibear Date: Wed, 16 Jul 2014 16:46:22 +0900 Subject: [PATCH 091/177] fixed vector-map/map! --- contrib/10.srfi/srfi/43.scm | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/contrib/10.srfi/srfi/43.scm b/contrib/10.srfi/srfi/43.scm index 88ebc083..993a0aa1 100644 --- a/contrib/10.srfi/srfi/43.scm +++ b/contrib/10.srfi/srfi/43.scm @@ -92,16 +92,28 @@ (map (lambda (v) (vector-ref v count)) vects)) (- count 1)))))) - (define (vector-map! f vec . vects) + (define (vector-map f vec . vects) (let* ((vects (cons vec vects)) (veclen (apply min (map vector-length vects))) (new-vect (make-vector veclen))) + (let rec ((count 0)) + (if (= count veclen) + new-vect + (begin + (vector-set! new-vect count + (apply f count (map (lambda (v) (vector-ref v count)) + vects))) + (rec (+ 1 count))))))) + + (define (vector-map! f vec . vects) + (let* ((vects (cons vec vects)) + (veclen (apply min (map vector-length vects)))) (let rec ((count 0)) (if (< count veclen) (begin (vector-set! vec count - (apply f (map (lambda (v) (vector-ref v count)) - vects))) + (apply f count (map (lambda (v) (vector-ref v count)) + vects))) (rec (+ 1 count))))))) (define (vector-count pred? vec . vects) From 52624460cdf3db74423467f5db9c1193daddbd05 Mon Sep 17 00:00:00 2001 From: OGINO Masanori Date: Wed, 13 May 2015 12:08:38 +0900 Subject: [PATCH 092/177] Don't import vector-map from R7RS in SRFI 43. Signed-off-by: OGINO Masanori --- contrib/10.srfi/srfi/43.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/10.srfi/srfi/43.scm b/contrib/10.srfi/srfi/43.scm index 993a0aa1..13e5341c 100644 --- a/contrib/10.srfi/srfi/43.scm +++ b/contrib/10.srfi/srfi/43.scm @@ -1,5 +1,5 @@ (define-library (srfi 43) - (import (scheme base) + (import (except (scheme base) vector-map) (srfi 8)) ;; # Constructors From 919675670f830b4837b900497438345ec42daf4c Mon Sep 17 00:00:00 2001 From: Syohei YOSHIDA Date: Fri, 22 May 2015 14:53:17 +0900 Subject: [PATCH 093/177] Correct cast type --- extlib/benz/include/picrin/xfile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/include/picrin/xfile.h b/extlib/benz/include/picrin/xfile.h index 8849fd04..cce8fd05 100644 --- a/extlib/benz/include/picrin/xfile.h +++ b/extlib/benz/include/picrin/xfile.h @@ -622,7 +622,7 @@ xvfprintf(xFILE *stream, const char *fmt, va_list ap) case 'p': vp = va_arg(ap, void*); xfputs("0x", stream); - xfile_printint(stream, (int)vp, 16); + xfile_printint(stream, (long)vp, 16); break; default: xputc(*(p-1), stream); From 3bc0be34ac62090a4fd214b9778d26b7d7f35aa6 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 27 May 2015 22:08:44 +0900 Subject: [PATCH 094/177] remove trailing comma --- extlib/benz/boot.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extlib/benz/boot.c b/extlib/benz/boot.c index 8960dab5..ededb5d4 100644 --- a/extlib/benz/boot.c +++ b/extlib/benz/boot.c @@ -384,6 +384,7 @@ foreach (@lines) { s/\n/\\n/g; print "\"$_\",\n"; } +print "\"\"\n"; =pod */ @@ -558,6 +559,7 @@ const char pic_boot[][80] = { "d or\n cond case else =>\n do when unless\n parameterize", "\n let-syntax letrec-syntax\n syntax-error))\n\n", "", +"" }; #if 0 From 81be1b9e3e9f83f79e3ba476751cef2e2e1ea91a Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 27 May 2015 22:10:51 +0900 Subject: [PATCH 095/177] define pic_dump_irep only if DEBUG is defined --- extlib/benz/include/picrin/irep.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/irep.h index bba4e2f3..213d0456 100644 --- a/extlib/benz/include/picrin/irep.h +++ b/extlib/benz/include/picrin/irep.h @@ -80,6 +80,8 @@ struct pic_irep { pic_value pic_analyze(pic_state *, pic_value); struct pic_irep *pic_codegen(pic_state *, pic_value); +#if DEBUG + PIC_INLINE void pic_dump_code(pic_code c) { @@ -213,6 +215,8 @@ pic_dump_irep(struct pic_irep *irep) } } +#endif + #if defined(__cplusplus) } #endif From 2bfb6876ebc5187a00dcd34119989f2e0f9e9532 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 27 May 2015 22:49:29 +0900 Subject: [PATCH 096/177] don't use bit field --- extlib/benz/gc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 6dc2be85..0f80b695 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -25,7 +25,7 @@ union header { struct { union header *ptr; size_t size; - unsigned int mark : 1; + char mark; } s; long alignment[2]; }; @@ -93,7 +93,7 @@ add_heap_page(pic_state *pic) nu = (PIC_HEAP_PAGE_SIZE + sizeof(union header) - 1) / sizeof(union header) + 1; - up = (union header *)pic_calloc(pic, 1 + nu + 1, sizeof(union header)); + up = pic_calloc(pic, 1 + nu + 1, sizeof(union header)); up->s.size = nu + 1; up->s.mark = PIC_GC_UNMARK; gc_free(pic, up); @@ -104,7 +104,7 @@ add_heap_page(pic_state *pic) up->s.size = 1; up->s.ptr = np; - page = (struct heap_page *)pic_alloc(pic, sizeof(struct heap_page)); + page = pic_alloc(pic, sizeof(struct heap_page)); page->basep = up; page->endp = up + nu + 1; page->next = pic->heap->pages; From 53dadede15bda0ffbe9c9616e5d335b64c697c5a Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 27 May 2015 23:01:35 +0900 Subject: [PATCH 097/177] [bugfix] gc bug --- extlib/benz/proc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index 321a362e..b1a9a795 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -11,13 +11,16 @@ struct pic_proc * pic_make_proc(pic_state *pic, pic_func_t func, const char *name) { struct pic_proc *proc; + pic_sym *sym; assert(name != NULL); + sym = pic_intern_cstr(pic, name); + proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc), PIC_TT_PROC); proc->kind = PIC_PROC_KIND_FUNC; proc->u.func.f = func; - proc->u.func.name = pic_intern_cstr(pic, name); + proc->u.func.name = sym; proc->env = NULL; return proc; } From 6d5ef7bda5dced48419185530b13f54473e67669 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 27 May 2015 23:08:47 +0900 Subject: [PATCH 098/177] more error handling at pic_open --- extlib/benz/state.c | 47 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/extlib/benz/state.c b/extlib/benz/state.c index b6d8064d..778ca034 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -104,11 +104,11 @@ pic_init_features(pic_state *pic) static void pic_init_core(pic_state *pic) { - size_t ai = pic_gc_arena_preserve(pic); - pic_init_features(pic); pic_deflibrary (pic, "(picrin base)") { + size_t ai = pic_gc_arena_preserve(pic); + pic_define_syntactic_keyword(pic, pic->lib->env, pic->sDEFINE, pic->rDEFINE); pic_define_syntactic_keyword(pic, pic->lib->env, pic->sSETBANG, pic->rSETBANG); pic_define_syntactic_keyword(pic, pic->lib->env, pic->sQUOTE, pic->rQUOTE); @@ -156,6 +156,10 @@ pic_open(int argc, char *argv[], char **envp) pic = malloc(sizeof(pic_state)); + if (! pic) { + goto EXIT_PIC; + } + /* turn off GC */ pic->gc_enable = false; @@ -171,14 +175,35 @@ pic_open(int argc, char *argv[], char **envp) pic->stbase = pic->sp = calloc(PIC_STACK_SIZE, sizeof(pic_value)); pic->stend = pic->stbase + PIC_STACK_SIZE; + if (! pic->sp) { + goto EXIT_SP; + } + /* callinfo */ pic->cibase = pic->ci = calloc(PIC_STACK_SIZE, sizeof(pic_callinfo)); pic->ciend = pic->cibase + PIC_STACK_SIZE; + if (! pic->ci) { + goto EXIT_CI; + } + /* exception handler */ pic->xpbase = pic->xp = calloc(PIC_RESCUE_SIZE, sizeof(struct pic_proc *)); pic->xpend = pic->xpbase + PIC_RESCUE_SIZE; + if (! pic->xp) { + goto EXIT_XP; + } + + /* GC arena */ + pic->arena = calloc(PIC_ARENA_SIZE, sizeof(struct pic_object **)); + pic->arena_size = PIC_ARENA_SIZE; + pic->arena_idx = 0; + + if (! pic->arena) { + goto EXIT_ARENA; + } + /* memory heap */ pic->heap = pic_heap_open(pic); @@ -201,11 +226,6 @@ pic_open(int argc, char *argv[], char **envp) pic->libs = pic_nil_value(); pic->lib = NULL; - /* 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(); @@ -321,7 +341,20 @@ pic_open(int argc, char *argv[], char **envp) pic_init_core(pic); + pic_gc_arena_restore(pic, ai); + return pic; + + EXIT_ARENA: + free(pic->xp); + EXIT_XP: + free(pic->ci); + EXIT_CI: + free(pic->sp); + EXIT_SP: + free(pic); + EXIT_PIC: + return NULL; } void From 15449354c6ab842a3b16b0ef20f2b466ddfe141d Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 27 May 2015 23:34:40 +0900 Subject: [PATCH 099/177] switch string implementation to picrin's --- contrib/03.mutable-string/mutable-string.c | 18 +- contrib/03.system/src/system.c | 2 +- contrib/10.regexp/src/regexp.c | 6 +- extlib/benz/bool.c | 6 +- extlib/benz/debug.c | 16 +- extlib/benz/error.c | 8 +- extlib/benz/gc.c | 2 +- extlib/benz/include/picrin.h | 1 - extlib/benz/include/picrin/string.h | 17 +- extlib/benz/include/picrin/xrope.h | 324 --------------------- extlib/benz/port.c | 4 +- extlib/benz/string.c | 275 +++++++++++++++-- extlib/benz/symbol.c | 12 +- extlib/benz/vector.c | 2 +- extlib/benz/vm.c | 4 +- extlib/benz/write.c | 10 +- 16 files changed, 300 insertions(+), 407 deletions(-) delete mode 100644 extlib/benz/include/picrin/xrope.h diff --git a/contrib/03.mutable-string/mutable-string.c b/contrib/03.mutable-string/mutable-string.c index de3ab2bc..43679a29 100644 --- a/contrib/03.mutable-string/mutable-string.c +++ b/contrib/03.mutable-string/mutable-string.c @@ -6,18 +6,18 @@ pic_str_set(pic_state *pic, pic_str *str, size_t i, char c) { pic_str *x, *y, *z, *tmp; - if (pic_strlen(str) <= i) { + if (pic_str_len(str) <= i) { pic_errorf(pic, "index out of range %d", i); } - x = pic_substr(pic, str, 0, i); + x = pic_str_sub(pic, str, 0, i); y = pic_make_str_fill(pic, 1, c); - z = pic_substr(pic, str, i + 1, pic_strlen(str)); + z = pic_str_sub(pic, str, i + 1, pic_str_len(str)); - tmp = pic_strcat(pic, x, pic_strcat(pic, y, z)); + tmp = pic_str_cat(pic, x, pic_str_cat(pic, y, z)); - XROPE_INCREF(tmp->rope); - XROPE_DECREF(str->rope); + pic_rope_incref(pic, tmp->rope); + pic_rope_decref(pic, str->rope); str->rope = tmp->rope; } @@ -46,10 +46,10 @@ pic_str_string_copy_ip(pic_state *pic) case 3: start = 0; case 4: - end = pic_strlen(from); + end = pic_str_len(from); } if (to == from) { - from = pic_substr(pic, from, 0, end); + from = pic_str_sub(pic, from, 0, end); } while (start < end) { @@ -71,7 +71,7 @@ pic_str_string_fill_ip(pic_state *pic) case 2: start = 0; case 3: - end = pic_strlen(str); + end = pic_str_len(str); } while (start < end) { diff --git a/contrib/03.system/src/system.c b/contrib/03.system/src/system.c index c46173b6..5ead4d9c 100644 --- a/contrib/03.system/src/system.c +++ b/contrib/03.system/src/system.c @@ -111,7 +111,7 @@ pic_system_getenvs(pic_state *pic) ; key = pic_make_str(pic, *envp, i); - val = pic_make_str_cstr(pic, getenv(pic_str_cstr(key))); + val = pic_make_str_cstr(pic, getenv(pic_str_cstr(pic, key))); /* push */ data = pic_acons(pic, pic_obj_value(key), pic_obj_value(val), data); diff --git a/contrib/10.regexp/src/regexp.c b/contrib/10.regexp/src/regexp.c index d3942ca7..53134ad0 100644 --- a/contrib/10.regexp/src/regexp.c +++ b/contrib/10.regexp/src/regexp.c @@ -168,13 +168,13 @@ pic_regexp_regexp_replace(pic_state *pic) pic_assert_type(pic, reg, regexp); while (regexec(&pic_regexp_data_ptr(reg)->reg, input, 1, &match, 0) != REG_NOMATCH) { - output = pic_strcat(pic, output, pic_make_str(pic, input, match.rm_so)); - output = pic_strcat(pic, output, txt); + output = pic_str_cat(pic, output, pic_make_str(pic, input, match.rm_so)); + output = pic_str_cat(pic, output, txt); input += match.rm_eo; } - output = pic_strcat(pic, output, pic_make_str(pic, input, strlen(input))); + output = pic_str_cat(pic, output, pic_make_str(pic, input, strlen(input))); return pic_obj_value(output); } diff --git a/extlib/benz/bool.c b/extlib/benz/bool.c index b102f9de..b81c2155 100644 --- a/extlib/benz/bool.c +++ b/extlib/benz/bool.c @@ -9,9 +9,9 @@ #include "picrin/string.h" static bool -str_equal_p(struct pic_string *str1, struct pic_string *str2) +str_equal_p(pic_state *pic, struct pic_string *str1, struct pic_string *str2) { - return pic_strcmp(str1, str2) == 0; + return pic_str_cmp(pic, str1, str2) == 0; } static bool @@ -65,7 +65,7 @@ internal_equal_p(pic_state *pic, pic_value x, pic_value y, size_t depth, xhash * switch (pic_type(x)) { case PIC_TT_STRING: - return str_equal_p(pic_str_ptr(x), pic_str_ptr(y)); + return str_equal_p(pic, pic_str_ptr(x), pic_str_ptr(y)); case PIC_TT_BLOB: return blob_equal_p(pic_blob_ptr(x), pic_blob_ptr(y)); diff --git a/extlib/benz/debug.c b/extlib/benz/debug.c index bcd95546..eb969c1c 100644 --- a/extlib/benz/debug.c +++ b/extlib/benz/debug.c @@ -19,13 +19,13 @@ pic_get_backtrace(pic_state *pic) for (ci = pic->ci; ci != pic->cibase; --ci) { struct pic_proc *proc = pic_proc_ptr(ci->fp[0]); - trace = pic_strcat(pic, trace, pic_make_str_cstr(pic, " at ")); - trace = pic_strcat(pic, trace, pic_make_str_cstr(pic, pic_symbol_name(pic, pic_proc_name(proc)))); + trace = pic_str_cat(pic, trace, pic_make_str_cstr(pic, " at ")); + trace = pic_str_cat(pic, trace, pic_make_str_cstr(pic, pic_symbol_name(pic, pic_proc_name(proc)))); if (pic_proc_func_p(proc)) { - trace = pic_strcat(pic, trace, pic_make_str_cstr(pic, " (native function)\n")); + trace = pic_str_cat(pic, trace, pic_make_str_cstr(pic, " (native function)\n")); } else if (pic_proc_irep_p(proc)) { - trace = pic_strcat(pic, trace, pic_make_str_cstr(pic, " (unknown location)\n")); /* TODO */ + trace = pic_str_cat(pic, trace, pic_make_str_cstr(pic, " (unknown location)\n")); /* TODO */ } } @@ -54,16 +54,16 @@ pic_print_backtrace(pic_state *pic) } else { trace = pic_make_str(pic, NULL, 0); } - trace = pic_strcat(pic, trace, pic_format(pic, "error: ~s", pic_obj_value(e->msg))); + trace = pic_str_cat(pic, trace, pic_format(pic, "error: ~s", pic_obj_value(e->msg))); /* TODO: print error irritants */ - trace = pic_strcat(pic, trace, pic_make_str(pic, "\n", 1)); - trace = pic_strcat(pic, trace, e->stack); + trace = pic_str_cat(pic, trace, pic_make_str(pic, "\n", 1)); + trace = pic_str_cat(pic, trace, e->stack); } /* print! */ - xfprintf(xstderr, "%s", pic_str_cstr(trace)); + xfprintf(xstderr, "%s", pic_str_cstr(pic, trace)); pic_gc_arena_restore(pic, ai); } diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 5df91233..3fd6035b 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -29,7 +29,7 @@ pic_warnf(pic_state *pic, const char *fmt, ...) err_line = pic_xvformat(pic, fmt, ap); va_end(ap); - fprintf(stderr, "warn: %s\n", pic_str_cstr(pic_str_ptr(pic_car(pic, err_line)))); + fprintf(stderr, "warn: %s\n", pic_str_cstr(pic, pic_str_ptr(pic_car(pic, err_line)))); } void @@ -43,7 +43,7 @@ pic_errorf(pic_state *pic, const char *fmt, ...) err_line = pic_xvformat(pic, fmt, ap); va_end(ap); - msg = pic_str_cstr(pic_str_ptr(pic_car(pic, err_line))); + msg = pic_str_cstr(pic, pic_str_ptr(pic_car(pic, err_line))); irrs = pic_cdr(pic, err_line); pic_error(pic, msg, irrs); @@ -62,7 +62,7 @@ pic_errmsg(pic_state *pic) str = pic_error_ptr(pic->err)->msg; } - return pic_str_cstr(str); + return pic_str_cstr(pic, str); } static pic_value @@ -260,7 +260,7 @@ pic_error_make_error_object(pic_state *pic) pic_get_args(pic, "ms*", &type, &msg, &argc, &argv); - e = pic_make_error(pic, type, pic_str_cstr(msg), pic_list_by_array(pic, argc, argv)); + e = pic_make_error(pic, type, pic_str_cstr(pic, msg), pic_list_by_array(pic, argc, argv)); return pic_obj_value(e); } diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 0f80b695..fd319454 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -649,7 +649,7 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) break; } case PIC_TT_STRING: { - XROPE_DECREF(((struct pic_string *)obj)->rope); + pic_rope_decref(pic, ((struct pic_string *)obj)->rope); break; } case PIC_TT_PORT: { diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index c5980e73..6ae0107e 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -48,7 +48,6 @@ extern "C" { #include "picrin/xvect.h" #include "picrin/xhash.h" #include "picrin/xfile.h" -#include "picrin/xrope.h" #include "picrin/value.h" diff --git a/extlib/benz/include/picrin/string.h b/extlib/benz/include/picrin/string.h index 2701e162..2728e97b 100644 --- a/extlib/benz/include/picrin/string.h +++ b/extlib/benz/include/picrin/string.h @@ -11,9 +11,12 @@ extern "C" { struct pic_string { PIC_OBJECT_HEADER - xrope *rope; + struct pic_rope *rope; }; +void pic_rope_incref(pic_state *, struct pic_rope *); +void pic_rope_decref(pic_state *, struct pic_rope *); + #define pic_str_p(v) (pic_type(v) == PIC_TT_STRING) #define pic_str_ptr(o) ((struct pic_string *)pic_ptr(o)) @@ -21,14 +24,12 @@ pic_str *pic_make_str(pic_state *, const char * /* nullable */, size_t); pic_str *pic_make_str_cstr(pic_state *, const char *); pic_str *pic_make_str_fill(pic_state *, size_t, char); -size_t pic_strlen(pic_str *); char pic_str_ref(pic_state *, pic_str *, size_t); - -pic_str *pic_strcat(pic_state *, pic_str *, pic_str *); -pic_str *pic_substr(pic_state *, pic_str *, size_t, size_t); -int pic_strcmp(pic_str *, pic_str *); - -const char *pic_str_cstr(pic_str *); +size_t pic_str_len(pic_str *); +pic_str *pic_str_cat(pic_state *, pic_str *, pic_str *); +pic_str *pic_str_sub(pic_state *, pic_str *, size_t, size_t); +int pic_str_cmp(pic_state *, pic_str *, pic_str *); +const char *pic_str_cstr(pic_state *, pic_str *); pic_str *pic_format(pic_state *, const char *, ...); pic_str *pic_vformat(pic_state *, const char *, va_list); diff --git a/extlib/benz/include/picrin/xrope.h b/extlib/benz/include/picrin/xrope.h deleted file mode 100644 index fcdeb446..00000000 --- a/extlib/benz/include/picrin/xrope.h +++ /dev/null @@ -1,324 +0,0 @@ -#ifndef XROPE_H__ -#define XROPE_H__ - -#if defined(__cplusplus) -extern "C" { -#endif - -/* public APIs */ - -typedef struct xrope xrope; - -/** - * | name | frees buffer? | end with NULL? | complexity | misc - * | ---- | ---- | ---- | ---- | --- - * | xr_new_cstr | no | yes | O(1) | xr_new(_lit) - * | xr_new_imbed | no | no | O(1) | - * | xr_new_move | yes | yes | O(1) | - * | xr_new_copy | yes | no | O(n) | - */ - -#define xr_new(cstr) xr_new_cstr(cstr, strlen(cstr)) -#define xr_new_lit(cstr) xr_new_cstr(cstr, sizeof(cstr) - 1) -PIC_INLINE xrope *xr_new_cstr(const char *, size_t); -PIC_INLINE xrope *xr_new_imbed(const char *, size_t); -PIC_INLINE xrope *xr_new_move(const char *, size_t); -PIC_INLINE xrope *xr_new_copy(const char *, size_t); - -PIC_INLINE void XROPE_INCREF(xrope *); -PIC_INLINE void XROPE_DECREF(xrope *); - -PIC_INLINE size_t xr_len(xrope *); -PIC_INLINE char xr_at(xrope *, size_t); -PIC_INLINE xrope *xr_cat(xrope *, xrope *); -PIC_INLINE xrope *xr_sub(xrope *, size_t, size_t); -PIC_INLINE const char *xr_cstr(xrope *); /* returns NULL-terminated string */ - - -/* impl */ - -typedef struct { - char *str; - int refcnt; - size_t len; - char autofree, zeroterm; -} xr_chunk; - -#define XR_CHUNK_INCREF(c) do { \ - (c)->refcnt++; \ - } while (0) - -#define XR_CHUNK_DECREF(c) do { \ - xr_chunk *c__ = (c); \ - if (! --c__->refcnt) { \ - if (c__->autofree) \ - free(c__->str); \ - free(c__); \ - } \ - } while (0) - -struct xrope { - int refcnt; - size_t weight; - xr_chunk *chunk; - size_t offset; - struct xrope *left, *right; -}; - -PIC_INLINE void -XROPE_INCREF(xrope *x) { - x->refcnt++; -} - -PIC_INLINE void -XROPE_DECREF(xrope *x) { - if (! --x->refcnt) { - if (x->chunk) { - XR_CHUNK_DECREF(x->chunk); - free(x); - return; - } - XROPE_DECREF(x->left); - XROPE_DECREF(x->right); - free(x); - } -} - -PIC_INLINE xrope * -xr_new_cstr(const char *cstr, size_t len) -{ - xr_chunk *c; - xrope *x; - - c = (xr_chunk *)malloc(sizeof(xr_chunk)); - c->refcnt = 1; - c->str = (char *)cstr; - c->len = len; - c->autofree = 0; - c->zeroterm = 1; - - x = (xrope *)malloc(sizeof(xrope)); - x->refcnt = 1; - x->left = NULL; - x->right = NULL; - x->weight = c->len; - x->offset = 0; - x->chunk = c; - - return x; -} - -PIC_INLINE xrope * -xr_new_imbed(const char *str, size_t len) -{ - xr_chunk *c; - xrope *x; - - c = (xr_chunk *)malloc(sizeof(xr_chunk)); - c->refcnt = 1; - c->str = (char *)str; - c->len = len; - c->autofree = 0; - c->zeroterm = 0; - - x = (xrope *)malloc(sizeof(xrope)); - x->refcnt = 1; - x->left = NULL; - x->right = NULL; - x->weight = c->len; - x->offset = 0; - x->chunk = c; - - return x; -} - -PIC_INLINE xrope * -xr_new_move(const char *cstr, size_t len) -{ - xr_chunk *c; - xrope *x; - - c = (xr_chunk *)malloc(sizeof(xr_chunk)); - c->refcnt = 1; - c->str = (char *)cstr; - c->len = len; - c->autofree = 1; - c->zeroterm = 1; - - x = (xrope *)malloc(sizeof(xrope)); - x->refcnt = 1; - x->left = NULL; - x->right = NULL; - x->weight = c->len; - x->offset = 0; - x->chunk = c; - - return x; -} - -PIC_INLINE xrope * -xr_new_copy(const char *str, size_t len) -{ - char *buf; - xr_chunk *c; - xrope *x; - - buf = (char *)malloc(len + 1); - buf[len] = '\0'; - memcpy(buf, str, len); - - c = (xr_chunk *)malloc(sizeof(xr_chunk)); - c->refcnt = 1; - c->str = buf; - c->len = len; - c->autofree = 1; - c->zeroterm = 1; - - x = (xrope *)malloc(sizeof(xrope)); - x->refcnt = 1; - x->left = NULL; - x->right = NULL; - x->weight = c->len; - x->offset = 0; - x->chunk = c; - - return x; -} - -PIC_INLINE size_t -xr_len(xrope *x) -{ - return x->weight; -} - -PIC_INLINE char -xr_at(xrope *x, size_t i) -{ - if (x->weight <= i) { - return -1; - } - if (x->chunk) { - return x->chunk->str[x->offset + i]; - } - return (i < x->left->weight) - ? xr_at(x->left, i) - : xr_at(x->right, i - x->left->weight); -} - -PIC_INLINE xrope * -xr_cat(xrope *x, xrope *y) -{ - xrope *z; - - z = (xrope *)malloc(sizeof(xrope)); - z->refcnt = 1; - z->left = x; - z->right = y; - z->weight = x->weight + y->weight; - z->offset = 0; - z->chunk = NULL; - - XROPE_INCREF(x); - XROPE_INCREF(y); - - return z; -} - -PIC_INLINE struct xrope * -xr_sub(xrope *x, size_t i, size_t j) -{ - assert(i <= j); - assert(j <= x->weight); - - if (i == 0 && x->weight == j) { - XROPE_INCREF(x); - return x; - } - - if (x->chunk) { - xrope *y; - - y = (xrope *)malloc(sizeof(xrope)); - y->refcnt = 1; - y->left = NULL; - y->right = NULL; - y->weight = j - i; - y->offset = x->offset + i; - y->chunk = x->chunk; - - XR_CHUNK_INCREF(x->chunk); - - return y; - } - - if (j <= x->left->weight) { - return xr_sub(x->left, i, j); - } - else if (x->left->weight <= i) { - return xr_sub(x->right, i - x->left->weight, j - x->left->weight); - } - else { - xrope *r, *l; - - l = xr_sub(x->left, i, x->left->weight); - r = xr_sub(x->right, 0, j - x->left->weight); - x = xr_cat(l, r); - - XROPE_DECREF(l); - XROPE_DECREF(r); - - return x; - } -} - -PIC_INLINE void -xr_fold(xrope *x, xr_chunk *c, size_t offset) -{ - if (x->chunk) { - memcpy(c->str + offset, x->chunk->str + x->offset, x->weight); - XR_CHUNK_DECREF(x->chunk); - - x->chunk = c; - x->offset = offset; - XR_CHUNK_INCREF(c); - return; - } - xr_fold(x->left, c, offset); - xr_fold(x->right, c, offset + x->left->weight); - - XROPE_DECREF(x->left); - XROPE_DECREF(x->right); - x->left = x->right = NULL; - x->chunk = c; - x->offset = offset; - XR_CHUNK_INCREF(c); -} - -PIC_INLINE const char * -xr_cstr(xrope *x) -{ - xr_chunk *c; - - if (x->chunk && x->offset == 0 && x->weight == x->chunk->len && x->chunk->zeroterm) { - return x->chunk->str; /* reuse cached chunk */ - } - - c = (xr_chunk *)malloc(sizeof(xr_chunk)); - c->refcnt = 1; - c->len = x->weight; - c->autofree = 1; - c->zeroterm = 1; - c->str = (char *)malloc(c->len + 1); - c->str[c->len] = '\0'; - - xr_fold(x, c, 0); - - XR_CHUNK_DECREF(c); - return c->str; -} - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/extlib/benz/port.c b/extlib/benz/port.c index 5032104b..be574938 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -415,7 +415,7 @@ pic_port_read_line(pic_state *pic) } str = pic_get_output_string(pic, buf); - if (pic_strlen(str) == 0 && c == EOF) { + if (pic_str_len(str) == 0 && c == EOF) { return pic_eof_object(); } else { @@ -456,7 +456,7 @@ pic_port_read_string(pic_state *pic){ } str = pic_get_output_string(pic, buf); - if (pic_strlen(str) == 0 && c == EOF) { + if (pic_str_len(str) == 0 && c == EOF) { return pic_eof_object(); } else { diff --git a/extlib/benz/string.c b/extlib/benz/string.c index da6614dd..d2924ac6 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -8,8 +8,93 @@ #include "picrin/port.h" #include "picrin/error.h" +struct pic_chunk { + char *str; + int refcnt; + size_t len; + char autofree; +}; + +struct pic_rope { + int refcnt; + size_t weight; + struct pic_chunk *chunk; + size_t offset; + struct pic_rope *left, *right; +}; + +#define CHUNK_INCREF(c) do { \ + (c)->refcnt++; \ + } while (0) + +#define CHUNK_DECREF(c) do { \ + struct pic_chunk *c_ = (c); \ + if (! --c_->refcnt) { \ + if (c_->autofree) \ + pic_free(pic, c_->str); \ + pic_free(pic, c_); \ + } \ + } while (0) + +void +pic_rope_incref(pic_state *pic, struct pic_rope *x) { + PIC_UNUSED(pic); + + x->refcnt++; +} + +void +pic_rope_decref(pic_state *pic, struct pic_rope *x) { + if (! --x->refcnt) { + if (x->chunk) { + CHUNK_DECREF(x->chunk); + pic_free(pic, x); + return; + } + pic_rope_decref(pic, x->left); + pic_rope_decref(pic, x->right); + pic_free(pic, x); + } +} + +static struct pic_chunk * +pic_make_chunk(pic_state *pic, const char *str, size_t len) +{ + char *buf; + struct pic_chunk *c; + + buf = pic_malloc(pic, len + 1); + buf[len] = 0; + + memcpy(buf, str, len); + + c = pic_malloc(pic, sizeof(struct pic_chunk)); + c->refcnt = 1; + c->str = buf; + c->len = len; + c->autofree = 1; + + return c; +} + +static struct pic_rope * +pic_make_rope(pic_state *pic, struct pic_chunk *c) +{ + struct pic_rope *x; + + x = pic_malloc(pic, sizeof(struct pic_rope)); + x->refcnt = 1; + x->left = NULL; + x->right = NULL; + x->weight = c->len; + x->offset = 0; + x->chunk = c; /* delegate ownership */ + + return x; +} + static pic_str * -make_str_rope(pic_state *pic, xrope *rope) +pic_make_string(pic_state *pic, struct pic_rope *rope) { pic_str *str; @@ -18,13 +103,147 @@ make_str_rope(pic_state *pic, xrope *rope) return str; } -pic_str * -pic_make_str(pic_state *pic, const char *imbed, size_t len) +static size_t +rope_len(struct pic_rope *x) { - if (imbed == NULL && len > 0) { + return x->weight; +} + +static char +rope_at(struct pic_rope *x, size_t i) +{ + while (i < x->weight) { + if (x->chunk) { + return x->chunk->str[x->offset + i]; + } + if (i < x->left->weight) { + x = x->left; + } else { + x = x->right; + i -= x->left->weight; + } + } + return -1; +} + +static struct pic_rope * +rope_cat(pic_state *pic, struct pic_rope *x, struct pic_rope *y) +{ + struct pic_rope *z; + + z = pic_malloc(pic, sizeof(struct pic_rope)); + z->refcnt = 1; + z->left = x; + z->right = y; + z->weight = x->weight + y->weight; + z->offset = 0; + z->chunk = NULL; + + pic_rope_incref(pic, x); + pic_rope_incref(pic, y); + + return z; +} + +static struct pic_rope * +rope_sub(pic_state *pic, struct pic_rope *x, size_t i, size_t j) +{ + assert(i <= j); + assert(j <= x->weight); + + if (i == 0 && x->weight == j) { + pic_rope_incref(pic, x); + return x; + } + + if (x->chunk) { + struct pic_rope *y; + + y = pic_malloc(pic, sizeof(struct pic_rope)); + y->refcnt = 1; + y->left = NULL; + y->right = NULL; + y->weight = j - i; + y->offset = x->offset + i; + y->chunk = x->chunk; + + CHUNK_INCREF(x->chunk); + + return y; + } + + if (j <= x->left->weight) { + return rope_sub(pic, x->left, i, j); + } + else if (x->left->weight <= i) { + return rope_sub(pic, x->right, i - x->left->weight, j - x->left->weight); + } + else { + struct pic_rope *r, *l; + + l = rope_sub(pic, x->left, i, x->left->weight); + r = rope_sub(pic, x->right, 0, j - x->left->weight); + x = rope_cat(pic, l, r); + + pic_rope_decref(pic, l); + pic_rope_decref(pic, r); + + return x; + } +} + +static void +flatten(pic_state *pic, struct pic_rope *x, struct pic_chunk *c, size_t offset) +{ + if (x->chunk) { + memcpy(c->str + offset, x->chunk->str + x->offset, x->weight); + CHUNK_DECREF(x->chunk); + + x->chunk = c; + x->offset = offset; + CHUNK_INCREF(c); + return; + } + flatten(pic, x->left, c, offset); + flatten(pic, x->right, c, offset + x->left->weight); + + pic_rope_decref(pic, x->left); + pic_rope_decref(pic, x->right); + x->left = x->right = NULL; + x->chunk = c; + x->offset = offset; + CHUNK_INCREF(c); +} + +static const char * +rope_cstr(pic_state *pic, struct pic_rope *x) +{ + struct pic_chunk *c; + + if (x->chunk && x->offset == 0 && x->weight == x->chunk->len) { + return x->chunk->str; /* reuse cached chunk */ + } + + c = pic_malloc(pic, sizeof(struct pic_chunk)); + c->refcnt = 1; + c->len = x->weight; + c->autofree = 1; + c->str = pic_malloc(pic, c->len + 1); + c->str[c->len] = '\0'; + + flatten(pic, x, c, 0); + + CHUNK_DECREF(c); + return c->str; +} + +pic_str * +pic_make_str(pic_state *pic, const char *str, size_t len) +{ + if (str == NULL && len > 0) { pic_errorf(pic, "zero length specified against NULL ptr"); } - return make_str_rope(pic, xr_new_copy(imbed, len)); + return pic_make_string(pic, pic_make_rope(pic, pic_make_chunk(pic, str, len))); } pic_str * @@ -53,9 +272,9 @@ pic_make_str_fill(pic_state *pic, size_t len, char fill) } size_t -pic_strlen(pic_str *str) +pic_str_len(pic_str *str) { - return xr_len(str->rope); + return rope_len(str->rope); } char @@ -63,7 +282,7 @@ pic_str_ref(pic_state *pic, pic_str *str, size_t i) { int c; - c = xr_at(str->rope, i); + c = rope_at(str->rope, i); if (c == -1) { pic_errorf(pic, "index out of range %d", i); } @@ -71,27 +290,27 @@ pic_str_ref(pic_state *pic, pic_str *str, size_t i) } pic_str * -pic_strcat(pic_state *pic, pic_str *a, pic_str *b) +pic_str_cat(pic_state *pic, pic_str *a, pic_str *b) { - return make_str_rope(pic, xr_cat(a->rope, b->rope)); + return pic_make_string(pic, rope_cat(pic, a->rope, b->rope)); } pic_str * -pic_substr(pic_state *pic, pic_str *str, size_t s, size_t e) +pic_str_sub(pic_state *pic, pic_str *str, size_t s, size_t e) { - return make_str_rope(pic, xr_sub(str->rope, s, e)); + return pic_make_string(pic, rope_sub(pic, str->rope, s, e)); } int -pic_strcmp(pic_str *str1, pic_str *str2) +pic_str_cmp(pic_state *pic, pic_str *str1, pic_str *str2) { - return strcmp(xr_cstr(str1->rope), xr_cstr(str2->rope)); + return strcmp(pic_str_cstr(pic, str1), pic_str_cstr(pic, str2)); } const char * -pic_str_cstr(pic_str *str) +pic_str_cstr(pic_state *pic, pic_str *str) { - return xr_cstr(str->rope); + return rope_cstr(pic, str->rope); } pic_value @@ -275,7 +494,7 @@ pic_str_string_length(pic_state *pic) pic_get_args(pic, "s", &str); - return pic_size_value(pic_strlen(str)); + return pic_size_value(pic_str_len(str)); } static pic_value @@ -306,7 +525,7 @@ pic_str_string_ref(pic_state *pic) if (! pic_str_p(argv[i])) { \ return pic_false_value(); \ } \ - if (! (pic_strcmp(pic_str_ptr(argv[i-1]), pic_str_ptr(argv[i])) op 0)) { \ + if (! (pic_str_cmp(pic, pic_str_ptr(argv[i-1]), pic_str_ptr(argv[i])) op 0)) { \ return pic_false_value(); \ } \ } \ @@ -332,10 +551,10 @@ pic_str_string_copy(pic_state *pic) case 1: start = 0; case 2: - end = pic_strlen(str); + end = pic_str_len(str); } - return pic_obj_value(pic_substr(pic, str, start, end)); + return pic_obj_value(pic_str_sub(pic, str, start, end)); } static pic_value @@ -352,7 +571,7 @@ pic_str_string_append(pic_state *pic) if (! pic_str_p(argv[i])) { pic_errorf(pic, "type error"); } - str = pic_strcat(pic, str, pic_str_ptr(argv[i])); + str = pic_str_cat(pic, str, pic_str_ptr(argv[i])); } return pic_obj_value(str); } @@ -372,14 +591,14 @@ pic_str_string_map(pic_state *pic) pic_errorf(pic, "string-map: one or more strings expected, but got zero"); } else { pic_assert_type(pic, argv[0], str); - len = pic_strlen(pic_str_ptr(argv[0])); + len = pic_str_len(pic_str_ptr(argv[0])); } for (i = 1; i < argc; ++i) { pic_assert_type(pic, argv[i], str); - len = len < pic_strlen(pic_str_ptr(argv[i])) + len = len < pic_str_len(pic_str_ptr(argv[i])) ? len - : pic_strlen(pic_str_ptr(argv[i])); + : pic_str_len(pic_str_ptr(argv[i])); } buf = pic_malloc(pic, len); @@ -419,14 +638,14 @@ pic_str_string_for_each(pic_state *pic) pic_errorf(pic, "string-map: one or more strings expected, but got zero"); } else { pic_assert_type(pic, argv[0], str); - len = pic_strlen(pic_str_ptr(argv[0])); + len = pic_str_len(pic_str_ptr(argv[0])); } for (i = 1; i < argc; ++i) { pic_assert_type(pic, argv[i], str); - len = len < pic_strlen(pic_str_ptr(argv[i])) + len = len < pic_str_len(pic_str_ptr(argv[i])) ? len - : pic_strlen(pic_str_ptr(argv[i])); + : pic_str_len(pic_str_ptr(argv[i])); } for (i = 0; i < len; ++i) { @@ -488,7 +707,7 @@ pic_str_string_to_list(pic_state *pic) case 1: start = 0; case 2: - end = pic_strlen(str); + end = pic_str_len(str); } list = pic_nil_value(); diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index f8f091bd..219ee25a 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -23,15 +23,15 @@ pic_intern(pic_state *pic, pic_str *str) pic_sym *sym; char *cstr; - e = xh_get_str(&pic->syms, pic_str_cstr(str)); + e = xh_get_str(&pic->syms, pic_str_cstr(pic, str)); if (e) { sym = xh_val(e, pic_sym *); pic_gc_protect(pic, pic_obj_value(sym)); return sym; } - cstr = pic_malloc(pic, pic_strlen(str) + 1); - strcpy(cstr, pic_str_cstr(str)); + cstr = pic_malloc(pic, pic_str_len(str) + 1); + strcpy(cstr, pic_str_cstr(pic, str)); sym = pic_make_symbol(pic, str); xh_put_str(&pic->syms, cstr, &sym); @@ -55,7 +55,7 @@ pic_interned_p(pic_state *pic, pic_sym *sym) { xh_entry *e; - e = xh_get_str(&pic->syms, pic_str_cstr(sym->str)); + e = xh_get_str(&pic->syms, pic_str_cstr(pic, sym->str)); if (e) { return sym == xh_val(e, pic_sym *); } else { @@ -66,9 +66,7 @@ pic_interned_p(pic_state *pic, pic_sym *sym) const char * pic_symbol_name(pic_state *pic, pic_sym *sym) { - PIC_UNUSED(pic); - - return pic_str_cstr(sym->str); + return pic_str_cstr(pic, sym->str); } static pic_value diff --git a/extlib/benz/vector.c b/extlib/benz/vector.c index 60004cc8..f98c81ab 100644 --- a/extlib/benz/vector.c +++ b/extlib/benz/vector.c @@ -392,7 +392,7 @@ pic_vec_string_to_vector(pic_state *pic) case 1: start = 0; case 2: - end = pic_strlen(str); + end = pic_str_len(str); } if (end < start) { diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 9db86c38..9626f5d9 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -254,7 +254,7 @@ pic_get_args(pic_state *pic, const char *format, ...) if (! pic_str_p(v)) { pic_errorf(pic, "pic_get_args: expected string, but got ~s", v); } - *cstr = pic_str_cstr(pic_str_ptr(v)); + *cstr = pic_str_cstr(pic, pic_str_ptr(v)); break; } case 'm': { @@ -484,7 +484,7 @@ vm_push_env(pic_state *pic) { pic_callinfo *ci = pic->ci; - ci->env = (struct pic_env *)pic_obj_alloc(pic, offsetof(struct pic_env, storage) + sizeof(pic_value) * (size_t)(ci->regc), PIC_TT_ENV); + ci->env = (struct pic_env *)pic_obj_alloc(pic, sizeof(struct pic_env) + sizeof(pic_value) * (size_t)(ci->regc), PIC_TT_ENV); ci->env->up = ci->up; ci->env->regc = ci->regc; ci->env->regs = ci->regs; diff --git a/extlib/benz/write.c b/extlib/benz/write.c index 5fe657e2..29b4792f 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -161,11 +161,11 @@ static void write_str(pic_state *pic, struct pic_string *str, xFILE *file) { size_t i; - const char *cstr = pic_str_cstr(str); + const char *cstr = pic_str_cstr(pic, str); PIC_UNUSED(pic); - for (i = 0; i < pic_strlen(str); ++i) { + for (i = 0; i < pic_str_len(str); ++i) { if (cstr[i] == '"' || cstr[i] == '\\') { xfputc('\\', file); } @@ -197,7 +197,7 @@ write_record(pic_state *pic, struct pic_record *rec, xFILE *file) if (! pic_str_p(str)) { pic_errorf(pic, "return value from writer procedure is not of string type"); } - xfprintf(file, "%s", pic_str_cstr(pic_str_ptr(str))); + xfprintf(file, "%s", pic_str_cstr(pic, pic_str_ptr(str))); #endif } @@ -303,7 +303,7 @@ write_core(struct writer_control *p, pic_value obj) break; case PIC_TT_STRING: if (p->mode == DISPLAY_MODE) { - xfprintf(file, "%s", pic_str_cstr(pic_str_ptr(obj))); + xfprintf(file, "%s", pic_str_cstr(pic, pic_str_ptr(obj))); break; } xfprintf(file, "\""); @@ -443,7 +443,7 @@ pic_printf(pic_state *pic, const char *fmt, ...) va_end(ap); - xprintf("%s", pic_str_cstr(str)); + xprintf("%s", pic_str_cstr(pic, str)); xfflush(xstdout); } From 4cd8dcab60fd0ab56364662580033aea729e5742 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Wed, 27 May 2015 23:40:01 +0900 Subject: [PATCH 100/177] refactor number reader --- extlib/benz/read.c | 89 +++++++++++++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 28 deletions(-) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 8e2f2c01..b1ca4678 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -224,67 +224,102 @@ read_symbol(pic_state *pic, struct pic_port *port, int c) return pic_obj_value(sym); } -static size_t -read_uinteger(pic_state *pic, struct pic_port *port, int c, char buf[]) +static unsigned +read_uinteger(pic_state *pic, struct pic_port *port, int c) { - size_t i = 0; + unsigned u = 0; if (! isdigit(c)) { read_error(pic, "expected one or more digits"); } - buf[i++] = (char)c; + u = c - '0'; while (isdigit(c = peek(port))) { - buf[i++] = (char)next(port); + u = u * 10 + next(port) - '0'; } - buf[i] = '\0'; - - return i; + return u; } -static size_t -read_suffix(pic_state *pic, struct pic_port *port, char buf[]) +static int +read_suffix(pic_state *pic, struct pic_port *port) { - size_t i = 0; - int c; + int c, s = 1; c = peek(port); if (c != 'e' && c != 'E') { - return i; + return 0; } - buf[i++] = (char)next(port); + next(port); switch ((c = next(port))) { case '-': + s = -1; case '+': - buf[i++] = (char)c; c = next(port); default: - return i + read_uinteger(pic, port, c, buf + i); + return s * read_uinteger(pic, port, c); } } static pic_value read_unsigned(pic_state *pic, struct pic_port *port, int c) { - char buf[256]; - size_t i; + unsigned u, w = 0; + int exp, s, i, e; + double f; - i = read_uinteger(pic, port, c, buf); + u = read_uinteger(pic, port, c); switch (peek(port)) { case '.': - buf[i++] = (char)next(port); - i += read_uinteger(pic, port, next(port), buf + i); - read_suffix(pic, port, buf + i); - return pic_float_value(atof(buf)); + next(port); + w = 0, f = 1; + while (isdigit(c = peek(port))) { + w = w * 10 + next(port) - '0'; + f /= 10; + } + f = u + w * f; + + exp = read_suffix(pic, port); + if (exp >= 0) { + s = 0; + } else { + exp = -exp; + s = 1; + } + + e = 10; + for (i = 0; exp; ++i) { + if ((exp & 1) != 0) { + f = s ? f / e : (f * e); + } + e *= e; + exp >>= 1; + } + return pic_float_value(f); default: - read_suffix(pic, port, buf + i); - return pic_int_value((int)(atof(buf))); + exp = read_suffix(pic, port); + if (exp >= 0) { + s = 0; + } else { + exp = -exp; + s = 1; + } + + e = 10; + for (i = 0; exp; ++i) { + if ((exp & 1) != 0) { + u = s ? u / e : (u * e); + } + e *= e; + exp >>= 1; + } + + return pic_int_value(u); } } @@ -495,7 +530,6 @@ read_blob(pic_state *pic, struct pic_port *port, int c) { int nbits, n; size_t len, i; - char buf[256]; unsigned char *dat; pic_blob *blob; @@ -517,8 +551,7 @@ read_blob(pic_state *pic, struct pic_port *port, int c) dat = NULL; c = next(port); while ((c = skip(port, c)) != ')') { - read_uinteger(pic, port, c, buf); - n = atoi(buf); + n = read_uinteger(pic, port, c); if (n < 0 || (1 << nbits) <= n) { read_error(pic, "invalid element in bytevector literal"); } From 1fe960716e0745dc93450b63574669795911d1b0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 00:02:24 +0900 Subject: [PATCH 101/177] [bugfix] too long fraction causes overflow --- extlib/benz/read.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index b1ca4678..8262e0d7 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -267,21 +267,21 @@ read_suffix(pic_state *pic, struct pic_port *port) static pic_value read_unsigned(pic_state *pic, struct pic_port *port, int c) { - unsigned u, w = 0; + unsigned u; int exp, s, i, e; - double f; + double f, g; u = read_uinteger(pic, port, c); switch (peek(port)) { case '.': next(port); - w = 0, f = 1; + g = 0, e = 0; while (isdigit(c = peek(port))) { - w = w * 10 + next(port) - '0'; - f /= 10; + g = g * 10 + (next(port) - '0'); + e++; } - f = u + w * f; + f = u + g * pow(10, -e); exp = read_suffix(pic, port); if (exp >= 0) { From 7923f947d78e62cbb2e82e19ae803587f52c1ee8 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 00:14:10 +0900 Subject: [PATCH 102/177] don't use xstd** from benz --- extlib/benz/codegen.c | 3 --- extlib/benz/debug.c | 25 +++++++++---------------- extlib/benz/error.c | 3 ++- extlib/benz/include/picrin.h | 2 +- extlib/benz/port.c | 10 ++++++++++ extlib/benz/write.c | 9 +++++---- src/main.c | 2 +- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 68149a05..062fc20c 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -555,7 +555,6 @@ analyze_quote(analyze_state *state, pic_value obj) return pic_list2(pic, pic_obj_value(pic->sQUOTE), pic_list_ref(pic, obj, 1)); } - #define ARGC_ASSERT_GE(n, name) do { \ if (pic_length(pic, obj) < (n) + 1) { \ pic_errorf(pic, \ @@ -573,7 +572,6 @@ analyze_quote(analyze_state *state, pic_value obj) } \ } while (0) - static pic_value analyze_add(analyze_state *state, pic_value obj, bool tailpos) { @@ -730,7 +728,6 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos) 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) { diff --git a/extlib/benz/debug.c b/extlib/benz/debug.c index eb969c1c..65b8e548 100644 --- a/extlib/benz/debug.c +++ b/extlib/benz/debug.c @@ -36,34 +36,27 @@ pic_get_backtrace(pic_state *pic) } void -pic_print_backtrace(pic_state *pic) +pic_print_backtrace(pic_state *pic, xFILE *file) { - size_t ai = pic_gc_arena_preserve(pic); - pic_str *trace; - assert(! pic_undef_p(pic->err)); if (! pic_error_p(pic->err)) { - trace = pic_format(pic, "raised: ~s", pic->err); + xfprintf(file, "raise: "); + pic_fwrite(pic, pic->err, file); } else { struct pic_error *e; e = pic_error_ptr(pic->err); if (e->type != pic_intern_cstr(pic, "")) { - trace = pic_format(pic, "~s ", pic_obj_value(e->type)); - } else { - trace = pic_make_str(pic, NULL, 0); + pic_fwrite(pic, pic_obj_value(e->type), file); + xfprintf(file, " "); } - trace = pic_str_cat(pic, trace, pic_format(pic, "error: ~s", pic_obj_value(e->msg))); + xfprintf(file, "error: "); + pic_fwrite(pic, pic_obj_value(e->msg), file); + xfprintf(file, "\n"); /* TODO: print error irritants */ - trace = pic_str_cat(pic, trace, pic_make_str(pic, "\n", 1)); - trace = pic_str_cat(pic, trace, e->stack); + xfputs(pic_str_cstr(pic, e->stack), file); } - - /* print! */ - xfprintf(xstderr, "%s", pic_str_cstr(pic, trace)); - - pic_gc_arena_restore(pic, ai); } diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 3fd6035b..705f0055 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -9,6 +9,7 @@ #include "picrin/data.h" #include "picrin/string.h" #include "picrin/error.h" +#include "picrin/port.h" void pic_panic(pic_state *pic, const char *msg) @@ -29,7 +30,7 @@ pic_warnf(pic_state *pic, const char *fmt, ...) err_line = pic_xvformat(pic, fmt, ap); va_end(ap); - fprintf(stderr, "warn: %s\n", pic_str_cstr(pic, pic_str_ptr(pic_car(pic, err_line)))); + xfprintf(pic_stderr(pic)->file, "warn: %s\n", pic_str_cstr(pic, pic_str_ptr(pic_car(pic, err_line)))); } void diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 6ae0107e..8965af8d 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -224,7 +224,7 @@ PIC_NORETURN void pic_errorf(pic_state *, const char *, ...); void pic_warnf(pic_state *, const char *, ...); const char *pic_errmsg(pic_state *); pic_str *pic_get_backtrace(pic_state *); -void pic_print_backtrace(pic_state *); +void pic_print_backtrace(pic_state *, xFILE *); /* obsoleted */ PIC_INLINE void pic_warn(pic_state *pic, const char *msg) diff --git a/extlib/benz/port.c b/extlib/benz/port.c index be574938..9f725f7f 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -38,6 +38,16 @@ pic_stdout(pic_state *pic) return pic_port_ptr(obj); } +struct pic_port * +pic_stderr(pic_state *pic) +{ + pic_value obj; + + obj = pic_funcall(pic, pic->PICRIN_BASE, "current-error-port", pic_nil_value()); + + return pic_port_ptr(obj); +} + struct pic_port * pic_make_standard_port(pic_state *pic, xFILE *file, short dir) { diff --git a/extlib/benz/write.c b/extlib/benz/write.c index 29b4792f..f89e0703 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -406,7 +406,7 @@ display(pic_state *pic, pic_value obj, xFILE *file) pic_value pic_write(pic_state *pic, pic_value obj) { - return pic_fwrite(pic, obj, xstdout); + return pic_fwrite(pic, obj, pic_stdout(pic)->file); } pic_value @@ -420,7 +420,7 @@ pic_fwrite(pic_state *pic, pic_value obj, xFILE *file) pic_value pic_display(pic_state *pic, pic_value obj) { - return pic_fdisplay(pic, obj, xstdout); + return pic_fdisplay(pic, obj, pic_stdout(pic)->file); } pic_value @@ -434,6 +434,7 @@ pic_fdisplay(pic_state *pic, pic_value obj, xFILE *file) void pic_printf(pic_state *pic, const char *fmt, ...) { + xFILE *file = pic_stdout(pic)->file; va_list ap; pic_str *str; @@ -443,8 +444,8 @@ pic_printf(pic_state *pic, const char *fmt, ...) va_end(ap); - xprintf("%s", pic_str_cstr(pic, str)); - xfflush(xstdout); + xfprintf(file, "%s", pic_str_cstr(pic, str)); + xfflush(file); } static pic_value diff --git a/src/main.c b/src/main.c index f43419f1..72bbaebb 100644 --- a/src/main.c +++ b/src/main.c @@ -65,7 +65,7 @@ main(int argc, char *argv[], char **envp) pic_funcall(pic, PICRIN_MAIN, "main", pic_nil_value()); } pic_catch { - pic_print_backtrace(pic); + pic_print_backtrace(pic, xstderr); status = 1; } From 9885bdd982de216648ddb4e5bff143ea7a87fe64 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 00:17:12 +0900 Subject: [PATCH 103/177] explicit cast to size_t --- extlib/benz/include/picrin/xvect.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extlib/benz/include/picrin/xvect.h b/extlib/benz/include/picrin/xvect.h index 6dcabb1c..44db4d8e 100644 --- a/extlib/benz/include/picrin/xvect.h +++ b/extlib/benz/include/picrin/xvect.h @@ -54,23 +54,23 @@ #define xv_push(type, v, x) \ do { \ if ((v).n == (v).m) { \ - (v).m = (v).m? (v).m<<1 : 2; \ + (v).m = (v).m? (v).m<<1 : (size_t)2; \ (v).a = (type*)xv_realloc((v).a, sizeof(type) * (v).m); \ } \ (v).a[(v).n++] = (x); \ } while (0) -#define xv_pushp(type, v) \ - (((v).n == (v).m)? \ - ((v).m = ((v).m? (v).m<<1 : 2), \ +#define xv_pushp(type, v) \ + (((v).n == (v).m)? \ + ((v).m = ((v).m? (v).m<<1 : (size_t)2), \ (v).a = (type*)xv_realloc((v).a, sizeof(type) * (v).m), 0) \ : 0), ((v).a + ((v).n++)) #define xv_a(type, v, i) \ (((v).m <= (size_t)(i)? \ ((v).m = (v).n = (i) + 1, xv_roundup32((v).m), \ - (v).a = (type*)xv_realloc((v).a, sizeof(type) * (v).m), 0) \ + (v).a = (type*)xv_realloc((v).a, sizeof(type) * (v).m), 0) \ : (v).n <= (size_t)(i)? (v).n = (i) + 1 \ - : 0), (v).a[(i)]) + : (size_t)0), (v).a[(i)]) #endif From bb55bbfdde50a12283e6eb37910752cae48348aa Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 00:21:49 +0900 Subject: [PATCH 104/177] [bugfix] codegen causes segv when default irep size is short --- extlib/benz/codegen.c | 246 +++++++++++++++++++++--------------------- 1 file changed, 121 insertions(+), 125 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index 062fc20c..f3f003ad 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -144,22 +144,17 @@ static bool push_scope(analyze_state *state, pic_value formals) { pic_state *pic = state->pic; - analyze_scope *scope; + analyze_scope *scope = pic_alloc(pic, sizeof(analyze_scope)); bool varg; - xvect args, locals, captures; - xv_init(args); - xv_init(locals); - xv_init(captures); + xv_init(scope->args); + xv_init(scope->locals); + xv_init(scope->captures); - if (analyze_args(pic, formals, &varg, &args, &locals)) { - scope = pic_alloc(pic, sizeof(analyze_scope)); + if (analyze_args(pic, formals, &varg, &scope->args, &scope->locals)) { scope->up = state->scope; scope->depth = scope->up ? scope->up->depth + 1 : 0; scope->varg = varg; - scope->args = args; - scope->locals = locals; - scope->captures = captures; scope->defer = pic_nil_value(); state->scope = scope; @@ -167,8 +162,10 @@ push_scope(analyze_state *state, pic_value formals) return true; } else { - xv_destroy(args); - xv_destroy(locals); + xv_destroy(scope->args); + xv_destroy(scope->locals); + xv_destroy(scope->captures); + pic_free(pic, scope); return false; } } @@ -921,8 +918,69 @@ destroy_codegen_state(codegen_state *state) } static void -create_activation(codegen_context *cxt) +emit_n(codegen_state *state, enum pic_opcode insn) { + pic_state *pic = state->pic; + codegen_context *cxt = state->cxt; + + if (cxt->clen >= cxt->ccapa) { + cxt->ccapa *= 2; + cxt->code = pic_realloc(pic, cxt->code, sizeof(pic_code) * cxt->ccapa); + } + cxt->code[cxt->clen].insn = insn; + cxt->clen++; +} + +static void +emit_i(codegen_state *state, enum pic_opcode insn, int i) +{ + pic_state *pic = state->pic; + codegen_context *cxt = state->cxt; + + if (cxt->clen >= cxt->ccapa) { + cxt->ccapa *= 2; + cxt->code = pic_realloc(pic, cxt->code, sizeof(pic_code) * cxt->ccapa); + } + cxt->code[cxt->clen].insn = insn; + cxt->code[cxt->clen].u.i = i; + cxt->clen++; +} + +static void +emit_c(codegen_state *state, enum pic_opcode insn, char c) +{ + pic_state *pic = state->pic; + codegen_context *cxt = state->cxt; + + if (cxt->clen >= cxt->ccapa) { + cxt->ccapa *= 2; + cxt->code = pic_realloc(pic, cxt->code, sizeof(pic_code) * cxt->ccapa); + } + cxt->code[cxt->clen].insn = insn; + cxt->code[cxt->clen].u.c = c; + cxt->clen++; +} + +static void +emit_r(codegen_state *state, enum pic_opcode insn, int d, int i) +{ + pic_state *pic = state->pic; + codegen_context *cxt = state->cxt; + + if (cxt->clen >= cxt->ccapa) { + cxt->ccapa *= 2; + cxt->code = pic_realloc(pic, cxt->code, sizeof(pic_code) * cxt->ccapa); + } + cxt->code[cxt->clen].insn = insn; + cxt->code[cxt->clen].u.r.depth = d; + cxt->code[cxt->clen].u.r.idx = i; + cxt->clen++; +} + +static void +create_activation(codegen_state *state) +{ + codegen_context *cxt = state->cxt; size_t i, n; xhash regs; size_t offset; @@ -944,13 +1002,10 @@ create_activation(codegen_context *cxt) n = xh_val(xh_get_ptr(®s, xv_A(cxt->captures, i)), size_t); if (n <= 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; - cxt->clen++; + emit_i(state, OP_LREF, (int)n); } else { /* otherwise, just extend the stack */ - cxt->code[cxt->clen].insn = OP_PUSHNONE; - cxt->clen++; + emit_n(state, OP_PUSHNONE); } } @@ -1005,7 +1060,7 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v state->cxt = cxt; - create_activation(cxt); + create_activation(state); } static struct pic_irep * @@ -1111,9 +1166,7 @@ codegen(codegen_state *state, pic_value 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_ptr(pic_list_ref(pic, obj, 1))); - cxt->clen++; + emit_i(state, OP_GREF, index_symbol(state, pic_sym_ptr(pic_list_ref(pic, obj, 1)))); return; } else if (sym == pic->sCREF) { pic_sym *name; @@ -1121,10 +1174,7 @@ codegen(codegen_state *state, pic_value obj) depth = pic_int(pic_list_ref(pic, obj, 1)); 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); - cxt->clen++; + emit_r(state, OP_CREF, depth, index_capture(state, name, depth)); return; } else if (sym == pic->sLREF) { pic_sym *name; @@ -1132,14 +1182,10 @@ codegen(codegen_state *state, pic_value obj) 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; - cxt->clen++; + emit_i(state, OP_LREF, i + (int)xv_size(cxt->args) + (int)xv_size(cxt->locals) + 1); return; } - cxt->code[cxt->clen].insn = OP_LREF; - cxt->code[cxt->clen].u.i = index_local(state, name); - cxt->clen++; + emit_i(state, OP_LREF, index_local(state, name)); return; } else if (sym == pic->sSETBANG) { pic_value var, val; @@ -1151,11 +1197,8 @@ codegen(codegen_state *state, pic_value obj) var = pic_list_ref(pic, obj, 1); 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_ptr(pic_list_ref(pic, var, 1))); - cxt->clen++; - cxt->code[cxt->clen].insn = OP_PUSHNONE; - cxt->clen++; + emit_i(state, OP_GSET, index_symbol(state, pic_sym_ptr(pic_list_ref(pic, var, 1)))); + emit_n(state, OP_PUSHNONE); return; } else if (type == pic->sCREF) { @@ -1164,12 +1207,8 @@ codegen(codegen_state *state, pic_value obj) depth = pic_int(pic_list_ref(pic, var, 1)); 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); - cxt->clen++; - cxt->code[cxt->clen].insn = OP_PUSHNONE; - cxt->clen++; + emit_r(state, OP_CSET, depth, index_capture(state, name, depth)); + emit_n(state, OP_PUSHNONE); return; } else if (type == pic->sLREF) { @@ -1178,18 +1217,12 @@ codegen(codegen_state *state, pic_value obj) 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; - cxt->clen++; - cxt->code[cxt->clen].insn = OP_PUSHNONE; - cxt->clen++; + emit_i(state, OP_LSET, i + (int)xv_size(cxt->args) + (int)xv_size(cxt->locals) + 1); + emit_n(state, OP_PUSHNONE); return; } - cxt->code[cxt->clen].insn = OP_LSET; - cxt->code[cxt->clen].u.i = index_local(state, name); - cxt->clen++; - cxt->code[cxt->clen].insn = OP_PUSHNONE; - cxt->clen++; + emit_i(state, OP_LSET, index_local(state, name)); + emit_n(state, OP_PUSHNONE); return; } } @@ -1201,9 +1234,7 @@ codegen(codegen_state *state, pic_value obj) cxt->irep = pic_realloc(pic, cxt->irep, sizeof(struct pic_irep *) * cxt->icapa); } k = (int)cxt->ilen++; - cxt->code[cxt->clen].insn = OP_LAMBDA; - cxt->code[cxt->clen].u.i = k; - cxt->clen++; + emit_i(state, OP_LAMBDA, k); cxt->irep[k] = codegen_lambda(state, obj); return; @@ -1213,13 +1244,16 @@ codegen(codegen_state *state, pic_value obj) codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_JMPIF; - s = (int)cxt->clen++; + s = (int)cxt->clen; + + emit_n(state, OP_JMPIF); /* if false branch */ codegen(state, pic_list_ref(pic, obj, 3)); - cxt->code[cxt->clen].insn = OP_JMP; - t = (int)cxt->clen++; + + t = (int)cxt->clen; + + emit_n(state, OP_JMP); cxt->code[s].u.i = (int)cxt->clen - s; @@ -1234,8 +1268,7 @@ codegen(codegen_state *state, pic_value obj) pic_for_each (elt, pic_cdr(pic, obj), it) { if (i++ != 0) { - cxt->code[cxt->clen].insn = OP_POP; - cxt->clen++; + emit_n(state, OP_POP); } codegen(state, elt); } @@ -1247,26 +1280,16 @@ codegen(codegen_state *state, pic_value obj) obj = pic_list_ref(pic, obj, 1); switch (pic_type(obj)) { case PIC_TT_BOOL: - if (pic_true_p(obj)) { - cxt->code[cxt->clen].insn = OP_PUSHTRUE; - } else { - cxt->code[cxt->clen].insn = OP_PUSHFALSE; - } - cxt->clen++; + emit_n(state, (pic_true_p(obj) ? OP_PUSHTRUE : OP_PUSHFALSE)); return; case PIC_TT_INT: - cxt->code[cxt->clen].insn = OP_PUSHINT; - cxt->code[cxt->clen].u.i = pic_int(obj); - cxt->clen++; + emit_i(state, OP_PUSHINT, pic_int(obj)); return; case PIC_TT_NIL: - cxt->code[cxt->clen].insn = OP_PUSHNIL; - cxt->clen++; + emit_n(state, OP_PUSHNIL); return; case PIC_TT_CHAR: - cxt->code[cxt->clen].insn = OP_PUSHCHAR; - cxt->code[cxt->clen].u.c = pic_char(obj); - cxt->clen++; + emit_c(state, OP_PUSHCHAR, pic_char(obj)); return; default: if (cxt->plen >= cxt->pcapa) { @@ -1275,122 +1298,103 @@ codegen(codegen_state *state, pic_value obj) } pidx = (int)cxt->plen++; cxt->pool[pidx] = obj; - cxt->code[cxt->clen].insn = OP_PUSHCONST; - cxt->code[cxt->clen].u.i = pidx; - cxt->clen++; + emit_i(state, OP_PUSHCONST, pidx); return; } } else if (sym == pic->sCONS) { codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 2)); - cxt->code[cxt->clen].insn = OP_CONS; - cxt->clen++; + emit_n(state, OP_CONS); return; } else if (sym == pic->sCAR) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_CAR; - cxt->clen++; + emit_n(state, OP_CAR); return; } else if (sym == pic->sCDR) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_CDR; - cxt->clen++; + emit_n(state, OP_CDR); return; } else if (sym == pic->sNILP) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_NILP; - cxt->clen++; + emit_n(state, OP_NILP); return; } else if (sym == pic->sSYMBOLP) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_SYMBOLP; - cxt->clen++; + emit_n(state, OP_SYMBOLP); return; } else if (sym == pic->sPAIRP) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_PAIRP; - cxt->clen++; + emit_n(state, OP_PAIRP); return; } else if (sym == pic->sADD) { codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 2)); - cxt->code[cxt->clen].insn = OP_ADD; - cxt->clen++; + emit_n(state, OP_ADD); return; } else if (sym == pic->sSUB) { codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 2)); - cxt->code[cxt->clen].insn = OP_SUB; - cxt->clen++; + emit_n(state, OP_SUB); return; } else if (sym == pic->sMUL) { codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 2)); - cxt->code[cxt->clen].insn = OP_MUL; - cxt->clen++; + emit_n(state, OP_MUL); return; } else if (sym == pic->sDIV) { codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 2)); - cxt->code[cxt->clen].insn = OP_DIV; - cxt->clen++; + emit_n(state, OP_DIV); return; } else if (sym == pic->sMINUS) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_MINUS; - cxt->clen++; + emit_n(state, OP_MINUS); return; } else if (sym == pic->sEQ) { codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 2)); - cxt->code[cxt->clen].insn = OP_EQ; - cxt->clen++; + emit_n(state, OP_EQ); return; } else if (sym == pic->sLT) { codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 2)); - cxt->code[cxt->clen].insn = OP_LT; - cxt->clen++; + emit_n(state, OP_LT); return; } else if (sym == pic->sLE) { codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 2)); - cxt->code[cxt->clen].insn = OP_LE; - cxt->clen++; + emit_n(state, OP_LE); return; } else if (sym == pic->sGT) { codegen(state, pic_list_ref(pic, obj, 2)); codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_LT; - cxt->clen++; + emit_n(state, OP_LT); return; } else if (sym == pic->sGE) { codegen(state, pic_list_ref(pic, obj, 2)); codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_LE; - cxt->clen++; + emit_n(state, OP_LE); return; } else if (sym == pic->sNOT) { codegen(state, pic_list_ref(pic, obj, 1)); - cxt->code[cxt->clen].insn = OP_NOT; - cxt->clen++; + emit_n(state, OP_NOT); return; } else if (sym == pic->sCALL || sym == pic->sTAILCALL) { @@ -1400,9 +1404,7 @@ codegen(codegen_state *state, pic_value obj) pic_for_each (elt, pic_cdr(pic, obj), it) { codegen(state, elt); } - cxt->code[cxt->clen].insn = (sym == pic->sCALL) ? OP_CALL : OP_TAILCALL; - cxt->code[cxt->clen].u.i = len - 1; - cxt->clen++; + emit_i(state, (sym == pic->sCALL ? OP_CALL : OP_TAILCALL), len - 1); return; } else if (sym == pic->sCALL_WITH_VALUES || sym == pic->sTAILCALL_WITH_VALUES) { @@ -1410,13 +1412,9 @@ codegen(codegen_state *state, pic_value obj) codegen(state, pic_list_ref(pic, obj, 2)); codegen(state, pic_list_ref(pic, obj, 1)); /* call producer */ - cxt->code[cxt->clen].insn = OP_CALL; - cxt->code[cxt->clen].u.i = 1; - cxt->clen++; + emit_i(state, OP_CALL, 1); /* call consumer */ - cxt->code[cxt->clen].insn = (sym == pic->sCALL_WITH_VALUES) ? OP_CALL : OP_TAILCALL; - cxt->code[cxt->clen].u.i = -1; - cxt->clen++; + emit_i(state, (sym == pic->sCALL_WITH_VALUES ? OP_CALL : OP_TAILCALL), -1); return; } else if (sym == pic->sRETURN) { @@ -1426,9 +1424,7 @@ codegen(codegen_state *state, pic_value obj) pic_for_each (elt, pic_cdr(pic, obj), it) { codegen(state, elt); } - cxt->code[cxt->clen].insn = OP_RET; - cxt->code[cxt->clen].u.i = len - 1; - cxt->clen++; + emit_i(state, OP_RET, len - 1); return; } pic_errorf(pic, "codegen: unknown AST type ~s", obj); From b9dde91123f7f999d266ba3cb1e39ab7c96f04d8 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 00:41:55 +0900 Subject: [PATCH 105/177] allow custom setjmp/longjmp --- extlib/benz/cont.c | 6 ++++-- extlib/benz/include/picrin.h | 1 - extlib/benz/include/picrin/config.h | 20 ++++++++++++++++++++ extlib/benz/include/picrin/cont.h | 2 +- extlib/benz/include/picrin/error.h | 2 +- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 391e766e..eaa09771 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -103,7 +103,9 @@ escape_call(pic_state *pic) pic_load_point(pic, e->data); - longjmp(((struct pic_escape *)e->data)->jmp, 1); + PIC_LONGJMP(pic, (void *)((struct pic_escape *)e->data)->jmp, 1); + + PIC_UNREACHABLE(); } struct pic_proc * @@ -130,7 +132,7 @@ pic_escape(pic_state *pic, struct pic_proc *proc) pic_save_point(pic, escape); - if (setjmp(escape->jmp)) { + if (PIC_SETJMP(pic, (void *)escape->jmp)) { return pic_values_by_list(pic, escape->results); } else { diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 8965af8d..eaefc79b 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -35,7 +35,6 @@ extern "C" { #include #include -#include #include #include #include diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index e03c6819..2853c572 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -11,6 +11,11 @@ /** treat false value as none */ /* #define PIC_NONE_IS_FALSE 1 */ +/** custom setjmp/longjmp */ +/* #define PIC_JMPBUF_SIZE sizeof(jmp_buf) */ +/* #define PIC_SETJMP(pic, buf) setjmp(buf) */ +/* #define PIC_LONGJMP(pic, buf, val) longjmp((buf), (val)) */ + /** initial memory size (to be dynamically extended if necessary) */ /* #define PIC_ARENA_SIZE 1000 */ @@ -55,6 +60,21 @@ # define PIC_NONE_IS_FALSE 1 #endif +#ifndef PIC_JMPBUF_SIZE +# include +# define PIC_JMPBUF_SIZE sizeof(jmp_buf) +#endif + +#ifndef PIC_SETJMP +# include +# define PIC_SETJMP(pic, buf) setjmp(buf) +#endif + +#ifndef PIC_LONGJMP +# include +# define PIC_LONGJMP(pic, buf, val) longjmp((buf), (val)) +#endif + #ifndef PIC_ARENA_SIZE # define PIC_ARENA_SIZE (8 * 1024) #endif diff --git a/extlib/benz/include/picrin/cont.h b/extlib/benz/include/picrin/cont.h index 645e6d9c..72fda5b2 100644 --- a/extlib/benz/include/picrin/cont.h +++ b/extlib/benz/include/picrin/cont.h @@ -10,7 +10,7 @@ extern "C" { #endif struct pic_escape { - jmp_buf jmp; + char jmp[PIC_JMPBUF_SIZE]; bool valid; diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index 9a290bae..7f58ec35 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -34,7 +34,7 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) do { \ struct pic_escape *escape = pic_alloc(pic, sizeof(struct pic_escape)); \ pic_save_point(pic, escape); \ - if (setjmp(escape->jmp) == 0) { \ + if (PIC_SETJMP(pic, (void *)escape->jmp) == 0) { \ pic_push_try(pic, escape); \ do #define pic_catch_(label) \ From 4bdb17db2f40ae84f62f2bb599520ca730165fab Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 01:06:44 +0900 Subject: [PATCH 106/177] style fix --- extlib/benz/vm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 9626f5d9..2425bc89 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -101,11 +101,11 @@ pic_get_args(pic_state *pic, const char *format, ...) rest? "at least " : "", paramc); } - + /* start dispatching */ va_start(ap, format); min = paramc + optc < argc ? paramc + optc : argc; - for(i = 1; i < min + 1; i++) { + for (i = 1; i < min + 1; i++) { c = *format++; /* skip '|' if exists. This is always safe because of assert and argc check */ @@ -395,7 +395,7 @@ pic_get_args(pic_state *pic, const char *format, ...) argv = va_arg(ap, pic_value **); *n = (size_t)(argc - (i - 1)); *argv = &GET_OPERAND(pic, i); - } + } va_end(ap); return argc; } From 7dcd050e1a7bf87601709b87ffb63ea01d6c8b76 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 01:48:38 +0900 Subject: [PATCH 107/177] add PIC_ENABLE_FLOAT and PIC_WORD_BOXING --- extlib/benz/codegen.c | 4 + extlib/benz/gc.c | 4 + extlib/benz/include/picrin.h | 6 +- extlib/benz/include/picrin/config.h | 36 +- extlib/benz/include/picrin/value.h | 110 +++++- extlib/benz/number.c | 582 +++++++++++++++++++--------- extlib/benz/read.c | 14 + extlib/benz/string.c | 2 + extlib/benz/vm.c | 47 +++ extlib/benz/write.c | 4 + 10 files changed, 615 insertions(+), 194 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index f3f003ad..fdc209de 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -635,7 +635,11 @@ analyze_div(analyze_state *state, pic_value obj) switch (pic_length(pic, obj)) { case 2: args = pic_cdr(pic, obj); +#if PIC_ENABLE_FLOAT obj = pic_list3(pic, pic_car(pic, obj), pic_float_value(1), pic_car(pic, args)); +#else + obj = pic_list3(pic, pic_car(pic, obj), pic_int_value(1), pic_car(pic, args)); +#endif return analyze(state, obj, false); default: args = pic_cdr(pic, obj); diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index fd319454..74c3e7bf 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -489,7 +489,9 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) } case PIC_TT_NIL: case PIC_TT_BOOL: +#if PIC_ENABLE_FLOAT case PIC_TT_FLOAT: +#endif case PIC_TT_INT: case PIC_TT_CHAR: case PIC_TT_EOF: @@ -691,7 +693,9 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) } case PIC_TT_NIL: case PIC_TT_BOOL: +#if PIC_ENABLE_FLOAT case PIC_TT_FLOAT: +#endif case PIC_TT_INT: case PIC_TT_CHAR: case PIC_TT_EOF: diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index eaefc79b..3d43a428 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -30,7 +30,6 @@ extern "C" { #include #include -#include #include #include @@ -38,12 +37,15 @@ extern "C" { #include #include #include -#include #include #include "picrin/config.h" #include "picrin/util.h" +#if PIC_ENABLE_FLOAT +# include +#endif + #include "picrin/xvect.h" #include "picrin/xhash.h" #include "picrin/xfile.h" diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index 2853c572..edf07594 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -8,6 +8,12 @@ /** switch internal value representation */ /* #define PIC_NAN_BOXING 1 */ +/** enable word boxing */ +/* #define PIC_WORD_BOXING 0 */ + +/** enable floating point number support */ +/* #define PIC_ENABLE_FLOAT 1 */ + /** treat false value as none */ /* #define PIC_NONE_IS_FALSE 1 */ @@ -50,12 +56,36 @@ # endif #endif -#ifndef PIC_NAN_BOXING -# if __x86_64__ && (defined(__GNUC__) || defined(__clang__)) && __STRICT_ANSI__ != 1 -# define PIC_NAN_BOXING 1 +#if PIC_NAN_BOXING && PIC_WORD_BOXING +# error cannot enable both PIC_NAN_BOXING and PIC_WORD_BOXING simultaneously +#endif + +#if PIC_WORD_BOXING && PIC_ENABLE_FLOAT +# error cannot enable both PIC_WORD_BOXING and PIC_ENABLE_FLOAT simultaneously +#endif + +#ifndef PIC_WORD_BOXING +# define PIC_WORD_BOXING 0 +#endif + +#if ! PIC_WORD_BOXING +# ifndef PIC_NAN_BOXING +# if __x86_64__ && (defined(__GNUC__) || defined(__clang__)) && __STRICT_ANSI__ != 1 +# define PIC_NAN_BOXING 1 +# endif # endif #endif +#ifndef PIC_ENABLE_FLOAT +# if ! PIC_WORD_BOXING +# define PIC_ENABLE_FLOAT 1 +# endif +#endif + +#if PIC_NAN_BOXING && defined(PIC_ENABLE_FLOAT) && ! PIC_ENABLE_FLOAT +# error cannot disable float support when nan boxing is on +#endif + #ifndef PIC_NONE_IS_FALSE # define PIC_NONE_IS_FALSE 1 #endif diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index 21a3e54d..42c65295 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -19,7 +19,9 @@ enum pic_vtype { PIC_VTYPE_TRUE, PIC_VTYPE_FALSE, PIC_VTYPE_UNDEF, +#if PIC_ENABLE_FLOAT PIC_VTYPE_FLOAT, +#endif PIC_VTYPE_INT, PIC_VTYPE_CHAR, PIC_VTYPE_EOF, @@ -28,6 +30,8 @@ enum pic_vtype { #if PIC_NAN_BOXING +#include + /** * value representation by nan-boxing: * float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF @@ -65,13 +69,55 @@ pic_int(pic_value v) #define pic_char(v) ((v) & 0xfffffffful) +#elif PIC_WORD_BOXING + +typedef unsigned long pic_value; + +#define pic_ptr(v) ((void *)(v)) +#define pic_init_value(v,vtype) do { \ + v = (vtype << 3) + 7; \ + } while (0) + +PIC_INLINE enum pic_vtype +pic_vtype(pic_value v) +{ + if ((v & 1) == 0) { + return PIC_VTYPE_HEAP; + } + if ((v & 2) == 0) { + return PIC_VTYPE_INT; + } + if ((v & 4) == 0) { + return PIC_VTYPE_CHAR; + } + return v >> 3; +} + +PIC_INLINE int +pic_int(pic_value v) +{ + v >>= 2; + if ((v & ((ULONG_MAX >> 3) + 1)) != 0) { + v |= ULONG_MAX - (ULONG_MAX >> 2); + } + return v; +} + +PIC_INLINE char +pic_char(pic_value v) +{ + return v >> 3; +} + #else typedef struct { enum pic_vtype type; union { void *data; +#if PIC_ENABLE_FLOAT double f; +#endif int i; char c; } u; @@ -81,7 +127,9 @@ typedef struct { #define pic_vtype(v) ((v).type) #define pic_init_value(v,vtype) ((v).type = (vtype), (v).u.data = NULL) -#define pic_float(v) ((v).u.f) +#if PIC_ENABLE_FLOAT +# define pic_float(v) ((v).u.f) +#endif #define pic_int(v) ((v).u.i) #define pic_char(v) ((v).u.c) @@ -91,7 +139,9 @@ enum pic_tt { /* immediate */ PIC_TT_NIL, PIC_TT_BOOL, +#if PIC_ENABLE_FLOAT PIC_TT_FLOAT, +#endif PIC_TT_INT, PIC_TT_CHAR, PIC_TT_EOF, @@ -161,7 +211,21 @@ PIC_INLINE const char *pic_type_repr(enum pic_tt); pic_errorf(pic, "expected " #type ", but got ~s", v); \ } -PIC_INLINE bool pic_valid_int(double); +#if PIC_ENABLE_FLOAT +PIC_INLINE bool +pic_valid_int(double v) +{ + return INT_MIN <= v && v <= INT_MAX; +} + +#else +PIC_INLINE bool +pic_valid_int(int v) +{ + PIC_UNUSED(v); + return true; +} +#endif PIC_INLINE pic_value pic_nil_value(); PIC_INLINE pic_value pic_true_value(); @@ -169,7 +233,9 @@ PIC_INLINE pic_value pic_false_value(); PIC_INLINE pic_value pic_bool_value(bool); PIC_INLINE pic_value pic_undef_value(); PIC_INLINE pic_value pic_obj_value(void *); +#if PIC_ENABLE_FLOAT PIC_INLINE pic_value pic_float_value(double); +#endif PIC_INLINE pic_value pic_int_value(int); PIC_INLINE pic_value pic_size_value(size_t); PIC_INLINE pic_value pic_char_value(char c); @@ -190,8 +256,10 @@ pic_type(pic_value v) return PIC_TT_BOOL; case PIC_VTYPE_UNDEF: return PIC_TT_UNDEF; +#if PIC_ENABLE_FLOAT case PIC_VTYPE_FLOAT: return PIC_TT_FLOAT; +#endif case PIC_VTYPE_INT: return PIC_TT_INT; case PIC_VTYPE_CHAR: @@ -213,8 +281,10 @@ pic_type_repr(enum pic_tt tt) return "nil"; case PIC_TT_BOOL: return "boolean"; +#if PIC_ENABLE_FLOAT case PIC_TT_FLOAT: return "float"; +#endif case PIC_TT_INT: return "int"; case PIC_TT_SYMBOL: @@ -257,12 +327,6 @@ pic_type_repr(enum pic_tt tt) PIC_UNREACHABLE(); } -PIC_INLINE bool -pic_valid_int(double v) -{ - return INT_MIN <= v && v <= INT_MAX; -} - PIC_INLINE pic_value pic_nil_value() { @@ -302,11 +366,13 @@ pic_bool_value(bool b) PIC_INLINE pic_value pic_size_value(size_t s) { +#if PIC_ENABLE_FLOAT if (sizeof(unsigned) < sizeof(size_t)) { if (s > (size_t)INT_MAX) { return pic_float_value(s); } } +#endif return pic_int_value((int)s); } @@ -358,6 +424,26 @@ pic_char_value(char c) return v; } +#elif PIC_WORD_BOXING + +PIC_INLINE pic_value +pic_obj_value(void *ptr) +{ + return (pic_value)ptr; +} + +PIC_INLINE pic_value +pic_int_value(int i) +{ + return (i << 2) + 1; +} + +PIC_INLINE pic_value +pic_char_value(char c) +{ + return (c << 3) + 3; +} + #else PIC_INLINE pic_value @@ -370,6 +456,8 @@ pic_obj_value(void *ptr) return v; } +#if PIC_ENABLE_FLOAT + PIC_INLINE pic_value pic_float_value(double f) { @@ -380,6 +468,8 @@ pic_float_value(double f) return v; } +#endif + PIC_INLINE pic_value pic_int_value(int i) { @@ -421,7 +511,7 @@ pic_none_value() #endif } -#if PIC_NAN_BOXING +#if PIC_NAN_BOXING || PIC_WORD_BOXING PIC_INLINE bool pic_eq_p(pic_value x, pic_value y) @@ -464,8 +554,10 @@ pic_eqv_p(pic_value x, pic_value y) return true; case PIC_TT_BOOL: return pic_vtype(x) == pic_vtype(y); +#if PIC_ENABLE_FLOAT case PIC_TT_FLOAT: return pic_float(x) == pic_float(y); +#endif case PIC_TT_INT: return pic_int(x) == pic_int(y); default: diff --git a/extlib/benz/number.c b/extlib/benz/number.c index c3ec4dcf..928ba50e 100644 --- a/extlib/benz/number.c +++ b/extlib/benz/number.c @@ -5,6 +5,19 @@ #include "picrin.h" #include "picrin/string.h" #include "picrin/cont.h" +#include "picrin/port.h" + +#if ! PIC_ENABLE_FLOAT +static pic_value +pic_number_id(pic_state *pic) +{ + int i; + + pic_get_args(pic, "i", &i); + + return pic_int_value(i); +} +#endif /** * Returns the length of string representing val. @@ -66,7 +79,11 @@ pic_number_real_p(pic_state *pic) pic_get_args(pic, "o", &v); +#if PIC_ENABLE_FLOAT return pic_bool_value(pic_float_p(v) || pic_int_p(v)); +#else + return pic_bool_value(pic_int_p(v)); +#endif } static pic_value @@ -79,6 +96,7 @@ pic_number_integer_p(pic_state *pic) if (pic_int_p(v)) { return pic_true_value(); } +#if PIC_ENABLE_FLOAT if (pic_float_p(v)) { double f = pic_float(v); @@ -90,6 +108,7 @@ pic_number_integer_p(pic_state *pic) return pic_true_value(); } } +#endif return pic_false_value(); } @@ -110,48 +129,11 @@ pic_number_inexact_p(pic_state *pic) pic_get_args(pic, "o", &v); +#if PIC_ENABLE_FLOAT return pic_bool_value(pic_float_p(v)); -} - -static pic_value -pic_number_finite_p(pic_state *pic) -{ - pic_value v; - - pic_get_args(pic, "o", &v); - - if (pic_int_p(v)) - return pic_true_value(); - if (pic_float_p(v) && ! (isinf(pic_float(v)) || isnan(pic_float(v)))) - return pic_true_value(); - else - return pic_false_value(); -} - -static pic_value -pic_number_infinite_p(pic_state *pic) -{ - pic_value v; - - pic_get_args(pic, "o", &v); - - if (pic_float_p(v) && isinf(pic_float(v))) - return pic_true_value(); - else - return pic_false_value(); -} - -static pic_value -pic_number_nan_p(pic_state *pic) -{ - pic_value v; - - pic_get_args(pic, "o", &v); - - if (pic_float_p(v) && isnan(pic_float(v))) - return pic_true_value(); - else - return pic_false_value(); +#else + return pic_false_value(); +#endif } #define DEFINE_ARITH_CMP(op, name) \ @@ -183,11 +165,46 @@ pic_number_nan_p(pic_state *pic) return pic_true_value(); \ } +#define DEFINE_ARITH_CMP2(op, name) \ + static pic_value \ + pic_number_##name(pic_state *pic) \ + { \ + size_t argc, i; \ + pic_value *argv; \ + int f,g; \ + \ + pic_get_args(pic, "ii*", &f, &g, &argc, &argv); \ + \ + if (! (f op g)) \ + return pic_false_value(); \ + \ + for (i = 0; i < argc; ++i) { \ + f = g; \ + if (pic_int_p(argv[i])) \ + g = pic_int(argv[i]); \ + else \ + pic_errorf(pic, #op ": number required"); \ + \ + if (! (f op g)) \ + return pic_false_value(); \ + } \ + \ + return pic_true_value(); \ + } + +#if PIC_ENABLE_FLOAT DEFINE_ARITH_CMP(==, eq) DEFINE_ARITH_CMP(<, lt) DEFINE_ARITH_CMP(>, gt) DEFINE_ARITH_CMP(<=, le) DEFINE_ARITH_CMP(>=, ge) +#else +DEFINE_ARITH_CMP2(==, eq) +DEFINE_ARITH_CMP2(<, lt) +DEFINE_ARITH_CMP2(>, gt) +DEFINE_ARITH_CMP2(<=, le) +DEFINE_ARITH_CMP2(>=, ge) +#endif #define DEFINE_ARITH_OP(op, name, unit) \ static pic_value \ @@ -217,63 +234,170 @@ DEFINE_ARITH_CMP(>=, ge) return e ? pic_int_value((int)f) : pic_float_value(f); \ } +#define DEFINE_ARITH_OP2(op, name, unit) \ + static pic_value \ + pic_number_##name(pic_state *pic) \ + { \ + size_t argc, i; \ + pic_value *argv; \ + int f; \ + \ + pic_get_args(pic, "*", &argc, &argv); \ + \ + f = unit; \ + for (i = 0; i < argc; ++i) { \ + if (pic_int_p(argv[i])) { \ + f op##= pic_int(argv[i]); \ + } \ + else { \ + pic_errorf(pic, #op ": number required"); \ + } \ + } \ + \ + return pic_int_value(f); \ + } + +#if PIC_ENABLE_FLOAT DEFINE_ARITH_OP(+, add, 0) DEFINE_ARITH_OP(*, mul, 1) +#else +DEFINE_ARITH_OP2(+, add, 0) +DEFINE_ARITH_OP2(*, mul, 1) +#endif #define DEFINE_ARITH_INV_OP(op, name, unit, exact) \ static pic_value \ pic_number_##name(pic_state *pic) \ { \ size_t argc, i; \ - pic_value *argv; \ - double f; \ - bool e; \ + pic_value *argv; \ + double f; \ + bool e = true; \ \ - pic_get_args(pic, "F*", &f, &e, &argc, &argv); \ + pic_get_args(pic, "F*", &f, &e, &argc, &argv); \ \ - e = e && exact; \ + e = e && exact; \ \ - if (argc == 0) { \ - f = unit op f; \ - } \ - for (i = 0; i < argc; ++i) { \ - if (pic_int_p(argv[i])) { \ - f op##= pic_int(argv[i]); \ - } \ - else if (pic_float_p(argv[i])) { \ - e = false; \ - f op##= pic_float(argv[i]); \ - } \ - else { \ - pic_errorf(pic, #op ": number required"); \ - } \ - } \ + if (argc == 0) { \ + f = unit op f; \ + } \ + for (i = 0; i < argc; ++i) { \ + if (pic_int_p(argv[i])) { \ + f op##= pic_int(argv[i]); \ + } \ + else if (pic_float_p(argv[i])) { \ + e = false; \ + f op##= pic_float(argv[i]); \ + } \ + else { \ + pic_errorf(pic, #op ": number required"); \ + } \ + } \ \ - return e ? pic_int_value((int)f) : pic_float_value(f); \ + return e ? pic_int_value((int)f) : pic_float_value(f); \ } +#define DEFINE_ARITH_INV_OP2(op, name, unit) \ + static pic_value \ + pic_number_##name(pic_state *pic) \ + { \ + size_t argc, i; \ + pic_value *argv; \ + int f; \ + \ + pic_get_args(pic, "i*", &f, &argc, &argv); \ + \ + if (argc == 0) { \ + f = unit op f; \ + } \ + for (i = 0; i < argc; ++i) { \ + if (pic_int_p(argv[i])) { \ + f op##= pic_int(argv[i]); \ + } \ + else { \ + pic_errorf(pic, #op ": number required"); \ + } \ + } \ + \ + return pic_int_value(f); \ + } + +#if PIC_ENABLE_FLOAT DEFINE_ARITH_INV_OP(-, sub, 0, true) DEFINE_ARITH_INV_OP(/, div, 1, false) +#else +DEFINE_ARITH_INV_OP2(-, sub, 0) +DEFINE_ARITH_INV_OP2(/, div, 1) +#endif static pic_value pic_number_abs(pic_state *pic) { +#if PIC_ENABLE_FLOAT double f; bool e; pic_get_args(pic, "F", &f, &e); if (e) { - return pic_int_value(abs((int)f)); + return pic_int_value(f < 0 ? -f : f); } else { return pic_float_value(fabs(f)); } +#else + int i; + + pic_get_args(pic, "i", &i); + + return pic_int_value(i < 0 ? -i : i); +#endif +} + +static pic_value +pic_number_expt(pic_state *pic) +{ +#if PIC_ENABLE_FLOAT + double f, g, h; + bool e1, e2; + + pic_get_args(pic, "FF", &f, &e1, &g, &e2); + + h = pow(f, g); + if (e1 && e2) { + if (h <= INT_MAX) { + return pic_int_value((int)h); + } + } + return pic_float_value(h); +#else + int x, y, i, e = 1, r = 1, s = 0; + + pic_get_args(pic, "ii", &x, &y); + + if (y < 0) { + s = 1; + y = -y; + } + e = x; + for (i = 0; y; ++i) { + if ((y & 1) != 0) { + r *= e; + } + e *= e; + y >>= 1; + } + if (s != 0) { + r = 1 / r; + } + return pic_int_value(r); +#endif } static pic_value pic_number_floor2(pic_state *pic) { +#if PIC_ENABLE_FLOAT int i, j; bool e1, e2; @@ -295,11 +419,23 @@ pic_number_floor2(pic_state *pic) r = i - j * q; return pic_values2(pic, pic_float_value(q), pic_float_value(r)); } +#else + int i, j, k; + + pic_get_args(pic, "ii", &i, &j); + + k = (i < 0 && j < 0) || (0 <= i && 0 <= j) + ? i / j + : (i / j) - 1; + + return pic_values2(pic, pic_int_value(k), pic_int_value(i - k * j)); +#endif } static pic_value pic_number_trunc2(pic_state *pic) { +#if PIC_ENABLE_FLOAT int i, j; bool e1, e2; @@ -316,8 +452,16 @@ pic_number_trunc2(pic_state *pic) return pic_values2(pic, pic_float_value(q), pic_float_value(r)); } +#else + int i, j; + + pic_get_args(pic, "ii", &i, &j); + + return pic_values2(pic, pic_int_value(i/j), pic_int_value(i - (i/j) * j)); +#endif } +#if PIC_ENABLE_FLOAT static pic_value pic_number_floor(pic_state *pic) { @@ -382,6 +526,180 @@ pic_number_round(pic_state *pic) } } +static pic_value +pic_number_inexact(pic_state *pic) +{ + double f; + + pic_get_args(pic, "f", &f); + + return pic_float_value(f); +} + +static pic_value +pic_number_exact(pic_state *pic) +{ + double f; + + pic_get_args(pic, "f", &f); + + return pic_int_value((int)(round(f))); +} +#endif + +static pic_value +pic_number_number_to_string(pic_state *pic) +{ +#if PIC_ENABLE_FLOAT + double f; + bool e; + int radix = 10; + pic_str *str; + + pic_get_args(pic, "F|i", &f, &e, &radix); + + if (radix < 2 || radix > 36) { + pic_errorf(pic, "number->string: invalid radix %d (between 2 and 36, inclusive)", radix); + } + + if (e) { + int ival = (int) f; + int ilen = number_string_length(ival, radix); + size_t s = ilen + 1; + char *buf = pic_malloc(pic, s); + + number_string(ival, radix, ilen, buf); + + str = pic_make_str(pic, buf, s - 1); + + pic_free(pic, buf); + } + else { + struct pic_port *port = pic_open_output_string(pic); + + xfprintf(port->file, "%f", f); + + str = pic_get_output_string(pic, port); + + pic_close_port(pic, port); + } + + return pic_obj_value(str); +#else + int f; + bool e; + int radix = 10; + pic_str *str; + size_t s; + char *buf; + int ival, ilen; + + pic_get_args(pic, "i|i", &f, &e, &radix); + + if (radix < 2 || radix > 36) { + pic_errorf(pic, "number->string: invalid radix %d (between 2 and 36, inclusive)", radix); + } + + ival = f; + ilen = number_string_length(ival, radix); + s = ilen + 1; + + buf = pic_malloc(pic, s); + + number_string(ival, radix, ilen, buf); + + str = pic_make_str(pic, buf, s - 1); + + pic_free(pic, buf); + + return pic_obj_value(str); +#endif +} + +static pic_value +pic_number_string_to_number(pic_state *pic) +{ +#if PIC_ENABLE_FLOAT + const char *str; + int radix = 10; + long num; + char *eptr; + double flo; + + pic_get_args(pic, "z|i", &str, &radix); + + num = strtol(str, &eptr, radix); + if (*eptr == '\0') { + return pic_valid_int(num) + ? pic_int_value((int)num) + : pic_float_value(num); + } + + flo = strtod(str, &eptr); + if (*eptr == '\0') { + return pic_float_value(flo); + } + + pic_errorf(pic, "invalid string given: %s", str); +#else + const char *str; + int radix = 10; + long num; + char *eptr; + + pic_get_args(pic, "z|i", &str, &radix); + + num = strtol(str, &eptr, radix); + if (*eptr == '\0') { + return pic_int_value(num); + } + + pic_errorf(pic, "invalid string given: %s", str); +#endif +} + +#if PIC_ENABLE_FLOAT +static pic_value +pic_number_finite_p(pic_state *pic) +{ + pic_value v; + + pic_get_args(pic, "o", &v); + + if (pic_int_p(v)) + return pic_true_value(); + if (pic_float_p(v) && ! (isinf(pic_float(v)) || isnan(pic_float(v)))) + return pic_true_value(); + else + return pic_false_value(); +} + +static pic_value +pic_number_infinite_p(pic_state *pic) +{ + pic_value v; + + pic_get_args(pic, "o", &v); + + if (pic_float_p(v) && isinf(pic_float(v))) + return pic_true_value(); + else + return pic_false_value(); +} + +static pic_value +pic_number_nan_p(pic_state *pic) +{ + pic_value v; + + pic_get_args(pic, "o", &v); + + if (pic_float_p(v) && isnan(pic_float(v))) + return pic_true_value(); + else + return pic_false_value(); +} + static pic_value pic_number_exp(pic_state *pic) { @@ -481,113 +799,7 @@ pic_number_sqrt(pic_state *pic) return pic_float_value(sqrt(f)); } - -static pic_value -pic_number_expt(pic_state *pic) -{ - double f, g, h; - bool e1, e2; - - pic_get_args(pic, "FF", &f, &e1, &g, &e2); - - h = pow(f, g); - if (e1 && e2) { - if (h <= INT_MAX) { - return pic_int_value((int)h); - } - } - return pic_float_value(h); -} - -static pic_value -pic_number_inexact(pic_state *pic) -{ - double f; - - pic_get_args(pic, "f", &f); - - return pic_float_value(f); -} - -static pic_value -pic_number_exact(pic_state *pic) -{ - double f; - - pic_get_args(pic, "f", &f); - - return pic_int_value((int)(round(f))); -} - -static pic_value -pic_number_number_to_string(pic_state *pic) -{ - double f; - bool e; - int radix = 10; - pic_str *str; - size_t s; - char *buf; - - pic_get_args(pic, "F|i", &f, &e, &radix); - - if (radix < 2 || radix > 36) { - pic_errorf(pic, "number->string: invalid radix %d (between 2 and 36, inclusive)", radix); - } - - if (e) { - int ival = (int) f; - int ilen = number_string_length(ival, radix); - s = ilen + 1; - - buf = pic_malloc(pic, s); - - number_string(ival, radix, ilen, buf); - } - else { - s = snprintf(NULL, 0, "%f", f) + 1; - - buf = pic_malloc(pic, s); - - - snprintf(buf, s, "%f", f); - - while(buf[s - 2] == '0') - s -= 1; - - } - str = pic_make_str(pic, buf, s - 1); - - pic_free(pic, buf); - - return pic_obj_value(str); -} - -static pic_value -pic_number_string_to_number(pic_state *pic) -{ - const char *str; - int radix = 10; - long num; - char *eptr; - double flo; - - pic_get_args(pic, "z|i", &str, &radix); - - num = strtol(str, &eptr, radix); - if (*eptr == '\0') { - return pic_valid_int(num) - ? pic_int_value((int)num) - : pic_float_value(num); - } - - flo = strtod(str, &eptr); - if (*eptr == '\0') { - return pic_float_value(flo); - } - - pic_errorf(pic, "invalid string given: %s", str); -} +#endif void pic_init_number(pic_state *pic) @@ -618,27 +830,40 @@ pic_init_number(pic_state *pic) pic_defun(pic, "/", pic_number_div); pic_gc_arena_restore(pic, ai); + pic_defun(pic, "abs", pic_number_abs); + pic_defun(pic, "expt", pic_number_expt); + pic_gc_arena_restore(pic, ai); + pic_defun(pic, "floor/", pic_number_floor2); pic_defun(pic, "truncate/", pic_number_trunc2); pic_gc_arena_restore(pic, ai); +#if PIC_ENABLE_FLOAT pic_defun(pic, "floor", pic_number_floor); pic_defun(pic, "ceiling", pic_number_ceil); pic_defun(pic, "truncate", pic_number_trunc); pic_defun(pic, "round", pic_number_round); - pic_gc_arena_restore(pic, ai); - pic_defun(pic, "inexact", pic_number_inexact); pic_defun(pic, "exact", pic_number_exact); pic_gc_arena_restore(pic, ai); +#else + pic_defun(pic, "floor", pic_number_id); + pic_defun(pic, "ceiling", pic_number_id); + pic_defun(pic, "truncate", pic_number_id); + pic_defun(pic, "round", pic_number_id); + pic_defun(pic, "inexact", pic_number_id); + pic_defun(pic, "exact", pic_number_id); + pic_gc_arena_restore(pic, ai); +#endif + pic_defun(pic, "number->string", pic_number_number_to_string); + pic_defun(pic, "string->number", pic_number_string_to_number); + pic_gc_arena_restore(pic, ai); + +#if PIC_ENABLE_FLOAT pic_defun(pic, "finite?", pic_number_finite_p); pic_defun(pic, "infinite?", pic_number_infinite_p); pic_defun(pic, "nan?", pic_number_nan_p); - pic_gc_arena_restore(pic, ai); - - pic_defun(pic, "abs", pic_number_abs); - pic_defun(pic, "expt", pic_number_expt); pic_defun(pic, "sqrt", pic_number_sqrt); pic_defun(pic, "exp", pic_number_exp); pic_defun(pic, "log", pic_number_log); @@ -649,8 +874,5 @@ pic_init_number(pic_state *pic) pic_defun(pic, "asin", pic_number_asin); pic_defun(pic, "atan", pic_number_atan); pic_gc_arena_restore(pic, ai); - - pic_defun(pic, "number->string", pic_number_number_to_string); - pic_defun(pic, "string->number", pic_number_string_to_number); - pic_gc_arena_restore(pic, ai); +#endif } diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 8262e0d7..4f6c6b30 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -67,6 +67,7 @@ isdelim(int c) return c == EOF || strchr("();,|\" \t\n\r", c) != NULL; /* ignores "#", "'" */ } +#if PIC_ENABLE_FLOAT static bool strcaseeq(const char *s1, const char *s2) { @@ -78,6 +79,7 @@ strcaseeq(const char *s1, const char *s2) } return a == b; } +#endif static int case_fold(pic_state *pic, int c) @@ -269,11 +271,14 @@ read_unsigned(pic_state *pic, struct pic_port *port, int c) { unsigned u; int exp, s, i, e; +#if PIC_ENABLE_FLOAT double f, g; +#endif u = read_uinteger(pic, port, c); switch (peek(port)) { +#if PIC_ENABLE_FLOAT case '.': next(port); g = 0, e = 0; @@ -300,6 +305,7 @@ read_unsigned(pic_state *pic, struct pic_port *port, int c) exp >>= 1; } return pic_float_value(f); +#endif default: exp = read_suffix(pic, port); @@ -332,11 +338,15 @@ read_number(pic_state *pic, struct pic_port *port, int c) static pic_value negate(pic_value n) { +#if PIC_ENABLE_FLOAT if (pic_int_p(n)) { return pic_int_value(-pic_int(n)); } else { return pic_float_value(-pic_float(n)); } +#else + return pic_int_value(-pic_int(n)); +#endif } static pic_value @@ -349,12 +359,14 @@ read_minus(pic_state *pic, struct pic_port *port, int c) } else { sym = read_symbol(pic, port, c); +#if PIC_ENABLE_FLOAT 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_ptr(sym)), "-nan.0")) { return pic_float_value(-NAN); } +#endif return sym; } } @@ -369,12 +381,14 @@ read_plus(pic_state *pic, struct pic_port *port, int c) } else { sym = read_symbol(pic, port, c); +#if PIC_ENABLE_FLOAT 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_ptr(sym)), "+nan.0")) { return pic_float_value(NAN); } +#endif return sym; } } diff --git a/extlib/benz/string.c b/extlib/benz/string.c index d2924ac6..aeafef93 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -347,9 +347,11 @@ pic_xvfformat(pic_state *pic, xFILE *file, const char *fmt, va_list ap) case 'p': xfprintf(file, "%p", va_arg(ap, void *)); break; +#if PIC_ENABLE_FLOAT case 'f': xfprintf(file, "%f", va_arg(ap, double)); break; +#endif } break; case '~': diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 2425bc89..130084cd 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -119,6 +119,7 @@ pic_get_args(pic_state *pic, const char *format, ...) *p = GET_OPERAND(pic,i); break; } +#if PIC_ENABLE_FLOAT case 'f': { double *f; @@ -184,6 +185,7 @@ pic_get_args(pic_state *pic, const char *format, ...) } break; } +#endif case 'i': { int *k; @@ -192,9 +194,11 @@ pic_get_args(pic_state *pic, const char *format, ...) v = GET_OPERAND(pic, i); switch (pic_type(v)) { +#if PIC_ENABLE_FLOAT case PIC_TT_FLOAT: *k = (int)pic_float(v); break; +#endif case PIC_TT_INT: *k = pic_int(v); break; @@ -1060,10 +1064,31 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) NEXT; \ } +#define DEFINE_ARITH_OP2(opcode, op) \ + CASE(opcode) { \ + pic_value a, b; \ + b = POP(); \ + a = POP(); \ + if (pic_int_p(a) && pic_int_p(b)) { \ + PUSH(pic_int_value(pic_int(a) op pic_int(b))); \ + } \ + else { \ + pic_errorf(pic, #op " got non-number operands"); \ + } \ + NEXT; \ + } + +#if PIC_ENABLE_FLOAT DEFINE_ARITH_OP(OP_ADD, +, true); DEFINE_ARITH_OP(OP_SUB, -, true); DEFINE_ARITH_OP(OP_MUL, *, true); DEFINE_ARITH_OP(OP_DIV, /, f == round(f)); +#else + DEFINE_ARITH_OP2(OP_ADD, +); + DEFINE_ARITH_OP2(OP_SUB, -); + DEFINE_ARITH_OP2(OP_MUL, *); + DEFINE_ARITH_OP2(OP_DIV, /); +#endif CASE(OP_MINUS) { pic_value n; @@ -1071,9 +1096,11 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) if (pic_int_p(n)) { PUSH(pic_int_value(-pic_int(n))); } +#if PIC_ENABLE_FLOAT else if (pic_float_p(n)) { PUSH(pic_float_value(-pic_float(n))); } +#endif else { pic_errorf(pic, "unary - got a non-number operand"); } @@ -1103,9 +1130,29 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) NEXT; \ } +#define DEFINE_COMP_OP2(opcode, op) \ + CASE(opcode) { \ + pic_value a, b; \ + b = POP(); \ + a = POP(); \ + if (pic_int_p(a) && pic_int_p(b)) { \ + PUSH(pic_bool_value(pic_int(a) op pic_int(b))); \ + } \ + else { \ + pic_errorf(pic, #op " got non-number operands"); \ + } \ + NEXT; \ + } + +#if PIC_ENABLE_FLOAT DEFINE_COMP_OP(OP_EQ, ==); DEFINE_COMP_OP(OP_LT, <); DEFINE_COMP_OP(OP_LE, <=); +#else + DEFINE_COMP_OP2(OP_EQ, ==); + DEFINE_COMP_OP2(OP_LT, <); + DEFINE_COMP_OP2(OP_LE, <=); +#endif CASE(OP_STOP) { diff --git a/extlib/benz/write.c b/extlib/benz/write.c index f89e0703..e01966de 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -210,7 +210,9 @@ write_core(struct writer_control *p, pic_value obj) size_t i; xh_entry *e, *it; int c; +#if PIC_ENABLE_FLOAT double f; +#endif /* shared objects */ if (pic_vtype(obj) == PIC_VTYPE_HEAP @@ -285,6 +287,7 @@ write_core(struct writer_control *p, pic_value obj) case '\t': xfprintf(file, "#\\tab"); break; } break; +#if PIC_ENABLE_FLOAT case PIC_TT_FLOAT: f = pic_float(obj); if (isnan(f)) { @@ -295,6 +298,7 @@ write_core(struct writer_control *p, pic_value obj) xfprintf(file, "%f", pic_float(obj)); } break; +#endif case PIC_TT_INT: xfprintf(file, "%d", pic_int(obj)); break; From 304664eaf068c5fd7aa43a5d740b4b38b8bac87b Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 01:55:55 +0900 Subject: [PATCH 108/177] add libc fallback --- extlib/benz/include/picrin.h | 20 +++- extlib/benz/include/picrin/compat.h | 141 ++++++++++++++++++++++++++++ extlib/benz/include/picrin/config.h | 7 ++ extlib/benz/vm.c | 6 +- 4 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 extlib/benz/include/picrin/compat.h diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 3d43a428..40428c03 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -29,18 +29,28 @@ extern "C" { #endif #include -#include #include #include #include -#include -#include -#include -#include + +#if __STDC_VERSION__ >= 199901L +# include +#else +# define bool char +# define true 1 +# define false 0 +#endif + +#if __STDC_VERSION__ >= 199901L +# include +#elif ! defined(offsetof) +# define offsetof(s,m) ((size_t)&(((s *)NULL)->m)) +#endif #include "picrin/config.h" #include "picrin/util.h" +#include "picrin/compat.h" #if PIC_ENABLE_FLOAT # include diff --git a/extlib/benz/include/picrin/compat.h b/extlib/benz/include/picrin/compat.h new file mode 100644 index 00000000..cca83d95 --- /dev/null +++ b/extlib/benz/include/picrin/compat.h @@ -0,0 +1,141 @@ +/** + * See Copyright Notice in picrin.h + */ + +#ifndef PICRIN_COMPAT_H +#define PICRIN_COMPAT_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#if PIC_ENABLE_LIBC + +#include +#include +#include +#include + +#else + +# define assert(v) 0 + +PIC_INLINE int +isspace(int c) +{ + return c == ' ' || c == '\t' || c == '\r' || c == '\v' || c == '\f' || c == '\n'; +} + +PIC_INLINE int +tolower(int c) +{ + return ('A' <= c && c <= 'Z') ? c - 'A' + 'a' : c; +} + +PIC_INLINE int +isdigit(int c) +{ + return '0' <= c && c <= '9'; +} + +PIC_INLINE char * +strchr(const char *s, int c) +{ + do { + if (*s == c) + return (char *)s; + } while (*s++ != '\0'); + return NULL; +} + +PIC_INLINE size_t +strlen(const char *s) +{ + size_t l = 0; + + while (*s++) { + l++; + } + return l; +} + +PIC_INLINE int +strcmp(const char *s1, const char *s2) +{ + while (*s1 && *s1 == *s2) { + s1++; + s2++; + } + return (unsigned)*s1 - (unsigned)*s2; +} + +PIC_INLINE long +strtol(const char *nptr, char **endptr, int base) +{ + long l = 0; + char c; + int n; + + while (1) { + c = *nptr; + if ('0' <= c && c <= '9') + n = c - '0'; + else if ('a' <= c && c <= 'z') + n = c - 'a' + 10; + else if ('A' <= c && c <= 'Z') + n = c - 'A' + 10; + else + goto exit; + + if (base <= n) + goto exit; + + l = l * base + n; + nptr++; + } + exit: + if (endptr) + *endptr = (char *)nptr; + return l; +} + +PIC_INLINE void * +memset(void *s, int n, size_t c) +{ + char *p = s; + + while (c-- > 0) { + *p++ = n; + } + return s; +} + +PIC_INLINE void * +memcpy(void *dst, const void *src, size_t n) +{ + const char *s = src; + char *d = dst; + + while (n-- > 0) { + *d++ = *s++; + } + return d; +} + +PIC_INLINE char * +strcpy(char *dst, const char *src) +{ + char *d = dst; + + while ((*dst++ = *src++) != 0); + + return d; +} + +#endif + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index edf07594..58f5d54b 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -14,6 +14,9 @@ /** enable floating point number support */ /* #define PIC_ENABLE_FLOAT 1 */ +/** no dependency on libc */ +/* #define PIC_ENABLE_LIBC 1 */ + /** treat false value as none */ /* #define PIC_NONE_IS_FALSE 1 */ @@ -82,6 +85,10 @@ # endif #endif +#ifndef PIC_ENABLE_LIBC +# define PIC_ENABLE_LIBC 1 +#endif + #if PIC_NAN_BOXING && defined(PIC_ENABLE_FLOAT) && ! PIC_ENABLE_FLOAT # error cannot disable float support when nan boxing is on #endif diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 130084cd..fa07c6d2 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -255,10 +255,12 @@ pic_get_args(pic_state *pic, const char *format, ...) cstr = va_arg(ap, const char **); v = GET_OPERAND(pic,i); - if (! pic_str_p(v)) { + if (pic_str_p(v)) { + *cstr = pic_str_cstr(pic, pic_str_ptr(v)); + } + else { pic_errorf(pic, "pic_get_args: expected string, but got ~s", v); } - *cstr = pic_str_cstr(pic, pic_str_ptr(v)); break; } case 'm': { From 271898ae78eeb327c535052979276dde1d2daf5e Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 01:58:22 +0900 Subject: [PATCH 109/177] don't use xmopen --- extlib/benz/port.c | 103 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 4 deletions(-) diff --git a/extlib/benz/port.c b/extlib/benz/port.c index 9f725f7f..c3f70832 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -7,6 +7,7 @@ #include "picrin/port.h" #include "picrin/string.h" #include "picrin/blob.h" +#include "picrin/error.h" pic_value pic_eof_object() @@ -60,13 +61,107 @@ pic_make_standard_port(pic_state *pic, xFILE *file, short dir) return port; } +struct strfile { + pic_state *pic; + char *buf; + long pos, end, capa; +}; + +static int +strfile_read(void *cookie, char *ptr, int size) +{ + struct strfile *m = cookie; + + if (size > (int)(m->end - m->pos)) + size = (int)(m->end - m->pos); + memcpy(ptr, m->buf + m->pos, size); + m->pos += size; + return size; +} + +static int +strfile_write(void *cookie, const char *ptr, int size) +{ + struct strfile *m = cookie; + + if (m->pos + size >= m->capa) { + m->capa = (m->pos + size) * 2; + m->buf = pic_realloc(m->pic, m->buf, (size_t)m->capa); + } + memcpy(m->buf + m->pos, ptr, size); + m->pos += size; + if (m->end < m->pos) + m->end = m->pos; + return size; +} + +static long +strfile_seek(void *cookie, long pos, int whence) +{ + struct strfile *m = cookie; + + switch (whence) { + case XF_SEEK_SET: + m->pos = pos; + break; + case XF_SEEK_CUR: + m->pos += pos; + break; + case XF_SEEK_END: + m->pos = m->end + pos; + break; + } + + return m->pos; +} + +static int +strfile_flush(void *cookie) +{ + (void)cookie; + + return 0; +} + +static int +strfile_close(void *cookie) +{ + struct strfile *m = cookie; + + pic_free(m->pic, m->buf); + pic_free(m->pic, m); + return 0; +} + +static xFILE * +strfile_open(pic_state *pic) +{ + static const size_t size = 128; + struct strfile *m; + xFILE *file; + + m = pic_malloc(pic, sizeof(struct strfile)); + m->pic = pic; + m->buf = pic_malloc(pic, size); + m->pos = 0; + m->end = 0; + m->capa = size; + + file = xfunopen(m, strfile_read, strfile_write, strfile_seek, strfile_flush, strfile_close); + if (file == NULL) { + strfile_close(m); + pic_error(pic, "could not open new output string/bytevector port", pic_nil_value()); + } + return file; +} + struct pic_port * pic_open_input_string(pic_state *pic, const char *str) { struct pic_port *port; port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); - port->file = xmopen(); + port->file = strfile_open(pic); port->flags = PIC_PORT_IN | PIC_PORT_TEXT; port->status = PIC_PORT_OPEN; @@ -83,7 +178,7 @@ pic_open_output_string(pic_state *pic) struct pic_port *port; port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); - port->file = xmopen(); + port->file = strfile_open(pic); port->flags = PIC_PORT_OUT | PIC_PORT_TEXT; port->status = PIC_PORT_OPEN; @@ -322,7 +417,7 @@ pic_port_open_input_blob(pic_state *pic) pic_get_args(pic, "b", &blob); port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); - port->file = xmopen(); + port->file = strfile_open(pic); port->flags = PIC_PORT_IN | PIC_PORT_BINARY; port->status = PIC_PORT_OPEN; @@ -341,7 +436,7 @@ pic_port_open_output_bytevector(pic_state *pic) pic_get_args(pic, ""); port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); - port->file = xmopen(); + port->file = strfile_open(pic); port->flags = PIC_PORT_OUT | PIC_PORT_BINARY; port->status = PIC_PORT_OPEN; From 278075910a2d621a6b73e4b66d74040ebe9dbcdf Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 02:12:26 +0900 Subject: [PATCH 110/177] custom allocator and custom abort --- extlib/benz/codegen.c | 1 + extlib/benz/error.c | 8 +++- extlib/benz/gc.c | 14 ++++--- extlib/benz/include/picrin.h | 7 +++- extlib/benz/include/picrin/config.h | 7 ++++ extlib/benz/include/picrin/xhash.h | 58 ++++++++++++++--------------- extlib/benz/port.c | 6 +-- extlib/benz/state.c | 36 ++++++++++-------- src/main.c | 2 +- 9 files changed, 81 insertions(+), 58 deletions(-) diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index fdc209de..c90e0aab 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -984,6 +984,7 @@ emit_r(codegen_state *state, enum pic_opcode insn, int d, int i) static void create_activation(codegen_state *state) { + pic_state *pic = state->pic; codegen_context *cxt = state->cxt; size_t i, n; xhash regs; diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 705f0055..6d2abc37 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -16,8 +16,14 @@ pic_panic(pic_state *pic, const char *msg) { PIC_UNUSED(pic); +#if DEBUG fprintf(stderr, "abort: %s\n", msg); - abort(); +#else + PIC_UNUSED(msg); +#endif + PIC_ABORT(pic); + + PIC_UNREACHABLE(); } void diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 74c3e7bf..348a64f0 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -112,8 +112,9 @@ add_heap_page(pic_state *pic) pic->heap->pages = page; } -static void * -alloc(void *ptr, size_t size) +#if PIC_ENABLE_LIBC +void * +pic_default_allocf(void *ptr, size_t size) { if (size == 0) { if (ptr) { @@ -127,13 +128,14 @@ alloc(void *ptr, size_t size) return malloc(size); } } +#endif void * pic_alloc(pic_state *pic, size_t size) { void *ptr; - ptr = alloc(NULL, size); + ptr = pic->allocf(NULL, size); if (ptr == NULL && size > 0) { pic_panic(pic, "memory exhausted"); } @@ -143,7 +145,7 @@ pic_alloc(pic_state *pic, size_t size) void * pic_realloc(pic_state *pic, void *ptr, size_t size) { - ptr = alloc(ptr, size); + ptr = pic->allocf(ptr, size); if (ptr == NULL && size > 0) { pic_panic(pic, "memory exhausted"); } @@ -156,7 +158,7 @@ pic_calloc(pic_state *pic, size_t count, size_t size) void *ptr; size *= count; - ptr = alloc(NULL, size); + ptr = pic->allocf(NULL, size); if (ptr == NULL && size > 0) { pic_panic(pic, "memory exhausted"); } @@ -169,7 +171,7 @@ pic_free(pic_state *pic, void *ptr) { PIC_UNUSED(pic); - free(ptr); + pic->allocf(ptr, 0); } static void diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 40428c03..37bd8312 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -81,10 +81,14 @@ typedef struct { struct pic_env *up; } pic_callinfo; +typedef void *(*pic_allocf)(void *, size_t); + typedef struct { int argc; char **argv, **envp; + pic_allocf allocf; + struct pic_winder *wind; pic_value *sp; @@ -167,7 +171,8 @@ void pic_gc_arena_restore(pic_state *, size_t); pic_gc_arena_restore(pic, ai); \ } while (0) -pic_state *pic_open(int argc, char *argv[], char **envp); +pic_state *pic_open(int argc, char *argv[], char **envp, pic_allocf); +void *pic_default_allocf(void *, size_t); void pic_close(pic_state *); void pic_add_feature(pic_state *, const char *); diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index 58f5d54b..1de25976 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -25,6 +25,9 @@ /* #define PIC_SETJMP(pic, buf) setjmp(buf) */ /* #define PIC_LONGJMP(pic, buf, val) longjmp((buf), (val)) */ +/** custom abort */ +/* #define PIC_ABORT(pic) abort() */ + /** initial memory size (to be dynamically extended if necessary) */ /* #define PIC_ARENA_SIZE 1000 */ @@ -112,6 +115,10 @@ # define PIC_LONGJMP(pic, buf, val) longjmp((buf), (val)) #endif +#ifndef PIC_ABORT +# define PIC_ABORT(pic) abort() +#endif + #ifndef PIC_ARENA_SIZE # define PIC_ARENA_SIZE (8 * 1024) #endif diff --git a/extlib/benz/include/picrin/xhash.h b/extlib/benz/include/picrin/xhash.h index 60e3847d..9a3aafe4 100644 --- a/extlib/benz/include/picrin/xhash.h +++ b/extlib/benz/include/picrin/xhash.h @@ -9,10 +9,12 @@ extern "C" { #endif +#define XHASH_ALLOCATOR pic->allocf + /* simple object to object hash table */ #define XHASH_INIT_SIZE 11 -#define XHASH_RESIZE_RATIO 0.75 +#define XHASH_RESIZE_RATIO(x) ((x) * 3 / 4) #define XHASH_ALIGNMENT 3 /* quad word alignment */ #define XHASH_MASK (~(size_t)((1 << XHASH_ALIGNMENT) - 1)) @@ -31,8 +33,10 @@ typedef struct xh_entry { typedef int (*xh_hashf)(const void *, void *); typedef int (*xh_equalf)(const void *, const void *, void *); +typedef void *(*xh_allocf)(void *, size_t); typedef struct xhash { + xh_allocf allocf; xh_entry **buckets; size_t size, count, kwidth, vwidth; size_t koffset, voffset; @@ -76,16 +80,17 @@ PIC_INLINE xh_entry *xh_next(xh_entry *e); PIC_INLINE void -xh_bucket_realloc(xhash *x, size_t newsize) +xh_bucket_alloc(xhash *x, size_t newsize) { x->size = newsize; - x->buckets = realloc(x->buckets, (x->size + 1) * sizeof(xh_entry *)); + x->buckets = x->allocf(NULL, (x->size + 1) * sizeof(xh_entry *)); memset(x->buckets, 0, (x->size + 1) * sizeof(xh_entry *)); } PIC_INLINE void -xh_init_(xhash *x, size_t kwidth, size_t vwidth, xh_hashf hashf, xh_equalf equalf, void *data) +xh_init_(xhash *x, xh_allocf allocf, size_t kwidth, size_t vwidth, xh_hashf hashf, xh_equalf equalf, void *data) { + x->allocf = allocf; x->size = 0; x->buckets = NULL; x->count = 0; @@ -99,7 +104,7 @@ xh_init_(xhash *x, size_t kwidth, size_t vwidth, xh_hashf hashf, xh_equalf equal x->tail = NULL; x->data = data; - xh_bucket_realloc(x, XHASH_INIT_SIZE); + xh_bucket_alloc(x, XHASH_INIT_SIZE); } PIC_INLINE xh_entry * @@ -125,8 +130,8 @@ xh_resize_(xhash *x, size_t newsize) xh_entry *it; size_t idx; - xh_init_(&y, x->kwidth, x->vwidth, x->hashf, x->equalf, x->data); - xh_bucket_realloc(&y, newsize); + xh_init_(&y, x->allocf, x->kwidth, x->vwidth, x->hashf, x->equalf, x->data); + xh_bucket_alloc(&y, newsize); for (it = xh_begin(x); it != NULL; it = xh_next(it)) { idx = ((unsigned)it->hash) % y.size; @@ -139,7 +144,7 @@ xh_resize_(xhash *x, size_t newsize) y.head = x->head; y.tail = x->tail; - free(x->buckets); + x->allocf(x->buckets, 0); /* copy all members from y to x */ memcpy(x, &y, sizeof(xhash)); @@ -157,13 +162,13 @@ xh_put_(xhash *x, const void *key, void *val) return e; } - if (x->count + 1 > x->size * XHASH_RESIZE_RATIO) { + if (x->count + 1 > XHASH_RESIZE_RATIO(x->size)) { xh_resize_(x, x->size * 2 + 1); } hash = x->hashf(key, x->data); idx = ((unsigned)hash) % x->size; - e = malloc(x->voffset + x->vwidth); + e = x->allocf(NULL, x->voffset + x->vwidth); e->next = x->buckets[idx]; e->hash = hash; e->key = ((char *)e) + x->koffset; @@ -208,7 +213,7 @@ xh_del_(xhash *x, const void *key) q->bw->fw = q->fw; } r = q->next; - free(q); + x->allocf(q, 0); x->buckets[idx] = r; } else { @@ -228,7 +233,7 @@ xh_del_(xhash *x, const void *key) q->bw->fw = q->fw; } r = q->next; - free(q); + x->allocf(q, 0); p->next = r; } @@ -251,7 +256,7 @@ xh_clear(xhash *x) e = x->buckets[i]; while (e) { d = e->next; - free(e); + x->allocf(e, 0); e = d; } x->buckets[i] = NULL; @@ -265,7 +270,7 @@ PIC_INLINE void xh_destroy(xhash *x) { xh_clear(x); - free(x->buckets); + x->allocf(x->buckets, 0); } /* string map */ @@ -287,16 +292,15 @@ xh_str_hash(const void *key, void *data) PIC_INLINE int xh_str_equal(const void *key1, const void *key2, void *data) { + const char *s1 = *(const char **)key1, *s2 = *(const char **)key2; + (void)data; - return strcmp(*(const char **)key1, *(const char **)key2) == 0; + return strcmp(s1, s2) == 0; } -PIC_INLINE void -xh_init_str(xhash *x, size_t width) -{ - xh_init_(x, sizeof(const char *), width, xh_str_hash, xh_str_equal, NULL); -} +#define xh_init_str(x, width) \ + xh_init_(x, XHASH_ALLOCATOR, sizeof(const char *), width, xh_str_hash, xh_str_equal, NULL); PIC_INLINE xh_entry * xh_get_str(xhash *x, const char *key) @@ -334,11 +338,8 @@ xh_ptr_equal(const void *key1, const void *key2, void *data) return *(const void **)key1 == *(const void **)key2; } -PIC_INLINE void -xh_init_ptr(xhash *x, size_t width) -{ - xh_init_(x, sizeof(const void *), width, xh_ptr_hash, xh_ptr_equal, NULL); -} +#define xh_init_ptr(x, width) \ + xh_init_(x, XHASH_ALLOCATOR, sizeof(const void *), width, xh_ptr_hash, xh_ptr_equal, NULL); PIC_INLINE xh_entry * xh_get_ptr(xhash *x, const void *key) @@ -376,11 +377,8 @@ xh_int_equal(const void *key1, const void *key2, void *data) return *(int *)key1 == *(int *)key2; } -PIC_INLINE void -xh_init_int(xhash *x, size_t width) -{ - xh_init_(x, sizeof(int), width, xh_int_hash, xh_int_equal, NULL); -} +#define xh_init_int(x, width) \ + xh_init_(x, XHASH_ALLOCATOR, sizeof(int), width, xh_int_hash, xh_int_equal, NULL); PIC_INLINE xh_entry * xh_get_int(xhash *x, int key) diff --git a/extlib/benz/port.c b/extlib/benz/port.c index c3f70832..65e6482c 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -101,13 +101,13 @@ strfile_seek(void *cookie, long pos, int whence) struct strfile *m = cookie; switch (whence) { - case XF_SEEK_SET: + case SEEK_SET: m->pos = pos; break; - case XF_SEEK_CUR: + case SEEK_CUR: m->pos += pos; break; - case XF_SEEK_END: + case SEEK_END: m->pos = m->end + pos; break; } diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 778ca034..5e574d53 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -146,7 +146,7 @@ pic_init_core(pic_state *pic) } pic_state * -pic_open(int argc, char *argv[], char **envp) +pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) { struct pic_port *pic_make_standard_port(pic_state *, xFILE *, short); char t; @@ -154,12 +154,15 @@ pic_open(int argc, char *argv[], char **envp) pic_state *pic; size_t ai; - pic = malloc(sizeof(pic_state)); + pic = allocf(NULL, sizeof(pic_state)); if (! pic) { goto EXIT_PIC; } + /* allocator */ + pic->allocf = allocf; + /* turn off GC */ pic->gc_enable = false; @@ -172,7 +175,7 @@ pic_open(int argc, char *argv[], char **envp) pic->envp = envp; /* prepare VM stack */ - pic->stbase = pic->sp = calloc(PIC_STACK_SIZE, sizeof(pic_value)); + pic->stbase = pic->sp = allocf(NULL, PIC_STACK_SIZE * sizeof(pic_value)); pic->stend = pic->stbase + PIC_STACK_SIZE; if (! pic->sp) { @@ -180,7 +183,7 @@ pic_open(int argc, char *argv[], char **envp) } /* callinfo */ - pic->cibase = pic->ci = calloc(PIC_STACK_SIZE, sizeof(pic_callinfo)); + pic->cibase = pic->ci = allocf(NULL, PIC_STACK_SIZE * sizeof(pic_callinfo)); pic->ciend = pic->cibase + PIC_STACK_SIZE; if (! pic->ci) { @@ -188,7 +191,7 @@ pic_open(int argc, char *argv[], char **envp) } /* exception handler */ - pic->xpbase = pic->xp = calloc(PIC_RESCUE_SIZE, sizeof(struct pic_proc *)); + pic->xpbase = pic->xp = allocf(NULL, PIC_RESCUE_SIZE * sizeof(struct pic_proc *)); pic->xpend = pic->xpbase + PIC_RESCUE_SIZE; if (! pic->xp) { @@ -196,7 +199,7 @@ pic_open(int argc, char *argv[], char **envp) } /* GC arena */ - pic->arena = calloc(PIC_ARENA_SIZE, sizeof(struct pic_object **)); + pic->arena = allocf(NULL, PIC_ARENA_SIZE * sizeof(struct pic_object *)); pic->arena_size = PIC_ARENA_SIZE; pic->arena_idx = 0; @@ -346,13 +349,13 @@ pic_open(int argc, char *argv[], char **envp) return pic; EXIT_ARENA: - free(pic->xp); + allocf(pic->xp, 0); EXIT_XP: - free(pic->ci); + allocf(pic->ci, 0); EXIT_CI: - free(pic->sp); + allocf(pic->sp, 0); EXIT_SP: - free(pic); + allocf(pic, 0); EXIT_PIC: return NULL; } @@ -361,6 +364,7 @@ void pic_close(pic_state *pic) { xh_entry *it; + pic_allocf allocf = pic->allocf; /* invoke exit handlers */ while (pic->wind) { @@ -372,7 +376,7 @@ pic_close(pic_state *pic) /* free symbol names */ for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { - free(xh_key(it, char *)); + allocf(xh_key(it, char *), 0); } /* clear out root objects */ @@ -398,16 +402,16 @@ pic_close(pic_state *pic) pic_reader_close(pic, pic->reader); /* free runtime context */ - free(pic->stbase); - free(pic->cibase); - free(pic->xpbase); + allocf(pic->stbase, 0); + allocf(pic->cibase, 0); + allocf(pic->xpbase, 0); /* free global stacks */ xh_destroy(&pic->syms); xh_destroy(&pic->attrs); /* free GC arena */ - free(pic->arena); + allocf(pic->arena, 0); - free(pic); + allocf(pic, 0); } diff --git a/src/main.c b/src/main.c index 72bbaebb..5c70fd7f 100644 --- a/src/main.c +++ b/src/main.c @@ -55,7 +55,7 @@ main(int argc, char *argv[], char **envp) struct pic_lib *PICRIN_MAIN; int status = 0; - pic = pic_open(argc, argv, envp); + pic = pic_open(argc, argv, envp, pic_default_allocf); pic_init_picrin(pic); From 6a692541a6e80538d5fae13feade7ff1ac75e704 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 16:42:16 +0900 Subject: [PATCH 111/177] s/pic_alloc/pic_malloc/g --- contrib/03.callcc/callcc.c | 12 ++++++------ contrib/10.regexp/src/regexp.c | 2 +- extlib/benz/blob.c | 2 +- extlib/benz/codegen.c | 8 ++++---- extlib/benz/cont.c | 4 ++-- extlib/benz/dict.c | 4 ++-- extlib/benz/gc.c | 4 ++-- extlib/benz/include/picrin.h | 3 +-- extlib/benz/include/picrin/error.h | 2 +- extlib/benz/port.c | 2 +- extlib/benz/read.c | 8 ++++---- extlib/benz/state.c | 2 +- extlib/benz/string.c | 2 +- extlib/benz/vector.c | 4 ++-- 14 files changed, 29 insertions(+), 30 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index f516e8c7..09746077 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -117,36 +117,36 @@ save_cont(pic_state *pic, struct pic_cont **c) pic_vm_tear_off(pic); /* tear off */ - cont = *c = pic_alloc(pic, sizeof(struct pic_cont)); + cont = *c = pic_malloc(pic, sizeof(struct pic_cont)); cont->wind = pic->wind; cont->stk_len = native_stack_length(pic, &pos); cont->stk_pos = pos; assert(cont->stk_len > 0); - cont->stk_ptr = pic_alloc(pic, cont->stk_len); + cont->stk_ptr = pic_malloc(pic, cont->stk_len); memcpy(cont->stk_ptr, cont->stk_pos, cont->stk_len); cont->sp_offset = pic->sp - pic->stbase; cont->st_len = pic->stend - pic->stbase; - cont->st_ptr = pic_alloc(pic, sizeof(pic_value) * cont->st_len); + cont->st_ptr = pic_malloc(pic, sizeof(pic_value) * cont->st_len); memcpy(cont->st_ptr, pic->stbase, sizeof(pic_value) * cont->st_len); cont->ci_offset = pic->ci - pic->cibase; cont->ci_len = pic->ciend - pic->cibase; - cont->ci_ptr = pic_alloc(pic, sizeof(pic_callinfo) * cont->ci_len); + cont->ci_ptr = pic_malloc(pic, sizeof(pic_callinfo) * cont->ci_len); memcpy(cont->ci_ptr, pic->cibase, sizeof(pic_callinfo) * cont->ci_len); cont->xp_offset = pic->xp - pic->xpbase; cont->xp_len = pic->xpend - pic->xpbase; - cont->xp_ptr = pic_alloc(pic, sizeof(struct pic_proc *) * cont->xp_len); + cont->xp_ptr = pic_malloc(pic, sizeof(struct pic_proc *) * cont->xp_len); memcpy(cont->xp_ptr, pic->xpbase, sizeof(struct pic_proc *) * cont->xp_len); cont->ip = pic->ip; cont->arena_idx = pic->arena_idx; cont->arena_size = pic->arena_size; - cont->arena = pic_alloc(pic, sizeof(struct pic_object *) * pic->arena_size); + cont->arena = pic_malloc(pic, sizeof(struct pic_object *) * pic->arena_size); memcpy(cont->arena, pic->arena, sizeof(struct pic_object *) * pic->arena_size); cont->results = pic_undef_value(); diff --git a/contrib/10.regexp/src/regexp.c b/contrib/10.regexp/src/regexp.c index 53134ad0..3a358fab 100644 --- a/contrib/10.regexp/src/regexp.c +++ b/contrib/10.regexp/src/regexp.c @@ -54,7 +54,7 @@ pic_regexp_regexp(pic_state *pic) } } - reg = pic_alloc(pic, sizeof(struct pic_regexp_t)); + reg = pic_malloc(pic, sizeof(struct pic_regexp_t)); reg->flags = flags; if ((err = regcomp(®->reg, ptrn, cflags)) != 0) { diff --git a/extlib/benz/blob.c b/extlib/benz/blob.c index 4ca4006d..0169c970 100644 --- a/extlib/benz/blob.c +++ b/extlib/benz/blob.c @@ -12,7 +12,7 @@ pic_make_blob(pic_state *pic, size_t len) struct pic_blob *bv; bv = (struct pic_blob *)pic_obj_alloc(pic, sizeof(struct pic_blob), PIC_TT_BLOB); - bv->data = pic_alloc(pic, len); + bv->data = pic_malloc(pic, len); bv->len = len; return bv; } diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index c90e0aab..bd9fe03b 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -70,7 +70,7 @@ new_analyze_state(pic_state *pic) pic_sym *sym; xh_entry *it; - state = pic_alloc(pic, sizeof(analyze_state)); + state = pic_malloc(pic, sizeof(analyze_state)); state->pic = pic; state->scope = NULL; @@ -144,7 +144,7 @@ static bool push_scope(analyze_state *state, pic_value formals) { pic_state *pic = state->pic; - analyze_scope *scope = pic_alloc(pic, sizeof(analyze_scope)); + analyze_scope *scope = pic_malloc(pic, sizeof(analyze_scope)); bool varg; xv_init(scope->args); @@ -900,7 +900,7 @@ new_codegen_state(pic_state *pic) { codegen_state *state; - state = pic_alloc(pic, sizeof(codegen_state)); + state = pic_malloc(pic, sizeof(codegen_state)); state->pic = pic; state->cxt = NULL; @@ -1026,7 +1026,7 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v assert(pic_sym_p(name) || pic_false_p(name)); - cxt = pic_alloc(pic, sizeof(codegen_context)); + cxt = pic_malloc(pic, sizeof(codegen_context)); cxt->up = state->cxt; cxt->name = pic_false_p(name) ? pic_intern_cstr(pic, "(anonymous lambda)") diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index eaa09771..00209c0c 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -36,7 +36,7 @@ pic_dynamic_wind(pic_state *pic, struct pic_proc *in, struct pic_proc *thunk, st } here = pic->wind; - pic->wind = pic_alloc(pic, sizeof(struct pic_winder)); + pic->wind = pic_malloc(pic, sizeof(struct pic_winder)); pic->wind->prev = here; pic->wind->depth = here->depth + 1; pic->wind->in = in; @@ -128,7 +128,7 @@ pic_make_econt(pic_state *pic, struct pic_escape *escape) pic_value pic_escape(pic_state *pic, struct pic_proc *proc) { - struct pic_escape *escape = pic_alloc(pic, sizeof(struct pic_escape)); + struct pic_escape *escape = pic_malloc(pic, sizeof(struct pic_escape)); pic_save_point(pic, escape); diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index 4312c40f..0ad6f769 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -170,7 +170,7 @@ pic_dict_dictionary_map(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &args); - it = pic_alloc(pic, argc * sizeof(xh_entry)); + it = pic_malloc(pic, argc * sizeof(xh_entry)); for (i = 0; i < argc; ++i) { if (! pic_dict_p(args[i])) { pic_free(pic, it); @@ -217,7 +217,7 @@ pic_dict_dictionary_for_each(pic_state *pic) pic_get_args(pic, "l*", &proc, &argc, &args); - it = pic_alloc(pic, argc * sizeof(xh_entry)); + it = pic_malloc(pic, argc * sizeof(xh_entry)); for (i = 0; i < argc; ++i) { if (! pic_dict_p(args[i])) { pic_free(pic, it); diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 348a64f0..0fea8df1 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -104,7 +104,7 @@ add_heap_page(pic_state *pic) up->s.size = 1; up->s.ptr = np; - page = pic_alloc(pic, sizeof(struct heap_page)); + page = pic_malloc(pic, sizeof(struct heap_page)); page->basep = up; page->endp = up + nu + 1; page->next = pic->heap->pages; @@ -131,7 +131,7 @@ pic_default_allocf(void *ptr, size_t size) #endif void * -pic_alloc(pic_state *pic, size_t size) +pic_malloc(pic_state *pic, size_t size) { void *ptr; diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 37bd8312..2a75d496 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -151,8 +151,7 @@ typedef struct { typedef pic_value (*pic_func_t)(pic_state *); -void *pic_alloc(pic_state *, size_t); -#define pic_malloc(pic,size) pic_alloc(pic,size) /* obsoleted */ +void *pic_malloc(pic_state *, size_t); void *pic_realloc(pic_state *, void *, size_t); void *pic_calloc(pic_state *, size_t, size_t); struct pic_object *pic_obj_alloc(pic_state *, size_t, enum pic_tt); diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index 7f58ec35..efb12130 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -32,7 +32,7 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) pic_catch_(PIC_GENSYM(label)) #define pic_try_(escape) \ do { \ - struct pic_escape *escape = pic_alloc(pic, sizeof(struct pic_escape)); \ + struct pic_escape *escape = pic_malloc(pic, sizeof(struct pic_escape)); \ pic_save_point(pic, escape); \ if (PIC_SETJMP(pic, (void *)escape->jmp) == 0) { \ pic_push_try(pic, escape); \ diff --git a/extlib/benz/port.c b/extlib/benz/port.c index 65e6482c..df6a971c 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -197,7 +197,7 @@ pic_get_output_string(pic_state *pic, struct pic_port *port) xrewind(port->file); /* copy to buf */ - buf = (char *)pic_alloc(pic, size + 1); + buf = (char *)pic_malloc(pic, size + 1); buf[size] = 0; xfread(buf, size, 1, port->file); diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 4f6c6b30..f0d0299f 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -208,7 +208,7 @@ read_symbol(pic_state *pic, struct pic_port *port, int c) pic_sym *sym; len = 1; - buf = pic_alloc(pic, len + 1); + buf = pic_malloc(pic, len + 1); buf[0] = case_fold(pic, c); buf[1] = 0; @@ -468,7 +468,7 @@ read_string(pic_state *pic, struct pic_port *port, int c) pic_str *str; size = 256; - buf = pic_alloc(pic, size); + buf = pic_malloc(pic, size); cnt = 0; /* TODO: intraline whitespaces */ @@ -506,7 +506,7 @@ read_pipe(pic_state *pic, struct pic_port *port, int c) size_t i = 0; size = 256; - buf = pic_alloc(pic, size); + buf = pic_malloc(pic, size); cnt = 0; while ((c = next(port)) != '|') { if (c == '\\') { @@ -830,7 +830,7 @@ pic_reader_open(pic_state *pic) struct pic_reader *reader; int c; - reader = pic_alloc(pic, sizeof(struct pic_reader)); + reader = pic_malloc(pic, sizeof(struct pic_reader)); reader->typecase = PIC_CASE_DEFAULT; xh_init_int(&reader->labels, sizeof(pic_value)); diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 5e574d53..efc8d2a8 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -318,7 +318,7 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) pic->macros = pic_make_dict(pic); /* root block */ - pic->wind = pic_alloc(pic, sizeof(struct pic_winder)); + pic->wind = pic_malloc(pic, sizeof(struct pic_winder)); pic->wind->prev = NULL; pic->wind->depth = 0; pic->wind->in = pic->wind->out = NULL; diff --git a/extlib/benz/string.c b/extlib/benz/string.c index aeafef93..c9b75bd0 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -465,7 +465,7 @@ pic_str_string(pic_state *pic) pic_get_args(pic, "*", &argc, &argv); - buf = pic_alloc(pic, (size_t)argc); + buf = pic_malloc(pic, (size_t)argc); for (i = 0; i < argc; ++i) { pic_assert_type(pic, argv[i], char); diff --git a/extlib/benz/vector.c b/extlib/benz/vector.c index f98c81ab..46b02616 100644 --- a/extlib/benz/vector.c +++ b/extlib/benz/vector.c @@ -15,7 +15,7 @@ pic_make_vec(pic_state *pic, size_t len) vec = (struct pic_vector *)pic_obj_alloc(pic, sizeof(struct pic_vector), PIC_TT_VECTOR); vec->len = len; - vec->data = (pic_value *)pic_alloc(pic, sizeof(pic_value) * len); + vec->data = (pic_value *)pic_malloc(pic, sizeof(pic_value) * len); for (i = 0; i < len; ++i) { vec->data[i] = pic_none_value(); } @@ -363,7 +363,7 @@ pic_vec_vector_to_string(pic_state *pic) pic_errorf(pic, "vector->string: end index must not be less than start index"); } - buf = pic_alloc(pic, end - start); + buf = pic_malloc(pic, end - start); for (i = start; i < end; ++i) { pic_assert_type(pic, vec->data[i], char); From d11da3a40058e95677629e8c2b78a889820b52b0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 16:54:36 +0900 Subject: [PATCH 112/177] move complex macros from picrin.h to util.h --- extlib/benz/include/picrin.h | 14 -------------- extlib/benz/include/picrin/util.h | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 2a75d496..19fe9e16 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -34,20 +34,6 @@ extern "C" { #include -#if __STDC_VERSION__ >= 199901L -# include -#else -# define bool char -# define true 1 -# define false 0 -#endif - -#if __STDC_VERSION__ >= 199901L -# include -#elif ! defined(offsetof) -# define offsetof(s,m) ((size_t)&(((s *)NULL)->m)) -#endif - #include "picrin/config.h" #include "picrin/util.h" #include "picrin/compat.h" diff --git a/extlib/benz/include/picrin/util.h b/extlib/benz/include/picrin/util.h index 2b69b206..a04c2813 100644 --- a/extlib/benz/include/picrin/util.h +++ b/extlib/benz/include/picrin/util.h @@ -9,6 +9,20 @@ extern "C" { #endif +#if __STDC_VERSION__ >= 199901L +# include +#else +# define bool char +# define true 1 +# define false 0 +#endif + +#if __STDC_VERSION__ >= 199901L +# include +#elif ! defined(offsetof) +# define offsetof(s,m) ((size_t)&(((s *)NULL)->m)) +#endif + #if __STDC_VERSION__ >= 201112L # include # define PIC_NORETURN noreturn From e30f1a11dc0864b5c9ff3e645522bf19e6e4d2aa Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 17:06:41 +0900 Subject: [PATCH 113/177] more strict unused variable check --- extlib/benz/dict.c | 12 +++------ extlib/benz/error.c | 6 ++--- extlib/benz/gc.c | 2 -- extlib/benz/include/picrin/util.h | 9 +++++-- extlib/benz/read.c | 42 +++++++------------------------ extlib/benz/string.c | 4 +-- extlib/benz/write.c | 2 -- 7 files changed, 22 insertions(+), 55 deletions(-) diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index 0ad6f769..3904dbd0 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -33,26 +33,20 @@ 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_UNUSED(*pic), struct pic_dict *dict, pic_sym *key, pic_value val) { - PIC_UNUSED(pic); - xh_put_ptr(&dict->hash, key, &val); } size_t -pic_dict_size(pic_state *pic, struct pic_dict *dict) +pic_dict_size(pic_state PIC_UNUSED(*pic), struct pic_dict *dict) { - PIC_UNUSED(pic); - return dict->hash.count; } bool -pic_dict_has(pic_state *pic, struct pic_dict *dict, pic_sym *key) +pic_dict_has(pic_state PIC_UNUSED(*pic), struct pic_dict *dict, pic_sym *key) { - PIC_UNUSED(pic); - return xh_get_ptr(&dict->hash, key) != NULL; } diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 6d2abc37..2c70e188 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -12,14 +12,12 @@ #include "picrin/port.h" void -pic_panic(pic_state *pic, const char *msg) +pic_panic(pic_state PIC_UNUSED(*pic), const char *msg) { - PIC_UNUSED(pic); - #if DEBUG fprintf(stderr, "abort: %s\n", msg); #else - PIC_UNUSED(msg); + (void)msg; #endif PIC_ABORT(pic); diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 0fea8df1..4220c758 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -169,8 +169,6 @@ pic_calloc(pic_state *pic, size_t count, size_t size) void pic_free(pic_state *pic, void *ptr) { - PIC_UNUSED(pic); - pic->allocf(ptr, 0); } diff --git a/extlib/benz/include/picrin/util.h b/extlib/benz/include/picrin/util.h index a04c2813..5c831bad 100644 --- a/extlib/benz/include/picrin/util.h +++ b/extlib/benz/include/picrin/util.h @@ -35,13 +35,18 @@ extern "C" { #if __STDC_VERSION__ >= 199901L # define PIC_INLINE static inline #elif __GNUC__ || __clang__ -# define PIC_INLINE static __attribute__((unused)) +# define PIC_INLINE static __inline__ #else # define PIC_INLINE static #endif #define PIC_FALLTHROUGH ((void)0) -#define PIC_UNUSED(v) ((void)(v)) + +#if __GNUC__ || __clang__ +# define PIC_UNUSED(v) __attribute__((unused)) v +#else +# define PIC_UNUSED(v) v +#endif #define PIC_GENSYM2_(x,y) PIC_G##x##_##y##_ #define PIC_GENSYM1_(x,y) PIC_GENSYM2_(x,y) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index f0d0299f..d2300579 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -91,10 +91,8 @@ case_fold(pic_state *pic, int c) } static pic_value -read_comment(pic_state *pic, struct pic_port *port, int c) +read_comment(pic_state PIC_UNUSED(*pic), struct pic_port *port, int c) { - PIC_UNUSED(pic); - do { c = next(port); } while (! (c == EOF || c == '\n')); @@ -103,14 +101,11 @@ read_comment(pic_state *pic, struct pic_port *port, int c) } static pic_value -read_block_comment(pic_state *pic, struct pic_port *port, int c) +read_block_comment(pic_state PIC_UNUSED(*pic), struct pic_port *port, int PIC_UNUSED(c)) { int x, y; int i = 1; - PIC_UNUSED(pic); - PIC_UNUSED(c); - y = next(port); while (y != EOF && i > 0) { @@ -128,10 +123,8 @@ read_block_comment(pic_state *pic, struct pic_port *port, int c) } static pic_value -read_datum_comment(pic_state *pic, struct pic_port *port, int c) +read_datum_comment(pic_state *pic, struct pic_port *port, int PIC_UNUSED(c)) { - PIC_UNUSED(c); - read(pic, port, next(port)); return pic_undef_value(); @@ -159,40 +152,32 @@ read_directive(pic_state *pic, struct pic_port *port, int c) } static pic_value -read_eval(pic_state *pic, struct pic_port *port, int c) +read_eval(pic_state *pic, struct pic_port *port, int PIC_UNUSED(c)) { pic_value form; - PIC_UNUSED(c); - form = read(pic, port, next(port)); return pic_eval(pic, form, pic->lib); } static pic_value -read_quote(pic_state *pic, struct pic_port *port, int c) +read_quote(pic_state *pic, struct pic_port *port, int PIC_UNUSED(c)) { - PIC_UNUSED(c); - return pic_list2(pic, pic_obj_value(pic->sQUOTE), read(pic, port, next(port))); } static pic_value -read_quasiquote(pic_state *pic, struct pic_port *port, int c) +read_quasiquote(pic_state *pic, struct pic_port *port, int PIC_UNUSED(c)) { - PIC_UNUSED(c); - return pic_list2(pic, pic_obj_value(pic->sQUASIQUOTE), read(pic, port, next(port))); } static pic_value -read_unquote(pic_state *pic, struct pic_port *port, int c) +read_unquote(pic_state *pic, struct pic_port *port, int PIC_UNUSED(c)) { pic_sym *tag = pic->sUNQUOTE; - PIC_UNUSED(c); - if (peek(port) == '@') { tag = pic->sUNQUOTE_SPLICING; next(port); @@ -396,8 +381,6 @@ read_plus(pic_state *pic, struct pic_port *port, int c) static pic_value read_true(pic_state *pic, struct pic_port *port, int c) { - PIC_UNUSED(pic); - if ((c = peek(port)) == 'r') { if (! expect(port, "rue")) { read_error(pic, "unexpected character while reading #true"); @@ -412,8 +395,6 @@ read_true(pic_state *pic, struct pic_port *port, int c) static pic_value read_false(pic_state *pic, struct pic_port *port, int c) { - PIC_UNUSED(pic); - if ((c = peek(port)) == 'a') { if (! expect(port, "alse")) { read_error(pic, "unexpected character while reading #false"); @@ -690,12 +671,10 @@ read_label_set(pic_state *pic, struct pic_port *port, int i) } static pic_value -read_label_ref(pic_state *pic, struct pic_port *port, int i) +read_label_ref(pic_state *pic, struct pic_port PIC_UNUSED(*port), int i) { xh_entry *e; - PIC_UNUSED(port); - e = xh_get_int(&pic->reader->labels, i); if (! e) { read_error(pic, "label of given index not defined"); @@ -723,11 +702,8 @@ read_label(pic_state *pic, struct pic_port *port, int c) } static pic_value -read_unmatch(pic_state *pic, struct pic_port *port, int c) +read_unmatch(pic_state *pic, struct pic_port PIC_UNUSED(*port), int PIC_UNUSED(c)) { - PIC_UNUSED(port); - PIC_UNUSED(c); - read_error(pic, "unmatched parenthesis"); } diff --git a/extlib/benz/string.c b/extlib/benz/string.c index c9b75bd0..e2f356b4 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -37,9 +37,7 @@ struct pic_rope { } while (0) void -pic_rope_incref(pic_state *pic, struct pic_rope *x) { - PIC_UNUSED(pic); - +pic_rope_incref(pic_state PIC_UNUSED(*pic), struct pic_rope *x) { x->refcnt++; } diff --git a/extlib/benz/write.c b/extlib/benz/write.c index e01966de..c9e36553 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -163,8 +163,6 @@ write_str(pic_state *pic, struct pic_string *str, xFILE *file) size_t i; const char *cstr = pic_str_cstr(pic, str); - PIC_UNUSED(pic); - for (i = 0; i < pic_str_len(str); ++i) { if (cstr[i] == '"' || cstr[i] == '\\') { xfputc('\\', file); From 329251d9842b535336599ef1e6e97fb40e5efeb5 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 17:29:13 +0900 Subject: [PATCH 114/177] embed chunk buffer into pic_chunk --- extlib/benz/string.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/extlib/benz/string.c b/extlib/benz/string.c index e2f356b4..95a32210 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -12,7 +12,7 @@ struct pic_chunk { char *str; int refcnt; size_t len; - char autofree; + char buf[1]; }; struct pic_rope { @@ -30,9 +30,9 @@ struct pic_rope { #define CHUNK_DECREF(c) do { \ struct pic_chunk *c_ = (c); \ if (! --c_->refcnt) { \ - if (c_->autofree) \ + if (c_->str != c_->buf) \ pic_free(pic, c_->str); \ - pic_free(pic, c_); \ + pic_free(pic, c_); \ } \ } while (0) @@ -58,19 +58,14 @@ pic_rope_decref(pic_state *pic, struct pic_rope *x) { static struct pic_chunk * pic_make_chunk(pic_state *pic, const char *str, size_t len) { - char *buf; struct pic_chunk *c; - buf = pic_malloc(pic, len + 1); - buf[len] = 0; - - memcpy(buf, str, len); - - c = pic_malloc(pic, sizeof(struct pic_chunk)); + c = pic_malloc(pic, sizeof(struct pic_chunk) + len); c->refcnt = 1; - c->str = buf; + c->str = c->buf; c->len = len; - c->autofree = 1; + c->buf[len] = 0; + memcpy(c->buf, str, len); return c; } @@ -222,11 +217,10 @@ rope_cstr(pic_state *pic, struct pic_rope *x) return x->chunk->str; /* reuse cached chunk */ } - c = pic_malloc(pic, sizeof(struct pic_chunk)); + c = pic_malloc(pic, sizeof(struct pic_chunk) + x->weight); c->refcnt = 1; c->len = x->weight; - c->autofree = 1; - c->str = pic_malloc(pic, c->len + 1); + c->str = c->buf; c->str[c->len] = '\0'; flatten(pic, x, c, 0); From 00cde353baf5393ea2f5b19780090e4c6537af77 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 23:28:55 +0900 Subject: [PATCH 115/177] xfile completely refactored --- extlib/benz/include/picrin.h | 2 - extlib/benz/include/picrin/config.h | 1 + extlib/benz/include/picrin/xfile.h | 694 ++++------------------------ extlib/benz/port.c | 89 ++-- extlib/benz/read.c | 9 +- extlib/benz/state.c | 10 +- extlib/benz/xfile.c | 472 +++++++++++++++++++ 7 files changed, 606 insertions(+), 671 deletions(-) create mode 100644 extlib/benz/xfile.c diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 19fe9e16..c5fa86a9 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -32,8 +32,6 @@ extern "C" { #include #include -#include - #include "picrin/config.h" #include "picrin/util.h" #include "picrin/compat.h" diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index 1de25976..a0274422 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -156,6 +156,7 @@ #endif #if DEBUG +# include # define GC_STRESS 0 # define VM_DEBUG 1 # define GC_DEBUG 0 diff --git a/extlib/benz/include/picrin/xfile.h b/extlib/benz/include/picrin/xfile.h index cce8fd05..eff7d269 100644 --- a/extlib/benz/include/picrin/xfile.h +++ b/extlib/benz/include/picrin/xfile.h @@ -5,632 +5,104 @@ extern "C" { #endif +#include + +#ifndef NULL +# define NULL 0 +#endif + +#ifndef EOF +# define EOF (-1) +#endif + +#define XBUFSIZ 1024 +#define XOPEN_MAX 1024 + typedef struct { - int ungot; - int flags; + /* buffer */ + char buf[1]; /* fallback buffer */ + long cnt; /* characters left */ + char *ptr; /* next character position */ + char *base; /* location of the buffer */ /* operators */ struct { void *cookie; int (*read)(void *, char *, int); int (*write)(void *, const char *, int); long (*seek)(void *, long, int); - int (*flush)(void *); int (*close)(void *); } vtable; + int flag; /* mode of the file access */ } xFILE; -/* generic file constructor */ -PIC_INLINE xFILE *xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(void *, const char *, int), long (*seek)(void *, long, int), int (*flush)(void *), int (*close)(void *)); +extern xFILE x_iob[XOPEN_MAX]; -/* resource aquisition */ -PIC_INLINE xFILE *xfpopen(FILE *); -PIC_INLINE xFILE *xmopen(); -PIC_INLINE xFILE *xfopen(const char *, const char *); -PIC_INLINE int xfclose(xFILE *); +#define xstdin (x_iob[0].vtable.cookie || (x_iob[0].vtable.cookie = stdin ), &x_iob[0]) +#define xstdout (x_iob[1].vtable.cookie || (x_iob[1].vtable.cookie = stdout), &x_iob[1]) +#define xstderr (x_iob[2].vtable.cookie || (x_iob[2].vtable.cookie = stderr), &x_iob[2]) -/* buffer management */ -PIC_INLINE int xfflush(xFILE *); - -/* direct IO with buffering */ -PIC_INLINE size_t xfread(void *, size_t, size_t, xFILE *); -PIC_INLINE size_t xfwrite(const void *, size_t, size_t, xFILE *); - -/* indicator positioning */ -PIC_INLINE long xfseek(xFILE *, long offset, int whence); -PIC_INLINE long xftell(xFILE *); -PIC_INLINE void xrewind(xFILE *); - -/* stream status */ -PIC_INLINE void xclearerr(xFILE *); -PIC_INLINE int xfeof(xFILE *); -PIC_INLINE int xferror(xFILE *); - -/* character IO */ -PIC_INLINE int xfgetc(xFILE *); -PIC_INLINE char *xfgets(char *, int, xFILE *); -PIC_INLINE int xfputc(int, xFILE *); -PIC_INLINE int xfputs(const char *, xFILE *); -PIC_INLINE int xgetc(xFILE *); -PIC_INLINE int xgetchar(void); -PIC_INLINE int xputc(int, xFILE *); -PIC_INLINE int xputchar(int); -PIC_INLINE int xputs(const char *); -PIC_INLINE int xungetc(int, xFILE *); - -/* formatted I/O */ -PIC_INLINE int xprintf(const char *, ...); -PIC_INLINE int xfprintf(xFILE *, const char *, ...); -PIC_INLINE int xvfprintf(xFILE *, const char *, va_list); - -/* standard I/O */ -#define xstdin (xstdin_()) -#define xstdout (xstdout_()) -#define xstderr (xstderr_()) - - -/* private */ - -#define XF_EOF 1 -#define XF_ERR 2 - -PIC_INLINE xFILE * -xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(void *, const char *, int), long (*seek)(void *, long, int), int (*flush)(void *), int (*close)(void *)) -{ - xFILE *file; - - file = (xFILE *)malloc(sizeof(xFILE)); - if (! file) { - return NULL; - } - file->ungot = -1; - file->flags = 0; - /* set vtable */ - file->vtable.cookie = cookie; - file->vtable.read = read; - file->vtable.write = write; - file->vtable.seek = seek; - file->vtable.flush = flush; - file->vtable.close = close; - - return file; -} - -/* - * Derieved xFILE Classes - */ - -PIC_INLINE int -xf_file_read(void *cookie, char *ptr, int size) -{ - FILE *file = cookie; - int r; - - r = (int)fread(ptr, 1, (size_t)size, file); - if (r < size && ferror(file)) { - return -1; - } - if (r == 0 && feof(file)) { - clearerr(file); - } - return r; -} - -PIC_INLINE int -xf_file_write(void *cookie, const char *ptr, int size) -{ - FILE *file = cookie; - int r; - - r = (int)fwrite(ptr, 1, (size_t)size, file); - if (r < size) { - return -1; - } - return r; -} - -PIC_INLINE long -xf_file_seek(void *cookie, long pos, int whence) -{ - return fseek(cookie, pos, whence); -} - -PIC_INLINE int -xf_file_flush(void *cookie) -{ - return fflush(cookie); -} - -PIC_INLINE int -xf_file_close(void *cookie) -{ - return fclose(cookie); -} - -PIC_INLINE xFILE * -xfpopen(FILE *fp) -{ - xFILE *file; - - file = xfunopen(fp, xf_file_read, xf_file_write, xf_file_seek, xf_file_flush, xf_file_close); - if (! file) { - return NULL; - } - - return file; -} - -#define XF_FILE_VTABLE xf_file_read, xf_file_write, xf_file_seek, xf_file_flush, xf_file_close - -PIC_INLINE xFILE * -xstdin_() -{ - static xFILE x = { -1, 0, { NULL, XF_FILE_VTABLE } }; - - if (! x.vtable.cookie) { - x.vtable.cookie = stdin; - } - return &x; -} - -PIC_INLINE xFILE * -xstdout_() -{ - static xFILE x = { -1, 0, { NULL, XF_FILE_VTABLE } }; - - if (! x.vtable.cookie) { - x.vtable.cookie = stdout; - } - return &x; -} - -PIC_INLINE xFILE * -xstderr_() -{ - static xFILE x = { -1, 0, { NULL, XF_FILE_VTABLE } }; - - if (! x.vtable.cookie) { - x.vtable.cookie = stderr; - } - return &x; -} - -struct xf_membuf { - char *buf; - long pos, end, capa; +enum _flags { + X_READ = 01, + X_WRITE = 02, + X_UNBUF = 04, + X_EOF = 010, + X_ERR = 020, + X_LNBUF = 040 }; -PIC_INLINE int -xf_mem_read(void *cookie, char *ptr, int size) -{ - struct xf_membuf *mem; - - mem = (struct xf_membuf *)cookie; - - if (size > (int)(mem->end - mem->pos)) - size = (int)(mem->end - mem->pos); - memcpy(ptr, mem->buf + mem->pos, size); - mem->pos += size; - return size; -} - -PIC_INLINE int -xf_mem_write(void *cookie, const char *ptr, int size) -{ - struct xf_membuf *mem; - - mem = (struct xf_membuf *)cookie; - - if (mem->pos + size >= mem->capa) { - mem->capa = (mem->pos + size) * 2; - mem->buf = realloc(mem->buf, (size_t)mem->capa); - } - memcpy(mem->buf + mem->pos, ptr, size); - mem->pos += size; - if (mem->end < mem->pos) - mem->end = mem->pos; - return size; -} - -PIC_INLINE long -xf_mem_seek(void *cookie, long pos, int whence) -{ - struct xf_membuf *mem; - - mem = (struct xf_membuf *)cookie; - - switch (whence) { - case SEEK_SET: - mem->pos = pos; - break; - case SEEK_CUR: - mem->pos += pos; - break; - case SEEK_END: - mem->pos = mem->end + pos; - break; - } - - return mem->pos; -} - -PIC_INLINE int -xf_mem_flush(void *cookie) -{ - (void)cookie; - - return 0; -} - -PIC_INLINE int -xf_mem_close(void *cookie) -{ - struct xf_membuf *mem; - - mem = (struct xf_membuf *)cookie; - free(mem->buf); - free(mem); - return 0; -} - -PIC_INLINE xFILE * -xmopen() -{ - struct xf_membuf *mem; - - mem = (struct xf_membuf *)malloc(sizeof(struct xf_membuf)); - mem->buf = (char *)malloc(BUFSIZ); - mem->pos = 0; - mem->end = 0; - mem->capa = BUFSIZ; - - return xfunopen(mem, xf_mem_read, xf_mem_write, xf_mem_seek, xf_mem_flush, xf_mem_close); -} - -#undef XF_FILE_VTABLE - -PIC_INLINE xFILE * -xfopen(const char *filename, const char *mode) -{ - FILE *fp; - xFILE *file; - - fp = fopen(filename, mode); - if (! fp) { - return NULL; - } - - file = xfpopen(fp); - if (! file) { - return NULL; - } - - return file; -} - -PIC_INLINE int -xfclose(xFILE *file) -{ - int r; - - r = file->vtable.close(file->vtable.cookie); - if (r == EOF) { - return -1; - } - - free(file); - return 0; -} - -PIC_INLINE int -xfflush(xFILE *file) -{ - return file->vtable.flush(file->vtable.cookie); -} - -PIC_INLINE size_t -xfread(void *ptr, size_t block, size_t nitems, xFILE *file) -{ - char cbuf[256], *buf; - char *dst = (char *)ptr; - size_t i, offset; - int n; - - if (block <= 256) { - buf = cbuf; - } else { - buf = malloc(block); - } - - for (i = 0; i < nitems; ++i) { - offset = 0; - if (file->ungot != -1 && block > 0) { - buf[0] = (char)file->ungot; - offset += 1; - file->ungot = -1; - } - while (offset < block) { - n = file->vtable.read(file->vtable.cookie, buf + offset, (int)(block - offset)); - if (n < 0) { - file->flags |= XF_ERR; - goto exit; - } - if (n == 0) { - file->flags |= XF_EOF; - goto exit; - } - offset += (unsigned)n; - } - memcpy(dst, buf, block); - dst += block; - } - - exit: - - if (cbuf != buf) { - free(buf); - } - return i; -} - -PIC_INLINE size_t -xfwrite(const void *ptr, size_t block, size_t nitems, xFILE *file) -{ - char *dst = (char *)ptr; - size_t i, offset; - int n; - - for (i = 0; i < nitems; ++i) { - offset = 0; - while (offset < block) { - n = file->vtable.write(file->vtable.cookie, dst + offset, (int)(block - offset)); - if (n < 0) { - file->flags |= XF_ERR; - goto exit; - } - offset += (unsigned)n; - } - dst += block; - } - - exit: - return i; -} - -PIC_INLINE long -xfseek(xFILE *file, long offset, int whence) -{ - file->ungot = -1; - return file->vtable.seek(file->vtable.cookie, offset, whence); -} - -PIC_INLINE long -xftell(xFILE *file) -{ - return xfseek(file, 0, SEEK_CUR); -} - -PIC_INLINE void -xrewind(xFILE *file) -{ - xfseek(file, 0, SEEK_SET); -} - -PIC_INLINE void -xclearerr(xFILE *file) -{ - file->flags = 0; -} - -PIC_INLINE int -xfeof(xFILE *file) -{ - return file->flags & XF_EOF; -} - -PIC_INLINE int -xferror(xFILE *file) -{ - return file->flags & XF_ERR; -} - -PIC_INLINE int -xfgetc(xFILE *file) -{ - char buf[1]; - - xfread(buf, 1, 1, file); - - if (xfeof(file) || xferror(file)) { - return EOF; - } - - return buf[0]; -} - -PIC_INLINE int -xgetc(xFILE *file) -{ - return xfgetc(file); -} - -PIC_INLINE char * -xfgets(char *str, int size, xFILE *file) -{ - int c = EOF, i; - - for (i = 0; i < size - 1 && c != '\n'; ++i) { - if ((c = xfgetc(file)) == EOF) { - break; - } - str[i] = (char)c; - } - if (i == 0 && c == EOF) { - return NULL; - } - if (xferror(file)) { - return NULL; - } - str[i] = '\0'; - - return str; -} - -PIC_INLINE int -xungetc(int c, xFILE *file) -{ - file->ungot = c; - if (c != EOF) { - file->flags &= ~XF_EOF; - } - return c; -} - -PIC_INLINE int -xgetchar(void) -{ - return xfgetc(xstdin); -} - -PIC_INLINE int -xfputc(int c, xFILE *file) -{ - char buf[1]; - - buf[0] = (char)c; - xfwrite(buf, 1, 1, file); - - if (xferror(file)) { - return EOF; - } - return buf[0]; -} - -PIC_INLINE int -xputc(int c, xFILE *file) -{ - return xfputc(c, file); -} - -PIC_INLINE int -xputchar(int c) -{ - return xfputc(c, xstdout); -} - -PIC_INLINE int -xfputs(const char *str, xFILE *file) -{ - size_t len; - - len = strlen(str); - xfwrite(str, len, 1, file); - - if (xferror(file)) { - return EOF; - } - return 0; -} - -PIC_INLINE int -xputs(const char *s) -{ - return xfputs(s, xstdout); -} - -PIC_INLINE int -xprintf(const char *fmt, ...) -{ - va_list ap; - int n; - - va_start(ap, fmt); - n = xvfprintf(xstdout, fmt, ap); - va_end(ap); - return n; -} - -PIC_INLINE int -xfprintf(xFILE *stream, const char *fmt, ...) -{ - va_list ap; - int n; - - va_start(ap, fmt); - n = xvfprintf(stream, fmt, ap); - va_end(ap); - return n; -} - -static void -xfile_printint(xFILE *stream, long x, int base) -{ - static char digits[] = "0123456789abcdef"; - char buf[20]; - int i, neg; - - neg = 0; - if (x < 0) { - neg = 1; - x = -x; - } - - i = 0; - do { - buf[i++] = digits[x % base]; - } while ((x /= base) != 0); - - if (neg) { - buf[i++] = '-'; - } - - while (i-- > 0) { - xputc(buf[i], stream); - } -} - -PIC_INLINE int -xvfprintf(xFILE *stream, const char *fmt, va_list ap) -{ - const char *p; - char *sval; - int ival; - double dval; - void *vp; - long seekr = xftell(stream); - - for (p = fmt; *p; p++) { - if (*p != '%') { - xputc(*p, stream); - continue; - } - switch (*++p) { - case 'd': - case 'i': - ival = va_arg(ap, int); - xfile_printint(stream, ival, 10); - break; - case 'f': - dval = va_arg(ap, double); - xfile_printint(stream, dval, 10); - xputc('.', stream); - xfile_printint(stream, fabs((dval - (int)dval) * 1e4), 10); - break; - case 's': - sval = va_arg(ap, char*); - xfputs(sval, stream); - break; - case 'p': - vp = va_arg(ap, void*); - xfputs("0x", stream); - xfile_printint(stream, (long)vp, 16); - break; - default: - xputc(*(p-1), stream); - break; - } - } - return xftell(stream) - seekr; -} +#define xclearerr(p) ((p)->flag &= ~(X_EOF | X_ERR)) +#define xfeof(p) (((p)->flag & X_EOF) != 0) +#define xferror(p) (((p)->flag & X_ERR) != 0) +#define xfileno(p) ((p)->fd) + +#define xgetc(p) \ + ((--(p)->cnt >= 0) \ + ? (unsigned char) *(p)->ptr++ \ + : x_fillbuf(p)) +#define xputc(x, p) \ + ((--(p)->cnt >= 0 && !(((p)->flag & X_LNBUF) && (x) == '\n')) \ + ? *(p)->ptr++ = (x) \ + : x_flushbuf(x, (p))) +#define xgetchar() xgetc(xstdin) +#define xputchar(x) xputc((x), xstdout) + +/* resource aquisition */ +xFILE *xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(void *, const char *, int), long (*seek)(void *, long, int), int (*close)(void *)); +xFILE *xfopen(const char *, const char *); +int xfclose(xFILE *); + +/* buffer management */ +int x_fillbuf(xFILE *); +int x_flushbuf(int, xFILE *); +int xfflush(xFILE *); + +/* direct IO */ +size_t xfread(void *, size_t, size_t, xFILE *); +size_t xfwrite(const void *, size_t, size_t, xFILE *); + +enum { + XSEEK_CUR, + XSEEK_END, + XSEEK_SET +}; + +/* indicator positioning */ +long xfseek(xFILE *, long, int); +long xftell(xFILE *); +void xrewind(xFILE *); + +/* character IO */ +int xfputc(int, xFILE *); +int xfgetc(xFILE *); +int xfputs(const char *, xFILE *); +char *xfgets(char *, int, xFILE *); +int xputs(const char *); +int xungetc(int, xFILE *); + +/* formatted I/O */ +int xprintf(const char *, ...); +int xfprintf(xFILE *, const char *, ...); +int xvfprintf(xFILE *, const char *, va_list); #if defined(__cplusplus) } diff --git a/extlib/benz/port.c b/extlib/benz/port.c index df6a971c..20879173 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -68,7 +68,7 @@ struct strfile { }; static int -strfile_read(void *cookie, char *ptr, int size) +string_read(void *cookie, char *ptr, int size) { struct strfile *m = cookie; @@ -80,7 +80,7 @@ strfile_read(void *cookie, char *ptr, int size) } static int -strfile_write(void *cookie, const char *ptr, int size) +string_write(void *cookie, const char *ptr, int size) { struct strfile *m = cookie; @@ -96,18 +96,18 @@ strfile_write(void *cookie, const char *ptr, int size) } static long -strfile_seek(void *cookie, long pos, int whence) +string_seek(void *cookie, long pos, int whence) { struct strfile *m = cookie; switch (whence) { - case SEEK_SET: + case XSEEK_SET: m->pos = pos; break; - case SEEK_CUR: + case XSEEK_CUR: m->pos += pos; break; - case SEEK_END: + case XSEEK_END: m->pos = m->end + pos; break; } @@ -116,15 +116,7 @@ strfile_seek(void *cookie, long pos, int whence) } static int -strfile_flush(void *cookie) -{ - (void)cookie; - - return 0; -} - -static int -strfile_close(void *cookie) +string_close(void *cookie) { struct strfile *m = cookie; @@ -134,9 +126,8 @@ strfile_close(void *cookie) } static xFILE * -strfile_open(pic_state *pic) +string_open(pic_state *pic, const char *data, size_t size) { - static const size_t size = 128; struct strfile *m; xFILE *file; @@ -144,12 +135,19 @@ strfile_open(pic_state *pic) m->pic = pic; m->buf = pic_malloc(pic, size); m->pos = 0; - m->end = 0; + m->end = size; m->capa = size; - file = xfunopen(m, strfile_read, strfile_write, strfile_seek, strfile_flush, strfile_close); + memcpy(m->buf, data, size); + + if (data != NULL) { + file = xfunopen(m, string_read, NULL, string_seek, string_close); + } else { + file = xfunopen(m, NULL, string_write, string_seek, string_close); + } + if (file == NULL) { - strfile_close(m); + string_close(m); pic_error(pic, "could not open new output string/bytevector port", pic_nil_value()); } return file; @@ -161,14 +159,10 @@ pic_open_input_string(pic_state *pic, const char *str) struct pic_port *port; port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); - port->file = strfile_open(pic); + port->file = string_open(pic, str, strlen(str)); port->flags = PIC_PORT_IN | PIC_PORT_TEXT; port->status = PIC_PORT_OPEN; - xfputs(str, port->file); - xfflush(port->file); - xrewind(port->file); - return port; } @@ -178,7 +172,7 @@ pic_open_output_string(pic_state *pic) struct pic_port *port; port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); - port->file = strfile_open(pic); + port->file = string_open(pic, NULL, 0); port->flags = PIC_PORT_OUT | PIC_PORT_TEXT; port->status = PIC_PORT_OPEN; @@ -188,20 +182,17 @@ pic_open_output_string(pic_state *pic) struct pic_string * pic_get_output_string(pic_state *pic, struct pic_port *port) { - size_t size; - char *buf; + struct strfile *s; + + if (port->file->vtable.write != string_write) { + pic_errorf(pic, "get-output-string: port is not made by open-output-string"); + } - /* get endpos */ xfflush(port->file); - size = (size_t)xftell(port->file); - xrewind(port->file); - /* copy to buf */ - buf = (char *)pic_malloc(pic, size + 1); - buf[size] = 0; - xfread(buf, size, 1, port->file); + s = port->file->vtable.cookie; - return pic_make_str(pic, buf, size); + return pic_make_str(pic, s->buf, s->end); } void @@ -417,14 +408,10 @@ pic_port_open_input_blob(pic_state *pic) pic_get_args(pic, "b", &blob); port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); - port->file = strfile_open(pic); + port->file = string_open(pic, (const char *)blob->data, blob->len); port->flags = PIC_PORT_IN | PIC_PORT_BINARY; port->status = PIC_PORT_OPEN; - xfwrite(blob->data, 1, blob->len, port->file); - xfflush(port->file); - xrewind(port->file); - return pic_obj_value(port); } @@ -436,7 +423,7 @@ pic_port_open_output_bytevector(pic_state *pic) pic_get_args(pic, ""); port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); - port->file = strfile_open(pic); + port->file = string_open(pic, NULL, 0); port->flags = PIC_PORT_OUT | PIC_PORT_BINARY; port->status = PIC_PORT_OPEN; @@ -448,20 +435,22 @@ pic_port_get_output_bytevector(pic_state *pic) { struct pic_port *port = pic_stdout(pic); pic_blob *blob; - size_t size; + struct strfile *s; pic_get_args(pic, "|p", &port); assert_port_profile(port, PIC_PORT_OUT | PIC_PORT_BINARY, PIC_PORT_OPEN, "get-output-bytevector"); - /* get endpos */ - xfflush(port->file); - size = (size_t)xftell(port->file); - xrewind(port->file); + if (port->file->vtable.write != string_write) { + pic_errorf(pic, "get-output-bytevector: port is not made by open-output-bytevector"); + } - /* copy to buf */ - blob = pic_make_blob(pic, size); - xfread(blob->data, 1, size, port->file); + xfflush(port->file); + + s = port->file->vtable.cookie; + + blob = pic_make_blob(pic, s->end); + memcpy(blob->data, s->buf, s->end); return pic_obj_value(blob); } diff --git a/extlib/benz/read.c b/extlib/benz/read.c index d2300579..ce60a995 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -856,11 +856,14 @@ pic_read(pic_state *pic, struct pic_port *port) pic_value pic_read_cstr(pic_state *pic, const char *str) { - struct pic_port *port; + struct pic_port *port = pic_open_input_string(pic, str); + pic_value form; - port = pic_open_input_string(pic, str); + form = pic_read(pic, port); - return pic_read(pic, port); + pic_close_port(pic, port); + + return form; } static pic_value diff --git a/extlib/benz/state.c b/extlib/benz/state.c index efc8d2a8..571c5155 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -326,17 +326,17 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) /* reader */ pic->reader = pic_reader_open(pic); + /* standard I/O */ + pic->xSTDIN = pic_make_standard_port(pic, xstdin, PIC_PORT_IN); + pic->xSTDOUT = pic_make_standard_port(pic, xstdout, PIC_PORT_OUT); + pic->xSTDERR = pic_make_standard_port(pic, xstderr, PIC_PORT_OUT); + /* standard libraries */ pic->PICRIN_BASE = pic_open_library(pic, pic_read_cstr(pic, "(picrin base)")); pic->PICRIN_USER = pic_open_library(pic, pic_read_cstr(pic, "(picrin user)")); pic->lib = pic->PICRIN_USER; pic->prev_lib = NULL; - /* standard I/O */ - pic->xSTDIN = pic_make_standard_port(pic, xstdin, PIC_PORT_IN); - 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 */ diff --git a/extlib/benz/xfile.c b/extlib/benz/xfile.c new file mode 100644 index 00000000..d09bf9bf --- /dev/null +++ b/extlib/benz/xfile.c @@ -0,0 +1,472 @@ +#include "picrin.h" + +static int file_read(void *cookie, char *ptr, int size) { + FILE *file = cookie; + int r; + + size = 1; /* override size */ + + r = (int)fread(ptr, 1, (size_t)size, file); + if (r < size && ferror(file)) { + return -1; + } + if (r == 0 && feof(file)) { + clearerr(file); + } + return r; +} + +static int file_write(void *cookie, const char *ptr, int size) { + FILE *file = cookie; + int r; + + r = (int)fwrite(ptr, 1, (size_t)size, file); + if (r < size) { + return -1; + } + fflush(cookie); + return r; +} + +static long file_seek(void *cookie, long pos, int whence) { + switch (whence) { + case XSEEK_CUR: + whence = SEEK_CUR; + break; + case XSEEK_SET: + whence = SEEK_SET; + break; + case XSEEK_END: + whence = SEEK_END; + break; + } + return fseek(cookie, pos, whence); +} + +static int file_close(void *cookie) { + return fclose(cookie); +} + +xFILE *xfopen(const char *name, const char *mode) { + FILE *fp; + + if ((fp = fopen(name, mode)) == NULL) { + return NULL; + } + + switch (*mode) { + case 'r': + return xfunopen(fp, file_read, NULL, file_seek, file_close); + default: + return xfunopen(fp, NULL, file_write, file_seek, file_close); + } +} + +#define FILE_VTABLE { 0, file_read, file_write, file_seek, file_close } + +xFILE x_iob[XOPEN_MAX] = { + { { 0 }, 0, NULL, NULL, FILE_VTABLE, X_READ }, + { { 0 }, 0, NULL, NULL, FILE_VTABLE, X_WRITE | X_LNBUF }, + { { 0 }, 0, NULL, NULL, FILE_VTABLE, X_WRITE | X_UNBUF } +}; + +xFILE *xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(void *, const char *, int), long (*seek)(void *, long, int), int (*close)(void *)) { + xFILE *fp; + + for (fp = x_iob; fp < x_iob + XOPEN_MAX; fp++) + if ((fp->flag & (X_READ | X_WRITE)) == 0) + break; /* found free slot */ + + if (fp >= x_iob + XOPEN_MAX) /* no free slots */ + return NULL; + + fp->cnt = 0; + fp->base = NULL; + fp->flag = read? X_READ : X_WRITE; + + fp->vtable.cookie = cookie; + fp->vtable.read = read; + fp->vtable.write = write; + fp->vtable.seek = seek; + fp->vtable.close = close; + + return fp; +} + +int xfclose(xFILE *fp) { + xfflush(fp); + fp->flag = 0; + if (fp->base != fp->buf) + free(fp->base); + return fp->vtable.close(fp->vtable.cookie); +} + +int x_fillbuf(xFILE *fp) { + int bufsize; + + if ((fp->flag & (X_READ|X_EOF|X_ERR)) != X_READ) + return EOF; + if (fp->base == NULL) { + if ((fp->flag & X_UNBUF) == 0) { + /* no buffer yet */ + if ((fp->base = malloc(XBUFSIZ)) == NULL) { + /* can't get buffer, try unbuffered */ + fp->flag |= X_UNBUF; + } + } + if (fp->flag & X_UNBUF) { + fp->base = fp->buf; + } + } + bufsize = (fp->flag & X_UNBUF) ? sizeof(fp->buf) : XBUFSIZ; + + fp->ptr = fp->base; + fp->cnt = fp->vtable.read(fp->vtable.cookie, fp->ptr, bufsize); + + if (--fp->cnt < 0) { + if (fp->cnt == -1) + fp->flag |= X_EOF; + else + fp->flag |= X_ERR; + fp->cnt = 0; + return EOF; + } + + return (unsigned char) *fp->ptr++; +} + +int x_flushbuf(int x, xFILE *fp) { + int num_written=0, bufsize=0; + char c = x; + + if ((fp->flag & (X_WRITE|X_EOF|X_ERR)) != X_WRITE) + return EOF; + if (fp->base == NULL && ((fp->flag & X_UNBUF) == 0)) { + /* no buffer yet */ + if ((fp->base = malloc(XBUFSIZ)) == NULL) { + /* couldn't allocate a buffer, so try unbuffered */ + fp->flag |= X_UNBUF; + } else { + fp->ptr = fp->base; + fp->cnt = XBUFSIZ - 1; + } + } + if (fp->flag & X_UNBUF) { + /* unbuffered write */ + fp->ptr = fp->base = NULL; + fp->cnt = 0; + if (x == EOF) + return EOF; + num_written = fp->vtable.write(fp->vtable.cookie, (const char *) &c, 1); + bufsize = 1; + } else { + /* buffered write */ + assert(fp->ptr); + if (x != EOF) { + *fp->ptr++ = (unsigned char) c; + } + bufsize = (int)(fp->ptr - fp->base); + while(bufsize - num_written > 0) { + int t; + t = fp->vtable.write(fp->vtable.cookie, fp->base + num_written, bufsize - num_written); + if (t < 0) + break; + num_written += t; + } + + fp->ptr = fp->base; + fp->cnt = BUFSIZ - 1; + } + + if (num_written == bufsize) { + return x; + } else { + fp->flag |= X_ERR; + return EOF; + } +} + +int xfflush(xFILE *f) { + int retval; + int i; + + retval = 0; + if (f == NULL) { + /* flush all output streams */ + for (i = 0; i < XOPEN_MAX; i++) { + if ((x_iob[i].flag & X_WRITE) && (xfflush(&x_iob[i]) == -1)) + retval = -1; + } + } else { + if ((f->flag & X_WRITE) == 0) + return -1; + x_flushbuf(EOF, f); + if (f->flag & X_ERR) + retval = -1; + } + return retval; +} + +int xfputc(int x, xFILE *fp) { + return xputc(x, fp); +} + +int xfgetc(xFILE *fp) { + return xgetc(fp); +} + +int xfputs(const char *s, xFILE *stream) { + const char *ptr = s; + while(*ptr != '\0') { + if (xputc(*ptr, stream) == EOF) + return EOF; + ++ptr; + } + return (int)(ptr - s); +} + +char *xfgets(char *s, int size, xFILE *stream) { + int c; + char *buf; + + xfflush(NULL); + + if (size == 0) { + return NULL; + } + buf = s; + while (--size > 0 && (c = xgetc(stream)) != EOF) { + if ((*buf++ = c) == '\n') + break; + } + *buf = '\0'; + + return (c == EOF && buf == s) ? NULL : s; +} + +int xputs(const char *s) { + int i = 1; + + while(*s != '\0') { + if (xputchar(*s++) == EOF) + return EOF; + i++; + } + if (xputchar('\n') == EOF) { + return EOF; + } + return i; +} + +char *xgets(char *s) { + int c; + char *buf; + + xfflush(NULL); + + buf = s; + while ((c = xgetchar()) != EOF && c != '\n') { + *buf++ = c; + } + *buf = '\0'; + + return (c == EOF && buf == s) ? NULL : s; +} + +int xungetc(int c, xFILE *fp) { + unsigned char uc = c; + + if (c == EOF || fp->base == fp->ptr) { + return EOF; + } + fp->cnt++; + return *--fp->ptr = uc; +} + +size_t xfread(void *ptr, size_t size, size_t count, xFILE *fp) { + long nbytes; + int c; + + nbytes = size * count; + while (nbytes > fp->cnt) { + memcpy((char *)ptr, fp->ptr, fp->cnt); + fp->ptr += fp->cnt; + ptr += fp->cnt; + nbytes -= fp->cnt; + if ((c = x_fillbuf(fp)) == EOF) { + return (size * count - nbytes) / size; + } else { + xungetc(c, fp); + } + } + memcpy((char *)ptr, fp->ptr, nbytes); + fp->ptr += nbytes; + fp->cnt -= nbytes; + return count; +} + +size_t xfwrite(const void *ptr, size_t size, size_t count, xFILE *fp) { + long nbytes; + + nbytes = size * count; + while (nbytes > fp->cnt) { + memcpy(fp->ptr, (char *)ptr, fp->cnt); + fp->ptr += fp->cnt; + ptr += fp->cnt; + nbytes -= fp->cnt; + if (x_flushbuf(EOF, fp) == EOF) { + return (size * count - nbytes) / size; + } + } + memcpy(fp->ptr, (char *)ptr, nbytes); + fp->ptr += nbytes; + fp->cnt -= nbytes; + return count; +} + +long xfseek(xFILE *fp, long offset, int whence) { + long s; + + xfflush(fp); + + fp->ptr = fp->base; + fp->cnt = 0; + + if ((s = fp->vtable.seek(fp->vtable.cookie, offset, whence)) != 0) + return s; + fp->flag &= ~X_EOF; + return 0; +} + +long xftell(xFILE *fp) { + return xfseek(fp, 0, XSEEK_CUR); +} + +void xrewind(xFILE *fp) { + xfseek(fp, 0, XSEEK_SET); + xclearerr(fp); +} + +int xprintf(const char *fmt, ...) { + va_list ap; + int n; + + va_start(ap, fmt); + n = xvfprintf(xstdout, fmt, ap); + va_end(ap); + return n; +} + +int xfprintf(xFILE *stream, const char *fmt, ...) { + va_list ap; + int n; + + va_start(ap, fmt); + n = xvfprintf(stream, fmt, ap); + va_end(ap); + return n; +} + +static int print_int(xFILE *stream, long x, int base) { + static char digits[] = "0123456789abcdef"; + char buf[20]; + int i, c, neg; + + neg = 0; + if (x < 0) { + neg = 1; + x = -x; + } + + i = 0; + do { + buf[i++] = digits[x % base]; + } while ((x /= base) != 0); + + if (neg) { + buf[i++] = '-'; + } + + c = i; + while (i-- > 0) { + xputc(buf[i], stream); + } + return c; +} + +int xvfprintf(xFILE *stream, const char *fmt, va_list ap) { + const char *p; + char *sval; + int ival; +#if PIC_ENABLE_FLOAT + double dval; +#endif + void *vp; + int cnt = 0; + + for (p = fmt; *p; p++) { + if (*p != '%') { + xputc(*p, stream); + cnt++; + continue; + } + switch (*++p) { + case 'd': + case 'i': + ival = va_arg(ap, int); + cnt += print_int(stream, ival, 10); + break; +#if PIC_ENABLE_FLOAT + case 'f': + dval = va_arg(ap, double); + cnt += print_int(stream, dval, 10); + xputc('.', stream); + cnt++; + if ((ival = fabs((dval - floor(dval)) * 1e4) + 0.5) == 0) { + cnt += xfputs("0000", stream); + } else { + int i; + for (i = 0; i < 3 - (int)log10(ival); ++i) { + xputc('0', stream); + cnt++; + } + cnt += print_int(stream, ival, 10); + } + break; +#endif + case 's': + sval = va_arg(ap, char*); + cnt += xfputs(sval, stream); + break; + case 'p': + vp = va_arg(ap, void*); + cnt += xfputs("0x", stream); + cnt += print_int(stream, (long)vp, 16); + break; + case '%': + xputc(*(p-1), stream); + cnt++; + break; + default: + xputc('%', stream); + xputc(*(p-1), stream); + cnt += 2; + break; + } + } + return cnt; +} + +#if 0 +int main() +{ + char buf[256]; + + xgets(buf); + + xprintf("%s\n", buf); + xprintf("hello\n"); + xprintf("hello\n"); + // xfflush(0); +} +#endif From fa8226e581738a3194551078920a88b70ad050d3 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 23:30:55 +0900 Subject: [PATCH 116/177] [bugfix] pic_debug broken in debug build --- extlib/benz/include/picrin.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index c5fa86a9..aca199a0 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -244,9 +244,12 @@ pic_value pic_fwrite(pic_state *, pic_value, xFILE *); void pic_printf(pic_state *, const char *, ...); pic_value pic_display(pic_state *, pic_value); pic_value pic_fdisplay(pic_state *, pic_value, xFILE *); -/* obsoleted macros */ -#define pic_debug(pic,obj) pic_write(pic,obj) -#define pic_fdebug(pic,obj,file) pic_fwrite(pic,obj,file) + +#if DEBUG +# include "picrin/port.h" +# define pic_debug(pic,obj) pic_fwrite(pic,obj,pic->xSTDERR->file) +# define pic_fdebug(pic,obj,file) pic_fwrite(pic,obj,file) +#endif #if defined(__cplusplus) } From 9b7eb2f9966bfc602133ebb52305485f8b2f23ea Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 28 May 2015 23:57:10 +0900 Subject: [PATCH 117/177] unify all headers into picrin.h --- contrib/03.callcc/callcc.c | 4 ---- contrib/03.file/src/file.c | 2 -- contrib/03.load/src/load.c | 3 --- contrib/03.mutable-string/mutable-string.c | 1 - contrib/03.system/src/system.c | 3 --- contrib/10.readline/src/readline.c | 3 --- contrib/10.regexp/src/regexp.c | 4 ---- docs/capi.rst | 1 - etc/mkloader.pl | 1 - extlib/benz/attr.c | 1 - extlib/benz/blob.c | 2 -- extlib/benz/bool.c | 4 ---- extlib/benz/codegen.c | 7 ------- extlib/benz/cont.c | 5 ----- extlib/benz/data.c | 1 - extlib/benz/debug.c | 3 --- extlib/benz/dict.c | 5 ----- extlib/benz/error.c | 7 ------- extlib/benz/eval.c | 1 - extlib/benz/gc.c | 17 ----------------- extlib/benz/include/picrin.h | 20 +++++++++++++++++++- extlib/benz/include/picrin/error.h | 2 -- extlib/benz/lib.c | 8 -------- extlib/benz/load.c | 2 -- extlib/benz/macro.c | 9 --------- extlib/benz/number.c | 3 --- extlib/benz/pair.c | 1 - extlib/benz/port.c | 5 ----- extlib/benz/proc.c | 3 --- extlib/benz/read.c | 9 --------- extlib/benz/record.c | 2 -- extlib/benz/state.c | 10 ---------- extlib/benz/string.c | 4 ---- extlib/benz/symbol.c | 2 -- extlib/benz/var.c | 2 -- extlib/benz/vector.c | 3 --- extlib/benz/vm.c | 13 ------------- extlib/benz/write.c | 9 --------- src/main.c | 2 -- 39 files changed, 19 insertions(+), 165 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index 09746077..e6750347 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -1,8 +1,4 @@ #include "picrin.h" -#include "picrin/data.h" -#include "picrin/proc.h" -#include "picrin/pair.h" -#include "picrin/cont.h" struct pic_cont { jmp_buf jmp; diff --git a/contrib/03.file/src/file.c b/contrib/03.file/src/file.c index 8efd2a77..f0410f9d 100644 --- a/contrib/03.file/src/file.c +++ b/contrib/03.file/src/file.c @@ -3,8 +3,6 @@ */ #include "picrin.h" -#include "picrin/port.h" -#include "picrin/error.h" PIC_NORETURN static void file_error(pic_state *pic, const char *msg) diff --git a/contrib/03.load/src/load.c b/contrib/03.load/src/load.c index 93f832c6..5efb71c7 100644 --- a/contrib/03.load/src/load.c +++ b/contrib/03.load/src/load.c @@ -3,9 +3,6 @@ */ #include "picrin.h" -#include "picrin/pair.h" -#include "picrin/port.h" -#include "picrin/error.h" void pic_load(pic_state *pic, const char *filename) diff --git a/contrib/03.mutable-string/mutable-string.c b/contrib/03.mutable-string/mutable-string.c index 43679a29..6937b0f6 100644 --- a/contrib/03.mutable-string/mutable-string.c +++ b/contrib/03.mutable-string/mutable-string.c @@ -1,5 +1,4 @@ #include "picrin.h" -#include "picrin/string.h" void pic_str_set(pic_state *pic, pic_str *str, size_t i, char c) diff --git a/contrib/03.system/src/system.c b/contrib/03.system/src/system.c index 5ead4d9c..3265d876 100644 --- a/contrib/03.system/src/system.c +++ b/contrib/03.system/src/system.c @@ -5,9 +5,6 @@ #include #include "picrin.h" -#include "picrin/string.h" -#include "picrin/pair.h" -#include "picrin/cont.h" static pic_value pic_system_cmdline(pic_state *pic) diff --git a/contrib/10.readline/src/readline.c b/contrib/10.readline/src/readline.c index b516cb6c..fe831ddd 100644 --- a/contrib/10.readline/src/readline.c +++ b/contrib/10.readline/src/readline.c @@ -6,9 +6,6 @@ forget to use the C++ extern "C" to get it to compile. */ #include "picrin.h" -#include "picrin/pair.h" -#include "picrin/string.h" -#include "picrin/port.h" #if PIC_READLINE_INCLUDE_DIR_SUFFIX == readline #include diff --git a/contrib/10.regexp/src/regexp.c b/contrib/10.regexp/src/regexp.c index 3a358fab..ce54d65e 100644 --- a/contrib/10.regexp/src/regexp.c +++ b/contrib/10.regexp/src/regexp.c @@ -1,8 +1,4 @@ #include "picrin.h" -#include "picrin/data.h" -#include "picrin/pair.h" -#include "picrin/string.h" -#include "picrin/cont.h" #include diff --git a/docs/capi.rst b/docs/capi.rst index c4464114..a2c31320 100644 --- a/docs/capi.rst +++ b/docs/capi.rst @@ -51,7 +51,6 @@ When you use dynamic memory allocation inside C APIs, you must be caseful about /** foo.c **/ #include #include "picrin.h" - #include "picrin/data.h" /* * C-side API diff --git a/etc/mkloader.pl b/etc/mkloader.pl index 984f4709..3f5bcb41 100755 --- a/etc/mkloader.pl +++ b/etc/mkloader.pl @@ -12,7 +12,6 @@ print <xSTDERR->file) # define pic_fdebug(pic,obj,file) pic_fwrite(pic,obj,file) #endif +#include "picrin/blob.h" +#include "picrin/cont.h" +#include "picrin/data.h" +#include "picrin/dict.h" +#include "picrin/error.h" +#include "picrin/gc.h" +#include "picrin/irep.h" +#include "picrin/lib.h" +#include "picrin/macro.h" +#include "picrin/pair.h" +#include "picrin/port.h" +#include "picrin/proc.h" +#include "picrin/read.h" +#include "picrin/record.h" +#include "picrin/string.h" +#include "picrin/symbol.h" +#include "picrin/read.h" +#include "picrin/vector.h" + #if defined(__cplusplus) } #endif diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index efb12130..ddf14e85 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -9,8 +9,6 @@ extern "C" { #endif -#include "picrin/cont.h" - struct pic_error { PIC_OBJECT_HEADER pic_sym *type; diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 30362ef2..5e364af0 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -3,14 +3,6 @@ */ #include "picrin.h" -#include "picrin/lib.h" -#include "picrin/pair.h" -#include "picrin/macro.h" -#include "picrin/error.h" -#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/load.c b/extlib/benz/load.c index a6f2eb8d..53220101 100644 --- a/extlib/benz/load.c +++ b/extlib/benz/load.c @@ -3,8 +3,6 @@ */ #include "picrin.h" -#include "picrin/port.h" -#include "picrin/error.h" void pic_load_port(pic_state *pic, struct pic_port *port) diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index f934cdd3..219c225d 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -3,15 +3,6 @@ */ #include "picrin.h" -#include "picrin/pair.h" -#include "picrin/string.h" -#include "picrin/proc.h" -#include "picrin/macro.h" -#include "picrin/lib.h" -#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/number.c b/extlib/benz/number.c index 928ba50e..1f02ca0c 100644 --- a/extlib/benz/number.c +++ b/extlib/benz/number.c @@ -3,9 +3,6 @@ */ #include "picrin.h" -#include "picrin/string.h" -#include "picrin/cont.h" -#include "picrin/port.h" #if ! PIC_ENABLE_FLOAT static pic_value diff --git a/extlib/benz/pair.c b/extlib/benz/pair.c index 36400af2..17da2394 100644 --- a/extlib/benz/pair.c +++ b/extlib/benz/pair.c @@ -3,7 +3,6 @@ */ #include "picrin.h" -#include "picrin/pair.h" pic_value pic_cons(pic_state *pic, pic_value car, pic_value cdr) diff --git a/extlib/benz/port.c b/extlib/benz/port.c index 20879173..58bd0826 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -3,11 +3,6 @@ */ #include "picrin.h" -#include "picrin/proc.h" -#include "picrin/port.h" -#include "picrin/string.h" -#include "picrin/blob.h" -#include "picrin/error.h" pic_value pic_eof_object() diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index b1a9a795..2f7d2d11 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -3,9 +3,6 @@ */ #include "picrin.h" -#include "picrin/pair.h" -#include "picrin/proc.h" -#include "picrin/irep.h" struct pic_proc * pic_make_proc(pic_state *pic, pic_func_t func, const char *name) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index ce60a995..c8cf6d70 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -3,15 +3,6 @@ */ #include "picrin.h" -#include "picrin/read.h" -#include "picrin/error.h" -#include "picrin/pair.h" -#include "picrin/string.h" -#include "picrin/vector.h" -#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/record.c b/extlib/benz/record.c index 2a6e85cc..dc35e223 100644 --- a/extlib/benz/record.c +++ b/extlib/benz/record.c @@ -3,8 +3,6 @@ */ #include "picrin.h" -#include "picrin/record.h" -#include "picrin/dict.h" struct pic_record * pic_make_record(pic_state *pic, pic_value rectype) diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 571c5155..c4207987 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -3,16 +3,6 @@ */ #include "picrin.h" -#include "picrin/gc.h" -#include "picrin/read.h" -#include "picrin/proc.h" -#include "picrin/macro.h" -#include "picrin/cont.h" -#include "picrin/port.h" -#include "picrin/error.h" -#include "picrin/dict.h" -#include "picrin/pair.h" -#include "picrin/lib.h" void pic_add_feature(pic_state *pic, const char *feature) diff --git a/extlib/benz/string.c b/extlib/benz/string.c index 95a32210..ee1f3527 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -3,10 +3,6 @@ */ #include "picrin.h" -#include "picrin/string.h" -#include "picrin/pair.h" -#include "picrin/port.h" -#include "picrin/error.h" struct pic_chunk { char *str; diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 219ee25a..008c52b2 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -3,8 +3,6 @@ */ #include "picrin.h" -#include "picrin/symbol.h" -#include "picrin/string.h" pic_sym * pic_make_symbol(pic_state *pic, pic_str *str) diff --git a/extlib/benz/var.c b/extlib/benz/var.c index 7eb4e08a..e1b7ff06 100644 --- a/extlib/benz/var.c +++ b/extlib/benz/var.c @@ -3,8 +3,6 @@ */ #include "picrin.h" -#include "picrin/pair.h" -#include "picrin/proc.h" static pic_value var_lookup(pic_state *pic, pic_value var) diff --git a/extlib/benz/vector.c b/extlib/benz/vector.c index 46b02616..08d2f72a 100644 --- a/extlib/benz/vector.c +++ b/extlib/benz/vector.c @@ -3,9 +3,6 @@ */ #include "picrin.h" -#include "picrin/vector.h" -#include "picrin/string.h" -#include "picrin/pair.h" struct pic_vector * pic_make_vec(pic_state *pic, size_t len) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index fa07c6d2..c6cb42b1 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -3,19 +3,6 @@ */ #include "picrin.h" -#include "picrin/pair.h" -#include "picrin/string.h" -#include "picrin/vector.h" -#include "picrin/proc.h" -#include "picrin/port.h" -#include "picrin/irep.h" -#include "picrin/blob.h" -#include "picrin/lib.h" -#include "picrin/macro.h" -#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 c9e36553..d2c2a807 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -3,15 +3,6 @@ */ #include "picrin.h" -#include "picrin/port.h" -#include "picrin/pair.h" -#include "picrin/string.h" -#include "picrin/vector.h" -#include "picrin/blob.h" -#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) diff --git a/src/main.c b/src/main.c index 5c70fd7f..fbdae10c 100644 --- a/src/main.c +++ b/src/main.c @@ -3,8 +3,6 @@ */ #include "picrin.h" -#include "picrin/pair.h" -#include "picrin/error.h" void pic_init_contrib(pic_state *); void pic_load_piclib(pic_state *); From cd4b1be54ccadfa0a3e1033dc49dfa3194c515cc Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Fri, 29 May 2015 20:42:26 +0900 Subject: [PATCH 118/177] abandon cmake --- .gitignore | 4 +- .travis.yml | 7 +- CMakeLists.txt | 48 ------ Makefile | 86 ++++++++++ {build => bin}/.gitkeep | 0 bin/picrin | Bin 0 -> 447032 bytes cmake/FindPYTHON.cmake | 193 ----------------------- contrib/03.callcc/CMakeLists.txt | 4 - contrib/03.callcc/nitro.mk | 2 + contrib/03.file/CMakeLists.txt | 4 - contrib/03.file/nitro.mk | 2 + contrib/03.load/CMakeLists.txt | 4 - contrib/03.load/nitro.mk | 2 + contrib/03.mutable-string/CMakeLists.txt | 5 - contrib/03.mutable-string/nitro.mk | 2 + contrib/03.system/CMakeLists.txt | 4 - contrib/03.system/nitro.mk | 2 + contrib/03.time/CMakeLists.txt | 4 - contrib/03.time/nitro.mk | 2 + contrib/05.r7rs/CMakeLists.txt | 15 -- contrib/05.r7rs/nitro.mk | 14 ++ contrib/10.optional/CMakeLists.txt | 9 -- contrib/10.optional/nitro.mk | 7 + contrib/10.partcont/CMakeLists.txt | 2 - contrib/10.partcont/nitro.mk | 1 + contrib/10.pretty-print/CMakeLists.txt | 1 - contrib/10.pretty-print/nitro.mk | 1 + contrib/10.random/CMakeLists.txt | 11 -- contrib/10.random/nitro.mk | 8 + contrib/10.srfi/CMakeLists.txt | 10 -- contrib/10.srfi/nitro.mk | 9 ++ contrib/20.for/CMakeLists.txt | 4 - contrib/20.for/nitro.mk | 7 + contrib/20.repl/CMakeLists.txt | 3 - contrib/20.repl/nitro.mk | 3 + contrib/30.main/CMakeLists.txt | 1 - contrib/30.main/nitro.mk | 1 + contrib/40.class/CMakeLists.txt | 2 - contrib/40.class/nitro.mk | 1 + contrib/50.protocol/CMakeLists.txt | 2 - contrib/50.protocol/nitro.mk | 1 + contrib/CMakeLists.txt | 5 - docs/CMakeLists.txt | 27 ---- .gitmodules => lib/.gitkeep | 0 piclib/CMakeLists.txt | 10 -- src/CMakeLists.txt | 47 ------ 46 files changed, 158 insertions(+), 419 deletions(-) delete mode 100644 CMakeLists.txt create mode 100644 Makefile rename {build => bin}/.gitkeep (100%) create mode 100755 bin/picrin delete mode 100644 cmake/FindPYTHON.cmake delete mode 100644 contrib/03.callcc/CMakeLists.txt create mode 100644 contrib/03.callcc/nitro.mk delete mode 100644 contrib/03.file/CMakeLists.txt create mode 100644 contrib/03.file/nitro.mk delete mode 100644 contrib/03.load/CMakeLists.txt create mode 100644 contrib/03.load/nitro.mk delete mode 100644 contrib/03.mutable-string/CMakeLists.txt create mode 100644 contrib/03.mutable-string/nitro.mk delete mode 100644 contrib/03.system/CMakeLists.txt create mode 100644 contrib/03.system/nitro.mk delete mode 100644 contrib/03.time/CMakeLists.txt create mode 100644 contrib/03.time/nitro.mk delete mode 100644 contrib/05.r7rs/CMakeLists.txt create mode 100644 contrib/05.r7rs/nitro.mk delete mode 100644 contrib/10.optional/CMakeLists.txt create mode 100644 contrib/10.optional/nitro.mk delete mode 100644 contrib/10.partcont/CMakeLists.txt create mode 100644 contrib/10.partcont/nitro.mk delete mode 100644 contrib/10.pretty-print/CMakeLists.txt create mode 100644 contrib/10.pretty-print/nitro.mk delete mode 100644 contrib/10.random/CMakeLists.txt create mode 100644 contrib/10.random/nitro.mk delete mode 100644 contrib/10.srfi/CMakeLists.txt create mode 100644 contrib/10.srfi/nitro.mk delete mode 100644 contrib/20.for/CMakeLists.txt create mode 100644 contrib/20.for/nitro.mk delete mode 100644 contrib/20.repl/CMakeLists.txt create mode 100644 contrib/20.repl/nitro.mk delete mode 100644 contrib/30.main/CMakeLists.txt create mode 100644 contrib/30.main/nitro.mk delete mode 100644 contrib/40.class/CMakeLists.txt create mode 100644 contrib/40.class/nitro.mk delete mode 100644 contrib/50.protocol/CMakeLists.txt create mode 100644 contrib/50.protocol/nitro.mk delete mode 100644 contrib/CMakeLists.txt delete mode 100644 docs/CMakeLists.txt rename .gitmodules => lib/.gitkeep (100%) delete mode 100644 piclib/CMakeLists.txt delete mode 100644 src/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 7e3e70a0..c799dc45 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -build/* +*.o +bin/ +lib/ src/load_piclib.c src/init_contrib.c docs/contrib.rst diff --git a/.travis.yml b/.travis.yml index 8400d479..3d9ab350 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,9 @@ env: before_script: - sudo apt-get update -qq - sudo apt-get install -y libc6:i386 libgcc1:i386 gcc-4.6-base:i386 gcc-multilib - - cd build script: - perl --version - - cmake .. && make test - - cmake -DCMAKE_BUILD_TYPE=Debug .. && make test > /dev/null + - make test + - make clean + - make debug + - make test 2> /dev/null >/dev/null diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 45a3a2b6..00000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -cmake_minimum_required(VERSION 2.6) -cmake_policy(VERSION 2.6) -if(POLICY CMP0037) - cmake_policy(SET CMP0037 OLD) -endif() - -PROJECT(picrin) - -# load extra cmake modules -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") - -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY lib) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wall -Wextra") -set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g -DDEBUG=1") - -option(STRICT_C89_MODE "Strict c89 mode" OFF) -if(STRICT_C89_MODE) - add_definitions(-std=c89 -ansi -pedantic) -endif() - -include_directories(extlib/benz/include) - -# build picrin -include(piclib/CMakeLists.txt) -include(contrib/CMakeLists.txt) -include(src/CMakeLists.txt) -include(docs/CMakeLists.txt) - -# ---- - -# $ make run -add_custom_target(run bin/picrin DEPENDS repl) - -# $ make test -add_custom_target(test DEPENDS test-r7rs test-contribs) - -# $ make test-r7rs -add_custom_target(test-r7rs bin/picrin ${PROJECT_SOURCE_DIR}/t/r7rs-tests.scm DEPENDS repl) - -# $ make test-contribs -add_custom_target(test-contribs DEPENDS ${CONTRIB_TESTS}) - -# $ make tak -add_custom_target(tak bin/picrin ${PROJECT_SOURCE_DIR}/etc/tak.scm DEPENDS repl) - -# $ make lines -add_custom_target(lines find . -name "*.[chyl]" | xargs wc -l WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..8c2b5dcd --- /dev/null +++ b/Makefile @@ -0,0 +1,86 @@ +BENZ_SRCS = $(wildcard extlib/benz/*.c) +BENZ_OBJS = $(BENZ_SRCS:.c=.o) + +PICRIN_SRCS = \ + src/main.c\ + src/load_piclib.c\ + src/init_contrib.c +PICRIN_OBJS = \ + $(PICRIN_SRCS:.c=.o) +PICRIN_LIBS = \ + piclib/picrin/base.scm\ + piclib/picrin/macro.scm\ + piclib/picrin/record.scm\ + piclib/picrin/array.scm\ + piclib/picrin/dictionary.scm\ + piclib/picrin/experimental/lambda.scm\ + piclib/picrin/syntax-rules.scm\ + piclib/picrin/test.scm + +CONTRIB_SRCS = +CONTRIB_OBJS = $(CONTRIB_SRCS:.c=.o) +CONTRIB_LIBS = +CONTRIB_INITS = +CONTRIB_TESTS = +CONTRIB_DOCS = $(wildcard contrib/*/docs/*.rst) + +CFLAGS += -I./extlib/benz/include +# CFLAGS += -std=c89 -ansi -pedantic + +prefix = /usr/local + +all: CFLAGS += -O2 -Wall -Wextra +all: bin/picrin + +include contrib/*/nitro.mk # nitros define test-foo targets + +debug: CFLAGS += -O0 -g -DDEBUG=1 +debug: bin/picrin + +bin/picrin: $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libbenz.a + $(CC) $(CFLAGS) -o $@ $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libbenz.a + +src/load_piclib.c: $(PICRIN_LIBS) $(CONTRIB_LIBS) + perl etc/mkloader.pl $(PICRIN_LIBS) $(CONTRIB_LIBS) > $@ + +src/init_contrib.c: + perl etc/mkinit.pl $(CONTRIB_INITS) > $@ + +lib/libbenz.a: $(BENZ_OBJS) + $(AR) $(ARFLAGS) $@ $(BENZ_OBJS) + +%.o: %.c extlib/benz/include/picrin.h extlib/benz/include/picrin/*.h + $(CC) $(CFLAGS) -c -o $@ $< + +doc: docs/*.rst docs/contrib.rst + $(MAKE) -C docs html + mkdir -p doc + cp -uR docs/_build/* -t doc/ + +docs/contrib.rst: $(CONTRIB_DOCS) + echo "Contrib Libraries \\\(a.k.a nitros\\\)" > $@ + echo "================================" >> $@ + echo "" >> $@ + cat $(CONTRIB_DOCS) >> $@ + +run: bin/picrin + bin/picrin + +test: test-r7rs test-contribs + +test-r7rs: bin/picrin t/r7rs-tests.scm + bin/picrin t/r7rs-tests.scm + +test-contribs: bin/picrin $(CONTRIB_TESTS) + +install: all + install -c bin/picrin $(prefix)/bin/picrin + +clean: + rm -f src/load_piclib.c src/init_contrib.c + rm -f lib/libbenz.a + rm -f $(BENZ_OBJS) + rm -f $(PICRIN_OBJS) + rm -f $(CONTRIB_OBJS) + +.PHONY: all insall clean run test test-r7rs test-contribs doc $(CONTRIB_TESTS) diff --git a/build/.gitkeep b/bin/.gitkeep similarity index 100% rename from build/.gitkeep rename to bin/.gitkeep diff --git a/bin/picrin b/bin/picrin new file mode 100755 index 0000000000000000000000000000000000000000..96f32284a0f6610854f5a71f0d5d0eb4f9ace3b4 GIT binary patch literal 447032 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 -# -# @tp @b Python_ADDITIONAL_VERSIONS @endtp -# List of version numbers that should be taken into account when -# searching for Python. -# -# -# -# @par Output variables: -# -# -# @tp @b PYTHONINTERP_FOUND @endtp -# -# -# -# @tp @b PYTHON_EXECUTABLE @endtp -# -# -# -# @tp @b PYTHON_VERSION_STRING @endtp -# -# -# -# @tp @b PYTHON_VERSION_MAJOR @endtp -# -# -# -# @tp @b PYTHON_VERSION_MINOR @endtp -# -# -# -# @tp @b PYTHON_VERSION_PATCH @endtp -# -# -#
Was the Python executable found.
Path to the Python interpreter.
Python version found e.g. 2.5.2.
Python major version found e.g. 2.
Python minor version found e.g. 5.
Python patch version found e.g. 2.
-# -# @note This module has been copied from the Git repository of CMake on -# 4/12/2012, i.e., before the release of CMake 2.8.8. Once CMake 2.8.8 -# or any version is available for all major platforms, consider to -# remove this module from the BASIS package. -# -# @ingroup CMakeFindModules -############################################################################## - -#============================================================================= -# Copyright 2005-2010 Kitware, Inc. -# Copyright 2011 Bjoern Ricks -# Copyright 2012 Rolf Eike Beer -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# * Neither the names of Kitware, Inc., the Insight Software Consortium, -# nor the names of their contributors may be used to endorse or promote -# products derived from this software without specific prior written -# permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#============================================================================= - -unset(_Python_NAMES) - -set(_PYTHON1_VERSIONS 1.6 1.5) -set(_PYTHON2_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0) -set(_PYTHON3_VERSIONS 3.3 3.2 3.1 3.0) - -if(PythonInterp_FIND_VERSION) - if(PythonInterp_FIND_VERSION MATCHES "^[0-9]+\\.[0-9]+(\\.[0-9]+.*)?$") - string(REGEX REPLACE "^([0-9]+\\.[0-9]+).*" "\\1" _PYTHON_FIND_MAJ_MIN "${PythonInterp_FIND_VERSION}") - string(REGEX REPLACE "^([0-9]+).*" "\\1" _PYTHON_FIND_MAJ "${_PYTHON_FIND_MAJ_MIN}") - list(APPEND _Python_NAMES python${_PYTHON_FIND_MAJ_MIN} python${_PYTHON_FIND_MAJ}) - unset(_PYTHON_FIND_OTHER_VERSIONS) - if(NOT PythonInterp_FIND_VERSION_EXACT) - foreach(_PYTHON_V ${_PYTHON${_PYTHON_FIND_MAJ}_VERSIONS}) - if(NOT _PYTHON_V VERSION_LESS _PYTHON_FIND_MAJ_MIN) - list(APPEND _PYTHON_FIND_OTHER_VERSIONS ${_PYTHON_V}) - endif() - endforeach() - endif(NOT PythonInterp_FIND_VERSION_EXACT) - unset(_PYTHON_FIND_MAJ_MIN) - unset(_PYTHON_FIND_MAJ) - else(PythonInterp_FIND_VERSION MATCHES "^[0-9]+\\.[0-9]+(\\.[0-9]+.*)?$") - list(APPEND _Python_NAMES python${PythonInterp_FIND_VERSION}) - set(_PYTHON_FIND_OTHER_VERSIONS ${_PYTHON${PythonInterp_FIND_VERSION}_VERSIONS}) - endif(PythonInterp_FIND_VERSION MATCHES "^[0-9]+\\.[0-9]+(\\.[0-9]+.*)?$") -else(PythonInterp_FIND_VERSION) - set(_PYTHON_FIND_OTHER_VERSIONS ${_PYTHON3_VERSIONS} ${_PYTHON2_VERSIONS} ${_PYTHON1_VERSIONS}) -endif(PythonInterp_FIND_VERSION) - -list(APPEND _Python_NAMES python) - -# Search for the current active python version first -find_program(PYTHON_EXECUTABLE NAMES ${_Python_NAMES}) - -# Set up the versions we know about, in the order we will search. Always add -# the user supplied additional versions to the front. -set(_Python_VERSIONS - ${Python_ADDITIONAL_VERSIONS} - ${_PYTHON_FIND_OTHER_VERSIONS} - ) - -unset(_PYTHON_FIND_OTHER_VERSIONS) -unset(_PYTHON1_VERSIONS) -unset(_PYTHON2_VERSIONS) -unset(_PYTHON3_VERSIONS) - -# Search for newest python version if python executable isn't found -if(NOT PYTHON_EXECUTABLE) - foreach(_CURRENT_VERSION ${_Python_VERSIONS}) - set(_Python_NAMES python${_CURRENT_VERSION}) - if(WIN32) - list(APPEND _Python_NAMES python) - endif() - find_program(PYTHON_EXECUTABLE - NAMES ${_Python_NAMES} - PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath] - ) - endforeach() -endif() - -# determine python version string -if(PYTHON_EXECUTABLE) - execute_process(COMMAND "${PYTHON_EXECUTABLE}" -E -c - "import sys; sys.stdout.write(';'.join([str(x) for x in sys.version_info[:3]]))" - OUTPUT_VARIABLE _VERSION - RESULT_VARIABLE _PYTHON_VERSION_RESULT - ERROR_QUIET) - if(NOT _PYTHON_VERSION_RESULT) - string(REPLACE ";" "." PYTHON_VERSION_STRING "${_VERSION}") - list(GET _VERSION 0 PYTHON_VERSION_MAJOR) - list(GET _VERSION 1 PYTHON_VERSION_MINOR) - list(GET _VERSION 2 PYTHON_VERSION_PATCH) - if(PYTHON_VERSION_PATCH EQUAL 0) - # it's called "Python 2.7", not "2.7.0" - string(REGEX REPLACE "\\.0$" "" PYTHON_VERSION_STRING "${PYTHON_VERSION_STRING}") - endif() - else() - # sys.version predates sys.version_info, so use that - execute_process(COMMAND "${PYTHON_EXECUTABLE}" -E -c "import sys; sys.stdout.write(sys.version)" - OUTPUT_VARIABLE _VERSION - RESULT_VARIABLE _PYTHON_VERSION_RESULT - ERROR_QUIET) - if(NOT _PYTHON_VERSION_RESULT) - string(REGEX REPLACE " .*" "" PYTHON_VERSION_STRING "${_VERSION}") - string(REGEX REPLACE "^([0-9]+)\\.[0-9]+.*" "\\1" PYTHON_VERSION_MAJOR "${PYTHON_VERSION_STRING}") - string(REGEX REPLACE "^[0-9]+\\.([0-9])+.*" "\\1" PYTHON_VERSION_MINOR "${PYTHON_VERSION_STRING}") - if(PYTHON_VERSION_STRING MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+.*") - string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" PYTHON_VERSION_PATCH "${PYTHON_VERSION_STRING}") - else() - set(PYTHON_VERSION_PATCH "0") - endif() - else() - # sys.version was first documented for Python 1.5, so assume - # this is older. - set(PYTHON_VERSION_STRING "1.4") - set(PYTHON_VERSION_MAJOR "1") - set(PYTHON_VERSION_MINOR "4") - set(PYTHON_VERSION_PATCH "0") - endif() - endif() - unset(_PYTHON_VERSION_RESULT) - unset(_VERSION) -endif(PYTHON_EXECUTABLE) - -# handle the QUIETLY and REQUIRED arguments and set PYTHONINTERP_FOUND to TRUE if -# all listed variables are TRUE -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(PythonInterp REQUIRED_VARS PYTHON_EXECUTABLE VERSION_VAR PYTHON_VERSION_STRING) - -mark_as_advanced(PYTHON_EXECUTABLE) diff --git a/contrib/03.callcc/CMakeLists.txt b/contrib/03.callcc/CMakeLists.txt deleted file mode 100644 index 55a73452..00000000 --- a/contrib/03.callcc/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -file(GLOB PICRIN_CALLCC_SOURCES ${PROJECT_SOURCE_DIR}/contrib/03.callcc/*.c) - -list(APPEND PICRIN_CONTRIB_INITS callcc) -list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_CALLCC_SOURCES}) diff --git a/contrib/03.callcc/nitro.mk b/contrib/03.callcc/nitro.mk new file mode 100644 index 00000000..60dbe96b --- /dev/null +++ b/contrib/03.callcc/nitro.mk @@ -0,0 +1,2 @@ +CONTRIB_INITS += callcc +CONTRIB_SRCS += $(wildcard contrib/03.callcc/*.c) diff --git a/contrib/03.file/CMakeLists.txt b/contrib/03.file/CMakeLists.txt deleted file mode 100644 index 22987e3e..00000000 --- a/contrib/03.file/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -file(GLOB PICRIN_FILE_SOURCES ${PROJECT_SOURCE_DIR}/contrib/03.file/src/*.c) - -list(APPEND PICRIN_CONTRIB_INITS file) -list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_FILE_SOURCES}) diff --git a/contrib/03.file/nitro.mk b/contrib/03.file/nitro.mk new file mode 100644 index 00000000..d6bcbd93 --- /dev/null +++ b/contrib/03.file/nitro.mk @@ -0,0 +1,2 @@ +CONTRIB_INITS += file +CONTRIB_SRCS += $(wildcard contrib/03.file/src/*.c) diff --git a/contrib/03.load/CMakeLists.txt b/contrib/03.load/CMakeLists.txt deleted file mode 100644 index bb0d6a3d..00000000 --- a/contrib/03.load/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -file(GLOB PICRIN_LOAD_SOURCES ${PROJECT_SOURCE_DIR}/contrib/03.load/src/*.c) - -list(APPEND PICRIN_CONTRIB_INITS load) -list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_LOAD_SOURCES}) diff --git a/contrib/03.load/nitro.mk b/contrib/03.load/nitro.mk new file mode 100644 index 00000000..87566d36 --- /dev/null +++ b/contrib/03.load/nitro.mk @@ -0,0 +1,2 @@ +CONTRIB_INITS += load +CONTRIB_SRCS += $(wildcard contrib/03.load/src/*.c) diff --git a/contrib/03.mutable-string/CMakeLists.txt b/contrib/03.mutable-string/CMakeLists.txt deleted file mode 100644 index faa8402b..00000000 --- a/contrib/03.mutable-string/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -file(GLOB PICRIN_MUTABLE_STRING_SOURCES - ${PROJECT_SOURCE_DIR}/contrib/03.mutable-string/*.c) - -list(APPEND PICRIN_CONTRIB_INITS mutable_string) -list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_MUTABLE_STRING_SOURCES}) diff --git a/contrib/03.mutable-string/nitro.mk b/contrib/03.mutable-string/nitro.mk new file mode 100644 index 00000000..37d31b55 --- /dev/null +++ b/contrib/03.mutable-string/nitro.mk @@ -0,0 +1,2 @@ +CONTRIB_INITS += mutable_string +CONTRIB_SRCS += $(wildcard contrib/03.mutable-string/*.c) diff --git a/contrib/03.system/CMakeLists.txt b/contrib/03.system/CMakeLists.txt deleted file mode 100644 index c18f3266..00000000 --- a/contrib/03.system/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -file(GLOB PICRIN_SYSTEM_SOURCES ${PROJECT_SOURCE_DIR}/contrib/03.system/src/*.c) - -list(APPEND PICRIN_CONTRIB_INITS system) -list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_SYSTEM_SOURCES}) diff --git a/contrib/03.system/nitro.mk b/contrib/03.system/nitro.mk new file mode 100644 index 00000000..e9553587 --- /dev/null +++ b/contrib/03.system/nitro.mk @@ -0,0 +1,2 @@ +CONTRIB_INITS += system +CONTRIB_SRCS += $(wildcard contrib/03.system/src/*.c) diff --git a/contrib/03.time/CMakeLists.txt b/contrib/03.time/CMakeLists.txt deleted file mode 100644 index dc69714a..00000000 --- a/contrib/03.time/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -file(GLOB PICRIN_TIME_SOURCES ${PROJECT_SOURCE_DIR}/contrib/03.time/src/*.c) - -list(APPEND PICRIN_CONTRIB_INITS time) -list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_TIME_SOURCES}) diff --git a/contrib/03.time/nitro.mk b/contrib/03.time/nitro.mk new file mode 100644 index 00000000..61b7c4d3 --- /dev/null +++ b/contrib/03.time/nitro.mk @@ -0,0 +1,2 @@ +CONTRIB_INITS += time +CONTRIB_SRCS += $(wildcard contrib/03.time/src/*.c) diff --git a/contrib/05.r7rs/CMakeLists.txt b/contrib/05.r7rs/CMakeLists.txt deleted file mode 100644 index 814d80c2..00000000 --- a/contrib/05.r7rs/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -list(APPEND PICLIB_SCHEME_LIBS - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/base.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/cxr.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/read.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/write.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/file.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/case-lambda.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/lazy.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/eval.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/inexact.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/load.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/process-context.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/time.scm - ${PROJECT_SOURCE_DIR}/contrib/05.r7rs/scheme/r5rs.scm - ) diff --git a/contrib/05.r7rs/nitro.mk b/contrib/05.r7rs/nitro.mk new file mode 100644 index 00000000..b811b92e --- /dev/null +++ b/contrib/05.r7rs/nitro.mk @@ -0,0 +1,14 @@ +CONTRIB_LIBS += \ + contrib/05.r7rs/scheme/base.scm\ + contrib/05.r7rs/scheme/cxr.scm\ + contrib/05.r7rs/scheme/read.scm\ + contrib/05.r7rs/scheme/write.scm\ + contrib/05.r7rs/scheme/file.scm\ + contrib/05.r7rs/scheme/case-lambda.scm\ + contrib/05.r7rs/scheme/lazy.scm\ + contrib/05.r7rs/scheme/eval.scm\ + contrib/05.r7rs/scheme/inexact.scm\ + contrib/05.r7rs/scheme/load.scm\ + contrib/05.r7rs/scheme/process-context.scm\ + contrib/05.r7rs/scheme/time.scm\ + contrib/05.r7rs/scheme/r5rs.scm diff --git a/contrib/10.optional/CMakeLists.txt b/contrib/10.optional/CMakeLists.txt deleted file mode 100644 index c6a60a8a..00000000 --- a/contrib/10.optional/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -file(GLOB OPTIONAL_FILES ${PROJECT_SOURCE_DIR}/contrib/10.optional/piclib/*.scm) -list(APPEND PICLIB_CONTRIB_LIBS ${OPTIONAL_FILES}) -add_custom_target(test-optional - for test in ${PROJECT_SOURCE_DIR}/contrib/10.optional/t/*.scm \; - do - bin/picrin "$$test" \; - done - DEPENDS repl) -set(CONTRIB_TESTS ${CONTRIB_TESTS} test-optional) diff --git a/contrib/10.optional/nitro.mk b/contrib/10.optional/nitro.mk new file mode 100644 index 00000000..9048a19f --- /dev/null +++ b/contrib/10.optional/nitro.mk @@ -0,0 +1,7 @@ +CONTRIB_LIBS += $(wildcard contrib/10.optional/piclib/*.scm) +CONTRIB_TESTS += test-optional + +test-optional: bin/picrin + for test in `ls contrib/10.optional/t/*.scm`; do \ + bin/picrin $$test; \ + done diff --git a/contrib/10.partcont/CMakeLists.txt b/contrib/10.partcont/CMakeLists.txt deleted file mode 100644 index 65f16fb2..00000000 --- a/contrib/10.partcont/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -file(GLOB PARTCONT_FILES ${PROJECT_SOURCE_DIR}/contrib/10.partcont/piclib/*.scm) -list(APPEND PICLIB_CONTRIB_LIBS ${PARTCONT_FILES}) diff --git a/contrib/10.partcont/nitro.mk b/contrib/10.partcont/nitro.mk new file mode 100644 index 00000000..454bd39d --- /dev/null +++ b/contrib/10.partcont/nitro.mk @@ -0,0 +1 @@ +CONTRIB_LIBS += $(wildcard contrib/10.partcont/piclib/*.scm) diff --git a/contrib/10.pretty-print/CMakeLists.txt b/contrib/10.pretty-print/CMakeLists.txt deleted file mode 100644 index cf0327da..00000000 --- a/contrib/10.pretty-print/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -list(APPEND PICLIB_CONTRIB_LIBS ${PROJECT_SOURCE_DIR}/contrib/10.pretty-print/pretty-print.scm) diff --git a/contrib/10.pretty-print/nitro.mk b/contrib/10.pretty-print/nitro.mk new file mode 100644 index 00000000..28070d61 --- /dev/null +++ b/contrib/10.pretty-print/nitro.mk @@ -0,0 +1 @@ +CONTRIB_LIBS += contrib/10.pretty-print/pretty-print.scm diff --git a/contrib/10.random/CMakeLists.txt b/contrib/10.random/CMakeLists.txt deleted file mode 100644 index 224686b9..00000000 --- a/contrib/10.random/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -file(GLOB PICRIN_RANDOM_SOURCES ${PROJECT_SOURCE_DIR}/contrib/10.random/src/*.c) - -list(APPEND PICRIN_CONTRIB_INITS random) -list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_RANDOM_SOURCES}) -add_custom_target(test-random - for test in ${PROJECT_SOURCE_DIR}/contrib/10.random/t/*.scm \; - do - bin/picrin "$$test" \; - done - DEPENDS repl) -set(CONTRIB_TESTS ${CONTRIB_TESTS} test-random) diff --git a/contrib/10.random/nitro.mk b/contrib/10.random/nitro.mk new file mode 100644 index 00000000..e7ba691d --- /dev/null +++ b/contrib/10.random/nitro.mk @@ -0,0 +1,8 @@ +CONTRIB_INITS += random +CONTRIB_SRCS += $(wildcard contrib/10.random/src/*.c) +CONTRIB_TESTS += test-random + +test-random: bin/picrin + for test in `ls contrib/10.random/t/*.scm`; do \ + bin/picrin $$test; \ + done diff --git a/contrib/10.srfi/CMakeLists.txt b/contrib/10.srfi/CMakeLists.txt deleted file mode 100644 index 1cabb620..00000000 --- a/contrib/10.srfi/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -list(APPEND PICLIB_CONTRIB_LIBS - ${PROJECT_SOURCE_DIR}/contrib/10.srfi/srfi/1.scm - ${PROJECT_SOURCE_DIR}/contrib/10.srfi/srfi/8.scm - ${PROJECT_SOURCE_DIR}/contrib/10.srfi/srfi/17.scm - ${PROJECT_SOURCE_DIR}/contrib/10.srfi/srfi/26.scm - ${PROJECT_SOURCE_DIR}/contrib/10.srfi/srfi/43.scm - ${PROJECT_SOURCE_DIR}/contrib/10.srfi/srfi/60.scm - ${PROJECT_SOURCE_DIR}/contrib/10.srfi/srfi/95.scm - ${PROJECT_SOURCE_DIR}/contrib/10.srfi/srfi/111.scm - ) diff --git a/contrib/10.srfi/nitro.mk b/contrib/10.srfi/nitro.mk new file mode 100644 index 00000000..d8ac54ab --- /dev/null +++ b/contrib/10.srfi/nitro.mk @@ -0,0 +1,9 @@ +CONTRIB_LIBS += \ + contrib/10.srfi/srfi/1.scm\ + contrib/10.srfi/srfi/8.scm\ + contrib/10.srfi/srfi/17.scm\ + contrib/10.srfi/srfi/26.scm\ + contrib/10.srfi/srfi/43.scm\ + contrib/10.srfi/srfi/60.scm\ + contrib/10.srfi/srfi/95.scm\ + contrib/10.srfi/srfi/111.scm diff --git a/contrib/20.for/CMakeLists.txt b/contrib/20.for/CMakeLists.txt deleted file mode 100644 index 5e109d90..00000000 --- a/contrib/20.for/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -file(GLOB FOR_FILES ${PROJECT_SOURCE_DIR}/contrib/20.for/piclib/*.scm) -list(APPEND PICLIB_CONTRIB_LIBS ${FOR_FILES}) -add_custom_target(test-for for test in ${PROJECT_SOURCE_DIR}/contrib/20.for/t/*.scm \; do bin/picrin "$$test" \; done DEPENDS repl) -set(CONTRIB_TESTS ${CONTRIB_TESTS} test-for) diff --git a/contrib/20.for/nitro.mk b/contrib/20.for/nitro.mk new file mode 100644 index 00000000..b2c2cbad --- /dev/null +++ b/contrib/20.for/nitro.mk @@ -0,0 +1,7 @@ +CONTRIB_LIBS += $(wildcard contrib/20.for/piclib/*.scm) +CONTRIB_TESTS += test-for + +test-for: bin/picrin + for test in `ls contrib/20.for/t/*.scm`; do \ + bin/picrin "$$test"; \ + done diff --git a/contrib/20.repl/CMakeLists.txt b/contrib/20.repl/CMakeLists.txt deleted file mode 100644 index 7fc3bf06..00000000 --- a/contrib/20.repl/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -list(APPEND PICLIB_CONTRIB_LIBS ${PROJECT_SOURCE_DIR}/contrib/20.repl/repl.scm) -list(APPEND PICRIN_CONTRIB_SOURCES ${PROJECT_SOURCE_DIR}/contrib/20.repl/repl.c) -list(APPEND PICRIN_CONTRIB_INITS repl) diff --git a/contrib/20.repl/nitro.mk b/contrib/20.repl/nitro.mk new file mode 100644 index 00000000..f03e4ad7 --- /dev/null +++ b/contrib/20.repl/nitro.mk @@ -0,0 +1,3 @@ +CONTRIB_LIBS += contrib/20.repl/repl.scm +CONTRIB_SRCS += contrib/20.repl/repl.c +CONTRIB_INITS += repl diff --git a/contrib/30.main/CMakeLists.txt b/contrib/30.main/CMakeLists.txt deleted file mode 100644 index ceef792f..00000000 --- a/contrib/30.main/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -list(APPEND PICLIB_CONTRIB_LIBS ${PROJECT_SOURCE_DIR}/contrib/30.main/main.scm) diff --git a/contrib/30.main/nitro.mk b/contrib/30.main/nitro.mk new file mode 100644 index 00000000..a425fdc0 --- /dev/null +++ b/contrib/30.main/nitro.mk @@ -0,0 +1 @@ +CONTRIB_LIBS += contrib/30.main/main.scm diff --git a/contrib/40.class/CMakeLists.txt b/contrib/40.class/CMakeLists.txt deleted file mode 100644 index 5281edcd..00000000 --- a/contrib/40.class/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -file(GLOB CLASS_FILES ${PROJECT_SOURCE_DIR}/contrib/40.class/piclib/picrin/*.scm) -list(APPEND PICLIB_CONTRIB_LIBS ${CLASS_FILES}) diff --git a/contrib/40.class/nitro.mk b/contrib/40.class/nitro.mk new file mode 100644 index 00000000..cec300c1 --- /dev/null +++ b/contrib/40.class/nitro.mk @@ -0,0 +1 @@ +CONTRIB_LIBS += $(wildcard contrib/40.class/piclib/picrin/*.scm) diff --git a/contrib/50.protocol/CMakeLists.txt b/contrib/50.protocol/CMakeLists.txt deleted file mode 100644 index 41b4df2f..00000000 --- a/contrib/50.protocol/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -file(GLOB PROTOCOL_FILES ${PROJECT_SOURCE_DIR}/contrib/50.protocol/piclib/picrin/*.scm) -list(APPEND PICLIB_CONTRIB_LIBS ${PROTOCOL_FILES}) diff --git a/contrib/50.protocol/nitro.mk b/contrib/50.protocol/nitro.mk new file mode 100644 index 00000000..2db1bf31 --- /dev/null +++ b/contrib/50.protocol/nitro.mk @@ -0,0 +1 @@ +CONTRIB_LIBS += $(wildcard contrib/50.protocol/piclib/picrin/*.scm) diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt deleted file mode 100644 index 11050d90..00000000 --- a/contrib/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -file(GLOB CONTRIBS ${PROJECT_SOURCE_DIR}/contrib/*/CMakeLists.txt) -list(SORT CONTRIBS) -foreach(contrib ${CONTRIBS}) - include(${contrib}) -endforeach() diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt deleted file mode 100644 index a468e943..00000000 --- a/docs/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# contribs -file(GLOB PICRIN_CONTRIB_DOCS ${PROJECT_SOURCE_DIR}/contrib/*/docs/*.rst) -file(GLOB PICRIN_DOCS ${PROJECT_SOURCE_DIR}/docs/*.rst) -list(SORT PICRIN_CONTRIB_DOCS) - -set(PICRIN_CONTRIBS_DOC ${PROJECT_SOURCE_DIR}/docs/contrib.rst) -set(PICRIN_DOC_OUTPUT_DIRECTORY doc) - -add_custom_command( - OUTPUT ${PICRIN_CONTRIBS_DOC} - COMMAND echo "Contrib Libraries \\\(a.k.a nitros\\\)" > ${PICRIN_CONTRIBS_DOC} - COMMAND echo "================================" >> ${PICRIN_CONTRIBS_DOC} - COMMAND echo "" >> ${PICRIN_CONTRIBS_DOC} - COMMAND cat ${PICRIN_CONTRIB_DOCS} >> ${PICRIN_CONTRIBS_DOC} - DEPENDS ${PICRIN_CONTRIB_DOCS} - ) - -add_custom_target(doc - COMMAND make -C ${PROJECT_SOURCE_DIR}/docs html - DEPENDS ${PICRIN_CONTRIBS_DOC} - ) - -add_custom_command( - TARGET doc POST_BUILD - COMMAND mkdir -p ${PICRIN_DOC_OUTPUT_DIRECTORY} - COMMAND cp -uR ${PROJECT_SOURCE_DIR}/docs/_build/* -t ${PICRIN_DOC_OUTPUT_DIRECTORY}/ - ) \ No newline at end of file diff --git a/.gitmodules b/lib/.gitkeep similarity index 100% rename from .gitmodules rename to lib/.gitkeep diff --git a/piclib/CMakeLists.txt b/piclib/CMakeLists.txt deleted file mode 100644 index 5e734f4a..00000000 --- a/piclib/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -list(APPEND PICLIB_SCHEME_LIBS - ${PROJECT_SOURCE_DIR}/piclib/picrin/base.scm - ${PROJECT_SOURCE_DIR}/piclib/picrin/macro.scm - ${PROJECT_SOURCE_DIR}/piclib/picrin/record.scm - ${PROJECT_SOURCE_DIR}/piclib/picrin/array.scm - ${PROJECT_SOURCE_DIR}/piclib/picrin/dictionary.scm - ${PROJECT_SOURCE_DIR}/piclib/picrin/experimental/lambda.scm - ${PROJECT_SOURCE_DIR}/piclib/picrin/syntax-rules.scm - ${PROJECT_SOURCE_DIR}/piclib/picrin/test.scm - ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index 0ca3b949..00000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -### libpicrin ### - -find_package(Perl REQUIRED) - -# benz -file(GLOB BENZ_SOURCES extlib/benz/*.c) - -# srcs -file(GLOB PICRIN_SOURCES src/*.c) - -# piclib -set(PICLIB_SOURCE ${PROJECT_SOURCE_DIR}/src/load_piclib.c) -add_custom_command( - OUTPUT ${PICLIB_SOURCE} - COMMAND ${PERL_EXECUTABLE} etc/mkloader.pl ${PICLIB_SCHEME_LIBS} ${PICLIB_CONTRIB_LIBS} > ${PICLIB_SOURCE} - DEPENDS ${PICLIB_SCHEME_LIBS} ${PICLIB_CONTRIB_LIBS} - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - ) - -# contrib -set(CONTRIB_INIT ${PROJECT_SOURCE_DIR}/src/init_contrib.c) -add_custom_command( - OUTPUT ${CONTRIB_INIT} - COMMAND ${PERL_EXECUTABLE} etc/mkinit.pl ${PICRIN_CONTRIB_INITS} > ${CONTRIB_INIT} - DEPENDS ${PICRIN_CONTRIB_SOURCES} - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - ) - -add_library(picrin SHARED ${BENZ_SOURCES} ${PICRIN_SOURCES} ${PICLIB_SOURCE} ${PICRIN_CONTRIB_SOURCES} ${CONTRIB_INIT}) -target_link_libraries(picrin m ${PICRIN_CONTRIB_LIBRARIES}) - -# install -set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib) -install(TARGETS picrin DESTINATION lib) -install(DIRECTORY extlib/benz/include/ DESTINATION include FILES_MATCHING PATTERN "*.h") - -### picrin ### - -list(APPEND REPL_LIBRARIES picrin) - -# build -add_executable(repl src/main.c) -set_target_properties(repl PROPERTIES OUTPUT_NAME picrin) -target_link_libraries(repl ${REPL_LIBRARIES}) - -# install -install(TARGETS repl RUNTIME DESTINATION bin) From ab9c33fc227f96d090c726dcc3d08f685d522dda Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Fri, 29 May 2015 20:43:05 +0900 Subject: [PATCH 119/177] update repl --- contrib/20.repl/repl.scm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contrib/20.repl/repl.scm b/contrib/20.repl/repl.scm index f745ce4e..60411749 100644 --- a/contrib/20.repl/repl.scm +++ b/contrib/20.repl/repl.scm @@ -11,7 +11,9 @@ (else (begin (define (readline str) - (if (tty?) (display str)) + (when (tty?) + (display str) + (flush-output-port)) (read-line)) (define (add-history str) #f)))) From c9da23c2ee3c10665ffd0d01c1a597c61bb0a3c1 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Fri, 29 May 2015 21:12:28 +0900 Subject: [PATCH 120/177] add -lm --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8c2b5dcd..29bfd909 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ debug: CFLAGS += -O0 -g -DDEBUG=1 debug: bin/picrin bin/picrin: $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libbenz.a - $(CC) $(CFLAGS) -o $@ $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libbenz.a + $(CC) $(CFLAGS) -o $@ $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libbenz.a -lm src/load_piclib.c: $(PICRIN_LIBS) $(CONTRIB_LIBS) perl etc/mkloader.pl $(PICRIN_LIBS) $(CONTRIB_LIBS) > $@ From 708f3c2d67a5ae3926a75fcc5b5a7590a948f2a0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 17:58:25 +0900 Subject: [PATCH 121/177] replace readline cmake with equivalent pkg-config call --- Makefile | 8 +- contrib/10.readline/CMakeLists.txt | 17 ---- contrib/10.readline/cmake/FindLibedit.cmake | 107 -------------------- contrib/10.readline/nitro.mk | 7 ++ contrib/10.readline/src/readline.c | 6 -- 5 files changed, 11 insertions(+), 134 deletions(-) delete mode 100644 contrib/10.readline/CMakeLists.txt delete mode 100644 contrib/10.readline/cmake/FindLibedit.cmake create mode 100644 contrib/10.readline/nitro.mk diff --git a/Makefile b/Makefile index 29bfd909..8305c3f8 100644 --- a/Makefile +++ b/Makefile @@ -26,19 +26,20 @@ CONTRIB_DOCS = $(wildcard contrib/*/docs/*.rst) CFLAGS += -I./extlib/benz/include # CFLAGS += -std=c89 -ansi -pedantic +LDFLAGS += -lm prefix = /usr/local all: CFLAGS += -O2 -Wall -Wextra all: bin/picrin -include contrib/*/nitro.mk # nitros define test-foo targets +include contrib/*/nitro.mk debug: CFLAGS += -O0 -g -DDEBUG=1 debug: bin/picrin bin/picrin: $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libbenz.a - $(CC) $(CFLAGS) -o $@ $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libbenz.a -lm + $(CC) $(CFLAGS) -o $@ $(PICRIN_OBJS) $(CONTRIB_OBJS) lib/libbenz.a $(LDFLAGS) src/load_piclib.c: $(PICRIN_LIBS) $(CONTRIB_LIBS) perl etc/mkloader.pl $(PICRIN_LIBS) $(CONTRIB_LIBS) > $@ @@ -49,8 +50,7 @@ src/init_contrib.c: lib/libbenz.a: $(BENZ_OBJS) $(AR) $(ARFLAGS) $@ $(BENZ_OBJS) -%.o: %.c extlib/benz/include/picrin.h extlib/benz/include/picrin/*.h - $(CC) $(CFLAGS) -c -o $@ $< +%.o: extlib/benz/include/picrin.h extlib/benz/include/picrin/*.h doc: docs/*.rst docs/contrib.rst $(MAKE) -C docs html diff --git a/contrib/10.readline/CMakeLists.txt b/contrib/10.readline/CMakeLists.txt deleted file mode 100644 index 413e8c19..00000000 --- a/contrib/10.readline/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# readline - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/contrib/10.readline/cmake/") - -find_package(Libedit) -if (Libedit_FOUND) - add_definitions(${Libedit_DEFINITIONS} -DPIC_READLINE_FOUND=1 -DPIC_READLINE_INCLUDE_DIR_SUFFIX=${Libedit_INCLUDE_DIR_SUFFIX}) - include_directories(${Libedit_INCLUDE_DIR}) - - file(GLOB PICRIN_READLINE_SOURCES ${PROJECT_SOURCE_DIR}/contrib/10.readline/src/*.c) - - list(APPEND PICRIN_CONTRIB_INITS readline) - list(APPEND PICRIN_CONTRIB_LIBRARIES ${Libedit_LIBRARIES}) - list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_READLINE_SOURCES}) - add_custom_target(test-readline for test in ${PROJECT_SOURCE_DIR}/contrib/10.readline/t/*.scm \; do bin/picrin "$$test" \; done DEPENDS repl) - set(CONTRIB_TESTS ${CONTRIB_TESTS} test-readline) -endif(Libedit_FOUND) diff --git a/contrib/10.readline/cmake/FindLibedit.cmake b/contrib/10.readline/cmake/FindLibedit.cmake deleted file mode 100644 index 9a771988..00000000 --- a/contrib/10.readline/cmake/FindLibedit.cmake +++ /dev/null @@ -1,107 +0,0 @@ -# - Try to find libedit -# Once done this will define -# -# Libedit_FOUND - system has libedit -# Libedit_INCLUDE_DIRS - the libedit include directory -# Libedit_LIBRARIES - Link these to use libedit -# Libedit_DEFINITIONS - Compiler switches required for using libedit -# -# Copyright (c) 2014 Yuichi Nishiwaki -# Copyright (c) 2008 Andreas Schneider -# Modified for other libraries by Lasse Kärkkäinen -# -# Redistribution and use is allowed according to the terms of the New -# BSD license. -# - - -if (Libedit_LIBRARIES AND Libedit_INCLUDE_DIRS) - # in cache already - set(Libedit_FOUND TRUE) -else (Libedit_LIBRARIES AND Libedit_INCLUDE_DIRS) - # use pkg-config to get the directories and then use these values - # in the FIND_PATH() and FIND_LIBRARY() calls - if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) - include(UsePkgConfig) - pkgconfig(libedit _Libedit_INCLUDEDIR _Libedit_LIBDIR _Libedit_LDFLAGS _Libedit_CFLAGS) - else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) - find_package(PkgConfig) - if (PKG_CONFIG_FOUND) - pkg_check_modules(_LIBEDIT libedit) - endif (PKG_CONFIG_FOUND) - endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) - find_path(Libedit_EDITLINE_INCLUDE_DIR - NAMES - editline/readline.h - editline/history.h - PATHS - ${_Libedit_INCLUDEDIR} - /usr/include - /usr/local/include - /opt/local/include - /sw/include - ) - if (Libedit_EDITLINE_INCLUDE_DIR) - set(Libedit_INCLUDE_DIR_SUFFIX editline) - set(Libedit_INCLUDE_DIR ${Libedit_EDITLINE_INCLUDE_DIR}) - else (Libedit_EDITLINE_INCLUDE_DIR) - find_path(Libedit_READLINE_INCLUDE_DIR - NAMES - readline/readline.h - readline/history.h - PATHS - /usr/include/edit - /usr/local/include/edit - /opt/local/include/edit - /sw/include/edit - ) - if (Libedit_READLINE_INCLUDE_DIR) - set(Libedit_INCLUDE_DIR_SUFFIX readline) - set(Libedit_INCLUDE_DIR ${Libedit_READLINE_INCLUDE_DIR}) - endif (Libedit_READLINE_INCLUDE_DIR) - endif (Libedit_EDITLINE_INCLUDE_DIR) - - find_library(Libedit_LIBRARY - NAMES - edit - PATHS - ${_Libedit_LIBDIR} - /usr/lib - /usr/local/lib - /opt/local/lib - /sw/lib - ) - - if (Libedit_LIBRARY) - set(Libedit_FOUND TRUE) - endif (Libedit_LIBRARY) - - set(Libedit_INCLUDE_DIRS - ${Libedit_INCLUDE_DIR} - ) - - if (Libedit_FOUND) - set(Libedit_LIBRARIES - ${Libedit_LIBRARIES} - ${Libedit_LIBRARY} - ) - endif (Libedit_FOUND) - - if (Libedit_INCLUDE_DIRS AND Libedit_LIBRARIES) - set(Libedit_FOUND TRUE) - endif (Libedit_INCLUDE_DIRS AND Libedit_LIBRARIES) - - if (Libedit_FOUND) - if (NOT Libedit_FIND_QUIETLY) - message(STATUS "Found libedit: ${Libedit_LIBRARY}, ${Libedit_INCLUDE_DIR}") - endif (NOT Libedit_FIND_QUIETLY) - else (Libedit_FOUND) - if (Libedit_FIND_REQUIRED) - message(FATAL_ERROR "Could not find libedit") - endif (Libedit_FIND_REQUIRED) - endif (Libedit_FOUND) - - # show the Libedit_INCLUDE_DIRS and Libedit_LIBRARIES variables only in the advanced view - mark_as_advanced(Libedit_INCLUDE_DIRS Libedit_LIBRARIES) - -endif (Libedit_LIBRARIES AND Libedit_INCLUDE_DIRS) diff --git a/contrib/10.readline/nitro.mk b/contrib/10.readline/nitro.mk new file mode 100644 index 00000000..91d210b6 --- /dev/null +++ b/contrib/10.readline/nitro.mk @@ -0,0 +1,7 @@ +CONTRIB_SRCS += contrib/10.readline/src/readline.c +CONTRIB_INITS += readline + +LDFLAGS += `pkg-config libedit --libs` + +contrib/src/readline.o: contrib/src/readline.c + $(CC) $(CFLAGS) -o $@ $< `pkg-config libedit --cflags` diff --git a/contrib/10.readline/src/readline.c b/contrib/10.readline/src/readline.c index fe831ddd..84d3f37f 100644 --- a/contrib/10.readline/src/readline.c +++ b/contrib/10.readline/src/readline.c @@ -7,13 +7,7 @@ forget to use the C++ extern "C" to get it to compile. */ #include "picrin.h" -#if PIC_READLINE_INCLUDE_DIR_SUFFIX == readline -#include -#include -#else #include -#include -#endif static pic_value pic_rl_readline(pic_state *pic) From 356643170a7e03bf64917e16dcf983698f4db289 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 17:59:15 +0900 Subject: [PATCH 122/177] don't track bin/picrin --- bin/picrin | Bin 447032 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 bin/picrin diff --git a/bin/picrin b/bin/picrin deleted file mode 100755 index 96f32284a0f6610854f5a71f0d5d0eb4f9ace3b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447032 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 Date: Sat, 30 May 2015 18:13:55 +0900 Subject: [PATCH 123/177] support environments without libedit --- contrib/10.readline/nitro.mk | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/contrib/10.readline/nitro.mk b/contrib/10.readline/nitro.mk index 91d210b6..280d6f52 100644 --- a/contrib/10.readline/nitro.mk +++ b/contrib/10.readline/nitro.mk @@ -1,7 +1,10 @@ -CONTRIB_SRCS += contrib/10.readline/src/readline.c -CONTRIB_INITS += readline +libedit_exists := $(shell pkg-config libedit --exists; echo $$?) -LDFLAGS += `pkg-config libedit --libs` +ifeq ($(libedit_exists),0) + CONTRIB_SRCS += contrib/10.readline/src/readline.c + CONTRIB_INITS += readline + LDFLAGS += `pkg-config libedit --libs` +endif contrib/src/readline.o: contrib/src/readline.c $(CC) $(CFLAGS) -o $@ $< `pkg-config libedit --cflags` From 0d12c11b0ae62029d2da19cd4374c82c45d0eda5 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 18:27:24 +0900 Subject: [PATCH 124/177] replace regexp cmake with nitro.mk --- contrib/10.readline/nitro.mk | 6 ++ contrib/10.regexp/CMakeLists.txt | 18 ------ contrib/10.regexp/cmake/FindREGEX.cmake | 82 ------------------------- contrib/10.regexp/nitro.mk | 8 +++ 4 files changed, 14 insertions(+), 100 deletions(-) delete mode 100644 contrib/10.regexp/CMakeLists.txt delete mode 100644 contrib/10.regexp/cmake/FindREGEX.cmake create mode 100644 contrib/10.regexp/nitro.mk diff --git a/contrib/10.readline/nitro.mk b/contrib/10.readline/nitro.mk index 280d6f52..51d296ea 100644 --- a/contrib/10.readline/nitro.mk +++ b/contrib/10.readline/nitro.mk @@ -3,8 +3,14 @@ libedit_exists := $(shell pkg-config libedit --exists; echo $$?) ifeq ($(libedit_exists),0) CONTRIB_SRCS += contrib/10.readline/src/readline.c CONTRIB_INITS += readline + CONTRIB_TESTS += test-readline LDFLAGS += `pkg-config libedit --libs` endif contrib/src/readline.o: contrib/src/readline.c $(CC) $(CFLAGS) -o $@ $< `pkg-config libedit --cflags` + +test-readline: bin/picrin + for test in `ls contrib/10.readline/t/*.scm`; do \ + bin/picrin $$test; \ + done diff --git a/contrib/10.regexp/CMakeLists.txt b/contrib/10.regexp/CMakeLists.txt deleted file mode 100644 index c13c76d3..00000000 --- a/contrib/10.regexp/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# regex - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/contrib/10.regexp/cmake/") - -find_package(REGEX) - -if (REGEX_FOUND) - add_definitions(${REGEX_DEFINITIONS}) - include_directories(${REGEX_INCLUDE_DIR}) - - file(GLOB PICRIN_REGEX_SOURCES ${PROJECT_SOURCE_DIR}/contrib/10.regexp/src/*.c) - - list(APPEND PICRIN_CONTRIB_INITS regexp) - list(APPEND PICRIN_CONTRIB_LIBRARIES ${REGEX_LIBRARIES}) - list(APPEND PICRIN_CONTRIB_SOURCES ${PICRIN_REGEX_SOURCES}) - add_custom_target(test-regexp for test in ${PROJECT_SOURCE_DIR}/contrib/10.regexp/t/*.scm \; do bin/picrin "$$test" \; done DEPENDS repl) - set(CONTRIB_TESTS ${CONTRIB_TESTS} test-regexp) -endif() diff --git a/contrib/10.regexp/cmake/FindREGEX.cmake b/contrib/10.regexp/cmake/FindREGEX.cmake deleted file mode 100644 index f7b88113..00000000 --- a/contrib/10.regexp/cmake/FindREGEX.cmake +++ /dev/null @@ -1,82 +0,0 @@ -# -*- cmake -*- -# -# FindRegex.cmake: Try to find Regex -# -# Copyright (C) 2014- Yuichi Nishiwaki -# Copyright (C) 2005-2013 EDF-EADS-Phimeca -# -# This library is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# along with this library. If not, see . -# -# @author dutka -# @date 2010-02-04 16:44:49 +0100 (Thu, 04 Feb 2010) -# -# - Try to find Regex -# Once done this will define -# -# REGEX_FOUND - System has Regex -# REGEX_INCLUDE_DIR - The Regex include directory -# REGEX_LIBRARIES - The libraries needed to use Regex -# REGEX_DEFINITIONS - Compiler switches required for using Regex -# -# -# ChangeLogs: -# -# 2014/05/07 - Yuichi Nishiwaki -# On Mac, it finds /System/Library/Frameworks/Ruby.framework/Headers/regex.h, -# which was a part of superold version of glibc when POSIX standard didn't exist. -# To avoid this behavior, we call find_path twice, searching /usr/include and -# /usr/local/include first and if nothing was found then searching $PATH in the -# second stage. -# - -IF (REGEX_INCLUDE_DIR AND REGEX_LIBRARIES) - # in cache already - SET(Regex_FIND_QUIETLY TRUE) -ENDIF (REGEX_INCLUDE_DIR AND REGEX_LIBRARIES) - -#IF (NOT WIN32) -# # use pkg-config to get the directories and then use these values -# # in the FIND_PATH() and FIND_LIBRARY() calls -# FIND_PACKAGE(PkgConfig) -# PKG_CHECK_MODULES(PC_REGEX regex) -# SET(REGEX_DEFINITIONS ${PC_REGEX_CFLAGS_OTHER}) -#ENDIF (NOT WIN32) - -FIND_PATH(REGEX_INCLUDE_DIR regex.h - PATHS /usr/include /usr/local/include - NO_DEFAULT_PATH - ) - -IF (NOT REGEX_INCLUDE_DIR) - FIND_PATH(REGEX_INCLUDE_DIR regex.h - HINTS - ${REGEX_INCLUDEDIR} - ${PC_LIBXML_INCLUDE_DIRS} - PATH_SUFFIXES regex - ) -ENDIF() - -FIND_LIBRARY(REGEX_LIBRARIES NAMES c regex - HINTS - ${PC_REGEX_LIBDIR} - ${PC_REGEX_LIBRARY_DIRS} - ) - -INCLUDE(FindPackageHandleStandardArgs) - -# handle the QUIETLY and REQUIRED arguments and set REGEX_FOUND to TRUE if -# all listed variables are TRUE -FIND_PACKAGE_HANDLE_STANDARD_ARGS(Regex DEFAULT_MSG REGEX_LIBRARIES REGEX_INCLUDE_DIR) - -MARK_AS_ADVANCED(REGEX_INCLUDE_DIR REGEX_LIBRARIES) diff --git a/contrib/10.regexp/nitro.mk b/contrib/10.regexp/nitro.mk new file mode 100644 index 00000000..9fe45e2f --- /dev/null +++ b/contrib/10.regexp/nitro.mk @@ -0,0 +1,8 @@ +CONTRIB_SRCS += contrib/10.regexp/src/regexp.c +CONTRIB_INITS += regexp +CONTRIB_TESTS += test-regexp + +test-regexp: bin/picrin + for test in `ls contrib/10.regexp/t/*.scm`; do \ + bin/picrin $$test; \ + done From 0dc59840c45ed9ae761e2f2c266ddaf569eeeb55 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 19:13:11 +0900 Subject: [PATCH 125/177] update README and docs --- README.md | 74 +++++++++++++++++-------------------------------- docs/deploy.rst | 62 ++++++++++------------------------------- docs/intro.rst | 24 ++++++++-------- 3 files changed, 50 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index 1fccaac1..319b0424 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,18 @@ [![Build Status](https://travis-ci.org/picrin-scheme/picrin.png)](https://travis-ci.org/picrin-scheme/picrin) [![Docs Status](https://readthedocs.org/projects/picrin/badge/?version=latest)](https://picrin.readthedocs.org/) -Picrin is a lightweight scheme implementation intended to comply with full R7RS specification. Its code is written in pure C89 and does not require any special external libraries installed on the platform. +Picrin is a lightweight R7RS scheme implementation written in pure C89. It contains a reasonably fast VM, an improved hygienic macro system, usuful contribution libraries, and simple but powerful C interface. + +- R7RS compatible +- Reentrant design (all VM states are stored in single global state object) +- Bytecode interpreter +- Direct threaded VM +- Internal representation by nan-boxing (available only on x64) +- Conservative call/cc implementation (VM stack and native c stack can interleave) +- Exact GC (simple mark and sweep, partially reference count) +- String representation by rope +- Hygienic macro transformers (syntactic closures, explicit and implicit renaming macros) +- Extended library syntax ## Documentation @@ -17,71 +28,36 @@ https://github.com/picrin-scheme/picrin ## IRC -There is a chat room on chat.freenode.org, channel #picrin. IRC logs here: https://botbot.me/freenode/picrin/ +Our chat room is at #picrin channel, chat.freenode.org. IRC logs here: https://botbot.me/freenode/picrin/ -## How to use it +## Build -To build picrin, you need some build tools installed on your platform. +Just type `make` in the project root directory. You will find an executable binary newly created at bin/ directory. -- cmake (>= 2.6) + $ make +When you are building picrin on x86_64 system, PIC_NAN_BOXING flag is automatically turned on (see include/picrin/config.h for detail). -### Generate Makefile +## Install -Change directory to `build` then run `cmake` to create Makefile. Once `Makefile` is generated you can run `make` command to build picrin. - - $ cd build - $ cmake .. - -Actually you don't necessarily need to move to `build` directory before running `cmake` (in that case `$ cmake .`), but I strongly recommend to follow above instruction. - -Before generating Makefile, you can change some compilation switches to enable or disable optional features. Take *NAN_BOXING* for example, when you turn on "Use C11 feature" flag and the platform supports addresses of 48bit length, it is enabled. - -### Build - -A built executable binary will be under bin/ directory and shared libraries under lib/. - - $ make - -If you are building picrin on other systems than x86_64, PIC_NAN_BOXING flag is automatically turned on (see include/picrin/config.h for detail). - -### Install - -Just running `make install`, picrin library, headers, and runtime binary are install on your system, by default into `/usr/local` directory. You can change this value via cmake. +`make install` target is provided. By default it installs picrin binary into `/usr/local/bin/`. $ make install -### Run +Since picrin does not use autoconf, if you want to specify the install directory, pass the custom path to `make` via command line argument. -Before installing picrin, you can try picrin without breaking any of your system. Simply directly run the binary `bin/picrin` from terminal, or you can use `make` to execute it like this. + $ make install prefix=/path/to/dir - $ make run - -### Run Test -To run all the test including contribs, execute this. - - $ make test - -To test only R7RS features, - - $ make test-r7rs - -### Debug run - -If you execute `cmake` with debug flag `-DCMAKE_BUILD_TYPE=Debug`, it builds the binary with all debug flags enabled (PIC_GC_STRESS, VM_DEBUG, DEBUG). - - $ cmake -DCMAKE_BUILD_TYPE=Debug .. - ## Requirement -Picrin scheme depends on some external libraries to build the binary: +To build Picrin Scheme from source code, some external libraries are required: - perl +- regex.h of POSIX.1 - libedit (optional) -- regex.h of POSIX.1 (optional) -Optional libraries are, if cmake detected them, automatically enabled. -The compilation is tested only on Mac OSX and Ubuntu. I think (or hope) it'll be ok to compile and run on other operating systems such as Arch or Windows, but I don't guarantee :( +Make command automatically turns on optional libraries if available. +Picrin is mainly developed on Mac OS X and only tested on OS X or Ubuntu 14.04+. When you tried to run picrin on other platforms and found something was wrong with it, please send us an issue. ## Authors diff --git a/docs/deploy.rst b/docs/deploy.rst index 7a4a9330..7bb36135 100644 --- a/docs/deploy.rst +++ b/docs/deploy.rst @@ -4,68 +4,34 @@ Installation Installation instructions below. -Build and Install ------------------ - -To build picrin, you need some build tools installed on your platform. - -- cmake (>= 2.6) -- git - -Because of submodule dependencies, it is necessary to get picrin's source code via git clone command. Basically our git dependencies are only due to submodules, so in fact, If you have no git on your machine, it is possible to build it by downloading a tarball from github page as well. But in such case, you are assumed to modify CMakeLists.txt by yourself to get it work completely. We just strongly recommend you to use git-clone. - -Generate Makefile -^^^^^^^^^^^^^^^^^ - -Change directory to `build` then run `ccmake` to create Makefile. Once `Makefile` is generated you can run `make` command to build picrin:: - - $ cd build - - $ ccmake .. - -Actually you don't necessarily need to move to `build` directory before running `ccmake` (in that case `$ ccmake .`), but I strongly recommend to follow above instruction. - -Before generating Makefile, you can change some compilation switches to enable or disable optional features. Take *NAN_BOXING* for example, when you turn on "Use C11 feature" flag and the platform supports addresses of 48bit length, it is enabled. - Build -^^^^^ +----- -A built executable binary will be under bin/ directory and shared libraries under lib/:: +Just type `make` in the project root directory. You will find an executable binary newly created at bin/ directory. - $ make + $ make -If you are building picrin on other systems than x86_64, PIC_NAN_BOXING flag is automatically turned on (see include/picrin/config.h for detail). +When you are building picrin on x86_64 system, PIC_NAN_BOXING flag is automatically turned on (see include/picrin/config.h for detail). Install -^^^^^^^ +------- -Just running `make install`, picrin library, headers, and runtime binary are install on your system, by default into `/usr/local` directory. You can change this value via ccmake:: +`make install` target is provided. By default it installs picrin binary into `/usr/local/bin/`. - $ make install + $ make install -Run -^^^ - -Before installing picrin, you can try picrin without breaking any of your system. Simply directly run the binary `bin/picrin` from terminal, or you can use `make` to execute it like this:: - - $ make run - -Debug run -^^^^^^^^^ - -If you execute `cmake` with debug flag `-DCMAKE_BUILD_TYPE=Debug`, it builds the binary with all debug flags enabled (PIC_GC_STRESS, VM_DEBUG, DEBUG):: - - $ cmake -DCMAKE_BUILD_TYPE=Debug .. +Since picrin does not use autoconf, if you want to specify the install directory, pass the custom path to `make` via command line argument. + $ make install prefix=/path/to/dir Requirement ----------- -Picrin scheme depends on some external libraries to build the binary: +To build Picrin Scheme from source code, some external libraries are required: - perl -- readline (optional) -- regex.h of POSIX.1 (optional) +- regex.h of POSIX.1 +- libedit (optional) -Optional libraries are, if cmake detected them, automatically enabled. -The compilation is tested only on Mac OSX and Ubuntu. I think (or hope) it'll be ok to compile and run on other operating systems such as Arch or Windows, but I don't guarantee :( +Make command automatically turns on optional libraries if available. +Picrin is mainly developed on Mac OS X and only tested on OS X or Ubuntu 14.04+. When you tried to run picrin on other platforms and found something was wrong with it, please send us an issue. diff --git a/docs/intro.rst b/docs/intro.rst index 5cc22c15..fa72e69c 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -1,20 +1,18 @@ Introduction ============ -Picrin is a lightweight scheme implementation intended to comply with full R7RS specification. Its code is written in pure C89 and does not require any special external libraries installed on the platform. +Picrin is a lightweight R7RS scheme implementation written in pure C89. It contains a reasonably fast VM, an improved hygienic macro system, usuful contribution libraries, and simple but powerful C interface. -- R7RS compatibility -- reentrant design (all VM states are stored in single global state object) -- bytecode interpreter (based on stack VM) -- direct threaded VM -- internal representation by nan-boxing -- conservative call/cc implementation (users can freely interleave native stack with VM stack) -- exact GC (simple mark and sweep, partially reference count is used as well) -- string representation by rope data structure -- support full set hygienic macro transformers, including implicit renaming macros -- extended library syntax -- advanced REPL support (multi-line input, etc) -- tiny & portable library (all functions will be in `libpicrin.so`) +- R7RS compatible +- Reentrant design (all VM states are stored in single global state object) +- Bytecode interpreter +- Direct threaded VM +- Internal representation by nan-boxing (available only on x64) +- Conservative call/cc implementation (VM stack and native c stack can interleave) +- Exact GC (simple mark and sweep, partially reference count) +- String representation by rope +- Hygienic macro transformers (syntactic closures, explicit and implicit renaming macros) +- Extended library syntax Homepage -------- From 92bed39faed1d60f8234c7dbd91ab75253bb436f Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 19:39:18 +0900 Subject: [PATCH 126/177] merge file/load/mutable-string/system/time contribs into r7rs --- contrib/03.file/nitro.mk | 2 -- contrib/03.load/nitro.mk | 2 -- contrib/03.mutable-string/nitro.mk | 2 -- contrib/03.system/nitro.mk | 2 -- contrib/03.time/nitro.mk | 2 -- contrib/05.r7rs/nitro.mk | 10 +++++++++ contrib/{03.file => 05.r7rs}/src/file.c | 0 contrib/{03.load => 05.r7rs}/src/load.c | 0 .../src}/mutable-string.c | 0 contrib/05.r7rs/src/r7rs.c | 21 +++++++++++++++++++ contrib/{03.system => 05.r7rs}/src/system.c | 0 contrib/{03.time => 05.r7rs}/src/time.c | 0 12 files changed, 31 insertions(+), 10 deletions(-) delete mode 100644 contrib/03.file/nitro.mk delete mode 100644 contrib/03.load/nitro.mk delete mode 100644 contrib/03.mutable-string/nitro.mk delete mode 100644 contrib/03.system/nitro.mk delete mode 100644 contrib/03.time/nitro.mk rename contrib/{03.file => 05.r7rs}/src/file.c (100%) rename contrib/{03.load => 05.r7rs}/src/load.c (100%) rename contrib/{03.mutable-string => 05.r7rs/src}/mutable-string.c (100%) create mode 100644 contrib/05.r7rs/src/r7rs.c rename contrib/{03.system => 05.r7rs}/src/system.c (100%) rename contrib/{03.time => 05.r7rs}/src/time.c (100%) diff --git a/contrib/03.file/nitro.mk b/contrib/03.file/nitro.mk deleted file mode 100644 index d6bcbd93..00000000 --- a/contrib/03.file/nitro.mk +++ /dev/null @@ -1,2 +0,0 @@ -CONTRIB_INITS += file -CONTRIB_SRCS += $(wildcard contrib/03.file/src/*.c) diff --git a/contrib/03.load/nitro.mk b/contrib/03.load/nitro.mk deleted file mode 100644 index 87566d36..00000000 --- a/contrib/03.load/nitro.mk +++ /dev/null @@ -1,2 +0,0 @@ -CONTRIB_INITS += load -CONTRIB_SRCS += $(wildcard contrib/03.load/src/*.c) diff --git a/contrib/03.mutable-string/nitro.mk b/contrib/03.mutable-string/nitro.mk deleted file mode 100644 index 37d31b55..00000000 --- a/contrib/03.mutable-string/nitro.mk +++ /dev/null @@ -1,2 +0,0 @@ -CONTRIB_INITS += mutable_string -CONTRIB_SRCS += $(wildcard contrib/03.mutable-string/*.c) diff --git a/contrib/03.system/nitro.mk b/contrib/03.system/nitro.mk deleted file mode 100644 index e9553587..00000000 --- a/contrib/03.system/nitro.mk +++ /dev/null @@ -1,2 +0,0 @@ -CONTRIB_INITS += system -CONTRIB_SRCS += $(wildcard contrib/03.system/src/*.c) diff --git a/contrib/03.time/nitro.mk b/contrib/03.time/nitro.mk deleted file mode 100644 index 61b7c4d3..00000000 --- a/contrib/03.time/nitro.mk +++ /dev/null @@ -1,2 +0,0 @@ -CONTRIB_INITS += time -CONTRIB_SRCS += $(wildcard contrib/03.time/src/*.c) diff --git a/contrib/05.r7rs/nitro.mk b/contrib/05.r7rs/nitro.mk index b811b92e..56bf8f2f 100644 --- a/contrib/05.r7rs/nitro.mk +++ b/contrib/05.r7rs/nitro.mk @@ -1,3 +1,13 @@ +CONTRIB_INITS += r7rs + +CONTRIB_SRCS += \ + contrib/05.r7rs/src/r7rs.c\ + contrib/05.r7rs/src/file.c\ + contrib/05.r7rs/src/load.c\ + contrib/05.r7rs/src/mutable-string.c\ + contrib/05.r7rs/src/system.c\ + contrib/05.r7rs/src/time.c + CONTRIB_LIBS += \ contrib/05.r7rs/scheme/base.scm\ contrib/05.r7rs/scheme/cxr.scm\ diff --git a/contrib/03.file/src/file.c b/contrib/05.r7rs/src/file.c similarity index 100% rename from contrib/03.file/src/file.c rename to contrib/05.r7rs/src/file.c diff --git a/contrib/03.load/src/load.c b/contrib/05.r7rs/src/load.c similarity index 100% rename from contrib/03.load/src/load.c rename to contrib/05.r7rs/src/load.c diff --git a/contrib/03.mutable-string/mutable-string.c b/contrib/05.r7rs/src/mutable-string.c similarity index 100% rename from contrib/03.mutable-string/mutable-string.c rename to contrib/05.r7rs/src/mutable-string.c diff --git a/contrib/05.r7rs/src/r7rs.c b/contrib/05.r7rs/src/r7rs.c new file mode 100644 index 00000000..ad3090aa --- /dev/null +++ b/contrib/05.r7rs/src/r7rs.c @@ -0,0 +1,21 @@ +/** + * See Copyright Notice in picrin.h + */ + +#include "picrin.h" + +void pic_init_file(pic_state *); +void pic_init_load(pic_state *); +void pic_init_mutable_string(pic_state *); +void pic_init_system(pic_state *); +void pic_init_time(pic_state *); + +void +pic_init_r7rs(pic_state *pic) +{ + pic_init_file(pic); + pic_init_load(pic); + pic_init_mutable_string(pic); + pic_init_system(pic); + pic_init_time(pic); +} diff --git a/contrib/03.system/src/system.c b/contrib/05.r7rs/src/system.c similarity index 100% rename from contrib/03.system/src/system.c rename to contrib/05.r7rs/src/system.c diff --git a/contrib/03.time/src/time.c b/contrib/05.r7rs/src/time.c similarity index 100% rename from contrib/03.time/src/time.c rename to contrib/05.r7rs/src/time.c From bad14933d2e721f5089905f46aa9393c05392b24 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 19:57:12 +0900 Subject: [PATCH 127/177] add test-nostdlib target --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8305c3f8..6890aa97 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,6 @@ CONTRIB_TESTS = CONTRIB_DOCS = $(wildcard contrib/*/docs/*.rst) CFLAGS += -I./extlib/benz/include -# CFLAGS += -std=c89 -ansi -pedantic LDFLAGS += -lm prefix = /usr/local @@ -73,6 +72,10 @@ test-r7rs: bin/picrin t/r7rs-tests.scm test-contribs: bin/picrin $(CONTRIB_TESTS) +test-nostdlib: + $(CC) -I extlib/benz/include -D'PIC_ENABLE_LIBC=0' -D'PIC_ENABLE_FLOAT=0'-nostdlib -shared -std=c89 -ansi -pedantic -Wall -Wextra -Werror -o lib/libbenz.so $(BENZ_SRCS) + rm -f lib/libbenz.so + install: all install -c bin/picrin $(prefix)/bin/picrin From 334ceb9e7cf608e55867dc2afa2d8a7beace0c6e Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 19:57:32 +0900 Subject: [PATCH 128/177] fix bugs unveiled by the previous commit --- extlib/benz/error.c | 4 ++-- extlib/benz/include/picrin/value.h | 3 +-- extlib/benz/vm.c | 12 ++++++------ extlib/benz/xfile.c | 18 ++++++++++++------ 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/extlib/benz/error.c b/extlib/benz/error.c index d9ea00dd..8882da54 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -7,14 +7,14 @@ void pic_panic(pic_state PIC_UNUSED(*pic), const char *msg) { + extern void abort(); + #if DEBUG fprintf(stderr, "abort: %s\n", msg); #else (void)msg; #endif PIC_ABORT(pic); - - PIC_UNREACHABLE(); } void diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index 42c65295..c821d06f 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -220,9 +220,8 @@ pic_valid_int(double v) #else PIC_INLINE bool -pic_valid_int(int v) +pic_valid_int(int PIC_UNUSED(v)) { - PIC_UNUSED(v); return true; } #endif diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index c6cb42b1..0daf0c72 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -109,9 +109,9 @@ pic_get_args(pic_state *pic, const char *format, ...) #if PIC_ENABLE_FLOAT case 'f': { double *f; + pic_value v; f = va_arg(ap, double *); - pic_value v; v = GET_OPERAND(pic, i); switch (pic_type(v)) { @@ -129,10 +129,10 @@ pic_get_args(pic_state *pic, const char *format, ...) case 'F': { double *f; bool *e; + pic_value v; f = va_arg(ap, double *); e = va_arg(ap, bool *); - pic_value v; v = GET_OPERAND(pic, i); switch (pic_type(v)) { @@ -152,10 +152,10 @@ pic_get_args(pic_state *pic, const char *format, ...) case 'I': { int *k; bool *e; + pic_value v; k = va_arg(ap, int *); e = va_arg(ap, bool *); - pic_value v; v = GET_OPERAND(pic, i); switch (pic_type(v)) { @@ -175,9 +175,9 @@ pic_get_args(pic_state *pic, const char *format, ...) #endif case 'i': { int *k; + pic_value v; k = va_arg(ap, int *); - pic_value v; v = GET_OPERAND(pic, i); switch (pic_type(v)) { @@ -196,12 +196,12 @@ pic_get_args(pic_state *pic, const char *format, ...) } case 'k': { size_t *k; - - k = va_arg(ap, size_t *); pic_value v; int x; size_t s; + k = va_arg(ap, size_t *); + v = GET_OPERAND(pic, i); switch (pic_type(v)) { case PIC_TT_INT: diff --git a/extlib/benz/xfile.c b/extlib/benz/xfile.c index d09bf9bf..a071aced 100644 --- a/extlib/benz/xfile.c +++ b/extlib/benz/xfile.c @@ -94,6 +94,8 @@ xFILE *xfunopen(void *cookie, int (*read)(void *, char *, int), int (*write)(voi } int xfclose(xFILE *fp) { + extern void free(void *); /* FIXME */ + xfflush(fp); fp->flag = 0; if (fp->base != fp->buf) @@ -102,6 +104,7 @@ int xfclose(xFILE *fp) { } int x_fillbuf(xFILE *fp) { + extern void *malloc(size_t); /* FIXME */ int bufsize; if ((fp->flag & (X_READ|X_EOF|X_ERR)) != X_READ) @@ -136,6 +139,7 @@ int x_fillbuf(xFILE *fp) { } int x_flushbuf(int x, xFILE *fp) { + extern void *malloc(size_t); /* FIXME */ int num_written=0, bufsize=0; char c = x; @@ -284,14 +288,15 @@ int xungetc(int c, xFILE *fp) { } size_t xfread(void *ptr, size_t size, size_t count, xFILE *fp) { + char *bptr = ptr; long nbytes; int c; nbytes = size * count; while (nbytes > fp->cnt) { - memcpy((char *)ptr, fp->ptr, fp->cnt); + memcpy(bptr, fp->ptr, fp->cnt); fp->ptr += fp->cnt; - ptr += fp->cnt; + bptr += fp->cnt; nbytes -= fp->cnt; if ((c = x_fillbuf(fp)) == EOF) { return (size * count - nbytes) / size; @@ -299,26 +304,27 @@ size_t xfread(void *ptr, size_t size, size_t count, xFILE *fp) { xungetc(c, fp); } } - memcpy((char *)ptr, fp->ptr, nbytes); + memcpy(bptr, fp->ptr, nbytes); fp->ptr += nbytes; fp->cnt -= nbytes; return count; } size_t xfwrite(const void *ptr, size_t size, size_t count, xFILE *fp) { + const char *bptr = ptr; long nbytes; nbytes = size * count; while (nbytes > fp->cnt) { - memcpy(fp->ptr, (char *)ptr, fp->cnt); + memcpy(fp->ptr, bptr, fp->cnt); fp->ptr += fp->cnt; - ptr += fp->cnt; + bptr += fp->cnt; nbytes -= fp->cnt; if (x_flushbuf(EOF, fp) == EOF) { return (size * count - nbytes) / size; } } - memcpy(fp->ptr, (char *)ptr, nbytes); + memcpy(fp->ptr, bptr, nbytes); fp->ptr += nbytes; fp->cnt -= nbytes; return count; From ce25121837336d2778252ffa87925323ad06bf67 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 20:01:17 +0900 Subject: [PATCH 129/177] run test-nostdlib when make test runs --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6890aa97..e5f430b0 100644 --- a/Makefile +++ b/Makefile @@ -65,7 +65,7 @@ docs/contrib.rst: $(CONTRIB_DOCS) run: bin/picrin bin/picrin -test: test-r7rs test-contribs +test: test-r7rs test-contribs test-nostdlib test-r7rs: bin/picrin t/r7rs-tests.scm bin/picrin t/r7rs-tests.scm From 617de67b94ac7e23ff69fdc3deb5eb5ded409d7d Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 20:05:04 +0900 Subject: [PATCH 130/177] cleanup --- extlib/benz/xfile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/xfile.c b/extlib/benz/xfile.c index a071aced..b28bf060 100644 --- a/extlib/benz/xfile.c +++ b/extlib/benz/xfile.c @@ -374,7 +374,7 @@ int xfprintf(xFILE *stream, const char *fmt, ...) { } static int print_int(xFILE *stream, long x, int base) { - static char digits[] = "0123456789abcdef"; + static const char digits[] = "0123456789abcdef"; char buf[20]; int i, c, neg; From bebda9407fd6c9124c20ca0b0059823480413644 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 22:07:25 +0900 Subject: [PATCH 131/177] don't do -Werror --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e5f430b0..22842b9a 100644 --- a/Makefile +++ b/Makefile @@ -73,7 +73,7 @@ test-r7rs: bin/picrin t/r7rs-tests.scm test-contribs: bin/picrin $(CONTRIB_TESTS) test-nostdlib: - $(CC) -I extlib/benz/include -D'PIC_ENABLE_LIBC=0' -D'PIC_ENABLE_FLOAT=0'-nostdlib -shared -std=c89 -ansi -pedantic -Wall -Wextra -Werror -o lib/libbenz.so $(BENZ_SRCS) + $(CC) -I extlib/benz/include -D'PIC_ENABLE_LIBC=0' -D'PIC_ENABLE_FLOAT=0'-nostdlib -shared -std=c89 -ansi -pedantic -Wall -Wextra -o lib/libbenz.so $(BENZ_SRCS) rm -f lib/libbenz.so install: all From d0e10b49a7cc718f429d3e0f2497e7d629cd916b Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 22:34:51 +0900 Subject: [PATCH 132/177] pic_env -> pic_context --- contrib/03.callcc/callcc.c | 4 +- extlib/benz/gc.c | 22 +++++----- extlib/benz/include/picrin.h | 4 +- extlib/benz/include/picrin/proc.h | 12 +++--- extlib/benz/include/picrin/value.h | 6 +-- extlib/benz/proc.c | 6 +-- extlib/benz/vm.c | 66 +++++++++++++++--------------- 7 files changed, 60 insertions(+), 60 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index e6750347..4020849c 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -66,8 +66,8 @@ cont_mark(pic_state *pic, void *data, void (*mark)(pic_state *, pic_value)) /* callinfo */ for (ci = cont->ci_ptr + cont->ci_offset; ci != cont->ci_ptr; --ci) { - if (ci->env) { - mark(pic, pic_obj_value(ci->env)); + if (ci->cxt) { + mark(pic, pic_obj_value(ci->cxt)); } } diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 9a3c4c25..6f314178 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -354,22 +354,22 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) gc_mark(pic, ((struct pic_pair *)obj)->cdr); break; } - case PIC_TT_ENV: { - struct pic_env *env = (struct pic_env *)obj; + case PIC_TT_CXT: { + struct pic_context *cxt = (struct pic_context *)obj; int i; - for (i = 0; i < env->regc; ++i) { - gc_mark(pic, env->regs[i]); + for (i = 0; i < cxt->regc; ++i) { + gc_mark(pic, cxt->regs[i]); } - if (env->up) { - gc_mark_object(pic, (struct pic_object *)env->up); + if (cxt->up) { + gc_mark_object(pic, (struct pic_object *)cxt->up); } break; } case PIC_TT_PROC: { struct pic_proc *proc = (struct pic_proc *)obj; - if (proc->env) { - gc_mark_object(pic, (struct pic_object *)proc->env); + if (proc->cxt) { + gc_mark_object(pic, (struct pic_object *)proc->cxt); } if (pic_proc_irep_p(proc)) { gc_mark_object(pic, (struct pic_object *)proc->u.irep); @@ -542,8 +542,8 @@ gc_mark_phase(pic_state *pic) /* callinfo */ for (ci = pic->ci; ci != pic->cibase; --ci) { - if (ci->env) { - gc_mark_object(pic, (struct pic_object *)ci->env); + if (ci->cxt) { + gc_mark_object(pic, (struct pic_object *)ci->cxt); } } @@ -619,7 +619,7 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) case PIC_TT_PAIR: { break; } - case PIC_TT_ENV: { + case PIC_TT_CXT: { break; } case PIC_TT_PROC: { diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 941935f9..84ab6f45 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -59,10 +59,10 @@ typedef struct { int argc, retc; pic_code *ip; pic_value *fp; - struct pic_env *env; + struct pic_context *cxt; int regc; pic_value *regs; - struct pic_env *up; + struct pic_context *up; } pic_callinfo; typedef void *(*pic_allocf)(void *, size_t); diff --git a/extlib/benz/include/picrin/proc.h b/extlib/benz/include/picrin/proc.h index edf128ae..472dfe8a 100644 --- a/extlib/benz/include/picrin/proc.h +++ b/extlib/benz/include/picrin/proc.h @@ -15,11 +15,11 @@ struct pic_func { pic_sym *name; }; -struct pic_env { +struct pic_context { PIC_OBJECT_HEADER pic_value *regs; int regc; - struct pic_env *up; + struct pic_context *up; pic_value storage[1]; }; @@ -30,7 +30,7 @@ struct pic_proc { struct pic_func func; struct pic_irep *irep; } u; - struct pic_env *env; + struct pic_context *cxt; }; #define PIC_PROC_KIND_FUNC 1 @@ -42,11 +42,11 @@ struct pic_proc { #define pic_proc_p(o) (pic_type(o) == PIC_TT_PROC) #define pic_proc_ptr(o) ((struct pic_proc *)pic_ptr(o)) -#define pic_env_p(o) (pic_type(o) == PIC_TT_ENV) -#define pic_env_ptr(o) ((struct pic_env *)pic_ptr(o)) +#define pic_context_p(o) (pic_type(o) == PIC_TT_CXT) +#define pic_context_ptr(o) ((struct pic_context *)pic_ptr(o)) 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 *); +struct pic_proc *pic_make_proc_irep(pic_state *, struct pic_irep *, struct pic_context *); pic_sym *pic_proc_name(struct pic_proc *); diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index c821d06f..7f07ff4e 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -155,7 +155,7 @@ enum pic_tt { PIC_TT_PROC, PIC_TT_PORT, PIC_TT_ERROR, - PIC_TT_ENV, + PIC_TT_CXT, PIC_TT_SENV, PIC_TT_LIB, PIC_TT_IREP, @@ -306,8 +306,8 @@ pic_type_repr(enum pic_tt tt) return "port"; case PIC_TT_ERROR: return "error"; - case PIC_TT_ENV: - return "env"; + case PIC_TT_CXT: + return "cxt"; case PIC_TT_PROC: return "proc"; case PIC_TT_SENV: diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index 2f7d2d11..71b3195a 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -18,19 +18,19 @@ pic_make_proc(pic_state *pic, pic_func_t func, const char *name) proc->kind = PIC_PROC_KIND_FUNC; proc->u.func.f = func; proc->u.func.name = sym; - proc->env = NULL; + proc->cxt = NULL; return proc; } struct pic_proc * -pic_make_proc_irep(pic_state *pic, struct pic_irep *irep, struct pic_env *env) +pic_make_proc_irep(pic_state *pic, struct pic_irep *irep, struct pic_context *cxt) { struct pic_proc *proc; proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc), PIC_TT_PROC); proc->kind = PIC_PROC_KIND_IREP; proc->u.irep = irep; - proc->env = env; + proc->cxt = cxt; return proc; } diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 0daf0c72..9d26ee6b 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -473,33 +473,33 @@ pic_defvar(pic_state *pic, const char *name, pic_value init, struct pic_proc *co } static void -vm_push_env(pic_state *pic) +vm_push_cxt(pic_state *pic) { pic_callinfo *ci = pic->ci; - ci->env = (struct pic_env *)pic_obj_alloc(pic, sizeof(struct pic_env) + sizeof(pic_value) * (size_t)(ci->regc), PIC_TT_ENV); - ci->env->up = ci->up; - ci->env->regc = ci->regc; - ci->env->regs = ci->regs; + ci->cxt = (struct pic_context *)pic_obj_alloc(pic, sizeof(struct pic_context) + sizeof(pic_value) * (size_t)(ci->regc), PIC_TT_CXT); + ci->cxt->up = ci->up; + ci->cxt->regc = ci->regc; + ci->cxt->regs = ci->regs; } static void vm_tear_off(pic_callinfo *ci) { - struct pic_env *env; + struct pic_context *cxt; int i; - assert(ci->env != NULL); + assert(ci->cxt != NULL); - env = ci->env; + cxt = ci->cxt; - if (env->regs == env->storage) { + if (cxt->regs == cxt->storage) { return; /* is torn off */ } - for (i = 0; i < env->regc; ++i) { - env->storage[i] = env->regs[i]; + for (i = 0; i < cxt->regc; ++i) { + cxt->storage[i] = cxt->regs[i]; } - env->regs = env->storage; + cxt->regs = cxt->storage; } void @@ -508,7 +508,7 @@ pic_vm_tear_off(pic_state *pic) pic_callinfo *ci; for (ci = pic->ci; ci > pic->cibase; ci--) { - if (ci->env != NULL) { + if (ci->cxt != NULL) { vm_tear_off(ci); } } @@ -764,10 +764,10 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) pic_callinfo *ci = pic->ci; struct pic_irep *irep; - if (ci->env != NULL && ci->env->regs == ci->env->storage) { + if (ci->cxt != NULL && ci->cxt->regs == ci->cxt->storage) { irep = pic_get_proc(pic)->u.irep; if (c.u.i >= irep->argc + irep->localc) { - PUSH(ci->env->regs[c.u.i - (ci->regs - ci->fp)]); + PUSH(ci->cxt->regs[c.u.i - (ci->regs - ci->fp)]); NEXT; } } @@ -778,10 +778,10 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) pic_callinfo *ci = pic->ci; struct pic_irep *irep; - if (ci->env != NULL && ci->env->regs == ci->env->storage) { + if (ci->cxt != NULL && ci->cxt->regs == ci->cxt->storage) { irep = pic_get_proc(pic)->u.irep; if (c.u.i >= irep->argc + irep->localc) { - ci->env->regs[c.u.i - (ci->regs - ci->fp)] = POP(); + ci->cxt->regs[c.u.i - (ci->regs - ci->fp)] = POP(); NEXT; } } @@ -790,24 +790,24 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) } CASE(OP_CREF) { int depth = c.u.r.depth; - struct pic_env *env; + struct pic_context *cxt; - env = pic->ci->up; + cxt = pic->ci->up; while (--depth) { - env = env->up; + cxt = cxt->up; } - PUSH(env->regs[c.u.r.idx]); + PUSH(cxt->regs[c.u.r.idx]); NEXT; } CASE(OP_CSET) { int depth = c.u.r.depth; - struct pic_env *env; + struct pic_context *cxt; - env = pic->ci->up; + cxt = pic->ci->up; while (--depth) { - env = env->up; + cxt = cxt->up; } - env->regs[c.u.r.idx] = POP(); + cxt->regs[c.u.r.idx] = POP(); NEXT; } CASE(OP_JMP) { @@ -858,7 +858,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) ci->retc = 1; ci->ip = pic->ip; ci->fp = pic->sp - c.u.i; - ci->env = NULL; + ci->cxt = NULL; if (pic_proc_func_p(pic_proc_ptr(x))) { /* invoke! */ @@ -899,8 +899,8 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) } } - /* prepare env */ - ci->up = proc->env; + /* prepare cxt */ + ci->up = proc->cxt; ci->regc = irep->capturec; ci->regs = ci->fp + irep->argc + irep->localc; @@ -914,7 +914,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) pic_value *argv; pic_callinfo *ci; - if (pic->ci->env != NULL) { + if (pic->ci->cxt != NULL) { vm_tear_off(pic->ci); } @@ -940,7 +940,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) pic_value *retv; pic_callinfo *ci; - if (pic->ci->env != NULL) { + if (pic->ci->cxt != NULL) { vm_tear_off(pic->ci); } @@ -974,11 +974,11 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) pic_errorf(pic, "logic flaw"); } - if (pic->ci->env == NULL) { - vm_push_env(pic); + if (pic->ci->cxt == NULL) { + vm_push_cxt(pic); } - proc = pic_make_proc_irep(pic, irep->irep[c.u.i], pic->ci->env); + proc = pic_make_proc_irep(pic, irep->irep[c.u.i], pic->ci->cxt); PUSH(pic_obj_value(proc)); pic_gc_arena_restore(pic, ai); NEXT; From 599d8f5980dec0d3530364f32249c4fc6cbf77b9 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 22:39:03 +0900 Subject: [PATCH 133/177] pic_senv -> pic_env --- extlib/benz/gc.c | 14 +-- extlib/benz/include/picrin/lib.h | 2 +- extlib/benz/include/picrin/macro.h | 22 ++--- extlib/benz/include/picrin/value.h | 6 +- extlib/benz/lib.c | 6 +- extlib/benz/macro.c | 148 ++++++++++++++--------------- 6 files changed, 99 insertions(+), 99 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 6f314178..c60f377a 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -402,14 +402,14 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) case PIC_TT_BLOB: { break; } - case PIC_TT_SENV: { - struct pic_senv *senv = (struct pic_senv *)obj; + case PIC_TT_ENV: { + struct pic_env *env = (struct pic_env *)obj; - if (senv->up) { - gc_mark_object(pic, (struct pic_object *)senv->up); + if (env->up) { + gc_mark_object(pic, (struct pic_object *)env->up); } - gc_mark(pic, senv->defer); - gc_mark_object(pic, (struct pic_object *)senv->map); + gc_mark(pic, env->defer); + gc_mark_object(pic, (struct pic_object *)env->map); break; } case PIC_TT_LIB: { @@ -643,7 +643,7 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) case PIC_TT_ERROR: { break; } - case PIC_TT_SENV: { + case PIC_TT_ENV: { break; } case PIC_TT_LIB: { diff --git a/extlib/benz/include/picrin/lib.h b/extlib/benz/include/picrin/lib.h index d0611425..c2d0b420 100644 --- a/extlib/benz/include/picrin/lib.h +++ b/extlib/benz/include/picrin/lib.h @@ -12,7 +12,7 @@ extern "C" { struct pic_lib { PIC_OBJECT_HEADER pic_value name; - struct pic_senv *env; + struct pic_env *env; struct pic_dict *exports; }; diff --git a/extlib/benz/include/picrin/macro.h b/extlib/benz/include/picrin/macro.h index 07ca86d1..076c8c15 100644 --- a/extlib/benz/include/picrin/macro.h +++ b/extlib/benz/include/picrin/macro.h @@ -9,28 +9,28 @@ extern "C" { #endif -struct pic_senv { +struct pic_env { PIC_OBJECT_HEADER struct pic_dict *map; pic_value defer; - struct pic_senv *up; + struct pic_env *up; }; -#define pic_senv_p(v) (pic_type(v) == PIC_TT_SENV) -#define pic_senv_ptr(v) ((struct pic_senv *)pic_ptr(v)) +#define pic_env_p(v) (pic_type(v) == PIC_TT_ENV) +#define pic_env_ptr(v) ((struct pic_env *)pic_ptr(v)) -struct pic_senv *pic_null_syntactic_environment(pic_state *); +struct pic_env *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_env *, pic_sym *, struct pic_env *, pic_sym *); -struct pic_senv *pic_make_senv(pic_state *, struct pic_senv *); +struct pic_env *pic_make_env(pic_state *, struct pic_env *); -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_env *, pic_sym *); +bool pic_find_rename(pic_state *, struct pic_env *, pic_sym *, pic_sym ** /* = NULL */); +void pic_put_rename(pic_state *, struct pic_env *, 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_env *, pic_sym *, pic_sym *); #if defined(__cplusplus) } diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index 7f07ff4e..02b06293 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -156,7 +156,7 @@ enum pic_tt { PIC_TT_PORT, PIC_TT_ERROR, PIC_TT_CXT, - PIC_TT_SENV, + PIC_TT_ENV, PIC_TT_LIB, PIC_TT_IREP, PIC_TT_DATA, @@ -310,8 +310,8 @@ pic_type_repr(enum pic_tt tt) return "cxt"; case PIC_TT_PROC: return "proc"; - case PIC_TT_SENV: - return "senv"; + case PIC_TT_ENV: + return "env"; case PIC_TT_LIB: return "lib"; case PIC_TT_IREP: diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 5e364af0..ffa0583b 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -8,7 +8,7 @@ struct pic_lib * pic_open_library(pic_state *pic, pic_value name) { struct pic_lib *lib; - struct pic_senv *senv; + struct pic_env *env; struct pic_dict *exports; if ((lib = pic_find_library(pic, name)) != NULL) { @@ -22,12 +22,12 @@ pic_open_library(pic_state *pic, pic_value name) return lib; } - senv = pic_null_syntactic_environment(pic); + env = 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->name = name; - lib->env = senv; + lib->env = env; lib->exports = exports; /* register! */ diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index 219c225d..ed7625fd 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -5,29 +5,29 @@ #include "picrin.h" pic_sym * -pic_add_rename(pic_state *pic, struct pic_senv *senv, pic_sym *sym) +pic_add_rename(pic_state *pic, struct pic_env *env, pic_sym *sym) { pic_sym *rename; rename = pic_gensym(pic, sym); - pic_put_rename(pic, senv, sym, rename); + pic_put_rename(pic, env, sym, rename); return rename; } 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_env *env, pic_sym *sym, pic_sym *rename) { - pic_dict_set(pic, senv->map, sym, pic_obj_value(rename)); + pic_dict_set(pic, env->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_env *env, pic_sym *sym, pic_sym **rename) { - if (! pic_dict_has(pic, senv->map, sym)) { + if (! pic_dict_has(pic, env->map, sym)) { return false; } if (rename != NULL) { - *rename = pic_sym_ptr(pic_dict_ref(pic, senv->map, sym)); + *rename = pic_sym_ptr(pic_dict_ref(pic, env->map, sym)); } return true; } @@ -48,17 +48,17 @@ find_macro(pic_state *pic, pic_sym *rename) } static pic_sym * -make_identifier(pic_state *pic, pic_sym *sym, struct pic_senv *senv) +make_identifier(pic_state *pic, pic_sym *sym, struct pic_env *env) { pic_sym *rename; while (true) { - if (pic_find_rename(pic, senv, sym, &rename)) { + if (pic_find_rename(pic, env, sym, &rename)) { return rename; } - if (! senv->up) + if (! env->up) break; - senv = senv->up; + env = env->up; } if (! pic_interned_p(pic, sym)) { return sym; @@ -68,13 +68,13 @@ make_identifier(pic_state *pic, pic_sym *sym, struct pic_senv *senv) } } -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(pic_state *, pic_value, struct pic_env *); +static pic_value macroexpand_lambda(pic_state *, pic_value, struct pic_env *); 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_env *env) { - return pic_obj_value(make_identifier(pic, sym, senv)); + return pic_obj_value(make_identifier(pic, sym, env)); } static pic_value @@ -84,17 +84,17 @@ macroexpand_quote(pic_state *pic, pic_value expr) } static pic_value -macroexpand_list(pic_state *pic, pic_value obj, struct pic_senv *senv) +macroexpand_list(pic_state *pic, pic_value obj, struct pic_env *env) { size_t ai = pic_gc_arena_preserve(pic); pic_value x, head, tail; if (pic_pair_p(obj)) { - head = macroexpand(pic, pic_car(pic, obj), senv); - tail = macroexpand_list(pic, pic_cdr(pic, obj), senv); + head = macroexpand(pic, pic_car(pic, obj), env); + tail = macroexpand_list(pic, pic_cdr(pic, obj), env); x = pic_cons(pic, head, tail); } else { - x = macroexpand(pic, obj, senv); + x = macroexpand(pic, obj, env); } pic_gc_arena_restore(pic, ai); @@ -103,46 +103,46 @@ macroexpand_list(pic_state *pic, pic_value obj, struct pic_senv *senv) } static pic_value -macroexpand_defer(pic_state *pic, pic_value expr, struct pic_senv *senv) +macroexpand_defer(pic_state *pic, pic_value expr, struct pic_env *env) { pic_value skel = pic_list1(pic, pic_none_value()); /* (#) */ - pic_push(pic, pic_cons(pic, expr, skel), senv->defer); + pic_push(pic, pic_cons(pic, expr, skel), env->defer); return skel; } static void -macroexpand_deferred(pic_state *pic, struct pic_senv *senv) +macroexpand_deferred(pic_state *pic, struct pic_env *env) { pic_value defer, val, src, dst, it; - pic_for_each (defer, pic_reverse(pic, senv->defer), it) { + pic_for_each (defer, pic_reverse(pic, env->defer), it) { src = pic_car(pic, defer); dst = pic_cdr(pic, defer); - val = macroexpand_lambda(pic, src, senv); + val = macroexpand_lambda(pic, src, env); /* copy */ pic_pair_ptr(dst)->car = pic_car(pic, val); pic_pair_ptr(dst)->cdr = pic_cdr(pic, val); } - senv->defer = pic_nil_value(); + env->defer = pic_nil_value(); } static pic_value -macroexpand_lambda(pic_state *pic, pic_value expr, struct pic_senv *senv) +macroexpand_lambda(pic_state *pic, pic_value expr, struct pic_env *env) { pic_value formal, body; - struct pic_senv *in; + struct pic_env *in; pic_value a; if (pic_length(pic, expr) < 2) { pic_errorf(pic, "syntax error"); } - in = pic_make_senv(pic, senv); + in = pic_make_env(pic, env); for (a = pic_cadr(pic, expr); pic_pair_p(a); a = pic_cdr(pic, a)) { pic_value v = pic_car(pic, a); @@ -168,7 +168,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) +macroexpand_define(pic_state *pic, pic_value expr, struct pic_env *env) { pic_sym *sym, *rename; pic_value var, val; @@ -189,16 +189,16 @@ macroexpand_define(pic_state *pic, pic_value expr, struct pic_senv *senv) pic_errorf(pic, "binding to non-symbol object"); } sym = pic_sym_ptr(var); - if (! pic_find_rename(pic, senv, sym, &rename)) { - rename = pic_add_rename(pic, senv, sym); + if (! pic_find_rename(pic, env, sym, &rename)) { + rename = pic_add_rename(pic, env, sym); } - val = macroexpand(pic, pic_list_ref(pic, expr, 2), senv); + val = macroexpand(pic, pic_list_ref(pic, expr, 2), env); return pic_list3(pic, pic_obj_value(pic->rDEFINE), pic_obj_value(rename), val); } static pic_value -macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) +macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_env *env) { pic_value var, val; pic_sym *sym, *rename; @@ -212,8 +212,8 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) pic_errorf(pic, "binding to non-symbol object"); } sym = pic_sym_ptr(var); - if (! pic_find_rename(pic, senv, sym, &rename)) { - rename = pic_add_rename(pic, senv, sym); + if (! pic_find_rename(pic, env, sym, &rename)) { + rename = pic_add_rename(pic, env, sym); } else { pic_warnf(pic, "redefining syntax variable: ~s", pic_obj_value(sym)); } @@ -230,7 +230,7 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", var); } - val = pic_apply1(pic, pic_proc_ptr(val), pic_obj_value(senv)); + val = pic_apply1(pic, pic_proc_ptr(val), pic_obj_value(env)); if (! pic_proc_p(val)) { pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", var); @@ -242,7 +242,7 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_senv *senv) } static pic_value -macroexpand_macro(pic_state *pic, struct pic_proc *mac, pic_value expr, struct pic_senv *senv) +macroexpand_macro(pic_state *pic, struct pic_proc *mac, pic_value expr, struct pic_env *env) { pic_value v, args; @@ -252,7 +252,7 @@ macroexpand_macro(pic_state *pic, struct pic_proc *mac, pic_value expr, struct p puts(""); #endif - args = pic_list2(pic, expr, pic_obj_value(senv)); + args = pic_list2(pic, expr, pic_obj_value(env)); pic_try { v = pic_apply(pic, mac, args); @@ -270,11 +270,11 @@ macroexpand_macro(pic_state *pic, struct pic_proc *mac, pic_value expr, struct p } static pic_value -macroexpand_node(pic_state *pic, pic_value expr, struct pic_senv *senv) +macroexpand_node(pic_state *pic, pic_value expr, struct pic_env *env) { switch (pic_type(expr)) { case PIC_TT_SYMBOL: { - return macroexpand_symbol(pic, pic_sym_ptr(expr), senv); + return macroexpand_symbol(pic, pic_sym_ptr(expr), env); } case PIC_TT_PAIR: { pic_value car; @@ -284,29 +284,29 @@ macroexpand_node(pic_state *pic, pic_value expr, struct pic_senv *senv) pic_errorf(pic, "cannot macroexpand improper list: ~s", expr); } - car = macroexpand(pic, pic_car(pic, expr), senv); + car = macroexpand(pic, pic_car(pic, expr), env); if (pic_sym_p(car)) { pic_sym *tag = pic_sym_ptr(car); if (tag == pic->rDEFINE_SYNTAX) { - return macroexpand_defsyntax(pic, expr, senv); + return macroexpand_defsyntax(pic, expr, env); } else if (tag == pic->rLAMBDA) { - return macroexpand_defer(pic, expr, senv); + return macroexpand_defer(pic, expr, env); } else if (tag == pic->rDEFINE) { - return macroexpand_define(pic, expr, senv); + return macroexpand_define(pic, expr, env); } else if (tag == pic->rQUOTE) { return macroexpand_quote(pic, expr); } if ((mac = find_macro(pic, tag)) != NULL) { - return macroexpand_node(pic, macroexpand_macro(pic, mac, expr, senv), senv); + return macroexpand_node(pic, macroexpand_macro(pic, mac, expr, env), env); } } - return pic_cons(pic, car, macroexpand_list(pic, pic_cdr(pic, expr), senv)); + return pic_cons(pic, car, macroexpand_list(pic, pic_cdr(pic, expr), env)); } default: return expr; @@ -314,7 +314,7 @@ macroexpand_node(pic_state *pic, pic_value expr, struct pic_senv *senv) } static pic_value -macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv) +macroexpand(pic_state *pic, pic_value expr, struct pic_env *env) { size_t ai = pic_gc_arena_preserve(pic); pic_value v; @@ -325,7 +325,7 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv) puts(""); #endif - v = macroexpand_node(pic, expr, senv); + v = macroexpand_node(pic, expr, env); pic_gc_arena_restore(pic, ai); pic_gc_protect(pic, v); @@ -365,44 +365,44 @@ pic_macroexpand(pic_state *pic, pic_value expr, struct pic_lib *lib) return v; } -struct pic_senv * -pic_make_senv(pic_state *pic, struct pic_senv *up) +struct pic_env * +pic_make_env(pic_state *pic, struct pic_env *up) { - struct pic_senv *senv; + struct pic_env *env; 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(); - senv->map = map; + env = (struct pic_env *)pic_obj_alloc(pic, sizeof(struct pic_env), PIC_TT_ENV); + env->up = up; + env->defer = pic_nil_value(); + env->map = map; - return senv; + return env; } -struct pic_senv * +struct pic_env * pic_null_syntactic_environment(pic_state *pic) { - struct pic_senv *senv; + struct pic_env *env; - senv = pic_make_senv(pic, NULL); + env = pic_make_env(pic, NULL); - pic_define_syntactic_keyword(pic, senv, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY); - pic_define_syntactic_keyword(pic, senv, pic->sIMPORT, pic->rIMPORT); - pic_define_syntactic_keyword(pic, senv, pic->sEXPORT, pic->rEXPORT); - pic_define_syntactic_keyword(pic, senv, pic->sIN_LIBRARY, pic->rIN_LIBRARY); - pic_define_syntactic_keyword(pic, senv, pic->sCOND_EXPAND, pic->rCOND_EXPAND); + pic_define_syntactic_keyword(pic, env, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY); + pic_define_syntactic_keyword(pic, env, pic->sIMPORT, pic->rIMPORT); + pic_define_syntactic_keyword(pic, env, pic->sEXPORT, pic->rEXPORT); + pic_define_syntactic_keyword(pic, env, pic->sIN_LIBRARY, pic->rIN_LIBRARY); + pic_define_syntactic_keyword(pic, env, pic->sCOND_EXPAND, pic->rCOND_EXPAND); - return senv; + return env; } 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_env *env, pic_sym *sym, pic_sym *rsym) { - pic_put_rename(pic, senv, sym, rsym); + pic_put_rename(pic, env, sym, rsym); - if (pic->lib && pic->lib->env == senv) { + if (pic->lib && pic->lib->env == env) { pic_export(pic, sym); } } @@ -446,7 +446,7 @@ 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_env *env1, pic_sym *sym1, struct pic_env *env2, pic_sym *sym2) { pic_sym *a, *b; @@ -481,9 +481,9 @@ pic_macro_make_identifier(pic_state *pic) pic_get_args(pic, "mo", &sym, &obj); - pic_assert_type(pic, obj, senv); + pic_assert_type(pic, obj, env); - return pic_obj_value(make_identifier(pic, sym, pic_senv_ptr(obj))); + return pic_obj_value(make_identifier(pic, sym, pic_env_ptr(obj))); } static pic_value @@ -494,10 +494,10 @@ pic_macro_identifier_eq_p(pic_state *pic) pic_get_args(pic, "omom", &env1, &sym1, &env2, &sym2); - pic_assert_type(pic, env1, senv); - pic_assert_type(pic, env2, senv); + pic_assert_type(pic, env1, env); + pic_assert_type(pic, env2, env); - return pic_bool_value(pic_identifier_eq_p(pic, pic_senv_ptr(env1), sym1, pic_senv_ptr(env2), sym2)); + return pic_bool_value(pic_identifier_eq_p(pic, pic_env_ptr(env1), sym1, pic_env_ptr(env2), sym2)); } void From 5092affcfc79293a63233df09f45bc9739c409b3 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 30 May 2015 23:07:31 +0900 Subject: [PATCH 134/177] add -fPIC --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 22842b9a..757c480e 100644 --- a/Makefile +++ b/Makefile @@ -73,7 +73,7 @@ test-r7rs: bin/picrin t/r7rs-tests.scm test-contribs: bin/picrin $(CONTRIB_TESTS) test-nostdlib: - $(CC) -I extlib/benz/include -D'PIC_ENABLE_LIBC=0' -D'PIC_ENABLE_FLOAT=0'-nostdlib -shared -std=c89 -ansi -pedantic -Wall -Wextra -o lib/libbenz.so $(BENZ_SRCS) + $(CC) -I extlib/benz/include -D'PIC_ENABLE_LIBC=0' -D'PIC_ENABLE_FLOAT=0'-nostdlib -fPIC -shared -std=c89 -ansi -pedantic -Wall -Wextra -o lib/libbenz.so $(BENZ_SRCS) rm -f lib/libbenz.so install: all From 221f089716b5b060bdceeb7b7d87c48fef27dead Mon Sep 17 00:00:00 2001 From: "Sunrim KIM (keen)" <3han5chou7@gmail.com> Date: Sat, 30 May 2015 23:45:54 +0900 Subject: [PATCH 135/177] remove prototype declaration of function macro --- extlib/benz/include/picrin/xhash.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/extlib/benz/include/picrin/xhash.h b/extlib/benz/include/picrin/xhash.h index 9a3aafe4..253c25f2 100644 --- a/extlib/benz/include/picrin/xhash.h +++ b/extlib/benz/include/picrin/xhash.h @@ -54,19 +54,16 @@ typedef struct xhash { */ /* string map */ -PIC_INLINE void xh_init_str(xhash *x, size_t width); PIC_INLINE xh_entry *xh_get_str(xhash *x, const char *key); PIC_INLINE xh_entry *xh_put_str(xhash *x, const char *key, void *); PIC_INLINE void xh_del_str(xhash *x, const char *key); /* object map */ -PIC_INLINE void xh_init_ptr(xhash *x, size_t width); PIC_INLINE xh_entry *xh_get_ptr(xhash *x, const void *key); PIC_INLINE xh_entry *xh_put_ptr(xhash *x, const void *key, void *); PIC_INLINE void xh_del_ptr(xhash *x, const void *key); /* int map */ -PIC_INLINE void xh_init_int(xhash *x, size_t width); PIC_INLINE xh_entry *xh_get_int(xhash *x, int key); PIC_INLINE xh_entry *xh_put_int(xhash *x, int key, void *); PIC_INLINE void xh_del_int(xhash *x, int key); From 15e61d8cd404f14153f2dba4b1719b2595eccf2b Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 31 May 2015 00:25:40 +0900 Subject: [PATCH 136/177] pic_open_library -> pic_make_library --- Makefile | 2 +- extlib/benz/include/picrin.h | 7 +++++-- extlib/benz/lib.c | 15 +++++---------- extlib/benz/state.c | 4 ++-- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 757c480e..6aab7070 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ src/init_contrib.c: lib/libbenz.a: $(BENZ_OBJS) $(AR) $(ARFLAGS) $@ $(BENZ_OBJS) -%.o: extlib/benz/include/picrin.h extlib/benz/include/picrin/*.h +$(PICRIN_OBJS) $(CONTRIB_OBJS): extlib/benz/include/picrin.h extlib/benz/include/picrin/*.h doc: docs/*.rst docs/contrib.rst $(MAKE) -C docs html diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 84ab6f45..46da1afe 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -203,13 +203,16 @@ struct pic_proc *pic_compile(pic_state *, pic_value, struct pic_lib *); pic_value pic_macroexpand(pic_state *, pic_value, struct pic_lib *); void pic_in_library(pic_state *, pic_value); -struct pic_lib *pic_open_library(pic_state *, pic_value); +struct pic_lib *pic_make_library(pic_state *, pic_value); struct pic_lib *pic_find_library(pic_state *, pic_value); #define pic_deflibrary(pic, spec) \ for (((assert(pic->prev_lib == NULL)), \ (pic->prev_lib = pic->lib), \ - (pic->lib = pic_open_library(pic, pic_read_cstr(pic, (spec))))); \ + (pic->lib = pic_find_library(pic, pic_read_cstr(pic, (spec)))), \ + (pic->lib = pic->lib \ + ? pic->lib \ + : pic_make_library(pic, pic_read_cstr(pic, (spec))))); \ pic->prev_lib != NULL; \ ((pic->lib = pic->prev_lib), \ (pic->prev_lib = NULL))) diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index ffa0583b..8eff0bb7 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -5,21 +5,14 @@ #include "picrin.h" struct pic_lib * -pic_open_library(pic_state *pic, pic_value name) +pic_make_library(pic_state *pic, pic_value name) { struct pic_lib *lib; struct pic_env *env; struct pic_dict *exports; if ((lib = pic_find_library(pic, name)) != NULL) { - -#if DEBUG - printf("* reopen library: "); - pic_debug(pic, name); - puts(""); -#endif - - return lib; + pic_errorf(pic, "library name already in use: ~s", name); } env = pic_null_syntactic_environment(pic); @@ -295,7 +288,9 @@ pic_lib_define_library(pic_state *pic) pic_get_args(pic, "o*", &spec, &argc, &argv); - pic_open_library(pic, spec); + if (! pic_find_library(pic, spec)) { + pic_make_library(pic, spec); + } pic_try { pic_in_library(pic, spec); diff --git a/extlib/benz/state.c b/extlib/benz/state.c index c4207987..521b9a0d 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -322,8 +322,8 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) pic->xSTDERR = pic_make_standard_port(pic, xstderr, PIC_PORT_OUT); /* standard libraries */ - pic->PICRIN_BASE = pic_open_library(pic, pic_read_cstr(pic, "(picrin base)")); - pic->PICRIN_USER = pic_open_library(pic, pic_read_cstr(pic, "(picrin user)")); + pic->PICRIN_BASE = pic_make_library(pic, pic_read_cstr(pic, "(picrin base)")); + pic->PICRIN_USER = pic_make_library(pic, pic_read_cstr(pic, "(picrin user)")); pic->lib = pic->PICRIN_USER; pic->prev_lib = NULL; From f7b7655830ab8186a74a7cf61360caf07bd149cb Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 31 May 2015 14:32:56 +0900 Subject: [PATCH 137/177] always -Wall -Wextra --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 6aab7070..df08ccf4 100644 --- a/Makefile +++ b/Makefile @@ -24,12 +24,12 @@ CONTRIB_INITS = CONTRIB_TESTS = CONTRIB_DOCS = $(wildcard contrib/*/docs/*.rst) -CFLAGS += -I./extlib/benz/include +CFLAGS += -I./extlib/benz/include -Wall -Wextra LDFLAGS += -lm prefix = /usr/local -all: CFLAGS += -O2 -Wall -Wextra +all: CFLAGS += -O2 all: bin/picrin include contrib/*/nitro.mk From 83a84c3582fa15fdfcdace744cbd605a69fa21fe Mon Sep 17 00:00:00 2001 From: "Sunrim KIM (keen)" <3han5chou7@gmail.com> Date: Sun, 31 May 2015 21:25:49 +0900 Subject: [PATCH 138/177] sort include files in order to ensure directory name sorting works --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index df08ccf4..705d55c3 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ prefix = /usr/local all: CFLAGS += -O2 all: bin/picrin -include contrib/*/nitro.mk +include $(sort $(wildcard contrib/*/nitro.mk)) debug: CFLAGS += -O0 -g -DDEBUG=1 debug: bin/picrin From 6e9024b23777f3134561fb94d5d7678e2506d23f Mon Sep 17 00:00:00 2001 From: "Sunrim KIM (keen)" <3han5chou7@gmail.com> Date: Sun, 31 May 2015 21:26:06 +0900 Subject: [PATCH 139/177] don't pass NULL to memcpy --- extlib/benz/port.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/port.c b/extlib/benz/port.c index 58bd0826..ab5c39d8 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -133,9 +133,9 @@ string_open(pic_state *pic, const char *data, size_t size) m->end = size; m->capa = size; - memcpy(m->buf, data, size); if (data != NULL) { + memcpy(m->buf, data, size); file = xfunopen(m, string_read, NULL, string_seek, string_close); } else { file = xfunopen(m, NULL, string_write, string_seek, string_close); From e0c837baee2eebf810f61f7387d4d5b08e96d806 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 05:00:17 +0900 Subject: [PATCH 140/177] don't do pop_try in pic_raise --- extlib/benz/error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 8882da54..81daee96 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -167,7 +167,7 @@ pic_raise(pic_state *pic, pic_value err) val = pic_raise_continuable(pic, err); - pic_pop_try(pic); + --pic->xp; pic_errorf(pic, "error handler returned with ~s on error ~s", val, err); } From 1e3bb6f1bbd233b848a22b96bf52fb5b4b45a946 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 05:14:43 +0900 Subject: [PATCH 141/177] cleanup pic_push_try --- extlib/benz/error.c | 6 ++---- extlib/benz/include/picrin/error.h | 10 +++++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 81daee96..73370cd8 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -81,14 +81,12 @@ native_exception_handler(pic_state *pic) } void -pic_push_try(pic_state *pic, struct pic_escape *escape) +pic_push_try(pic_state *pic, struct pic_proc *cont) { - struct pic_proc *cont, *handler; + struct pic_proc *handler; size_t xp_len; ptrdiff_t xp_offset; - cont = pic_make_econt(pic, escape); - handler = pic_make_proc(pic, native_exception_handler, "(native-exception-handler)"); pic_attr_set(pic, pic_obj_value(handler), "@@escape", pic_obj_value(cont)); diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index ddf14e85..617f29f8 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -33,11 +33,11 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) struct pic_escape *escape = pic_malloc(pic, sizeof(struct pic_escape)); \ pic_save_point(pic, escape); \ if (PIC_SETJMP(pic, (void *)escape->jmp) == 0) { \ - pic_push_try(pic, escape); \ - do + do { \ + pic_push_try(pic, pic_make_econt(pic, escape)); #define pic_catch_(label) \ - while (0); \ - pic_pop_try(pic); \ + pic_pop_try(pic); \ + } while (0); \ } else { \ goto label; \ } \ @@ -45,7 +45,7 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) if (0) \ label: -void pic_push_try(pic_state *, struct pic_escape *); +void pic_push_try(pic_state *, struct pic_proc *); void pic_pop_try(pic_state *); pic_value pic_raise_continuable(pic_state *, pic_value); From dbcd81c8c191825d2decc7afcb96960843d62bb5 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 05:58:47 +0900 Subject: [PATCH 142/177] [bugfix] calling dead escape continuation causes segv --- contrib/03.callcc/callcc.c | 6 ++++++ extlib/benz/cont.c | 22 +++++++++++++++------- extlib/benz/error.c | 14 +------------- extlib/benz/include/picrin.h | 6 ++++++ extlib/benz/include/picrin/config.h | 6 +++--- extlib/benz/include/picrin/cont.h | 4 +--- extlib/benz/include/picrin/error.h | 4 +++- extlib/benz/state.c | 3 +++ 8 files changed, 38 insertions(+), 27 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index 4020849c..4019df18 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -3,6 +3,8 @@ struct pic_cont { jmp_buf jmp; + pic_jmpbuf *prev_jmp; + struct pic_winder *wind; char *stk_pos, *stk_ptr; @@ -115,6 +117,8 @@ save_cont(pic_state *pic, struct pic_cont **c) cont = *c = pic_malloc(pic, sizeof(struct pic_cont)); + cont->prev_jmp = pic->jmp; + cont->wind = pic->wind; cont->stk_len = native_stack_length(pic, &pos); @@ -170,6 +174,8 @@ restore_cont(pic_state *pic, struct pic_cont *cont) if (&v > cont->stk_pos + cont->stk_len) native_stack_extend(pic, cont); } + pic->jmp = cont->prev_jmp; + pic->wind = cont->wind; pic->stbase = pic_realloc(pic, pic->stbase, sizeof(pic_value) * cont->st_len); diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 90cccc60..e9891cf9 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -51,7 +51,8 @@ pic_dynamic_wind(pic_state *pic, struct pic_proc *in, struct pic_proc *thunk, st void pic_save_point(pic_state *pic, struct pic_escape *escape) { - escape->valid = true; + escape->jmp.prev = pic->jmp; + pic->jmp = &escape->jmp; /* save runtime context */ escape->wind = pic->wind; @@ -67,7 +68,14 @@ pic_save_point(pic_state *pic, struct pic_escape *escape) void pic_load_point(pic_state *pic, struct pic_escape *escape) { - if (! escape->valid) { + pic_jmpbuf *jmp; + + for (jmp = pic->jmp; jmp != NULL; jmp = jmp->prev) { + if (jmp == &escape->jmp) { + break; + } + } + if (jmp == NULL) { pic_errorf(pic, "calling dead escape continuation"); } @@ -80,8 +88,6 @@ pic_load_point(pic_state *pic, struct pic_escape *escape) pic->xp = pic->xpbase + escape->xp_offset; pic->arena_idx = escape->arena_idx; pic->ip = escape->ip; - - escape->valid = false; } static pic_value @@ -98,7 +104,7 @@ escape_call(pic_state *pic) pic_load_point(pic, e->data); - PIC_LONGJMP(pic, (void *)((struct pic_escape *)e->data)->jmp, 1); + PIC_LONGJMP(pic, (void *)((struct pic_escape *)e->data)->jmp.buf, 1); PIC_UNREACHABLE(); } @@ -127,7 +133,9 @@ pic_escape(pic_state *pic, struct pic_proc *proc) pic_save_point(pic, escape); - if (PIC_SETJMP(pic, (void *)escape->jmp)) { + if (PIC_SETJMP(pic, (void *)escape->jmp.buf)) { + pic->jmp = pic->jmp->prev; + return pic_values_by_list(pic, escape->results); } else { @@ -135,7 +143,7 @@ pic_escape(pic_state *pic, struct pic_proc *proc) val = pic_apply1(pic, proc, pic_obj_value(pic_make_econt(pic, escape))); - escape->valid = false; + pic->jmp = pic->jmp->prev; return val; } diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 73370cd8..d9684386 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -105,19 +105,7 @@ pic_push_try(pic_state *pic, struct pic_proc *cont) void pic_pop_try(pic_state *pic) { - pic_value cont, escape; - - assert(pic->xp > pic->xpbase); - - cont = pic_attr_ref(pic, pic_obj_value(*--pic->xp), "@@escape"); - - assert(pic_proc_p(cont)); - - escape = pic_attr_ref(pic, cont, "@@escape"); - - assert(pic_data_p(escape)); - - ((struct pic_escape *)pic_data_ptr(escape)->data)->valid = false; + --pic->xp; } struct pic_error * diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 46da1afe..faf3b29f 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -48,6 +48,11 @@ extern "C" { typedef struct pic_code pic_code; +typedef struct pic_jmpbuf { + PIC_JMPBUF buf; + struct pic_jmpbuf *prev; +} pic_jmpbuf; + struct pic_winder { struct pic_proc *in; struct pic_proc *out; @@ -73,6 +78,7 @@ typedef struct { pic_allocf allocf; + pic_jmpbuf *jmp; struct pic_winder *wind; pic_value *sp; diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index a0274422..4b98679d 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -21,7 +21,7 @@ /* #define PIC_NONE_IS_FALSE 1 */ /** custom setjmp/longjmp */ -/* #define PIC_JMPBUF_SIZE sizeof(jmp_buf) */ +/* #define PIC_JMPBUF jmp_buf */ /* #define PIC_SETJMP(pic, buf) setjmp(buf) */ /* #define PIC_LONGJMP(pic, buf, val) longjmp((buf), (val)) */ @@ -100,9 +100,9 @@ # define PIC_NONE_IS_FALSE 1 #endif -#ifndef PIC_JMPBUF_SIZE +#ifndef PIC_JMPBUF # include -# define PIC_JMPBUF_SIZE sizeof(jmp_buf) +# define PIC_JMPBUF jmp_buf #endif #ifndef PIC_SETJMP diff --git a/extlib/benz/include/picrin/cont.h b/extlib/benz/include/picrin/cont.h index 72fda5b2..b3002577 100644 --- a/extlib/benz/include/picrin/cont.h +++ b/extlib/benz/include/picrin/cont.h @@ -10,9 +10,7 @@ extern "C" { #endif struct pic_escape { - char jmp[PIC_JMPBUF_SIZE]; - - bool valid; + pic_jmpbuf jmp; struct pic_winder *wind; diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index 617f29f8..e7aaf920 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -32,13 +32,15 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) do { \ struct pic_escape *escape = pic_malloc(pic, sizeof(struct pic_escape)); \ pic_save_point(pic, escape); \ - if (PIC_SETJMP(pic, (void *)escape->jmp) == 0) { \ + if (PIC_SETJMP(pic, (void *)escape->jmp.buf) == 0) { \ do { \ pic_push_try(pic, pic_make_econt(pic, escape)); #define pic_catch_(label) \ pic_pop_try(pic); \ } while (0); \ + pic->jmp = pic->jmp->prev; \ } else { \ + pic->jmp = pic->jmp->prev; \ goto label; \ } \ } while (0); \ diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 521b9a0d..13a17e09 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -156,6 +156,9 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) /* turn off GC */ pic->gc_enable = false; + /* jmp */ + pic->jmp = NULL; + /* root block */ pic->wind = NULL; From 02f0d00578542ed24071e4e54ed56cd78c613190 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 06:03:35 +0900 Subject: [PATCH 143/177] update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 705d55c3..737c2985 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ src/init_contrib.c: lib/libbenz.a: $(BENZ_OBJS) $(AR) $(ARFLAGS) $@ $(BENZ_OBJS) -$(PICRIN_OBJS) $(CONTRIB_OBJS): extlib/benz/include/picrin.h extlib/benz/include/picrin/*.h +$(BENZ_OBJS) $(PICRIN_OBJS) $(CONTRIB_OBJS): extlib/benz/include/picrin.h extlib/benz/include/picrin/*.h doc: docs/*.rst docs/contrib.rst $(MAKE) -C docs html From 5df4e4f64efb7a5fbc3391b84420fc68732e11b8 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 06:18:09 +0900 Subject: [PATCH 144/177] rename functions related to continuation --- contrib/03.callcc/callcc.c | 34 +++++++++++++++--------------- extlib/benz/cont.c | 20 +++++++++--------- extlib/benz/include/picrin/cont.h | 10 ++++----- extlib/benz/include/picrin/error.h | 10 ++++----- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index 4019df18..2f953269 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -1,6 +1,6 @@ #include "picrin.h" -struct pic_cont { +struct pic_fullcont { jmp_buf jmp; pic_jmpbuf *prev_jmp; @@ -31,7 +31,7 @@ struct pic_cont { static void cont_dtor(pic_state *pic, void *data) { - struct pic_cont *cont = data; + struct pic_fullcont *cont = data; pic_free(pic, cont->stk_ptr); pic_free(pic, cont->st_ptr); @@ -44,7 +44,7 @@ cont_dtor(pic_state *pic, void *data) static void cont_mark(pic_state *pic, void *data, void (*mark)(pic_state *, pic_value)) { - struct pic_cont *cont = data; + struct pic_fullcont *cont = data; struct pic_winder *wind; pic_value *stack; pic_callinfo *ci; @@ -89,8 +89,8 @@ cont_mark(pic_state *pic, void *data, void (*mark)(pic_state *, pic_value)) static const pic_data_type cont_type = { "continuation", cont_dtor, cont_mark }; -static void save_cont(pic_state *, struct pic_cont **); -static void restore_cont(pic_state *, struct pic_cont *); +static void save_cont(pic_state *, struct pic_fullcont **); +static void restore_cont(pic_state *, struct pic_fullcont *); static ptrdiff_t native_stack_length(pic_state *pic, char **pos) @@ -107,15 +107,15 @@ native_stack_length(pic_state *pic, char **pos) } static void -save_cont(pic_state *pic, struct pic_cont **c) +save_cont(pic_state *pic, struct pic_fullcont **c) { void pic_vm_tear_off(pic_state *); - struct pic_cont *cont; + struct pic_fullcont *cont; char *pos; pic_vm_tear_off(pic); /* tear off */ - cont = *c = pic_malloc(pic, sizeof(struct pic_cont)); + cont = *c = pic_malloc(pic, sizeof(struct pic_fullcont)); cont->prev_jmp = pic->jmp; @@ -153,7 +153,7 @@ save_cont(pic_state *pic, struct pic_cont **c) } static void -native_stack_extend(pic_state *pic, struct pic_cont *cont) +native_stack_extend(pic_state *pic, struct pic_fullcont *cont) { volatile pic_value v[1024]; @@ -162,10 +162,10 @@ native_stack_extend(pic_state *pic, struct pic_cont *cont) } PIC_NORETURN static void -restore_cont(pic_state *pic, struct pic_cont *cont) +restore_cont(pic_state *pic, struct pic_fullcont *cont) { char v; - struct pic_cont *tmp = cont; + struct pic_fullcont *tmp = cont; if (&v < pic->native_stack_start) { if (&v > cont->stk_pos) native_stack_extend(pic, cont); @@ -211,7 +211,7 @@ cont_call(pic_state *pic) struct pic_proc *proc; size_t argc; pic_value *argv; - struct pic_cont *cont; + struct pic_fullcont *cont; proc = pic_get_proc(pic); pic_get_args(pic, "*", &argc, &argv); @@ -226,9 +226,9 @@ cont_call(pic_state *pic) } pic_value -pic_callcc(pic_state *pic, struct pic_proc *proc) +pic_callcc_full(pic_state *pic, struct pic_proc *proc) { - struct pic_cont *cont; + struct pic_fullcont *cont; save_cont(pic, &cont); if (setjmp(cont->jmp)) { @@ -250,9 +250,9 @@ pic_callcc(pic_state *pic, struct pic_proc *proc) } static pic_value -pic_callcc_trampoline(pic_state *pic, struct pic_proc *proc) +pic_callcc_full_trampoline(pic_state *pic, struct pic_proc *proc) { - struct pic_cont *cont; + struct pic_fullcont *cont; save_cont(pic, &cont); if (setjmp(cont->jmp)) { @@ -280,7 +280,7 @@ pic_callcc_callcc(pic_state *pic) pic_get_args(pic, "l", &cb); - return pic_callcc_trampoline(pic, cb); + return pic_callcc_full_trampoline(pic, cb); } #define pic_redefun(pic, lib, name, func) \ diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index e9891cf9..8ea5b896 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -49,7 +49,7 @@ pic_dynamic_wind(pic_state *pic, struct pic_proc *in, struct pic_proc *thunk, st } void -pic_save_point(pic_state *pic, struct pic_escape *escape) +pic_save_point(pic_state *pic, struct pic_cont *escape) { escape->jmp.prev = pic->jmp; pic->jmp = &escape->jmp; @@ -66,7 +66,7 @@ pic_save_point(pic_state *pic, struct pic_escape *escape) } void -pic_load_point(pic_state *pic, struct pic_escape *escape) +pic_load_point(pic_state *pic, struct pic_cont *escape) { pic_jmpbuf *jmp; @@ -100,17 +100,17 @@ escape_call(pic_state *pic) pic_get_args(pic, "*", &argc, &argv); e = pic_data_ptr(pic_attr_ref(pic, pic_obj_value(pic_get_proc(pic)), "@@escape")); - ((struct pic_escape *)e->data)->results = pic_list_by_array(pic, argc, argv); + ((struct pic_cont *)e->data)->results = pic_list_by_array(pic, argc, argv); pic_load_point(pic, e->data); - PIC_LONGJMP(pic, (void *)((struct pic_escape *)e->data)->jmp.buf, 1); + PIC_LONGJMP(pic, ((struct pic_cont *)e->data)->jmp.buf, 1); PIC_UNREACHABLE(); } struct pic_proc * -pic_make_econt(pic_state *pic, struct pic_escape *escape) +pic_make_cont(pic_state *pic, struct pic_cont *escape) { static const pic_data_type escape_type = { "escape", pic_free, NULL }; struct pic_proc *cont; @@ -127,13 +127,13 @@ pic_make_econt(pic_state *pic, struct pic_escape *escape) } pic_value -pic_escape(pic_state *pic, struct pic_proc *proc) +pic_callcc(pic_state *pic, struct pic_proc *proc) { - struct pic_escape *escape = pic_malloc(pic, sizeof(struct pic_escape)); + struct pic_cont *escape = pic_malloc(pic, sizeof(struct pic_cont)); pic_save_point(pic, escape); - if (PIC_SETJMP(pic, (void *)escape->jmp.buf)) { + if (PIC_SETJMP(pic, escape->jmp.buf)) { pic->jmp = pic->jmp->prev; return pic_values_by_list(pic, escape->results); @@ -141,7 +141,7 @@ pic_escape(pic_state *pic, struct pic_proc *proc) else { pic_value val; - val = pic_apply1(pic, proc, pic_obj_value(pic_make_econt(pic, escape))); + val = pic_apply1(pic, proc, pic_obj_value(pic_make_cont(pic, escape))); pic->jmp = pic->jmp->prev; @@ -237,7 +237,7 @@ pic_cont_callcc(pic_state *pic) pic_get_args(pic, "l", &cb); - return pic_escape(pic, cb); + return pic_callcc(pic, cb); } static pic_value diff --git a/extlib/benz/include/picrin/cont.h b/extlib/benz/include/picrin/cont.h index b3002577..a5d83ebc 100644 --- a/extlib/benz/include/picrin/cont.h +++ b/extlib/benz/include/picrin/cont.h @@ -9,7 +9,7 @@ extern "C" { #endif -struct pic_escape { +struct pic_cont { pic_jmpbuf jmp; struct pic_winder *wind; @@ -24,10 +24,10 @@ struct pic_escape { pic_value results; }; -void pic_save_point(pic_state *, struct pic_escape *); -void pic_load_point(pic_state *, struct pic_escape *); +void pic_save_point(pic_state *, struct pic_cont *); +void pic_load_point(pic_state *, struct pic_cont *); -struct pic_proc *pic_make_econt(pic_state *, struct pic_escape *); +struct pic_proc *pic_make_cont(pic_state *, struct pic_cont *); void pic_wind(pic_state *, struct pic_winder *, struct pic_winder *); pic_value pic_dynamic_wind(pic_state *, struct pic_proc *, struct pic_proc *, struct pic_proc *); @@ -42,7 +42,7 @@ pic_value pic_values_by_array(pic_state *, size_t, pic_value *); pic_value pic_values_by_list(pic_state *, pic_value); size_t pic_receive(pic_state *, size_t, pic_value *); -pic_value pic_escape(pic_state *, struct pic_proc *); +pic_value pic_callcc(pic_state *, struct pic_proc *); #if defined(__cplusplus) } diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index e7aaf920..ce20eb69 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -28,13 +28,13 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) pic_try_(PIC_GENSYM(escape)) #define pic_catch \ pic_catch_(PIC_GENSYM(label)) -#define pic_try_(escape) \ +#define pic_try_(cont) \ do { \ - struct pic_escape *escape = pic_malloc(pic, sizeof(struct pic_escape)); \ - pic_save_point(pic, escape); \ - if (PIC_SETJMP(pic, (void *)escape->jmp.buf) == 0) { \ + struct pic_cont *cont = pic_malloc(pic, sizeof(struct pic_cont)); \ + pic_save_point(pic, cont); \ + if (PIC_SETJMP(pic, cont->jmp.buf) == 0) { \ do { \ - pic_push_try(pic, pic_make_econt(pic, escape)); + pic_push_try(pic, pic_make_cont(pic, cont)); #define pic_catch_(label) \ pic_pop_try(pic); \ } while (0); \ From 1fb918743a1faeccda23c2189bd84f25e8c74f8e Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 06:32:43 +0900 Subject: [PATCH 145/177] rename variables --- extlib/benz/cont.c | 64 +++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 8ea5b896..40ff119e 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -49,29 +49,29 @@ pic_dynamic_wind(pic_state *pic, struct pic_proc *in, struct pic_proc *thunk, st } void -pic_save_point(pic_state *pic, struct pic_cont *escape) +pic_save_point(pic_state *pic, struct pic_cont *cont) { - escape->jmp.prev = pic->jmp; - pic->jmp = &escape->jmp; + cont->jmp.prev = pic->jmp; + pic->jmp = &cont->jmp; /* save runtime context */ - escape->wind = pic->wind; - escape->sp_offset = pic->sp - pic->stbase; - escape->ci_offset = pic->ci - pic->cibase; - escape->xp_offset = pic->xp - pic->xpbase; - escape->arena_idx = pic->arena_idx; - escape->ip = pic->ip; + cont->wind = pic->wind; + cont->sp_offset = pic->sp - pic->stbase; + cont->ci_offset = pic->ci - pic->cibase; + cont->xp_offset = pic->xp - pic->xpbase; + cont->arena_idx = pic->arena_idx; + cont->ip = pic->ip; - escape->results = pic_undef_value(); + cont->results = pic_undef_value(); } void -pic_load_point(pic_state *pic, struct pic_cont *escape) +pic_load_point(pic_state *pic, struct pic_cont *cont) { pic_jmpbuf *jmp; for (jmp = pic->jmp; jmp != NULL; jmp = jmp->prev) { - if (jmp == &escape->jmp) { + if (jmp == &cont->jmp) { break; } } @@ -79,19 +79,19 @@ pic_load_point(pic_state *pic, struct pic_cont *escape) pic_errorf(pic, "calling dead escape continuation"); } - pic_wind(pic, pic->wind, escape->wind); + pic_wind(pic, pic->wind, cont->wind); /* load runtime context */ - pic->wind = escape->wind; - pic->sp = pic->stbase + escape->sp_offset; - pic->ci = pic->cibase + escape->ci_offset; - pic->xp = pic->xpbase + escape->xp_offset; - pic->arena_idx = escape->arena_idx; - pic->ip = escape->ip; + pic->wind = cont->wind; + pic->sp = pic->stbase + cont->sp_offset; + pic->ci = pic->cibase + cont->ci_offset; + pic->xp = pic->xpbase + cont->xp_offset; + pic->arena_idx = cont->arena_idx; + pic->ip = cont->ip; } static pic_value -escape_call(pic_state *pic) +cont_call(pic_state *pic) { size_t argc; pic_value *argv; @@ -110,38 +110,38 @@ escape_call(pic_state *pic) } struct pic_proc * -pic_make_cont(pic_state *pic, struct pic_cont *escape) +pic_make_cont(pic_state *pic, struct pic_cont *cont) { - static const pic_data_type escape_type = { "escape", pic_free, NULL }; - struct pic_proc *cont; + static const pic_data_type cont_type = { "cont", pic_free, NULL }; + struct pic_proc *c; struct pic_data *e; - cont = pic_make_proc(pic, escape_call, ""); + c = pic_make_proc(pic, cont_call, ""); - e = pic_data_alloc(pic, &escape_type, escape); + e = pic_data_alloc(pic, &cont_type, cont); /* save the escape continuation in proc */ - pic_attr_set(pic, pic_obj_value(cont), "@@escape", pic_obj_value(e)); + pic_attr_set(pic, pic_obj_value(c), "@@escape", pic_obj_value(e)); - return cont; + return c; } pic_value pic_callcc(pic_state *pic, struct pic_proc *proc) { - struct pic_cont *escape = pic_malloc(pic, sizeof(struct pic_cont)); + struct pic_cont *cont = pic_malloc(pic, sizeof(struct pic_cont)); - pic_save_point(pic, escape); + pic_save_point(pic, cont); - if (PIC_SETJMP(pic, escape->jmp.buf)) { + if (PIC_SETJMP(pic, cont->jmp.buf)) { pic->jmp = pic->jmp->prev; - return pic_values_by_list(pic, escape->results); + return pic_values_by_list(pic, cont->results); } else { pic_value val; - val = pic_apply1(pic, proc, pic_obj_value(pic_make_cont(pic, escape))); + val = pic_apply1(pic, proc, pic_obj_value(pic_make_cont(pic, cont))); pic->jmp = pic->jmp->prev; From 88092044d76aa123b914e4b403728cb10df491be Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 31 May 2015 20:19:07 +0900 Subject: [PATCH 146/177] shrink pic_proc size --- extlib/benz/gc.c | 8 ++++---- extlib/benz/include/picrin/proc.h | 6 ++++-- extlib/benz/proc.c | 7 +++---- extlib/benz/vm.c | 20 ++++++++++++-------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index c60f377a..f1796ce1 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -368,11 +368,11 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) } case PIC_TT_PROC: { struct pic_proc *proc = (struct pic_proc *)obj; - if (proc->cxt) { - gc_mark_object(pic, (struct pic_object *)proc->cxt); - } if (pic_proc_irep_p(proc)) { - gc_mark_object(pic, (struct pic_object *)proc->u.irep); + gc_mark_object(pic, (struct pic_object *)proc->u.i.irep); + if (proc->u.i.cxt) { + gc_mark_object(pic, (struct pic_object *)proc->u.i.cxt); + } } else { gc_mark_object(pic, (struct pic_object *)proc->u.func.name); } diff --git a/extlib/benz/include/picrin/proc.h b/extlib/benz/include/picrin/proc.h index 472dfe8a..17605590 100644 --- a/extlib/benz/include/picrin/proc.h +++ b/extlib/benz/include/picrin/proc.h @@ -28,9 +28,11 @@ struct pic_proc { char kind; union { struct pic_func func; - struct pic_irep *irep; + struct { + struct pic_irep *irep; + struct pic_context *cxt; + } i; } u; - struct pic_context *cxt; }; #define PIC_PROC_KIND_FUNC 1 diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index 71b3195a..93432759 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -18,7 +18,6 @@ pic_make_proc(pic_state *pic, pic_func_t func, const char *name) proc->kind = PIC_PROC_KIND_FUNC; proc->u.func.f = func; proc->u.func.name = sym; - proc->cxt = NULL; return proc; } @@ -29,8 +28,8 @@ pic_make_proc_irep(pic_state *pic, struct pic_irep *irep, struct pic_context *cx proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc), PIC_TT_PROC); proc->kind = PIC_PROC_KIND_IREP; - proc->u.irep = irep; - proc->cxt = cxt; + proc->u.i.irep = irep; + proc->u.i.cxt = cxt; return proc; } @@ -41,7 +40,7 @@ pic_proc_name(struct pic_proc *proc) case PIC_PROC_KIND_FUNC: return proc->u.func.name; case PIC_PROC_KIND_IREP: - return proc->u.irep->name; + return proc->u.i.irep->name; } PIC_UNREACHABLE(); } diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 9d26ee6b..95ada7a5 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -524,7 +524,7 @@ vm_get_irep(pic_state *pic) if (! pic_proc_p(self)) { pic_errorf(pic, "logic flaw"); } - irep = pic_proc_ptr(self)->u.irep; + irep = pic_proc_ptr(self)->u.i.irep; if (! pic_proc_irep_p(pic_proc_ptr(self))) { pic_errorf(pic, "logic flaw"); } @@ -642,9 +642,9 @@ pic_apply5(pic_state *pic, struct pic_proc *proc, pic_value arg1, pic_value arg2 } \ puts(")"); \ if (! pic_proc_func_p(proc)) { \ - printf(" irep = %p\n", proc->u.irep); \ + printf(" irep = %p\n", proc->u.i.irep); \ printf(" name = %s\n", pic_symbol_name(pic, pic_proc_name(proc))); \ - pic_dump_irep(proc->u.irep); \ + pic_dump_irep(proc->u.i.irep); \ } \ else { \ printf(" cfunc = %p\n", (void *)proc->u.func.f); \ @@ -765,7 +765,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) struct pic_irep *irep; if (ci->cxt != NULL && ci->cxt->regs == ci->cxt->storage) { - irep = pic_get_proc(pic)->u.irep; + irep = pic_get_proc(pic)->u.i.irep; if (c.u.i >= irep->argc + irep->localc) { PUSH(ci->cxt->regs[c.u.i - (ci->regs - ci->fp)]); NEXT; @@ -779,7 +779,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) struct pic_irep *irep; if (ci->cxt != NULL && ci->cxt->regs == ci->cxt->storage) { - irep = pic_get_proc(pic)->u.irep; + irep = pic_get_proc(pic)->u.i.irep; if (c.u.i >= irep->argc + irep->localc) { ci->cxt->regs[c.u.i - (ci->regs - ci->fp)] = POP(); NEXT; @@ -870,7 +870,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) goto L_RET; } else { - struct pic_irep *irep = proc->u.irep; + struct pic_irep *irep = proc->u.i.irep; int i; pic_value rest; @@ -900,7 +900,11 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) } /* prepare cxt */ - ci->up = proc->cxt; + if (pic_proc_irep_p(proc)) { + ci->up = proc->u.i.cxt; + } else { + ci->up = NULL; + } ci->regc = irep->capturec; ci->regs = ci->fp + irep->argc + irep->localc; @@ -969,7 +973,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) if (! pic_proc_p(self)) { pic_errorf(pic, "logic flaw"); } - irep = pic_proc_ptr(self)->u.irep; + irep = pic_proc_ptr(self)->u.i.irep; if (! pic_proc_irep_p(pic_proc_ptr(self))) { pic_errorf(pic, "logic flaw"); } From ce0c737c95013861f3bbb6a501a7f26e17e1e091 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 31 May 2015 20:22:46 +0900 Subject: [PATCH 147/177] cleanup --- extlib/benz/gc.c | 2 +- extlib/benz/include/picrin/proc.h | 23 ++++++++++------------- extlib/benz/proc.c | 16 ++++++++-------- extlib/benz/vm.c | 2 +- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index f1796ce1..5d3c5f9d 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -374,7 +374,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) gc_mark_object(pic, (struct pic_object *)proc->u.i.cxt); } } else { - gc_mark_object(pic, (struct pic_object *)proc->u.func.name); + gc_mark_object(pic, (struct pic_object *)proc->u.f.name); } break; } diff --git a/extlib/benz/include/picrin/proc.h b/extlib/benz/include/picrin/proc.h index 17605590..eaac2ef7 100644 --- a/extlib/benz/include/picrin/proc.h +++ b/extlib/benz/include/picrin/proc.h @@ -9,12 +9,6 @@ extern "C" { #endif -/* native C function */ -struct pic_func { - pic_func_t f; - pic_sym *name; -}; - struct pic_context { PIC_OBJECT_HEADER pic_value *regs; @@ -25,9 +19,15 @@ struct pic_context { struct pic_proc { PIC_OBJECT_HEADER - char kind; + enum { + PIC_PROC_TAG_IREP, + PIC_PROC_TAG_FUNC + } tag; union { - struct pic_func func; + struct { + pic_func_t func; + pic_sym *name; + } f; struct { struct pic_irep *irep; struct pic_context *cxt; @@ -35,11 +35,8 @@ struct pic_proc { } u; }; -#define PIC_PROC_KIND_FUNC 1 -#define PIC_PROC_KIND_IREP 2 - -#define pic_proc_func_p(proc) ((proc)->kind == PIC_PROC_KIND_FUNC) -#define pic_proc_irep_p(proc) ((proc)->kind == PIC_PROC_KIND_IREP) +#define pic_proc_func_p(proc) ((proc)->tag == PIC_PROC_TAG_FUNC) +#define pic_proc_irep_p(proc) ((proc)->tag == PIC_PROC_TAG_IREP) #define pic_proc_p(o) (pic_type(o) == PIC_TT_PROC) #define pic_proc_ptr(o) ((struct pic_proc *)pic_ptr(o)) diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index 93432759..e8c80f7a 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -15,9 +15,9 @@ pic_make_proc(pic_state *pic, pic_func_t func, const char *name) sym = pic_intern_cstr(pic, name); proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc), PIC_TT_PROC); - proc->kind = PIC_PROC_KIND_FUNC; - proc->u.func.f = func; - proc->u.func.name = sym; + proc->tag = PIC_PROC_TAG_FUNC; + proc->u.f.func = func; + proc->u.f.name = sym; return proc; } @@ -27,7 +27,7 @@ pic_make_proc_irep(pic_state *pic, struct pic_irep *irep, struct pic_context *cx struct pic_proc *proc; proc = (struct pic_proc *)pic_obj_alloc(pic, sizeof(struct pic_proc), PIC_TT_PROC); - proc->kind = PIC_PROC_KIND_IREP; + proc->tag = PIC_PROC_TAG_IREP; proc->u.i.irep = irep; proc->u.i.cxt = cxt; return proc; @@ -36,10 +36,10 @@ pic_make_proc_irep(pic_state *pic, struct pic_irep *irep, struct pic_context *cx pic_sym * pic_proc_name(struct pic_proc *proc) { - switch (proc->kind) { - case PIC_PROC_KIND_FUNC: - return proc->u.func.name; - case PIC_PROC_KIND_IREP: + switch (proc->tag) { + case PIC_PROC_TAG_FUNC: + return proc->u.f.name; + case PIC_PROC_TAG_IREP: return proc->u.i.irep->name; } PIC_UNREACHABLE(); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 95ada7a5..baea1bfe 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -862,7 +862,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) if (pic_proc_func_p(pic_proc_ptr(x))) { /* invoke! */ - v = proc->u.func.f(pic); + v = proc->u.f.func(pic); pic->sp[0] = v; pic->sp += pic->ci->retc; From fc957da9209b61e55df0227bb55d39343017ad75 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 31 May 2015 20:46:44 +0900 Subject: [PATCH 148/177] add 'env' property to struct pic_proc Using attribute to make closure from c function is unsafe because closed variables are visible from the scheme world. Use env property instead from now. --- extlib/benz/gc.c | 3 +++ extlib/benz/include/picrin/proc.h | 4 ++++ extlib/benz/proc.c | 24 ++++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 5d3c5f9d..aedd9836 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -375,6 +375,9 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) } } else { gc_mark_object(pic, (struct pic_object *)proc->u.f.name); + if (proc->u.f.env) { + gc_mark_object(pic, (struct pic_object *)proc->u.f.env); + } } break; } diff --git a/extlib/benz/include/picrin/proc.h b/extlib/benz/include/picrin/proc.h index eaac2ef7..caa49cc6 100644 --- a/extlib/benz/include/picrin/proc.h +++ b/extlib/benz/include/picrin/proc.h @@ -27,6 +27,7 @@ struct pic_proc { struct { pic_func_t func; pic_sym *name; + struct pic_dict *env; } f; struct { struct pic_irep *irep; @@ -48,6 +49,9 @@ 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_context *); pic_sym *pic_proc_name(struct pic_proc *); +struct pic_dict *pic_proc_env(pic_state *, struct pic_proc *); +pic_value pic_proc_env_ref(pic_state *, struct pic_proc *, const char *); +void pic_proc_env_set(pic_state *, struct pic_proc *, const char *, pic_value); #if defined(__cplusplus) } diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index e8c80f7a..d730c909 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -18,6 +18,7 @@ pic_make_proc(pic_state *pic, pic_func_t func, const char *name) proc->tag = PIC_PROC_TAG_FUNC; proc->u.f.func = func; proc->u.f.name = sym; + proc->u.f.env = NULL; return proc; } @@ -45,6 +46,29 @@ pic_proc_name(struct pic_proc *proc) PIC_UNREACHABLE(); } +struct pic_dict * +pic_proc_env(pic_state *pic, struct pic_proc *proc) +{ + assert(pic_proc_func_p(proc)); + + if (! proc->u.f.env) { + proc->u.f.env = pic_make_dict(pic); + } + return proc->u.f.env; +} + +pic_value +pic_proc_env_ref(pic_state *pic, struct pic_proc *proc, const char *key) +{ + return pic_dict_ref(pic, pic_proc_env(pic, proc), pic_intern_cstr(pic, key)); +} + +void +pic_proc_env_set(pic_state *pic, struct pic_proc *proc, const char *key, pic_value val) +{ + pic_dict_set(pic, pic_proc_env(pic, proc), pic_intern_cstr(pic, key), val); +} + static pic_value pic_proc_proc_p(pic_state *pic) { From 0ea80d1f34a38bbb11c32caa280d7432981a2830 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 31 May 2015 20:59:27 +0900 Subject: [PATCH 149/177] use proc_env in var implementation --- extlib/benz/var.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/extlib/benz/var.c b/extlib/benz/var.c index e1b7ff06..6ef88ece 100644 --- a/extlib/benz/var.c +++ b/extlib/benz/var.c @@ -5,12 +5,13 @@ #include "picrin.h" static pic_value -var_lookup(pic_state *pic, pic_value var) +var_lookup(pic_state *pic, struct pic_proc *var) { pic_value val, env, binding; + pic_value key = pic_obj_value(var); val = pic_ref(pic, pic->PICRIN_BASE, "current-dynamic-environment"); - if (pic_eq_p(val, var)) { + if (pic_eq_p(val, key)) { return pic_false_value(); } @@ -19,7 +20,7 @@ var_lookup(pic_state *pic, pic_value var) binding = pic_car(pic, env); while (! pic_nil_p(binding)) { - if (pic_eq_p(pic_caar(pic, binding), var)) { + if (pic_eq_p(pic_caar(pic, binding), key)) { return pic_car(pic, binding); } binding = pic_cdr(pic, binding); @@ -39,9 +40,9 @@ var_call(pic_state *pic) n = pic_get_args(pic, "|oo", &val, &tmp); - box = var_lookup(pic, pic_obj_value(self)); + box = var_lookup(pic, self); if (! pic_test(box)) { - box = pic_attr_ref(pic, pic_obj_value(self), "@@box"); + box = pic_proc_env_ref(pic, self, "box"); } switch (n) { @@ -49,7 +50,7 @@ var_call(pic_state *pic) return pic_cdr(pic, box); case 1: - conv = pic_attr_ref(pic, pic_obj_value(self), "@@converter"); + conv = pic_proc_env_ref(pic, self, "conv"); if (pic_test(conv)) { pic_assert_type(pic, conv, proc); @@ -62,7 +63,7 @@ var_call(pic_state *pic) case 2: assert(pic_false_p(tmp)); - conv = pic_attr_ref(pic, pic_obj_value(self), "@@converter"); + conv = pic_proc_env_ref(pic, self, "conv"); if (pic_test(conv)) { pic_assert_type(pic, conv, proc); @@ -80,8 +81,8 @@ pic_make_var(pic_state *pic, pic_value init, struct pic_proc *conv) struct pic_proc *var; var = pic_make_proc(pic, var_call, ""); - pic_attr_set(pic, pic_obj_value(var), "@@box", pic_cons(pic, pic_false_value(), init)); - pic_attr_set(pic, pic_obj_value(var), "@@converter", conv ? pic_obj_value(conv) : pic_false_value()); + pic_proc_env_set(pic, var, "box", pic_cons(pic, pic_false_value(), init)); + pic_proc_env_set(pic, var, "conv", conv ? pic_obj_value(conv) : pic_false_value()); return var; } From 9573c6db65211e4f3dc3b6cf6c15c9fc119cead0 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 1 Jun 2015 19:47:40 +0900 Subject: [PATCH 150/177] use proc_env in callcc implementation --- extlib/benz/cont.c | 4 ++-- extlib/benz/error.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 40ff119e..b331d0c6 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -99,7 +99,7 @@ cont_call(pic_state *pic) pic_get_args(pic, "*", &argc, &argv); - e = pic_data_ptr(pic_attr_ref(pic, pic_obj_value(pic_get_proc(pic)), "@@escape")); + e = pic_data_ptr(pic_proc_env_ref(pic, pic_get_proc(pic), "escape")); ((struct pic_cont *)e->data)->results = pic_list_by_array(pic, argc, argv); pic_load_point(pic, e->data); @@ -121,7 +121,7 @@ pic_make_cont(pic_state *pic, struct pic_cont *cont) e = pic_data_alloc(pic, &cont_type, cont); /* save the escape continuation in proc */ - pic_attr_set(pic, pic_obj_value(c), "@@escape", pic_obj_value(e)); + pic_proc_env_set(pic, c, "escape", pic_obj_value(e)); return c; } diff --git a/extlib/benz/error.c b/extlib/benz/error.c index d9684386..a9390af2 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -73,7 +73,7 @@ native_exception_handler(pic_state *pic) pic->err = err; - cont = pic_proc_ptr(pic_attr_ref(pic, pic_obj_value(pic_get_proc(pic)), "@@escape")); + cont = pic_proc_ptr(pic_proc_env_ref(pic, pic_get_proc(pic), "cont")); pic_apply1(pic, cont, pic_false_value()); @@ -89,7 +89,7 @@ pic_push_try(pic_state *pic, struct pic_proc *cont) handler = pic_make_proc(pic, native_exception_handler, "(native-exception-handler)"); - pic_attr_set(pic, pic_obj_value(handler), "@@escape", pic_obj_value(cont)); + pic_proc_env_set(pic, handler, "cont", pic_obj_value(cont)); if (pic->xp >= pic->xpend) { xp_len = (size_t)(pic->xpend - pic->xpbase) * 2; From 27d642ecafc4aca231730196064a8d82912ffebc Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 06:57:55 +0900 Subject: [PATCH 151/177] use proc_env in callcc.c --- contrib/03.callcc/callcc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index 2f953269..c51a7861 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -216,7 +216,7 @@ cont_call(pic_state *pic) proc = pic_get_proc(pic); pic_get_args(pic, "*", &argc, &argv); - cont = pic_data_ptr(pic_attr_ref(pic, pic_obj_value(proc), "@@cont"))->data; + cont = pic_data_ptr(pic_proc_env_ref(pic, proc, "cont"))->data; cont->results = pic_list_by_array(pic, argc, argv); /* execute guard handlers */ @@ -243,7 +243,7 @@ pic_callcc_full(pic_state *pic, struct pic_proc *proc) dat = pic_data_alloc(pic, &cont_type, cont); /* save the continuation object in proc */ - pic_attr_set(pic, pic_obj_value(c), "@@cont", pic_obj_value(dat)); + pic_proc_env_set(pic, c, "cont", pic_obj_value(dat)); return pic_apply1(pic, proc, pic_obj_value(c)); } @@ -267,7 +267,7 @@ pic_callcc_full_trampoline(pic_state *pic, struct pic_proc *proc) dat = pic_data_alloc(pic, &cont_type, cont); /* save the continuation object in proc */ - pic_attr_set(pic, pic_obj_value(c), "@@cont", pic_obj_value(dat)); + pic_proc_env_set(pic, c, "cont", pic_obj_value(dat)); return pic_apply_trampoline(pic, proc, pic_list1(pic, pic_obj_value(c))); } From 8f891c00c62e411833d79f15793f3574c35e03aa Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 07:20:47 +0900 Subject: [PATCH 152/177] fix build --- extlib/benz/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index baea1bfe..91cedab6 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -647,7 +647,7 @@ pic_apply5(pic_state *pic, struct pic_proc *proc, pic_value arg1, pic_value arg2 pic_dump_irep(proc->u.i.irep); \ } \ else { \ - printf(" cfunc = %p\n", (void *)proc->u.func.f); \ + printf(" cfunc = %p\n", (void *)proc->u.f.func); \ printf(" name = %s\n", pic_symbol_name(pic, pic_proc_name(proc))); \ } \ puts("== end\n"); \ From 34b65852872afdcff2716f7ad1d71bc859f8ed9a Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 2 Jun 2015 07:57:52 +0900 Subject: [PATCH 153/177] cleanup --- extlib/benz/error.c | 45 ++++++++++-------------------- extlib/benz/include/picrin/error.h | 16 +++++++---- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/extlib/benz/error.c b/extlib/benz/error.c index a9390af2..b4964172 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -63,8 +63,8 @@ pic_errmsg(pic_state *pic) return pic_str_cstr(pic, str); } -static pic_value -native_exception_handler(pic_state *pic) +pic_value +pic_native_exception_handler(pic_state *pic) { pic_value err; struct pic_proc *cont; @@ -81,16 +81,11 @@ native_exception_handler(pic_state *pic) } void -pic_push_try(pic_state *pic, struct pic_proc *cont) +pic_push_handler(pic_state *pic, struct pic_proc *handler) { - struct pic_proc *handler; size_t xp_len; ptrdiff_t xp_offset; - handler = pic_make_proc(pic, native_exception_handler, "(native-exception-handler)"); - - pic_proc_env_set(pic, handler, "cont", pic_obj_value(cont)); - if (pic->xp >= pic->xpend) { xp_len = (size_t)(pic->xpend - pic->xpbase) * 2; xp_offset = pic->xp - pic->xpbase; @@ -102,10 +97,14 @@ pic_push_try(pic_state *pic, struct pic_proc *cont) *pic->xp++ = handler; } -void -pic_pop_try(pic_state *pic) +struct pic_proc * +pic_pop_handler(pic_state *pic) { - --pic->xp; + if (pic->xp == pic->xpbase) { + pic_panic(pic, "no exception handler registered"); + } + + return *--pic->xp; } struct pic_error * @@ -131,17 +130,13 @@ pic_raise_continuable(pic_state *pic, pic_value err) struct pic_proc *handler; pic_value v; - if (pic->xp == pic->xpbase) { - pic_panic(pic, "no exception handler registered"); - } - - handler = *--pic->xp; + handler = pic_pop_handler(pic); pic_gc_protect(pic, pic_obj_value(handler)); v = pic_apply1(pic, handler, err); - *pic->xp++ = handler; + pic_push_handler(pic, handler); return v; } @@ -153,7 +148,7 @@ pic_raise(pic_state *pic, pic_value err) val = pic_raise_continuable(pic, err); - --pic->xp; + pic_pop_handler(pic); pic_errorf(pic, "error handler returned with ~s on error ~s", val, err); } @@ -179,24 +174,14 @@ pic_error_with_exception_handler(pic_state *pic) { struct pic_proc *handler, *thunk; pic_value val; - size_t xp_len; - ptrdiff_t xp_offset; pic_get_args(pic, "ll", &handler, &thunk); - if (pic->xp >= pic->xpend) { - xp_len = (size_t)(pic->xpend - pic->xpbase) * 2; - xp_offset = pic->xp - pic->xpbase; - pic->xpbase = pic_realloc(pic, pic->xpbase, sizeof(struct pic_proc *) * xp_len); - pic->xp = pic->xpbase + xp_offset; - pic->xpend = pic->xpbase + xp_len; - } - - *pic->xp++ = handler; + pic_push_handler(pic, handler); val = pic_apply0(pic, thunk); - --pic->xp; + pic_pop_handler(pic); return val; } diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index ce20eb69..7200ddf9 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -25,18 +25,22 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) /* do not return from try block! */ #define pic_try \ - pic_try_(PIC_GENSYM(escape)) + pic_try_(PIC_GENSYM(cont), PIC_GENSYM(handler)) #define pic_catch \ pic_catch_(PIC_GENSYM(label)) -#define pic_try_(cont) \ +#define pic_try_(cont, handler) \ do { \ struct pic_cont *cont = pic_malloc(pic, sizeof(struct pic_cont)); \ pic_save_point(pic, cont); \ if (PIC_SETJMP(pic, cont->jmp.buf) == 0) { \ + extern pic_value pic_native_exception_handler(pic_state *); \ + struct pic_proc *handler; \ + handler = pic_make_proc(pic, pic_native_exception_handler, "(native-exception-handler)"); \ + pic_proc_env_set(pic, handler, "cont", pic_obj_value(pic_make_cont(pic, cont))); \ do { \ - pic_push_try(pic, pic_make_cont(pic, cont)); + pic_push_handler(pic, handler); #define pic_catch_(label) \ - pic_pop_try(pic); \ + pic_pop_handler(pic); \ } while (0); \ pic->jmp = pic->jmp->prev; \ } else { \ @@ -47,8 +51,8 @@ struct pic_error *pic_make_error(pic_state *, pic_sym *, const char *, pic_list) if (0) \ label: -void pic_push_try(pic_state *, struct pic_proc *); -void pic_pop_try(pic_state *); +void pic_push_handler(pic_state *, struct pic_proc *); +struct pic_proc *pic_pop_handler(pic_state *); pic_value pic_raise_continuable(pic_state *, pic_value); PIC_NORETURN void pic_raise(pic_state *, pic_value); From 72baa9a52d967157f5e3e154a155dd60ebc45a95 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 4 Jun 2015 13:23:20 +0900 Subject: [PATCH 154/177] remove pic_throw function --- contrib/05.r7rs/src/file.c | 6 +++++- extlib/benz/error.c | 10 ++-------- extlib/benz/include/picrin/error.h | 1 - extlib/benz/read.c | 6 +++++- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/contrib/05.r7rs/src/file.c b/contrib/05.r7rs/src/file.c index f0410f9d..4147bd84 100644 --- a/contrib/05.r7rs/src/file.c +++ b/contrib/05.r7rs/src/file.c @@ -7,7 +7,11 @@ PIC_NORETURN static void file_error(pic_state *pic, const char *msg) { - pic_throw(pic, pic->sFILE, msg, pic_nil_value()); + struct pic_error *e; + + e = pic_make_error(pic, pic->sFILE, msg, pic_nil_value()); + + pic_raise(pic, pic_obj_value(e)); } static pic_value diff --git a/extlib/benz/error.c b/extlib/benz/error.c index b4964172..15e34087 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -154,21 +154,15 @@ pic_raise(pic_state *pic, pic_value err) } void -pic_throw(pic_state *pic, pic_sym *type, const char *msg, pic_value irrs) +pic_error(pic_state *pic, const char *msg, pic_value irrs) { struct pic_error *e; - e = pic_make_error(pic, type, msg, irrs); + e = pic_make_error(pic, pic_intern_cstr(pic, ""), msg, irrs); pic_raise(pic, pic_obj_value(e)); } -void -pic_error(pic_state *pic, const char *msg, pic_value irrs) -{ - pic_throw(pic, pic_intern_cstr(pic, ""), msg, irrs); -} - static pic_value pic_error_with_exception_handler(pic_state *pic) { diff --git a/extlib/benz/include/picrin/error.h b/extlib/benz/include/picrin/error.h index 7200ddf9..1435faa3 100644 --- a/extlib/benz/include/picrin/error.h +++ b/extlib/benz/include/picrin/error.h @@ -56,7 +56,6 @@ struct pic_proc *pic_pop_handler(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_error(pic_state *, const char *, pic_list); #if defined(__cplusplus) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index c8cf6d70..50498ac2 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -10,7 +10,11 @@ static pic_value read_nullable(pic_state *pic, struct pic_port *port, int c); PIC_NORETURN static void read_error(pic_state *pic, const char *msg) { - pic_throw(pic, pic->sREAD, msg, pic_nil_value()); + struct pic_error *e; + + e = pic_make_error(pic, pic->sREAD, msg, pic_nil_value()); + + pic_raise(pic, pic_obj_value(e)); } static int From 531187bb2ac1145371e47997b8963a8784c2aab6 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 4 Jun 2015 13:53:41 +0900 Subject: [PATCH 155/177] speed up bytecode compilation --- extlib/benz/bool.c | 5 ++- extlib/benz/codegen.c | 74 +++++++++--------------------------- extlib/benz/cont.c | 7 +++- extlib/benz/gc.c | 5 +++ extlib/benz/include/picrin.h | 5 +++ extlib/benz/number.c | 20 +++++----- extlib/benz/pair.c | 13 ++++--- extlib/benz/state.c | 18 +++++++++ extlib/benz/symbol.c | 5 ++- extlib/benz/vm.c | 17 +++++++++ 10 files changed, 95 insertions(+), 74 deletions(-) diff --git a/extlib/benz/bool.c b/extlib/benz/bool.c index b5edfe98..33b6d0bf 100644 --- a/extlib/benz/bool.c +++ b/extlib/benz/bool.c @@ -189,11 +189,14 @@ pic_bool_boolean_eq_p(pic_state *pic) void pic_init_bool(pic_state *pic) { + void pic_defun_vm(pic_state *, const char *, pic_sym *, pic_func_t); + pic_defun(pic, "eq?", pic_bool_eq_p); pic_defun(pic, "eqv?", pic_bool_eqv_p); pic_defun(pic, "equal?", pic_bool_equal_p); - pic_defun(pic, "not", pic_bool_not); + pic_defun_vm(pic, "not", pic->rNOT, pic_bool_not); + pic_defun(pic, "boolean?", pic_bool_boolean_p); pic_defun(pic, "boolean=?", pic_bool_boolean_eq_p); } diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index d998eda9..ff53f12b 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -33,29 +33,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; } analyze_state; static bool push_scope(analyze_state *, pic_value); static void pop_scope(analyze_state *); -#define register_symbol(pic, state, slot, name) do { \ - state->slot = pic_intern_cstr(pic, name); \ - } while (0) - -#define register_renamed_symbol(pic, state, slot, lib, id) do { \ - 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); \ - } \ - state->slot = gsym; \ - } while (0) - static analyze_state * new_analyze_state(pic_state *pic) { @@ -67,26 +49,6 @@ new_analyze_state(pic_state *pic) state->pic = pic; state->scope = NULL; - /* native VM procedures */ - register_renamed_symbol(pic, state, rCONS, pic->PICRIN_BASE, "cons"); - 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, 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, "*"); - register_renamed_symbol(pic, state, rDIV, pic->PICRIN_BASE, "/"); - register_renamed_symbol(pic, state, rEQ, pic->PICRIN_BASE, "="); - register_renamed_symbol(pic, state, rLT, pic->PICRIN_BASE, "<"); - register_renamed_symbol(pic, state, rLE, pic->PICRIN_BASE, "<="); - register_renamed_symbol(pic, state, rGT, pic->PICRIN_BASE, ">"); - register_renamed_symbol(pic, state, rGE, pic->PICRIN_BASE, ">="); - register_renamed_symbol(pic, state, rNOT, pic->PICRIN_BASE, "not"); - register_renamed_symbol(pic, state, rVALUES, pic->PICRIN_BASE, "values"); - register_renamed_symbol(pic, state, rCALL_WITH_VALUES, pic->PICRIN_BASE, "call-with-values"); - /* push initial scope */ push_scope(state, pic_nil_value()); @@ -760,70 +722,70 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos) else if (sym == pic->rQUOTE) { return analyze_quote(state, obj); } - else if (sym == state->rCONS) { + else if (sym == pic->rCONS) { ARGC_ASSERT(2, "cons"); return CONSTRUCT_OP2(pic->sCONS); } - else if (sym == state->rCAR) { + else if (sym == pic->rCAR) { ARGC_ASSERT(1, "car"); return CONSTRUCT_OP1(pic->sCAR); } - else if (sym == state->rCDR) { + else if (sym == pic->rCDR) { ARGC_ASSERT(1, "cdr"); return CONSTRUCT_OP1(pic->sCDR); } - else if (sym == state->rNILP) { + else if (sym == pic->rNILP) { ARGC_ASSERT(1, "nil?"); return CONSTRUCT_OP1(pic->sNILP); } - else if (sym == state->rSYMBOLP) { + else if (sym == pic->rSYMBOLP) { ARGC_ASSERT(1, "symbol?"); return CONSTRUCT_OP1(pic->sSYMBOLP); } - else if (sym == state->rPAIRP) { + else if (sym == pic->rPAIRP) { ARGC_ASSERT(1, "pair?"); return CONSTRUCT_OP1(pic->sPAIRP); } - else if (sym == state->rADD) { + else if (sym == pic->rADD) { return analyze_add(state, obj, tailpos); } - else if (sym == state->rSUB) { + else if (sym == pic->rSUB) { return analyze_sub(state, obj); } - else if (sym == state->rMUL) { + else if (sym == pic->rMUL) { return analyze_mul(state, obj, tailpos); } - else if (sym == state->rDIV) { + else if (sym == pic->rDIV) { return analyze_div(state, obj); } - else if (sym == state->rEQ) { + else if (sym == pic->rEQ) { ARGC_ASSERT_WITH_FALLBACK(2); return CONSTRUCT_OP2(pic->sEQ); } - else if (sym == state->rLT) { + else if (sym == pic->rLT) { ARGC_ASSERT_WITH_FALLBACK(2); return CONSTRUCT_OP2(pic->sLT); } - else if (sym == state->rLE) { + else if (sym == pic->rLE) { ARGC_ASSERT_WITH_FALLBACK(2); return CONSTRUCT_OP2(pic->sLE); } - else if (sym == state->rGT) { + else if (sym == pic->rGT) { ARGC_ASSERT_WITH_FALLBACK(2); return CONSTRUCT_OP2(pic->sGT); } - else if (sym == state->rGE) { + else if (sym == pic->rGE) { ARGC_ASSERT_WITH_FALLBACK(2); return CONSTRUCT_OP2(pic->sGE); } - else if (sym == state->rNOT) { + else if (sym == pic->rNOT) { ARGC_ASSERT(1, "not"); return CONSTRUCT_OP1(pic->sNOT); } - else if (sym == state->rVALUES) { + else if (sym == pic->rVALUES) { return analyze_values(state, obj, tailpos); } - else if (sym == state->rCALL_WITH_VALUES) { + else if (sym == pic->rCALL_WITH_VALUES) { return analyze_call_with_values(state, obj, tailpos); } } diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index b331d0c6..dd021989 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -280,9 +280,12 @@ pic_cont_call_with_values(pic_state *pic) void pic_init_cont(pic_state *pic) { + void pic_defun_vm(pic_state *, const char *, pic_sym *, pic_func_t); + pic_defun(pic, "call-with-current-continuation", pic_cont_callcc); pic_defun(pic, "call/cc", pic_cont_callcc); pic_defun(pic, "dynamic-wind", pic_cont_dynamic_wind); - pic_defun(pic, "values", pic_cont_values); - pic_defun(pic, "call-with-values", pic_cont_call_with_values); + + pic_defun_vm(pic, "values", pic->rVALUES, pic_cont_values); + pic_defun_vm(pic, "call-with-values", pic->rCALL_WITH_VALUES, pic_cont_call_with_values); } diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index aedd9836..426a9256 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -521,6 +521,11 @@ gc_mark_global_symbols(pic_state *pic) M(rDEFINE_SYNTAX); M(rIMPORT); M(rEXPORT); M(rDEFINE_LIBRARY); M(rIN_LIBRARY); M(rCOND_EXPAND); + M(rCONS); M(rCAR); M(rCDR); M(rNILP); + M(rSYMBOLP); M(rPAIRP); + M(rADD); M(rSUB); M(rMUL); M(rDIV); + M(rEQ); M(rLT); M(rLE); M(rGT); M(rGE); M(rNOT); + M(rVALUES); M(rCALL_WITH_VALUES); } static void diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index faf3b29f..1d333a98 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -113,6 +113,11 @@ typedef struct { pic_sym *rDEFINE_SYNTAX, *rIMPORT, *rEXPORT; pic_sym *rDEFINE_LIBRARY, *rIN_LIBRARY; pic_sym *rCOND_EXPAND; + 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; struct pic_lib *PICRIN_BASE; struct pic_lib *PICRIN_USER; diff --git a/extlib/benz/number.c b/extlib/benz/number.c index 1f02ca0c..80c7fab9 100644 --- a/extlib/benz/number.c +++ b/extlib/benz/number.c @@ -801,6 +801,8 @@ pic_number_sqrt(pic_state *pic) void pic_init_number(pic_state *pic) { + void pic_defun_vm(pic_state *, const char *, pic_sym *, pic_func_t); + size_t ai = pic_gc_arena_preserve(pic); pic_defun(pic, "number?", pic_number_real_p); @@ -814,17 +816,17 @@ pic_init_number(pic_state *pic) pic_defun(pic, "inexact?", pic_number_inexact_p); pic_gc_arena_restore(pic, ai); - pic_defun(pic, "=", pic_number_eq); - pic_defun(pic, "<", pic_number_lt); - pic_defun(pic, ">", pic_number_gt); - pic_defun(pic, "<=", pic_number_le); - pic_defun(pic, ">=", pic_number_ge); + pic_defun_vm(pic, "=", pic->rEQ, pic_number_eq); + pic_defun_vm(pic, "<", pic->rLT, pic_number_lt); + pic_defun_vm(pic, ">", pic->rGT, pic_number_gt); + pic_defun_vm(pic, "<=", pic->rLE, pic_number_le); + pic_defun_vm(pic, ">=", pic->rGE, pic_number_ge); pic_gc_arena_restore(pic, ai); - pic_defun(pic, "+", pic_number_add); - pic_defun(pic, "-", pic_number_sub); - pic_defun(pic, "*", pic_number_mul); - pic_defun(pic, "/", pic_number_div); + pic_defun_vm(pic, "+", pic->rADD, pic_number_add); + pic_defun_vm(pic, "-", pic->rSUB, pic_number_sub); + pic_defun_vm(pic, "*", pic->rMUL, pic_number_mul); + pic_defun_vm(pic, "/", pic->rDIV, pic_number_div); pic_gc_arena_restore(pic, ai); pic_defun(pic, "abs", pic_number_abs); diff --git a/extlib/benz/pair.c b/extlib/benz/pair.c index 17da2394..c0b031af 100644 --- a/extlib/benz/pair.c +++ b/extlib/benz/pair.c @@ -760,13 +760,16 @@ pic_pair_assoc(pic_state *pic) void pic_init_pair(pic_state *pic) { - pic_defun(pic, "pair?", pic_pair_pair_p); - pic_defun(pic, "cons", pic_pair_cons); - pic_defun(pic, "car", pic_pair_car); - pic_defun(pic, "cdr", pic_pair_cdr); + void pic_defun_vm(pic_state *, const char *, pic_sym *, pic_func_t); + + pic_defun_vm(pic, "pair?", pic->rPAIRP, pic_pair_pair_p); + pic_defun_vm(pic, "cons", pic->rCONS, pic_pair_cons); + pic_defun_vm(pic, "car", pic->rCAR, pic_pair_car); + pic_defun_vm(pic, "cdr", pic->rCDR, pic_pair_cdr); + pic_defun_vm(pic, "null?", pic->rNILP, pic_pair_null_p); + pic_defun(pic, "set-car!", pic_pair_set_car); pic_defun(pic, "set-cdr!", pic_pair_set_cdr); - pic_defun(pic, "null?", pic_pair_null_p); pic_defun(pic, "caar", pic_pair_caar); pic_defun(pic, "cadr", pic_pair_cadr); diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 13a17e09..2dd19c2c 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -304,6 +304,24 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) R(rDEFINE_LIBRARY, "define-library"); R(rIN_LIBRARY, "in-library"); R(rCOND_EXPAND, "cond-expand"); + R(rCONS, "cons"); + R(rCAR, "car"); + R(rCDR, "cdr"); + R(rNILP, "null?"); + R(rSYMBOLP, "symbol?"); + R(rPAIRP, "pair?"); + R(rADD, "+"); + R(rSUB, "-"); + R(rMUL, "*"); + R(rDIV, "/"); + R(rEQ, "="); + R(rLT, "<"); + R(rLE, "<="); + R(rGT, ">"); + R(rGE, ">="); + R(rNOT, "not"); + R(rVALUES, "values"); + R(rCALL_WITH_VALUES, "call-with-values"); pic_gc_arena_restore(pic, ai); /* root tables */ diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 008c52b2..8298465d 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -119,7 +119,10 @@ pic_symbol_string_to_symbol(pic_state *pic) void pic_init_symbol(pic_state *pic) { - pic_defun(pic, "symbol?", pic_symbol_symbol_p); + void pic_defun_vm(pic_state *, const char *, pic_sym *, pic_func_t); + + pic_defun_vm(pic, "symbol?", pic->rSYMBOLP, pic_symbol_symbol_p); + pic_defun(pic, "symbol->string", pic_symbol_symbol_to_string); pic_defun(pic, "string->symbol", pic_symbol_string_to_symbol); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 91cedab6..17bf655f 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -466,6 +466,23 @@ pic_defun(pic_state *pic, const char *name, pic_func_t cfunc) pic_define(pic, name, pic_obj_value(proc)); } +void +pic_defun_vm(pic_state *pic, const char *name, pic_sym *rename, pic_func_t func) +{ + struct pic_proc *proc; + pic_sym *sym; + + proc = pic_make_proc(pic, func, name); + + sym = pic_intern_cstr(pic, name); + + pic_put_rename(pic, pic->lib->env, sym, rename); + + pic_dict_set(pic, pic->globals, rename, pic_obj_value(proc)); + + pic_export(pic, sym); +} + void pic_defvar(pic_state *pic, const char *name, pic_value init, struct pic_proc *conv) { From 8604e18719ad6205da5fafe40c7e2741df94446f Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Thu, 4 Jun 2015 14:17:37 +0900 Subject: [PATCH 156/177] remove in-library --- extlib/benz/error.c | 1 + extlib/benz/gc.c | 4 ++-- extlib/benz/include/picrin.h | 5 ++--- extlib/benz/lib.c | 37 ++++++------------------------------ extlib/benz/macro.c | 1 - extlib/benz/state.c | 2 -- 6 files changed, 11 insertions(+), 39 deletions(-) diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 15e34087..aa46b288 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -163,6 +163,7 @@ pic_error(pic_state *pic, const char *msg, pic_value irrs) pic_raise(pic, pic_obj_value(e)); } + static pic_value pic_error_with_exception_handler(pic_state *pic) { diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 426a9256..cd3321fb 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -506,7 +506,7 @@ 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(sDEFINE_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); @@ -519,7 +519,7 @@ gc_mark_global_symbols(pic_state *pic) 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(rDEFINE_LIBRARY); M(rCOND_EXPAND); M(rCONS); M(rCAR); M(rCDR); M(rNILP); M(rSYMBOLP); M(rPAIRP); diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 1d333a98..f4b078c9 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -97,7 +97,7 @@ typedef struct { 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 *sDEFINE_LIBRARY; pic_sym *sCOND_EXPAND, *sAND, *sOR, *sELSE, *sLIBRARY; pic_sym *sONLY, *sRENAME, *sPREFIX, *sEXCEPT; pic_sym *sCONS, *sCAR, *sCDR, *sNILP; @@ -111,7 +111,7 @@ typedef struct { pic_sym *rDEFINE, *rLAMBDA, *rIF, *rBEGIN, *rQUOTE, *rSETBANG; pic_sym *rDEFINE_SYNTAX, *rIMPORT, *rEXPORT; - pic_sym *rDEFINE_LIBRARY, *rIN_LIBRARY; + pic_sym *rDEFINE_LIBRARY; pic_sym *rCOND_EXPAND; pic_sym *rCONS, *rCAR, *rCDR, *rNILP; pic_sym *rSYMBOLP, *rPAIRP; @@ -213,7 +213,6 @@ pic_value pic_eval(pic_state *, pic_value, struct pic_lib *); struct pic_proc *pic_compile(pic_state *, pic_value, struct pic_lib *); pic_value pic_macroexpand(pic_state *, pic_value, struct pic_lib *); -void pic_in_library(pic_state *, pic_value); struct pic_lib *pic_make_library(pic_state *, pic_value); struct pic_lib *pic_find_library(pic_state *, pic_value); diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 8eff0bb7..c3e04dbd 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -29,18 +29,6 @@ pic_make_library(pic_state *pic, pic_value name) return lib; } -void -pic_in_library(pic_state *pic, pic_value spec) -{ - struct pic_lib *lib; - - lib = pic_find_library(pic, spec); - if (! lib) { - pic_errorf(pic, "library not found: ~a", spec); - } - pic->lib = lib; -} - struct pic_lib * pic_find_library(pic_state *pic, pic_value spec) { @@ -282,45 +270,33 @@ pic_lib_export(pic_state *pic) static pic_value pic_lib_define_library(pic_state *pic) { - struct pic_lib *prev = pic->lib; + struct pic_lib *lib, *prev = pic->lib; size_t argc, i; pic_value spec, *argv; pic_get_args(pic, "o*", &spec, &argc, &argv); - if (! pic_find_library(pic, spec)) { - pic_make_library(pic, spec); + if ((lib = pic_find_library(pic, spec)) == NULL) { + lib = pic_make_library(pic, spec); } pic_try { - pic_in_library(pic, spec); + pic->lib = lib; for (i = 0; i < argc; ++i) { pic_void(pic_eval(pic, argv[i], pic->lib)); } - pic_in_library(pic, prev->name); + pic->lib = prev; } pic_catch { - pic_in_library(pic, prev->name); /* restores pic->lib even if an error occurs */ + pic->lib = prev; /* restores pic->lib even if an error occured */ pic_raise(pic, pic->err); } return pic_none_value(); } -static pic_value -pic_lib_in_library(pic_state *pic) -{ - pic_value spec; - - pic_get_args(pic, "o", &spec); - - pic_in_library(pic, spec); - - return pic_none_value(); -} - void pic_init_lib(pic_state *pic) { @@ -330,5 +306,4 @@ pic_init_lib(pic_state *pic) pic_defmacro(pic, pic->sIMPORT, pic->rIMPORT, pic_lib_import); pic_defmacro(pic, pic->sEXPORT, pic->rEXPORT, pic_lib_export); pic_defmacro(pic, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY, pic_lib_define_library); - pic_defmacro(pic, pic->sIN_LIBRARY, pic->rIN_LIBRARY, pic_lib_in_library); } diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index ed7625fd..0e58c992 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -391,7 +391,6 @@ pic_null_syntactic_environment(pic_state *pic) pic_define_syntactic_keyword(pic, env, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY); pic_define_syntactic_keyword(pic, env, pic->sIMPORT, pic->rIMPORT); pic_define_syntactic_keyword(pic, env, pic->sEXPORT, pic->rEXPORT); - pic_define_syntactic_keyword(pic, env, pic->sIN_LIBRARY, pic->rIN_LIBRARY); pic_define_syntactic_keyword(pic, env, pic->sCOND_EXPAND, pic->rCOND_EXPAND); return env; diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 2dd19c2c..0265356e 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -250,7 +250,6 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) S(sIMPORT, "import"); S(sEXPORT, "export"); S(sDEFINE_LIBRARY, "define-library"); - S(sIN_LIBRARY, "in-library"); S(sCOND_EXPAND, "cond-expand"); S(sAND, "and"); S(sOR, "or"); @@ -302,7 +301,6 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) R(rIMPORT, "import"); R(rEXPORT, "export"); R(rDEFINE_LIBRARY, "define-library"); - R(rIN_LIBRARY, "in-library"); R(rCOND_EXPAND, "cond-expand"); R(rCONS, "cons"); R(rCAR, "car"); From 86b6e43f67f05ca8139729d9ffffe1b7abd4c6e8 Mon Sep 17 00:00:00 2001 From: OGINO Masanori Date: Thu, 4 Jun 2015 15:42:08 +0900 Subject: [PATCH 157/177] Refer `master` branch's build status badge. Now the link does not always refer `master` so we may miss build failures in the branch. Signed-off-by: OGINO Masanori --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 319b0424..5b5fddf2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -[![Build Status](https://travis-ci.org/picrin-scheme/picrin.png)](https://travis-ci.org/picrin-scheme/picrin) +[![Build Status](https://travis-ci.org/picrin-scheme/picrin.png?branch=master)](https://travis-ci.org/picrin-scheme/picrin) [![Docs Status](https://readthedocs.org/projects/picrin/badge/?version=latest)](https://picrin.readthedocs.org/) Picrin is a lightweight R7RS scheme implementation written in pure C89. It contains a reasonably fast VM, an improved hygienic macro system, usuful contribution libraries, and simple but powerful C interface. From 77d3b0b41ecf52d32662eefd9d006809761cf75a Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 6 Jun 2015 13:48:31 +0900 Subject: [PATCH 158/177] Revert "remove in-library" This reverts commit 8604e18719ad6205da5fafe40c7e2741df94446f. --- extlib/benz/error.c | 1 - extlib/benz/gc.c | 4 ++-- extlib/benz/include/picrin.h | 5 +++-- extlib/benz/lib.c | 37 ++++++++++++++++++++++++++++++------ extlib/benz/macro.c | 1 + extlib/benz/state.c | 2 ++ 6 files changed, 39 insertions(+), 11 deletions(-) diff --git a/extlib/benz/error.c b/extlib/benz/error.c index aa46b288..15e34087 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -163,7 +163,6 @@ pic_error(pic_state *pic, const char *msg, pic_value irrs) pic_raise(pic, pic_obj_value(e)); } - static pic_value pic_error_with_exception_handler(pic_state *pic) { diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index cd3321fb..426a9256 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -506,7 +506,7 @@ 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(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); @@ -519,7 +519,7 @@ gc_mark_global_symbols(pic_state *pic) M(rDEFINE); M(rLAMBDA); M(rIF); M(rBEGIN); M(rQUOTE); M(rSETBANG); M(rDEFINE_SYNTAX); M(rIMPORT); M(rEXPORT); - M(rDEFINE_LIBRARY); + M(rDEFINE_LIBRARY); M(rIN_LIBRARY); M(rCOND_EXPAND); M(rCONS); M(rCAR); M(rCDR); M(rNILP); M(rSYMBOLP); M(rPAIRP); diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index f4b078c9..1d333a98 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -97,7 +97,7 @@ typedef struct { pic_sym *sDEFINE, *sLAMBDA, *sIF, *sBEGIN, *sQUOTE, *sSETBANG; pic_sym *sQUASIQUOTE, *sUNQUOTE, *sUNQUOTE_SPLICING; pic_sym *sDEFINE_SYNTAX, *sIMPORT, *sEXPORT; - pic_sym *sDEFINE_LIBRARY; + 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; @@ -111,7 +111,7 @@ typedef struct { pic_sym *rDEFINE, *rLAMBDA, *rIF, *rBEGIN, *rQUOTE, *rSETBANG; pic_sym *rDEFINE_SYNTAX, *rIMPORT, *rEXPORT; - pic_sym *rDEFINE_LIBRARY; + pic_sym *rDEFINE_LIBRARY, *rIN_LIBRARY; pic_sym *rCOND_EXPAND; pic_sym *rCONS, *rCAR, *rCDR, *rNILP; pic_sym *rSYMBOLP, *rPAIRP; @@ -213,6 +213,7 @@ pic_value pic_eval(pic_state *, pic_value, struct pic_lib *); struct pic_proc *pic_compile(pic_state *, pic_value, struct pic_lib *); pic_value pic_macroexpand(pic_state *, pic_value, struct pic_lib *); +void pic_in_library(pic_state *, pic_value); struct pic_lib *pic_make_library(pic_state *, pic_value); struct pic_lib *pic_find_library(pic_state *, pic_value); diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index c3e04dbd..8eff0bb7 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -29,6 +29,18 @@ pic_make_library(pic_state *pic, pic_value name) return lib; } +void +pic_in_library(pic_state *pic, pic_value spec) +{ + struct pic_lib *lib; + + lib = pic_find_library(pic, spec); + if (! lib) { + pic_errorf(pic, "library not found: ~a", spec); + } + pic->lib = lib; +} + struct pic_lib * pic_find_library(pic_state *pic, pic_value spec) { @@ -270,33 +282,45 @@ pic_lib_export(pic_state *pic) static pic_value pic_lib_define_library(pic_state *pic) { - struct pic_lib *lib, *prev = pic->lib; + struct pic_lib *prev = pic->lib; size_t argc, i; pic_value spec, *argv; pic_get_args(pic, "o*", &spec, &argc, &argv); - if ((lib = pic_find_library(pic, spec)) == NULL) { - lib = pic_make_library(pic, spec); + if (! pic_find_library(pic, spec)) { + pic_make_library(pic, spec); } pic_try { - pic->lib = lib; + pic_in_library(pic, spec); for (i = 0; i < argc; ++i) { pic_void(pic_eval(pic, argv[i], pic->lib)); } - pic->lib = prev; + pic_in_library(pic, prev->name); } pic_catch { - pic->lib = prev; /* restores pic->lib even if an error occured */ + pic_in_library(pic, prev->name); /* restores pic->lib even if an error occurs */ pic_raise(pic, pic->err); } return pic_none_value(); } +static pic_value +pic_lib_in_library(pic_state *pic) +{ + pic_value spec; + + pic_get_args(pic, "o", &spec); + + pic_in_library(pic, spec); + + return pic_none_value(); +} + void pic_init_lib(pic_state *pic) { @@ -306,4 +330,5 @@ pic_init_lib(pic_state *pic) pic_defmacro(pic, pic->sIMPORT, pic->rIMPORT, pic_lib_import); pic_defmacro(pic, pic->sEXPORT, pic->rEXPORT, pic_lib_export); pic_defmacro(pic, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY, pic_lib_define_library); + pic_defmacro(pic, pic->sIN_LIBRARY, pic->rIN_LIBRARY, pic_lib_in_library); } diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index 0e58c992..ed7625fd 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -391,6 +391,7 @@ pic_null_syntactic_environment(pic_state *pic) pic_define_syntactic_keyword(pic, env, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY); pic_define_syntactic_keyword(pic, env, pic->sIMPORT, pic->rIMPORT); pic_define_syntactic_keyword(pic, env, pic->sEXPORT, pic->rEXPORT); + pic_define_syntactic_keyword(pic, env, pic->sIN_LIBRARY, pic->rIN_LIBRARY); pic_define_syntactic_keyword(pic, env, pic->sCOND_EXPAND, pic->rCOND_EXPAND); return env; diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 0265356e..2dd19c2c 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -250,6 +250,7 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) S(sIMPORT, "import"); S(sEXPORT, "export"); S(sDEFINE_LIBRARY, "define-library"); + S(sIN_LIBRARY, "in-library"); S(sCOND_EXPAND, "cond-expand"); S(sAND, "and"); S(sOR, "or"); @@ -301,6 +302,7 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) R(rIMPORT, "import"); R(rEXPORT, "export"); R(rDEFINE_LIBRARY, "define-library"); + R(rIN_LIBRARY, "in-library"); R(rCOND_EXPAND, "cond-expand"); R(rCONS, "cons"); R(rCAR, "car"); From 5def1df32043e73d62e542be56afb0abaeff3a6f Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 8 Jun 2015 21:04:04 +0900 Subject: [PATCH 159/177] s/pic_winder/pic_checkpoint/g --- contrib/03.callcc/callcc.c | 22 +++++++++++----------- extlib/benz/cont.c | 24 ++++++++++++------------ extlib/benz/gc.c | 20 ++++++++++---------- extlib/benz/include/picrin.h | 8 ++++---- extlib/benz/include/picrin/cont.h | 4 ++-- extlib/benz/state.c | 18 +++++++++--------- 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index c51a7861..e013836f 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -5,7 +5,7 @@ struct pic_fullcont { pic_jmpbuf *prev_jmp; - struct pic_winder *wind; + pic_checkpoint *cp; char *stk_pos, *stk_ptr; ptrdiff_t stk_len; @@ -45,19 +45,19 @@ static void cont_mark(pic_state *pic, void *data, void (*mark)(pic_state *, pic_value)) { struct pic_fullcont *cont = data; - struct pic_winder *wind; + pic_checkpoint *cp; pic_value *stack; pic_callinfo *ci; struct pic_proc **xp; size_t i; - /* winder */ - for (wind = cont->wind; wind != NULL; wind = wind->prev) { - if (wind->in) { - mark(pic, pic_obj_value(wind->in)); + /* checkpoint */ + for (cp = cont->cp; cp != NULL; cp = cp->prev) { + if (cp->in) { + mark(pic, pic_obj_value(cp->in)); } - if (wind->out) { - mark(pic, pic_obj_value(wind->out)); + if (cp->out) { + mark(pic, pic_obj_value(cp->out)); } } @@ -119,7 +119,7 @@ save_cont(pic_state *pic, struct pic_fullcont **c) cont->prev_jmp = pic->jmp; - cont->wind = pic->wind; + cont->cp = pic->cp; cont->stk_len = native_stack_length(pic, &pos); cont->stk_pos = pos; @@ -176,7 +176,7 @@ restore_cont(pic_state *pic, struct pic_fullcont *cont) pic->jmp = cont->prev_jmp; - pic->wind = cont->wind; + pic->cp = cont->cp; pic->stbase = pic_realloc(pic, pic->stbase, sizeof(pic_value) * cont->st_len); memcpy(pic->stbase, cont->st_ptr, sizeof(pic_value) * cont->st_len); @@ -220,7 +220,7 @@ cont_call(pic_state *pic) cont->results = pic_list_by_array(pic, argc, argv); /* execute guard handlers */ - pic_wind(pic, pic->wind, cont->wind); + pic_wind(pic, pic->cp, cont->cp); restore_cont(pic, cont); } diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index dd021989..b08f50cc 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -5,7 +5,7 @@ #include "picrin.h" void -pic_wind(pic_state *pic, struct pic_winder *here, struct pic_winder *there) +pic_wind(pic_state *pic, pic_checkpoint *here, pic_checkpoint *there) { if (here == there) return; @@ -23,23 +23,23 @@ pic_wind(pic_state *pic, struct pic_winder *here, struct pic_winder *there) pic_value pic_dynamic_wind(pic_state *pic, struct pic_proc *in, struct pic_proc *thunk, struct pic_proc *out) { - struct pic_winder *here; + pic_checkpoint *here; pic_value val; if (in != NULL) { pic_apply0(pic, in); /* enter */ } - here = pic->wind; - pic->wind = pic_malloc(pic, sizeof(struct pic_winder)); - pic->wind->prev = here; - pic->wind->depth = here->depth + 1; - pic->wind->in = in; - pic->wind->out = out; + here = pic->cp; + pic->cp = pic_malloc(pic, sizeof(pic_checkpoint)); + pic->cp->prev = here; + pic->cp->depth = here->depth + 1; + pic->cp->in = in; + pic->cp->out = out; val = pic_apply0(pic, thunk); - pic->wind = here; + pic->cp = here; if (out != NULL) { pic_apply0(pic, out); /* exit */ @@ -55,7 +55,7 @@ pic_save_point(pic_state *pic, struct pic_cont *cont) pic->jmp = &cont->jmp; /* save runtime context */ - cont->wind = pic->wind; + cont->cp = pic->cp; cont->sp_offset = pic->sp - pic->stbase; cont->ci_offset = pic->ci - pic->cibase; cont->xp_offset = pic->xp - pic->xpbase; @@ -79,10 +79,10 @@ pic_load_point(pic_state *pic, struct pic_cont *cont) pic_errorf(pic, "calling dead escape continuation"); } - pic_wind(pic, pic->wind, cont->wind); + pic_wind(pic, pic->cp, cont->cp); /* load runtime context */ - pic->wind = cont->wind; + pic->cp = cont->cp; pic->sp = pic->stbase + cont->sp_offset; pic->ci = pic->cibase + cont->ci_offset; pic->xp = pic->xpbase + cont->xp_offset; diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 426a9256..bf9f37ef 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -324,16 +324,16 @@ gc_unmark(union header *p) } static void -gc_mark_winder(pic_state *pic, struct pic_winder *wind) +gc_mark_checkpoint(pic_state *pic, pic_checkpoint *cp) { - if (wind->prev) { - gc_mark_object(pic, (struct pic_object *)wind->prev); + if (cp->prev) { + gc_mark_object(pic, (struct pic_object *)cp->prev); } - if (wind->in) { - gc_mark_object(pic, (struct pic_object *)wind->in); + if (cp->in) { + gc_mark_object(pic, (struct pic_object *)cp->in); } - if (wind->out) { - gc_mark_object(pic, (struct pic_object *)wind->out); + if (cp->out) { + gc_mark_object(pic, (struct pic_object *)cp->out); } } @@ -538,9 +538,9 @@ gc_mark_phase(pic_state *pic) xh_entry *it; struct pic_object *obj; - /* winder */ - if (pic->wind) { - gc_mark_winder(pic, pic->wind); + /* checkpoint */ + if (pic->cp) { + gc_mark_checkpoint(pic, pic->cp); } /* stack */ diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 1d333a98..5c4bea31 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -53,12 +53,12 @@ typedef struct pic_jmpbuf { struct pic_jmpbuf *prev; } pic_jmpbuf; -struct pic_winder { +typedef struct pic_checkpoint { struct pic_proc *in; struct pic_proc *out; int depth; - struct pic_winder *prev; -}; + struct pic_checkpoint *prev; +} pic_checkpoint; typedef struct { int argc, retc; @@ -79,7 +79,7 @@ typedef struct { pic_allocf allocf; pic_jmpbuf *jmp; - struct pic_winder *wind; + pic_checkpoint *cp; pic_value *sp; pic_value *stbase, *stend; diff --git a/extlib/benz/include/picrin/cont.h b/extlib/benz/include/picrin/cont.h index a5d83ebc..a20263ab 100644 --- a/extlib/benz/include/picrin/cont.h +++ b/extlib/benz/include/picrin/cont.h @@ -12,7 +12,7 @@ extern "C" { struct pic_cont { pic_jmpbuf jmp; - struct pic_winder *wind; + pic_checkpoint *cp; ptrdiff_t sp_offset; ptrdiff_t ci_offset; @@ -29,7 +29,7 @@ void pic_load_point(pic_state *, struct pic_cont *); struct pic_proc *pic_make_cont(pic_state *, struct pic_cont *); -void pic_wind(pic_state *, struct pic_winder *, struct pic_winder *); +void pic_wind(pic_state *, pic_checkpoint *, pic_checkpoint *); pic_value pic_dynamic_wind(pic_state *, struct pic_proc *, struct pic_proc *, struct pic_proc *); pic_value pic_values0(pic_state *); diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 2dd19c2c..3bd6f639 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -160,7 +160,7 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) pic->jmp = NULL; /* root block */ - pic->wind = NULL; + pic->cp = NULL; /* command line */ pic->argc = argc; @@ -329,10 +329,10 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) pic->macros = pic_make_dict(pic); /* root block */ - pic->wind = pic_malloc(pic, sizeof(struct pic_winder)); - pic->wind->prev = NULL; - pic->wind->depth = 0; - pic->wind->in = pic->wind->out = NULL; + pic->cp = pic_malloc(pic, sizeof(pic_checkpoint)); + pic->cp->prev = NULL; + pic->cp->depth = 0; + pic->cp->in = pic->cp->out = NULL; /* reader */ pic->reader = pic_reader_open(pic); @@ -378,11 +378,11 @@ pic_close(pic_state *pic) pic_allocf allocf = pic->allocf; /* invoke exit handlers */ - while (pic->wind) { - if (pic->wind->out) { - pic_apply0(pic, pic->wind->out); + while (pic->cp) { + if (pic->cp->out) { + pic_apply0(pic, pic->cp->out); } - pic->wind = pic->wind->prev; + pic->cp = pic->cp->prev; } /* free symbol names */ From 53a9e72413df9a4c9d7243d81bb0ce1bcbcabb32 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 8 Jun 2015 22:28:17 +0900 Subject: [PATCH 160/177] optimize var implementation --- contrib/03.callcc/callcc.c | 9 +++ extlib/benz/boot.c | 56 +++++--------- extlib/benz/cont.c | 2 + extlib/benz/gc.c | 3 + extlib/benz/include/picrin.h | 3 + extlib/benz/include/picrin/cont.h | 2 + extlib/benz/include/picrin/proc.h | 1 + extlib/benz/proc.c | 6 ++ extlib/benz/state.c | 7 ++ extlib/benz/var.c | 123 ++++++++++++++++-------------- 10 files changed, 116 insertions(+), 96 deletions(-) diff --git a/contrib/03.callcc/callcc.c b/contrib/03.callcc/callcc.c index e013836f..7b6b9609 100644 --- a/contrib/03.callcc/callcc.c +++ b/contrib/03.callcc/callcc.c @@ -21,6 +21,8 @@ struct pic_fullcont { pic_code *ip; + pic_value ptable; + struct pic_object **arena; size_t arena_size; int arena_idx; @@ -83,6 +85,9 @@ cont_mark(pic_state *pic, void *data, void (*mark)(pic_state *, pic_value)) mark(pic, pic_obj_value(cont->arena[i])); } + /* parameter table */ + mark(pic, cont->ptable); + /* result values */ mark(pic, cont->results); } @@ -144,6 +149,8 @@ save_cont(pic_state *pic, struct pic_fullcont **c) cont->ip = pic->ip; + cont->ptable = pic->ptable; + cont->arena_idx = pic->arena_idx; cont->arena_size = pic->arena_size; cont->arena = pic_malloc(pic, sizeof(struct pic_object *) * pic->arena_size); @@ -195,6 +202,8 @@ restore_cont(pic_state *pic, struct pic_fullcont *cont) pic->ip = cont->ip; + pic->ptable = cont->ptable; + pic->arena = pic_realloc(pic, pic->arena, sizeof(struct pic_object *) * cont->arena_size); memcpy(pic->arena, cont->arena, sizeof(struct pic_object *) * cont->arena_size); pic->arena_size = cont->arena_size; diff --git a/extlib/benz/boot.c b/extlib/benz/boot.c index ededb5d4..a65f4c7b 100644 --- a/extlib/benz/boot.c +++ b/extlib/benz/boot.c @@ -306,30 +306,15 @@ my $src = <<'EOL'; `(,(r 'begin) ,@(cdr clause))) ,(loop (cdr clauses))))))))))) - (define (dynamic-bind parameters values body) - (let* ((old-bindings - (current-dynamic-environment)) - (binding - (map (lambda (parameter value) - (cons parameter (parameter value #f))) - parameters - values)) - (new-bindings - (cons binding old-bindings))) - (dynamic-wind - (lambda () (current-dynamic-environment new-bindings)) - body - (lambda () (current-dynamic-environment old-bindings))))) - (define-syntax parameterize (er-macro-transformer (lambda (form r compare) (let ((formal (cadr form)) (body (cddr form))) - `(,(r 'dynamic-bind) - (list ,@(map car formal)) - (list ,@(map cadr formal)) - (,(r 'lambda) () ,@body)))))) + `(,(r 'with-parameter) + (lambda () + ,@formal + ,@body)))))) (define-syntax letrec-syntax (er-macro-transformer @@ -538,26 +523,19 @@ const char pic_boot[][80] = { " (car clause))))\n ,(if (compare (r '=>) (list-ref cla", "use 1))\n `(,(list-ref clause 2) ,(r 'key))\n ", " `(,(r 'begin) ,@(cdr clause)))\n ,(loop (", -"cdr clauses)))))))))))\n\n (define (dynamic-bind parameters values body)\n (let", -"* ((old-bindings\n (current-dynamic-environment))\n (binding\n", -" (map (lambda (parameter value)\n (cons parameter (p", -"arameter value #f)))\n parameters\n values))\n ", -" (new-bindings\n (cons binding old-bindings)))\n (dynamic-win", -"d\n (lambda () (current-dynamic-environment new-bindings))\n bod", -"y\n (lambda () (current-dynamic-environment old-bindings)))))\n\n (define", -"-syntax parameterize\n (er-macro-transformer\n (lambda (form r compare)\n ", -" (let ((formal (cadr form))\n (body (cddr form)))\n `(,(r '", -"dynamic-bind)\n (list ,@(map car formal))\n (list ,@(map cadr ", -"formal))\n (,(r 'lambda) () ,@body))))))\n\n (define-syntax letrec-synta", -"x\n (er-macro-transformer\n (lambda (form r c)\n (let ((formal (car (c", -"dr form)))\n (body (cdr (cdr form))))\n `(let ()\n ", -" ,@(map (lambda (x)\n `(,(r 'define-syntax) ,(car x) ,(cadr x", -")))\n formal)\n ,@body)))))\n\n (define-syntax let-syn", -"tax\n (er-macro-transformer\n (lambda (form r c)\n `(,(r 'letrec-synta", -"x) ,@(cdr form)))))\n\n (export let let* letrec letrec*\n let-values let*", -"-values define-values\n quasiquote unquote unquote-splicing\n an", -"d or\n cond case else =>\n do when unless\n parameterize", -"\n let-syntax letrec-syntax\n syntax-error))\n\n", +"cdr clauses)))))))))))\n\n (define-syntax parameterize\n (er-macro-transformer\n", +" (lambda (form r compare)\n (let ((formal (cadr form))\n (bo", +"dy (cddr form)))\n `(,(r 'with-parameter)\n (lambda ()\n ", +" ,@formal\n ,@body))))))\n\n (define-syntax letrec-syntax\n (er-m", +"acro-transformer\n (lambda (form r c)\n (let ((formal (car (cdr form)))\n", +" (body (cdr (cdr form))))\n `(let ()\n ,@(map (la", +"mbda (x)\n `(,(r 'define-syntax) ,(car x) ,(cadr x)))\n ", +" formal)\n ,@body)))))\n\n (define-syntax let-syntax\n (er", +"-macro-transformer\n (lambda (form r c)\n `(,(r 'letrec-syntax) ,@(cdr f", +"orm)))))\n\n (export let let* letrec letrec*\n let-values let*-values def", +"ine-values\n quasiquote unquote unquote-splicing\n and or\n ", +" cond case else =>\n do when unless\n parameterize\n ", +"let-syntax letrec-syntax\n syntax-error))\n\n", "", "" }; diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index b08f50cc..72a9b2cb 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -61,6 +61,7 @@ pic_save_point(pic_state *pic, struct pic_cont *cont) cont->xp_offset = pic->xp - pic->xpbase; cont->arena_idx = pic->arena_idx; cont->ip = pic->ip; + cont->ptable = pic->ptable; cont->results = pic_undef_value(); } @@ -88,6 +89,7 @@ pic_load_point(pic_state *pic, struct pic_cont *cont) pic->xp = pic->xpbase + cont->xp_offset; pic->arena_idx = cont->arena_idx; pic->ip = cont->ip; + pic->ptable = cont->ptable; } static pic_value diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index bf9f37ef..f7056d94 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -598,6 +598,9 @@ gc_mark_phase(pic_state *pic) gc_mark_object(pic, (struct pic_object *)pic->xSTDERR); } + /* parameter table */ + gc_mark(pic, pic->ptable); + /* attributes */ do { j = 0; diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 5c4bea31..acc68cb6 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -130,6 +130,9 @@ typedef struct { pic_value libs; xhash attrs; + pic_value ptable; + size_t pnum; + struct pic_reader *reader; bool gc_enable; diff --git a/extlib/benz/include/picrin/cont.h b/extlib/benz/include/picrin/cont.h index a20263ab..303ea0f9 100644 --- a/extlib/benz/include/picrin/cont.h +++ b/extlib/benz/include/picrin/cont.h @@ -21,6 +21,8 @@ struct pic_cont { pic_code *ip; + pic_value ptable; + pic_value results; }; diff --git a/extlib/benz/include/picrin/proc.h b/extlib/benz/include/picrin/proc.h index caa49cc6..bf1a0a4e 100644 --- a/extlib/benz/include/picrin/proc.h +++ b/extlib/benz/include/picrin/proc.h @@ -50,6 +50,7 @@ struct pic_proc *pic_make_proc_irep(pic_state *, struct pic_irep *, struct pic_c pic_sym *pic_proc_name(struct pic_proc *); struct pic_dict *pic_proc_env(pic_state *, struct pic_proc *); +bool pic_proc_env_has(pic_state *, struct pic_proc *, const char *); pic_value pic_proc_env_ref(pic_state *, struct pic_proc *, const char *); void pic_proc_env_set(pic_state *, struct pic_proc *, const char *, pic_value); diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index d730c909..9e5713c1 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -57,6 +57,12 @@ pic_proc_env(pic_state *pic, struct pic_proc *proc) return proc->u.f.env; } +bool +pic_proc_env_has(pic_state *pic, struct pic_proc *proc, const char *key) +{ + return pic_dict_has(pic, pic_proc_env(pic, proc), pic_intern_cstr(pic, key)); +} + pic_value pic_proc_env_ref(pic_state *pic, struct pic_proc *proc, const char *key) { diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 3bd6f639..75b2df9b 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -230,6 +230,10 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) pic->xSTDOUT = NULL; pic->xSTDERR = NULL; + /* parameter table */ + pic->ptable = pic_nil_value(); + pic->pnum = 0; + /* native stack marker */ pic->native_stack_start = &t; @@ -342,6 +346,9 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) pic->xSTDOUT = pic_make_standard_port(pic, xstdout, PIC_PORT_OUT); pic->xSTDERR = pic_make_standard_port(pic, xstderr, PIC_PORT_OUT); + /* parameter table */ + pic->ptable = pic_cons(pic, pic_obj_value(pic_make_dict(pic)), pic->ptable); + /* standard libraries */ pic->PICRIN_BASE = pic_make_library(pic, pic_read_cstr(pic, "(picrin base)")); pic->PICRIN_USER = pic_make_library(pic, pic_read_cstr(pic, "(picrin user)")); diff --git a/extlib/benz/var.c b/extlib/benz/var.c index 6ef88ece..42741215 100644 --- a/extlib/benz/var.c +++ b/extlib/benz/var.c @@ -5,84 +5,79 @@ #include "picrin.h" static pic_value -var_lookup(pic_state *pic, struct pic_proc *var) +var_conv(pic_state *pic, struct pic_proc *var, pic_value val) { - pic_value val, env, binding; - pic_value key = pic_obj_value(var); - - val = pic_ref(pic, pic->PICRIN_BASE, "current-dynamic-environment"); - if (pic_eq_p(val, key)) { - return pic_false_value(); + if (pic_proc_env_has(pic, var, "conv") != 0) { + return pic_apply1(pic, pic_proc_ptr(pic_proc_env_ref(pic, var, "conv")), val); } + return val; +} - env = pic_apply0(pic, pic_proc_ptr(val)); - while (! pic_nil_p(env)) { - binding = pic_car(pic, env); +static pic_value +var_get(pic_state *pic, struct pic_proc *var) +{ + pic_value elem, it; + pic_sym *id; + struct pic_dict *dict; - while (! pic_nil_p(binding)) { - if (pic_eq_p(pic_caar(pic, binding), key)) { - return pic_car(pic, binding); - } - binding = pic_cdr(pic, binding); + id = pic_sym_ptr(pic_proc_env_ref(pic, var, "id")); + + pic_for_each (elem, pic->ptable, it) { + dict = pic_dict_ptr(elem); + if (pic_dict_has(pic, dict, id)) { + return pic_dict_ref(pic, dict, id); } - env = pic_cdr(pic, env); } + pic_panic(pic, "logic flaw"); +} - return pic_false_value(); +static pic_value +var_set(pic_state *pic, struct pic_proc *var, pic_value val) +{ + pic_sym *id; + struct pic_dict *dict; + + id = pic_sym_ptr(pic_proc_env_ref(pic, var, "id")); + + dict = pic_dict_ptr(pic_car(pic, pic->ptable)); + + pic_dict_set(pic, dict, id, var_conv(pic, var, val)); + + return pic_none_value(); } static pic_value var_call(pic_state *pic) { struct pic_proc *self = pic_get_proc(pic); - pic_value val, tmp, box, conv; + pic_value val; int n; - n = pic_get_args(pic, "|oo", &val, &tmp); + n = pic_get_args(pic, "|o", &val); - box = var_lookup(pic, self); - if (! pic_test(box)) { - box = pic_proc_env_ref(pic, self, "box"); + if (n == 0) { + return var_get(pic, self); + } else { + return var_set(pic, self, val); } - - switch (n) { - case 0: - return pic_cdr(pic, box); - - case 1: - conv = pic_proc_env_ref(pic, self, "conv"); - if (pic_test(conv)) { - pic_assert_type(pic, conv, proc); - - val = pic_apply1(pic, pic_proc_ptr(conv), val); - } - pic_set_cdr(pic, box, val); - - return pic_none_value(); - - case 2: - assert(pic_false_p(tmp)); - - conv = pic_proc_env_ref(pic, self, "conv"); - if (pic_test(conv)) { - pic_assert_type(pic, conv, proc); - - return pic_apply1(pic, pic_proc_ptr(conv), val); - } else { - return val; - } - } - PIC_UNREACHABLE(); } struct pic_proc * pic_make_var(pic_state *pic, pic_value init, struct pic_proc *conv) { struct pic_proc *var; + pic_value converter = conv ? pic_obj_value(conv) : pic_false_value(); + pic_sym *id; var = pic_make_proc(pic, var_call, ""); - pic_proc_env_set(pic, var, "box", pic_cons(pic, pic_false_value(), init)); - pic_proc_env_set(pic, var, "conv", conv ? pic_obj_value(conv) : pic_false_value()); + + if (conv != NULL) { + pic_proc_env_set(pic, var, "conv", converter); + } + id = pic_intern(pic, pic_format(pic, "%d", pic->pnum++)); + pic_proc_env_set(pic, var, "id", pic_obj_value(id)); + + pic_apply1(pic, var, init); return var; } @@ -98,12 +93,26 @@ pic_var_make_parameter(pic_state *pic) return pic_obj_value(pic_make_var(pic, init, conv)); } +static pic_value +pic_var_with_parameter(pic_state *pic) +{ + struct pic_proc *body; + pic_value val; + + pic_get_args(pic, "l", &body); + + pic->ptable = pic_cons(pic, pic_obj_value(pic_make_dict(pic)), pic->ptable); + + val = pic_apply0(pic, body); + + pic->ptable = pic_cdr(pic, pic->ptable); + + return val; +} + void pic_init_var(pic_state *pic) { - pic_define_noexport(pic, "current-dynamic-environment", pic_false_value()); - pic_defun(pic, "make-parameter", pic_var_make_parameter); - - pic_set(pic, pic->PICRIN_BASE, "current-dynamic-environment", pic_obj_value(pic_make_var(pic, pic_nil_value(), NULL))); + pic_defun(pic, "with-parameter", pic_var_with_parameter); } From df56a8c154300934da8ab6cd776d6c4de657fb09 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 8 Jun 2015 22:41:43 +0900 Subject: [PATCH 161/177] cleanup --- extlib/benz/var.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extlib/benz/var.c b/extlib/benz/var.c index 42741215..08e1fb89 100644 --- a/extlib/benz/var.c +++ b/extlib/benz/var.c @@ -41,7 +41,7 @@ var_set(pic_state *pic, struct pic_proc *var, pic_value val) dict = pic_dict_ptr(pic_car(pic, pic->ptable)); - pic_dict_set(pic, dict, id, var_conv(pic, var, val)); + pic_dict_set(pic, dict, id, val); return pic_none_value(); } @@ -58,7 +58,7 @@ var_call(pic_state *pic) if (n == 0) { return var_get(pic, self); } else { - return var_set(pic, self, val); + return var_set(pic, self, var_conv(pic, self, val)); } } From 2c9a19acf54fd89c348b6ca66f53e28bf42b368e Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 16:02:23 +0900 Subject: [PATCH 162/177] introduce pic_invalid_value --- extlib/benz/debug.c | 2 +- extlib/benz/error.c | 2 +- extlib/benz/gc.c | 2 ++ extlib/benz/include/picrin/value.h | 21 +++++++++++++++++++-- extlib/benz/read.c | 18 +++++++++--------- extlib/benz/state.c | 4 ++-- 6 files changed, 34 insertions(+), 15 deletions(-) diff --git a/extlib/benz/debug.c b/extlib/benz/debug.c index 2525a656..d61e9380 100644 --- a/extlib/benz/debug.c +++ b/extlib/benz/debug.c @@ -35,7 +35,7 @@ pic_get_backtrace(pic_state *pic) void pic_print_backtrace(pic_state *pic, xFILE *file) { - assert(! pic_undef_p(pic->err)); + assert(! pic_invalid_p(pic->err)); if (! pic_error_p(pic->err)) { xfprintf(file, "raise: "); diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 15e34087..6fa5309d 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -52,7 +52,7 @@ pic_errmsg(pic_state *pic) { pic_str *str; - assert(! pic_undef_p(pic->err)); + assert(! pic_invalid_p(pic->err)); if (! pic_error_p(pic->err)) { str = pic_format(pic, "~s", pic->err); diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index f7056d94..65bf219d 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -482,6 +482,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) case PIC_TT_CHAR: case PIC_TT_EOF: case PIC_TT_UNDEF: + case PIC_TT_INVALID: pic_panic(pic, "logic flaw"); } } @@ -694,6 +695,7 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) case PIC_TT_CHAR: case PIC_TT_EOF: case PIC_TT_UNDEF: + case PIC_TT_INVALID: pic_panic(pic, "logic flaw"); } } diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index 02b06293..9790926b 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -10,8 +10,8 @@ extern "C" { #endif /** - * `undef` values never seen from user-end: that is, - * it's used only for repsenting internal special state + * `invalid` value will never be seen from user-end: + * it is only used for repsenting internal special state */ enum pic_vtype { @@ -19,6 +19,7 @@ enum pic_vtype { PIC_VTYPE_TRUE, PIC_VTYPE_FALSE, PIC_VTYPE_UNDEF, + PIC_VTYPE_INVALID, #if PIC_ENABLE_FLOAT PIC_VTYPE_FLOAT, #endif @@ -146,6 +147,7 @@ enum pic_tt { PIC_TT_CHAR, PIC_TT_EOF, PIC_TT_UNDEF, + PIC_TT_INVALID, /* heap */ PIC_TT_SYMBOL, PIC_TT_PAIR, @@ -196,6 +198,7 @@ typedef struct pic_blob pic_blob; #define pic_true_p(v) (pic_vtype(v) == PIC_VTYPE_TRUE) #define pic_false_p(v) (pic_vtype(v) == PIC_VTYPE_FALSE) #define pic_undef_p(v) (pic_vtype(v) == PIC_VTYPE_UNDEF) +#define pic_invalid_p(v) (pic_vtype(v) == PIC_VTYPE_INVALID) #define pic_float_p(v) (pic_vtype(v) == PIC_VTYPE_FLOAT) #define pic_int_p(v) (pic_vtype(v) == PIC_VTYPE_INT) #define pic_char_p(v) (pic_vtype(v) == PIC_VTYPE_CHAR) @@ -231,6 +234,7 @@ PIC_INLINE pic_value pic_true_value(); PIC_INLINE pic_value pic_false_value(); PIC_INLINE pic_value pic_bool_value(bool); PIC_INLINE pic_value pic_undef_value(); +PIC_INLINE pic_value pic_invalid_value(); PIC_INLINE pic_value pic_obj_value(void *); #if PIC_ENABLE_FLOAT PIC_INLINE pic_value pic_float_value(double); @@ -255,6 +259,8 @@ pic_type(pic_value v) return PIC_TT_BOOL; case PIC_VTYPE_UNDEF: return PIC_TT_UNDEF; + case PIC_VTYPE_INVALID: + return PIC_TT_INVALID; #if PIC_ENABLE_FLOAT case PIC_VTYPE_FLOAT: return PIC_TT_FLOAT; @@ -294,6 +300,8 @@ pic_type_repr(enum pic_tt tt) return "eof"; case PIC_TT_UNDEF: return "undef"; + case PIC_TT_INVALID: + return "invalid"; case PIC_TT_PAIR: return "pair"; case PIC_TT_STRING: @@ -500,6 +508,15 @@ pic_undef_value() return v; } +PIC_INLINE pic_value +pic_invalid_value() +{ + pic_value v; + + pic_init_value(v, PIC_VTYPE_INVALID); + return v; +} + PIC_INLINE pic_value pic_none_value() { diff --git a/extlib/benz/read.c b/extlib/benz/read.c index 50498ac2..dc7a28a5 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -92,7 +92,7 @@ read_comment(pic_state PIC_UNUSED(*pic), struct pic_port *port, int c) c = next(port); } while (! (c == EOF || c == '\n')); - return pic_undef_value(); + return pic_invalid_value(); } static pic_value @@ -114,7 +114,7 @@ read_block_comment(pic_state PIC_UNUSED(*pic), struct pic_port *port, int PIC_UN } } - return pic_undef_value(); + return pic_invalid_value(); } static pic_value @@ -122,7 +122,7 @@ read_datum_comment(pic_state *pic, struct pic_port *port, int PIC_UNUSED(c)) { read(pic, port, next(port)); - return pic_undef_value(); + return pic_invalid_value(); } static pic_value @@ -132,13 +132,13 @@ read_directive(pic_state *pic, struct pic_port *port, int c) case 'n': if (expect(port, "no-fold-case")) { pic->reader->typecase = PIC_CASE_DEFAULT; - return pic_undef_value(); + return pic_invalid_value(); } break; case 'f': if (expect(port, "fold-case")) { pic->reader->typecase = PIC_CASE_FOLD; - return pic_undef_value(); + return pic_invalid_value(); } break; } @@ -578,7 +578,7 @@ read_pair(pic_state *pic, struct pic_port *port, int c) closing: if ((c = skip(port, ' ')) != tCLOSE) { - if (pic_undef_p(read_nullable(pic, port, c))) { + if (pic_invalid_p(read_nullable(pic, port, c))) { goto closing; } read_error(pic, "unmatched parenthesis"); @@ -588,7 +588,7 @@ read_pair(pic_state *pic, struct pic_port *port, int c) else { car = read_nullable(pic, port, c); - if (pic_undef_p(car)) { + if (pic_invalid_p(car)) { goto retry; } @@ -742,7 +742,7 @@ read(pic_state *pic, struct pic_port *port, int c) retry: val = read_nullable(pic, port, c); - if (pic_undef_p(val)) { + if (pic_invalid_p(val)) { c = next(port); goto retry; } @@ -840,7 +840,7 @@ pic_read(pic_state *pic, struct pic_port *port) val = read_nullable(pic, port, c); - if (pic_undef_p(val)) { + if (pic_invalid_p(val)) { c = next(port); goto retry; } diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 75b2df9b..aa60da35 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -223,7 +223,7 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) pic->lib = NULL; /* raised error object */ - pic->err = pic_undef_value(); + pic->err = pic_invalid_value(); /* standard ports */ pic->xSTDIN = NULL; @@ -402,7 +402,7 @@ pic_close(pic_state *pic) pic->ci = pic->cibase; pic->xp = pic->xpbase; pic->arena_idx = 0; - pic->err = pic_undef_value(); + pic->err = pic_invalid_value(); pic->globals = NULL; pic->macros = NULL; xh_clear(&pic->syms); From 084d39cd9ec851d6dd8708dfc3b45a5351b00189 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 16:19:57 +0900 Subject: [PATCH 163/177] let undefined be public API --- extlib/benz/read.c | 17 ++++++++++++++++- extlib/benz/state.c | 2 ++ extlib/benz/undef.c | 21 +++++++++++++++++++++ extlib/benz/write.c | 2 +- 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 extlib/benz/undef.c diff --git a/extlib/benz/read.c b/extlib/benz/read.c index dc7a28a5..a43b28de 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -560,6 +560,21 @@ read_blob(pic_state *pic, struct pic_port *port, int c) return pic_obj_value(blob); } +static pic_value +read_undef_or_blob(pic_state *pic, struct pic_port *port, int c) +{ + if ((c = peek(port)) == 'n') { + if (! expect(port, "ndefined")) { + read_error(pic, "unexpected character while reading #undefined"); + } + return pic_undef_value(); + } + if (! isdigit(c)) { + read_error(pic, "expect #undefined or #u8(...), but illegal character given"); + } + return read_blob(pic, port, 'u'); +} + static pic_value read_pair(pic_state *pic, struct pic_port *port, int c) { @@ -786,7 +801,7 @@ reader_table_init(struct pic_reader *reader) reader->dispatch['f'] = read_false; reader->dispatch['\\'] = read_char; reader->dispatch['('] = read_vector; - reader->dispatch['u'] = read_blob; + reader->dispatch['u'] = read_undef_or_blob; reader->dispatch['.'] = read_eval; /* read labels */ diff --git a/extlib/benz/state.c b/extlib/benz/state.c index aa60da35..a555dc34 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -10,6 +10,7 @@ pic_add_feature(pic_state *pic, const char *feature) pic_push(pic, pic_obj_value(pic_intern_cstr(pic, feature)), pic->features); } +void pic_init_undef(pic_state *); void pic_init_bool(pic_state *); void pic_init_pair(pic_state *); void pic_init_port(pic_state *); @@ -107,6 +108,7 @@ pic_init_core(pic_state *pic) pic_define_syntactic_keyword(pic, pic->lib->env, pic->sBEGIN, pic->rBEGIN); pic_define_syntactic_keyword(pic, pic->lib->env, pic->sDEFINE_SYNTAX, pic->rDEFINE_SYNTAX); + pic_init_undef(pic); DONE; pic_init_bool(pic); DONE; pic_init_pair(pic); DONE; pic_init_port(pic); DONE; diff --git a/extlib/benz/undef.c b/extlib/benz/undef.c new file mode 100644 index 00000000..9e709c0e --- /dev/null +++ b/extlib/benz/undef.c @@ -0,0 +1,21 @@ +/** + * See Copyright Notice in picrin.h + */ + +#include "picrin.h" + +static pic_value +pic_undef_undefined_p(pic_state *pic) +{ + pic_value v; + + pic_get_args(pic, "o", &v); + + return pic_undef_p(v) ? pic_true_value() : pic_false_value(); +} + +void +pic_init_undef(pic_state *pic) +{ + pic_defun(pic, "undefined?", pic_undef_undefined_p); +} diff --git a/extlib/benz/write.c b/extlib/benz/write.c index d2c2a807..32aa3e8c 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -220,7 +220,7 @@ write_core(struct writer_control *p, pic_value obj) switch (pic_type(obj)) { case PIC_TT_UNDEF: - xfprintf(file, "#"); + xfprintf(file, "#undefined"); break; case PIC_TT_NIL: xfprintf(file, "()"); From 0cafbfdb0c6b4798b859097674c53b3d7570f1b7 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 16:21:15 +0900 Subject: [PATCH 164/177] update picrin/base.scm --- piclib/picrin/base.scm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/piclib/picrin/base.scm b/piclib/picrin/base.scm index baf00023..2aa6a42b 100644 --- a/piclib/picrin/base.scm +++ b/piclib/picrin/base.scm @@ -37,6 +37,8 @@ eqv? equal?) + (export undefined?) + (export boolean? boolean=? not) From 5185a73cd2fddd99cb9d3dd725d1b43e2d95c28f Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 16:34:45 +0900 Subject: [PATCH 165/177] replace none with undef --- contrib/05.r7rs/src/file.c | 2 +- contrib/05.r7rs/src/load.c | 2 +- contrib/05.r7rs/src/mutable-string.c | 6 +++--- extlib/benz/blob.c | 6 +++--- extlib/benz/codegen.c | 20 +++++++------------- extlib/benz/cont.c | 4 ++-- extlib/benz/dict.c | 8 ++++---- extlib/benz/include/picrin/config.h | 7 ------- extlib/benz/include/picrin/irep.h | 4 ++++ extlib/benz/include/picrin/value.h | 11 ----------- extlib/benz/lib.c | 10 +++++----- extlib/benz/macro.c | 4 ++-- extlib/benz/pair.c | 10 +++++----- extlib/benz/port.c | 14 +++++++------- extlib/benz/read.c | 2 +- extlib/benz/record.c | 2 +- extlib/benz/string.c | 2 +- extlib/benz/var.c | 2 +- extlib/benz/vector.c | 12 ++++++------ extlib/benz/vm.c | 10 +++++++--- extlib/benz/write.c | 8 ++++---- 21 files changed, 65 insertions(+), 81 deletions(-) diff --git a/contrib/05.r7rs/src/file.c b/contrib/05.r7rs/src/file.c index 4147bd84..ce9cb1b2 100644 --- a/contrib/05.r7rs/src/file.c +++ b/contrib/05.r7rs/src/file.c @@ -104,7 +104,7 @@ pic_file_delete(pic_state *pic) if (remove(fname) != 0) { file_error(pic, "file cannot be deleted"); } - return pic_none_value(); + return pic_undef_value(); } void diff --git a/contrib/05.r7rs/src/load.c b/contrib/05.r7rs/src/load.c index 5efb71c7..c887a1b2 100644 --- a/contrib/05.r7rs/src/load.c +++ b/contrib/05.r7rs/src/load.c @@ -35,7 +35,7 @@ pic_load_load(pic_state *pic) pic_load(pic, fn); - return pic_none_value(); + return pic_undef_value(); } void diff --git a/contrib/05.r7rs/src/mutable-string.c b/contrib/05.r7rs/src/mutable-string.c index 6937b0f6..85db9be0 100644 --- a/contrib/05.r7rs/src/mutable-string.c +++ b/contrib/05.r7rs/src/mutable-string.c @@ -30,7 +30,7 @@ pic_str_string_set(pic_state *pic) pic_get_args(pic, "sic", &str, &k, &c); pic_str_set(pic, str, k, c); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -54,7 +54,7 @@ pic_str_string_copy_ip(pic_state *pic) while (start < end) { pic_str_set(pic, to, at++, pic_str_ref(pic, from, start++)); } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -76,7 +76,7 @@ pic_str_string_fill_ip(pic_state *pic) while (start < end) { pic_str_set(pic, str, start++, c); } - return pic_none_value(); + return pic_undef_value(); } void diff --git a/extlib/benz/blob.c b/extlib/benz/blob.c index 59791ee9..c2775ea3 100644 --- a/extlib/benz/blob.c +++ b/extlib/benz/blob.c @@ -105,7 +105,7 @@ pic_blob_bytevector_u8_set(pic_state *pic) pic_errorf(pic, "byte out of range"); bv->data[k] = (unsigned char)v; - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -130,14 +130,14 @@ pic_blob_bytevector_copy_i(pic_state *pic) while (start < end) { to->data[--at] = from->data[--end]; } - return pic_none_value(); + return pic_undef_value(); } while (start < end) { to->data[at++] = from->data[start++]; } - return pic_none_value(); + return pic_undef_value(); } static pic_value diff --git a/extlib/benz/codegen.c b/extlib/benz/codegen.c index ff53f12b..79d4126c 100644 --- a/extlib/benz/codegen.c +++ b/extlib/benz/codegen.c @@ -4,12 +4,6 @@ #include "picrin.h" -#if PIC_NONE_IS_FALSE -# define OP_PUSHNONE OP_PUSHFALSE -#else -# error enable PIC_NONE_IS_FALSE -#endif - typedef xvect_t(pic_sym *) xvect; #define xv_push_sym(v, x) xv_push(pic_sym *, (v), (x)) @@ -428,7 +422,7 @@ analyze_if(analyze_state *state, pic_value obj, bool tailpos) pic_state *pic = state->pic; pic_value cond, if_true, if_false; - if_false = pic_none_value(); + if_false = pic_undef_value(); switch (pic_length(pic, obj)) { default: pic_errorf(pic, "syntax error"); @@ -456,7 +450,7 @@ analyze_begin(analyze_state *state, pic_value obj, bool tailpos) switch (pic_length(pic, obj)) { case 1: - return analyze(state, pic_none_value(), tailpos); + return analyze(state, pic_undef_value(), tailpos); case 2: return analyze(state, pic_list_ref(pic, obj, 1), tailpos); default: @@ -965,7 +959,7 @@ create_activation(codegen_state *state) emit_i(state, OP_LREF, (int)n); } else { /* otherwise, just extend the stack */ - emit_n(state, OP_PUSHNONE); + emit_n(state, OP_PUSHUNDEF); } } @@ -1158,7 +1152,7 @@ codegen(codegen_state *state, pic_value obj) type = pic_sym_ptr(pic_list_ref(pic, var, 0)); if (type == pic->sGREF) { emit_i(state, OP_GSET, index_symbol(state, pic_sym_ptr(pic_list_ref(pic, var, 1)))); - emit_n(state, OP_PUSHNONE); + emit_n(state, OP_PUSHUNDEF); return; } else if (type == pic->sCREF) { @@ -1168,7 +1162,7 @@ codegen(codegen_state *state, pic_value obj) depth = pic_int(pic_list_ref(pic, var, 1)); name = pic_sym_ptr(pic_list_ref(pic, var, 2)); emit_r(state, OP_CSET, depth, index_capture(state, name, depth)); - emit_n(state, OP_PUSHNONE); + emit_n(state, OP_PUSHUNDEF); return; } else if (type == pic->sLREF) { @@ -1178,11 +1172,11 @@ codegen(codegen_state *state, pic_value obj) name = pic_sym_ptr(pic_list_ref(pic, var, 1)); if ((i = index_capture(state, name, 0)) != -1) { emit_i(state, OP_LSET, i + (int)xv_size(cxt->args) + (int)xv_size(cxt->locals) + 1); - emit_n(state, OP_PUSHNONE); + emit_n(state, OP_PUSHUNDEF); return; } emit_i(state, OP_LSET, index_local(state, name)); - emit_n(state, OP_PUSHNONE); + emit_n(state, OP_PUSHUNDEF); return; } } diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 72a9b2cb..4b213f52 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -197,7 +197,7 @@ pic_values_by_array(pic_state *pic, size_t argc, pic_value *argv) } pic->ci->retc = (int)argc; - return argc == 0 ? pic_none_value() : pic->sp[0]; + return argc == 0 ? pic_undef_value() : pic->sp[0]; } pic_value @@ -212,7 +212,7 @@ pic_values_by_list(pic_state *pic, pic_value list) } pic->ci->retc = i; - return pic_nil_p(list) ? pic_none_value() : pic->sp[0]; + return pic_nil_p(list) ? pic_undef_value() : pic->sp[0]; } size_t diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index b802fe06..8a3d0ce7 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -107,7 +107,7 @@ pic_dict_dictionary_ref(pic_state *pic) if (pic_dict_has(pic, dict, key)) { return pic_values2(pic, pic_dict_ref(pic, dict, key), pic_true_value()); } else { - return pic_values2(pic, pic_none_value(), pic_false_value()); + return pic_values2(pic, pic_undef_value(), pic_false_value()); } } @@ -122,7 +122,7 @@ pic_dict_dictionary_set(pic_state *pic) pic_dict_set(pic, dict, key, val); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -135,7 +135,7 @@ pic_dict_dictionary_del(pic_state *pic) pic_dict_del(pic, dict, key); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -238,7 +238,7 @@ pic_dict_dictionary_for_each(pic_state *pic) pic_free(pic, it); - return pic_none_value(); + return pic_undef_value(); } static pic_value diff --git a/extlib/benz/include/picrin/config.h b/extlib/benz/include/picrin/config.h index 4b98679d..b30bc398 100644 --- a/extlib/benz/include/picrin/config.h +++ b/extlib/benz/include/picrin/config.h @@ -17,9 +17,6 @@ /** no dependency on libc */ /* #define PIC_ENABLE_LIBC 1 */ -/** treat false value as none */ -/* #define PIC_NONE_IS_FALSE 1 */ - /** custom setjmp/longjmp */ /* #define PIC_JMPBUF jmp_buf */ /* #define PIC_SETJMP(pic, buf) setjmp(buf) */ @@ -96,10 +93,6 @@ # error cannot disable float support when nan boxing is on #endif -#ifndef PIC_NONE_IS_FALSE -# define PIC_NONE_IS_FALSE 1 -#endif - #ifndef PIC_JMPBUF # include # define PIC_JMPBUF jmp_buf diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/irep.h index 213d0456..319d1b31 100644 --- a/extlib/benz/include/picrin/irep.h +++ b/extlib/benz/include/picrin/irep.h @@ -12,6 +12,7 @@ extern "C" { enum pic_opcode { OP_NOP, OP_POP, + OP_PUSHUNDEF, OP_PUSHNIL, OP_PUSHTRUE, OP_PUSHFALSE, @@ -93,6 +94,9 @@ pic_dump_code(pic_code c) case OP_POP: puts("OP_POP"); break; + case OP_PUSHUNDEF: + puts("OP_PUSHUNDEF"); + break; case OP_PUSHNIL: puts("OP_PUSHNIL"); break; diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index 9790926b..c69e09b0 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -242,7 +242,6 @@ PIC_INLINE pic_value pic_float_value(double); PIC_INLINE pic_value pic_int_value(int); PIC_INLINE pic_value pic_size_value(size_t); PIC_INLINE pic_value pic_char_value(char c); -PIC_INLINE pic_value pic_none_value(); PIC_INLINE bool pic_eq_p(pic_value, pic_value); PIC_INLINE bool pic_eqv_p(pic_value, pic_value); @@ -517,16 +516,6 @@ pic_invalid_value() return v; } -PIC_INLINE pic_value -pic_none_value() -{ -#if PIC_NONE_IS_FALSE - return pic_false_value(); -#else -# error enable PIC_NONE_IS_FALSE -#endif -} - #if PIC_NAN_BOXING || PIC_WORD_BOXING PIC_INLINE bool diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 8eff0bb7..6ece6a1f 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -246,7 +246,7 @@ pic_lib_condexpand(pic_state *pic) } } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -261,7 +261,7 @@ pic_lib_import(pic_state *pic) import(pic, argv[i]); } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -276,7 +276,7 @@ pic_lib_export(pic_state *pic) export(pic, argv[i]); } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -306,7 +306,7 @@ pic_lib_define_library(pic_state *pic) pic_raise(pic, pic->err); } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -318,7 +318,7 @@ pic_lib_in_library(pic_state *pic) pic_in_library(pic, spec); - return pic_none_value(); + return pic_undef_value(); } void diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index ed7625fd..fbda5faf 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -105,7 +105,7 @@ macroexpand_list(pic_state *pic, pic_value obj, struct pic_env *env) static pic_value macroexpand_defer(pic_state *pic, pic_value expr, struct pic_env *env) { - pic_value skel = pic_list1(pic, pic_none_value()); /* (#) */ + pic_value skel = pic_list1(pic, pic_invalid_value()); /* (#) */ pic_push(pic, pic_cons(pic, expr, skel), env->defer); @@ -238,7 +238,7 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_env *env) define_macro(pic, rename, pic_proc_ptr(val)); - return pic_none_value(); + return pic_undef_value(); } static pic_value diff --git a/extlib/benz/pair.c b/extlib/benz/pair.c index c0b031af..b3da3b6d 100644 --- a/extlib/benz/pair.c +++ b/extlib/benz/pair.c @@ -492,7 +492,7 @@ pic_pair_set_car(pic_state *pic) pic_set_car(pic, v, w); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -504,7 +504,7 @@ pic_pair_set_cdr(pic_state *pic) pic_set_cdr(pic, v, w); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -531,7 +531,7 @@ static pic_value pic_pair_make_list(pic_state *pic) { size_t i; - pic_value fill = pic_none_value(); + pic_value fill = pic_undef_value(); pic_get_args(pic, "k|o", &i, &fill); @@ -621,7 +621,7 @@ pic_pair_list_set(pic_state *pic) pic_list_set(pic, list, i, obj); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -692,7 +692,7 @@ pic_pair_for_each(pic_state *pic) pic_apply(pic, proc, pic_reverse(pic, arg)); } while (1); - return pic_none_value(); + return pic_undef_value(); } static pic_value diff --git a/extlib/benz/port.c b/extlib/benz/port.c index ab5c39d8..5b04f89b 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -327,7 +327,7 @@ pic_port_close_port(pic_state *pic) pic_close_port(pic, port); - return pic_none_value(); + return pic_undef_value(); } #define assert_port_profile(port, flgs, stat, caller) do { \ @@ -675,7 +675,7 @@ pic_port_newline(pic_state *pic) assert_port_profile(port, PIC_PORT_OUT | PIC_PORT_TEXT, PIC_PORT_OPEN, "newline"); xfputs("\n", port->file); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -689,7 +689,7 @@ pic_port_write_char(pic_state *pic) assert_port_profile(port, PIC_PORT_OUT | PIC_PORT_TEXT, PIC_PORT_OPEN, "write-char"); xfputc(c, port->file); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -714,7 +714,7 @@ pic_port_write_string(pic_state *pic) for (i = start; i < end && str[i] != '\0'; ++i) { xfputc(str[i], port->file); } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -728,7 +728,7 @@ pic_port_write_byte(pic_state *pic) assert_port_profile(port, PIC_PORT_OUT | PIC_PORT_BINARY, PIC_PORT_OPEN, "write-u8"); xfputc(i, port->file); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -754,7 +754,7 @@ pic_port_write_blob(pic_state *pic) for (i = start; i < end; ++i) { xfputc(blob->data[i], port->file); } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -767,7 +767,7 @@ pic_port_flush(pic_state *pic) assert_port_profile(port, PIC_PORT_OUT, PIC_PORT_OPEN, "flush-output-port"); xfflush(port->file); - return pic_none_value(); + return pic_undef_value(); } void diff --git a/extlib/benz/read.c b/extlib/benz/read.c index a43b28de..8320af38 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -633,7 +633,7 @@ read_label_set(pic_state *pic, struct pic_port *port, int i) { pic_value tmp; - val = pic_cons(pic, pic_none_value(), pic_none_value()); + val = pic_cons(pic, pic_undef_value(), pic_undef_value()); xh_put_int(&pic->reader->labels, i, &val); diff --git a/extlib/benz/record.c b/extlib/benz/record.c index dc35e223..55c98f14 100644 --- a/extlib/benz/record.c +++ b/extlib/benz/record.c @@ -96,7 +96,7 @@ pic_record_record_set(pic_state *pic) pic_record_set(pic, rec, slot, val); - return pic_none_value(); + return pic_undef_value(); } void diff --git a/extlib/benz/string.c b/extlib/benz/string.c index ee1f3527..1e1e083c 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -646,7 +646,7 @@ pic_str_string_for_each(pic_state *pic) pic_apply(pic, proc, vals); } - return pic_none_value(); + return pic_undef_value(); } static pic_value diff --git a/extlib/benz/var.c b/extlib/benz/var.c index 08e1fb89..95da6b16 100644 --- a/extlib/benz/var.c +++ b/extlib/benz/var.c @@ -43,7 +43,7 @@ var_set(pic_state *pic, struct pic_proc *var, pic_value val) pic_dict_set(pic, dict, id, val); - return pic_none_value(); + return pic_undef_value(); } static pic_value diff --git a/extlib/benz/vector.c b/extlib/benz/vector.c index 08d2f72a..c3b914c1 100644 --- a/extlib/benz/vector.c +++ b/extlib/benz/vector.c @@ -14,7 +14,7 @@ pic_make_vec(pic_state *pic, size_t len) vec->len = len; vec->data = (pic_value *)pic_malloc(pic, sizeof(pic_value) * len); for (i = 0; i < len; ++i) { - vec->data[i] = pic_none_value(); + vec->data[i] = pic_undef_value(); } return vec; } @@ -119,7 +119,7 @@ pic_vec_vector_set(pic_state *pic) pic_errorf(pic, "vector-set!: index out of range"); } v->data[k] = o; - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -144,14 +144,14 @@ pic_vec_vector_copy_i(pic_state *pic) while (start < end) { to->data[--at] = from->data[--end]; } - return pic_none_value(); + return pic_undef_value(); } while (start < end) { to->data[at++] = from->data[start++]; } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -231,7 +231,7 @@ pic_vec_vector_fill_i(pic_state *pic) vec->data[start++] = obj; } - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -292,7 +292,7 @@ pic_vec_vector_for_each(pic_state *pic) pic_apply(pic, proc, vals); } - return pic_none_value(); + return pic_undef_value(); } static pic_value diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 17bf655f..825b63fd 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -682,8 +682,8 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) #if PIC_DIRECT_THREADED_VM static void *oplabels[] = { - &&L_OP_NOP, &&L_OP_POP, &&L_OP_PUSHNIL, &&L_OP_PUSHTRUE, &&L_OP_PUSHFALSE, - &&L_OP_PUSHINT, &&L_OP_PUSHCHAR, &&L_OP_PUSHCONST, + &&L_OP_NOP, &&L_OP_POP, &&L_OP_PUSHUNDEF, &&L_OP_PUSHNIL, &&L_OP_PUSHTRUE, + &&L_OP_PUSHFALSE, &&L_OP_PUSHINT, &&L_OP_PUSHCHAR, &&L_OP_PUSHCONST, &&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, @@ -729,6 +729,10 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) (void)(POP()); NEXT; } + CASE(OP_PUSHUNDEF) { + PUSH(pic_undef_value()); + NEXT; + } CASE(OP_PUSHNIL) { PUSH(pic_nil_value()); NEXT; @@ -1197,7 +1201,7 @@ pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, pic_value args) ci->retc = (int)pic_length(pic, args); if (ci->retc == 0) { - return pic_none_value(); + return pic_undef_value(); } else { return pic_car(pic, args); } diff --git a/extlib/benz/write.c b/extlib/benz/write.c index 32aa3e8c..73ee11f5 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -449,7 +449,7 @@ pic_write_write(pic_state *pic) pic_get_args(pic, "o|p", &v, &port); write(pic, v, port->file); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -460,7 +460,7 @@ pic_write_write_simple(pic_state *pic) pic_get_args(pic, "o|p", &v, &port); write_simple(pic, v, port->file); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -471,7 +471,7 @@ pic_write_write_shared(pic_state *pic) pic_get_args(pic, "o|p", &v, &port); write_shared(pic, v, port->file); - return pic_none_value(); + return pic_undef_value(); } static pic_value @@ -482,7 +482,7 @@ pic_write_display(pic_state *pic) pic_get_args(pic, "o|p", &v, &port); display(pic, v, port->file); - return pic_none_value(); + return pic_undef_value(); } void From 2a1b7cf287fab6160cc88270414c1fd9c3ee9074 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 17:05:47 +0900 Subject: [PATCH 166/177] remove picrin/dictionary.scm --- Makefile | 1 - contrib/10.srfi/srfi/17.scm | 1 - contrib/20.repl/repl.scm | 1 - piclib/picrin/dictionary.scm | 14 -------------- 4 files changed, 17 deletions(-) delete mode 100644 piclib/picrin/dictionary.scm diff --git a/Makefile b/Makefile index 737c2985..ea71bca4 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,6 @@ PICRIN_LIBS = \ piclib/picrin/macro.scm\ piclib/picrin/record.scm\ piclib/picrin/array.scm\ - piclib/picrin/dictionary.scm\ piclib/picrin/experimental/lambda.scm\ piclib/picrin/syntax-rules.scm\ piclib/picrin/test.scm diff --git a/contrib/10.srfi/srfi/17.scm b/contrib/10.srfi/srfi/17.scm index c1bed0d0..fe1a85fe 100644 --- a/contrib/10.srfi/srfi/17.scm +++ b/contrib/10.srfi/srfi/17.scm @@ -2,7 +2,6 @@ (import (except (scheme base) set!) (prefix (only (scheme base) set!) %) - (picrin dictionary) (except (picrin base) set!) (srfi 1) (srfi 8)) diff --git a/contrib/20.repl/repl.scm b/contrib/20.repl/repl.scm index 60411749..3afd70c8 100644 --- a/contrib/20.repl/repl.scm +++ b/contrib/20.repl/repl.scm @@ -30,7 +30,6 @@ (scheme lazy) (scheme time) (picrin macro) - (picrin dictionary) (picrin array) (picrin library)) '(picrin user)) diff --git a/piclib/picrin/dictionary.scm b/piclib/picrin/dictionary.scm deleted file mode 100644 index 1a789c7f..00000000 --- a/piclib/picrin/dictionary.scm +++ /dev/null @@ -1,14 +0,0 @@ -(define-library (picrin dictionary) - (import (picrin base)) - - (export dictionary? - dictionary - make-dictionary - dictionary-ref - dictionary-set! - dictionary-delete! - dictionary-size - dictionary->plist - plist->dictionary - dictionary->alist - alist->dictionary)) From 448bbf679d3395acae6b7193f02d5799308f5c4a Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 17:06:19 +0900 Subject: [PATCH 167/177] change dictionary interface. use #undefined object as sentinel --- contrib/10.srfi/srfi/17.scm | 9 +- docs/libs.rst | 10 +- extlib/benz/boot.c | 288 ++++++++++++++++++------------------ extlib/benz/dict.c | 31 ++-- piclib/picrin/base.scm | 1 - piclib/picrin/macro.scm | 24 ++- 6 files changed, 172 insertions(+), 191 deletions(-) diff --git a/contrib/10.srfi/srfi/17.scm b/contrib/10.srfi/srfi/17.scm index fe1a85fe..0a7bdbad 100644 --- a/contrib/10.srfi/srfi/17.scm +++ b/contrib/10.srfi/srfi/17.scm @@ -16,11 +16,10 @@ (define setter (letrec ((setter (lambda (proc) - (receive (setter exists) (dictionary-ref (attribute proc) - '@@setter) - (if exists - setter - (error "No setter found"))))) + (let ((setter (dictionary-ref (attribute proc) '@@setter))) + (if (undefined? setter) + (error "no setter found") + setter)))) (set-setter! (lambda (proc setter) (dictionary-set! (attribute proc) '@@setter setter)))) diff --git a/docs/libs.rst b/docs/libs.rst index b67ea145..232dcdaa 100644 --- a/docs/libs.rst +++ b/docs/libs.rst @@ -101,9 +101,7 @@ Technically, picrin's array is implemented as a ring-buffer, effective double-en (picrin dictionary) ------------------- -Object-to-object table. Internally it is implemented on hash-table. Equivalence is tested with equal? procedure. - -Note that dictionary is not a weak map; if you are going to make a highly memory-consuming program with dictionaries, you should know that dictionaries keep their bound objects and never let them free until you explicitly deletes bindings. +Symbol-to-object hash table. - **(make-dictionary)** @@ -119,15 +117,13 @@ Note that dictionary is not a weak map; if you are going to make a highly memory - **(dictionary-ref dict key)** - Look up dictionary dict for a value associated with key. It returns two values: first is the associated value if exists, and second is a boolean of lookup result. + Look up dictionary dict for a value associated with key. If dict has a slot for key `key`, the value stored in the slot is returned. Otherwise `#undefined` is returned. - **(dictionary-set! dict key obj)** If there is no value already associated with key, this function newly creates a binding of key with obj. Otherwise, updates the existing binding with given obj. -- **(dictionary-delete dict key)** - - Deletes the binding associated with key from dict. If no binding on dict is associated with key, an error will be raised. + If obj is `#undefined`, this procedure behaves like a deleter: it will remove the key/value slot with the name `key` from the dictionary. When no slot is associated with `key`, it will do nothing. - **(dictionary-size dict)** diff --git a/extlib/benz/boot.c b/extlib/benz/boot.c index a65f4c7b..59eb736b 100644 --- a/extlib/benz/boot.c +++ b/extlib/benz/boot.c @@ -14,14 +14,13 @@ my $src = <<'EOL'; "memoize on symbols" (define cache (make-dictionary)) (lambda (sym) - (call-with-values (lambda () (dictionary-ref cache sym)) - (lambda (value exists) - (if exists - value - (begin - (define val (f sym)) - (dictionary-set! cache sym val) - val)))))) + (define value (dictionary-ref cache sym)) + (if (not (undefined? value)) + value + (begin + (define val (f sym)) + (dictionary-set! cache sym val) + val)))) (define (er-macro-transformer f) (lambda (mac-env) @@ -395,147 +394,146 @@ EOL const char pic_boot[][80] = { "\n(define-library (picrin base)\n\n (define (memoize f)\n \"memoize on symbols\"\n ", -" (define cache (make-dictionary))\n (lambda (sym)\n (call-with-values (l", -"ambda () (dictionary-ref cache sym))\n (lambda (value exists)\n (i", -"f exists\n value\n (begin\n (define val (f", -" sym))\n (dictionary-set! cache sym val)\n val))))))", -"\n\n (define (er-macro-transformer f)\n (lambda (mac-env)\n (lambda (expr u", -"se-env)\n\n (define rename\n (memoize\n (lambda (sym)\n ", -" (make-identifier sym mac-env))))\n\n (define (compare x y)\n ", -" (if (not (symbol? x))\n #f\n (if (not (symbol? y))\n ", -" #f\n (identifier=? use-env x use-env y))))\n\n ", -" (f expr rename compare))))\n\n (define-syntax syntax-error\n (er-macro-tran", -"sformer\n (lambda (expr rename compare)\n (apply error (cdr expr)))))\n\n ", -" (define-syntax define-auxiliary-syntax\n (er-macro-transformer\n (lambda (", -"expr r c)\n (list (r 'define-syntax) (cadr expr)\n (list (r 'lam", -"bda) '_\n (list (r 'lambda) '_\n (list (", -"r 'error) (list (r 'string-append) \"invalid use of auxiliary syntax: '\" (symbol-", -">string (cadr expr)) \"'\"))))))))\n\n (define-auxiliary-syntax else)\n (define-aux", -"iliary-syntax =>)\n (define-auxiliary-syntax unquote)\n (define-auxiliary-syntax", -" unquote-splicing)\n\n (define-syntax let\n (er-macro-transformer\n (lambda ", -"(expr r compare)\n (if (symbol? (cadr expr))\n (begin\n ", -" (define name (car (cdr expr)))\n (define bindings (car (cdr (cdr", -" expr))))\n (define body (cdr (cdr (cdr expr))))\n (li", -"st (r 'let) '()\n (list (r 'define) name\n ", -" (cons (r 'lambda) (cons (map car bindings) body)))\n (cons n", -"ame (map cadr bindings))))\n (begin\n (set! bindings (cadr e", -"xpr))\n (set! body (cddr expr))\n (cons (cons (r 'lambda) ", -"(cons (map car bindings) body))\n (map cadr bindings)))))))\n\n ", -"(define-syntax cond\n (er-macro-transformer\n (lambda (expr r compare)\n ", -" (let ((clauses (cdr expr)))\n (if (null? clauses)\n #f\n ", -" (begin\n (define clause (car clauses))\n (if ", -"(compare (r 'else) (car clause))\n (cons (r 'begin) (cdr clause", -"))\n (if (if (>= (length clause) 2)\n ", -"(compare (r '=>) (list-ref clause 1))\n #f)\n ", -" (list (r 'let) (list (list (r 'x) (car clause)))\n ", -" (list (r 'if) (r 'x)\n (list (list-re", -"f clause 2) (r 'x))\n (cons (r 'cond) (cdr clau", -"ses))))\n (list (r 'if) (car clause)\n ", -" (cons (r 'begin) (cdr clause))\n (cons (r 'con", -"d) (cdr clauses)))))))))))\n\n (define-syntax and\n (er-macro-transformer\n ", -"(lambda (expr r compare)\n (let ((exprs (cdr expr)))\n (cond\n ", -" ((null? exprs)\n #t)\n ((= (length exprs) 1)\n (car", -" exprs))\n (else\n (list (r 'let) (list (list (r 'it) (car expr", -"s)))\n (list (r 'if) (r 'it)\n (cons (r 'and", -") (cdr exprs))\n (r 'it)))))))))\n\n (define-syntax or\n (", +" (define cache (make-dictionary))\n (lambda (sym)\n (define value (dicti", +"onary-ref cache sym))\n (if (not (undefined? value))\n value\n ", +" (begin\n (define val (f sym))\n (dictionary-set! cache sy", +"m val)\n val))))\n\n (define (er-macro-transformer f)\n (lambda (mac-", +"env)\n (lambda (expr use-env)\n\n (define rename\n (memoize\n ", +" (lambda (sym)\n (make-identifier sym mac-env))))\n\n (de", +"fine (compare x y)\n (if (not (symbol? x))\n #f\n ", +" (if (not (symbol? y))\n #f\n (identifier=? use", +"-env x use-env y))))\n\n (f expr rename compare))))\n\n (define-syntax synta", +"x-error\n (er-macro-transformer\n (lambda (expr rename compare)\n (app", +"ly error (cdr expr)))))\n\n (define-syntax define-auxiliary-syntax\n (er-macro-", +"transformer\n (lambda (expr r c)\n (list (r 'define-syntax) (cadr expr)\n", +" (list (r 'lambda) '_\n (list (r 'lambda) '_\n ", +" (list (r 'error) (list (r 'string-append) \"invalid use of aux", +"iliary syntax: '\" (symbol->string (cadr expr)) \"'\"))))))))\n\n (define-auxiliary-", +"syntax else)\n (define-auxiliary-syntax =>)\n (define-auxiliary-syntax unquote)\n", +" (define-auxiliary-syntax unquote-splicing)\n\n (define-syntax let\n (er-macro", +"-transformer\n (lambda (expr r compare)\n (if (symbol? (cadr expr))\n ", +" (begin\n (define name (car (cdr expr)))\n (defi", +"ne bindings (car (cdr (cdr expr))))\n (define body (cdr (cdr (cdr", +" expr))))\n (list (r 'let) '()\n (list (r 'define) n", +"ame\n (cons (r 'lambda) (cons (map car bindings) body)))\n", +" (cons name (map cadr bindings))))\n (begin\n ", +" (set! bindings (cadr expr))\n (set! body (cddr expr))\n ", +" (cons (cons (r 'lambda) (cons (map car bindings) body))\n (ma", +"p cadr bindings)))))))\n\n (define-syntax cond\n (er-macro-transformer\n (la", +"mbda (expr r compare)\n (let ((clauses (cdr expr)))\n (if (null? cla", +"uses)\n #f\n (begin\n (define clause (car cla", +"uses))\n (if (compare (r 'else) (car clause))\n (c", +"ons (r 'begin) (cdr clause))\n (if (if (>= (length clause) 2)\n ", +" (compare (r '=>) (list-ref clause 1))\n ", +" #f)\n (list (r 'let) (list (list (r 'x) (car cla", +"use)))\n (list (r 'if) (r 'x)\n ", +" (list (list-ref clause 2) (r 'x))\n ", +" (cons (r 'cond) (cdr clauses))))\n (list (r 'if) (car clau", +"se)\n (cons (r 'begin) (cdr clause))\n ", +" (cons (r 'cond) (cdr clauses)))))))))))\n\n (define-syntax and\n (", "er-macro-transformer\n (lambda (expr r compare)\n (let ((exprs (cdr expr", ")))\n (cond\n ((null? exprs)\n #t)\n ((= (length", " exprs) 1)\n (car exprs))\n (else\n (list (r 'let) (li", "st (list (r 'it) (car exprs)))\n (list (r 'if) (r 'it)\n ", -" (r 'it)\n (cons (r 'or) (cdr exprs))))))))))\n\n", -" (define-syntax quasiquote\n (er-macro-transformer\n (lambda (form rename ", -"compare)\n\n (define (quasiquote? form)\n (and (pair? form) (compare ", -"(car form) (rename 'quasiquote))))\n\n (define (unquote? form)\n (and", -" (pair? form) (compare (car form) (rename 'unquote))))\n\n (define (unquote-", -"splicing? form)\n (and (pair? form) (pair? (car form))\n (com", -"pare (car (car form)) (rename 'unquote-splicing))))\n\n (define (qq depth ex", -"pr)\n (cond\n ;; unquote\n ((unquote? expr)\n (i", -"f (= depth 1)\n (car (cdr expr))\n (list (rename 'list", -")\n (list (rename 'quote) (rename 'unquote))\n ", -" (qq (- depth 1) (car (cdr expr))))))\n ;; unquote-splicing\n ", -" ((unquote-splicing? expr)\n (if (= depth 1)\n (list (ren", -"ame 'append)\n (car (cdr (car expr)))\n (q", -"q depth (cdr expr)))\n (list (rename 'cons)\n (l", -"ist (rename 'list)\n (list (rename 'quote) (rename 'unq", -"uote-splicing))\n (qq (- depth 1) (car (cdr (car expr))", -")))\n (qq depth (cdr expr)))))\n ;; quasiquote\n ", -" ((quasiquote? expr)\n (list (rename 'list)\n (list (", -"rename 'quote) (rename 'quasiquote))\n (qq (+ depth 1) (car (cdr ", -"expr)))))\n ;; list\n ((pair? expr)\n (list (rename 'co", -"ns)\n (qq depth (car expr))\n (qq depth (cdr expr)", -")))\n ;; vector\n ((vector? expr)\n (list (rename 'list", -"->vector) (qq depth (vector->list expr))))\n ;; simple datum\n (", -"else\n (list (rename 'quote) expr))))\n\n (let ((x (cadr form)))\n ", -" (qq 1 x)))))\n\n (define-syntax let*\n (er-macro-transformer\n (lambd", -"a (form r compare)\n (let ((bindings (cadr form))\n (body (cddr ", -"form)))\n (if (null? bindings)\n `(,(r 'let) () ,@body)\n ", -" `(,(r 'let) ((,(caar bindings)\n ,@(cdar binding", -"s)))\n (,(r 'let*) (,@(cdr bindings))\n ,@body)))))))", -"\n\n (define-syntax letrec*\n (er-macro-transformer\n (lambda (form r compar", -"e)\n (let ((bindings (cadr form))\n (body (cddr form)))\n ", -" (let ((vars (map (lambda (v) `(,v #f)) (map car bindings)))\n (ini", -"tials (map (lambda (v) `(,(r 'set!) ,@v)) bindings)))\n `(,(r 'let) (,@", -"vars)\n ,@initials\n ,@body))))))\n\n (define-syntax letrec", -"\n (er-macro-transformer\n (lambda (form rename compare)\n `(,(rename ", -"'letrec*) ,@(cdr form)))))\n\n (define-syntax let*-values\n (er-macro-transform", -"er\n (lambda (form r c)\n (let ((formals (cadr form)))\n (if (nul", -"l? formals)\n `(,(r 'let) () ,@(cddr form))\n `(,(r 'call-", -"with-values) (,(r 'lambda) () ,@(cdar formals))\n (,(r 'lambda) (,@", -"(caar formals))\n (,(r 'let*-values) (,@(cdr formals))\n ", -" ,@(cddr form)))))))))\n\n (define-syntax let-values\n (er-macro-transform", -"er\n (lambda (form r c)\n `(,(r 'let*-values) ,@(cdr form)))))\n\n (defin", -"e-syntax define-values\n (er-macro-transformer\n (lambda (form r compare)\n ", -" (let ((formal (cadr form))\n (exprs (cddr form)))\n `(,", -"(r 'begin)\n ,@(let loop ((formal formal))\n (if (not (p", -"air? formal))\n (if (symbol? formal)\n `", -"((,(r 'define) ,formal #f))\n '())\n `((", -",(r 'define) ,(car formal) #f) . ,(loop (cdr formal)))))\n (,(r 'call-", -"with-values) (,(r 'lambda) () ,@exprs)\n (,(r 'lambda) ,(r 'args)\n ", -" ,@(let loop ((formal formal) (args (r 'args)))\n ", -" (if (not (pair? formal))\n (if (symbol? formal)\n ", -" `((,(r 'set!) ,formal ,args))\n '()", -")\n `((,(r 'set!) ,(car formal) (,(r 'car) ,args))\n ", -" ,@(loop (cdr formal) `(,(r 'cdr) ,args))))))))))))\n\n (define", -"-syntax do\n (er-macro-transformer\n (lambda (form r compare)\n (let (", -"(bindings (car (cdr form)))\n (finish (car (cdr (cdr form))))\n ", -" (body (cdr (cdr (cdr form)))))\n `(,(r 'let) ,(r 'loop) ,(map", -" (lambda (x)\n (list (car x) (cadr x)))\n ", -" bindings)\n (,(r 'if) ,(car finish)", -"\n (,(r 'begin) ,@(cdr finish))\n (,(r 'begin) ,@body\n ", -" (,(r 'loop) ,@(map (lambda (x)\n (if (nul", -"l? (cddr x))\n (car x)\n ", -" (car (cddr x))))\n bindings))))))", -")))\n\n (define-syntax when\n (er-macro-transformer\n (lambda (expr rename c", -"ompare)\n (let ((test (cadr expr))\n (body (cddr expr)))\n ", -" `(,(rename 'if) ,test\n (,(rename 'begin) ,@body)\n #f", -")))))\n\n (define-syntax unless\n (er-macro-transformer\n (lambda (expr rena", -"me compare)\n (let ((test (cadr expr))\n (body (cddr expr)))\n ", -" `(,(rename 'if) ,test\n #f\n (,(rename 'begin) ,@b", -"ody))))))\n\n (define-syntax case\n (er-macro-transformer\n (lambda (expr r ", -"compare)\n (let ((key (cadr expr))\n (clauses (cddr expr)))\n ", -" `(,(r 'let) ((,(r 'key) ,key))\n ,(let loop ((clauses clauses))\n ", -" (if (null? clauses)\n #f\n (begi", -"n\n (define clause (car clauses))\n `(,(r ", -"'if) ,(if (compare (r 'else) (car clause))\n ", -"'#t\n `(,(r 'or)\n ", -" ,@(map (lambda (x)\n `(", -",(r 'eqv?) ,(r 'key) (,(r 'quote) ,x)))\n ", -" (car clause))))\n ,(if (compare (r '=>) (list-ref cla", -"use 1))\n `(,(list-ref clause 2) ,(r 'key))\n ", -" `(,(r 'begin) ,@(cdr clause)))\n ,(loop (", -"cdr clauses)))))))))))\n\n (define-syntax parameterize\n (er-macro-transformer\n", -" (lambda (form r compare)\n (let ((formal (cadr form))\n (bo", -"dy (cddr form)))\n `(,(r 'with-parameter)\n (lambda ()\n ", -" ,@formal\n ,@body))))))\n\n (define-syntax letrec-syntax\n (er-m", -"acro-transformer\n (lambda (form r c)\n (let ((formal (car (cdr form)))\n", -" (body (cdr (cdr form))))\n `(let ()\n ,@(map (la", -"mbda (x)\n `(,(r 'define-syntax) ,(car x) ,(cadr x)))\n ", -" formal)\n ,@body)))))\n\n (define-syntax let-syntax\n (er", -"-macro-transformer\n (lambda (form r c)\n `(,(r 'letrec-syntax) ,@(cdr f", -"orm)))))\n\n (export let let* letrec letrec*\n let-values let*-values def", -"ine-values\n quasiquote unquote unquote-splicing\n and or\n ", -" cond case else =>\n do when unless\n parameterize\n ", -"let-syntax letrec-syntax\n syntax-error))\n\n", +" (cons (r 'and) (cdr exprs))\n (r 'it)))))))))\n", +"\n (define-syntax or\n (er-macro-transformer\n (lambda (expr r compare)\n ", +" (let ((exprs (cdr expr)))\n (cond\n ((null? exprs)\n ", +" #t)\n ((= (length exprs) 1)\n (car exprs))\n (else\n ", +" (list (r 'let) (list (list (r 'it) (car exprs)))\n (list ", +"(r 'if) (r 'it)\n (r 'it)\n (cons (r '", +"or) (cdr exprs))))))))))\n\n (define-syntax quasiquote\n (er-macro-transformer\n", +" (lambda (form rename compare)\n\n (define (quasiquote? form)\n (", +"and (pair? form) (compare (car form) (rename 'quasiquote))))\n\n (define (un", +"quote? form)\n (and (pair? form) (compare (car form) (rename 'unquote))))", +"\n\n (define (unquote-splicing? form)\n (and (pair? form) (pair? (car", +" form))\n (compare (car (car form)) (rename 'unquote-splicing))))\n\n ", +" (define (qq depth expr)\n (cond\n ;; unquote\n ((un", +"quote? expr)\n (if (= depth 1)\n (car (cdr expr))\n ", +" (list (rename 'list)\n (list (rename 'quote) (rename '", +"unquote))\n (qq (- depth 1) (car (cdr expr))))))\n ;;", +" unquote-splicing\n ((unquote-splicing? expr)\n (if (= depth 1)", +"\n (list (rename 'append)\n (car (cdr (car expr)", +"))\n (qq depth (cdr expr)))\n (list (rename 'con", +"s)\n (list (rename 'list)\n (list (r", +"ename 'quote) (rename 'unquote-splicing))\n (qq (- dept", +"h 1) (car (cdr (car expr)))))\n (qq depth (cdr expr)))))\n ", +" ;; quasiquote\n ((quasiquote? expr)\n (list (rename 'list", +")\n (list (rename 'quote) (rename 'quasiquote))\n ", +"(qq (+ depth 1) (car (cdr expr)))))\n ;; list\n ((pair? expr)\n ", +" (list (rename 'cons)\n (qq depth (car expr))\n ", +" (qq depth (cdr expr))))\n ;; vector\n ((vector? expr)\n ", +" (list (rename 'list->vector) (qq depth (vector->list expr))))\n ;", +"; simple datum\n (else\n (list (rename 'quote) expr))))\n\n ", +" (let ((x (cadr form)))\n (qq 1 x)))))\n\n (define-syntax let*\n (er-mac", +"ro-transformer\n (lambda (form r compare)\n (let ((bindings (cadr form))", +"\n (body (cddr form)))\n (if (null? bindings)\n `(,", +"(r 'let) () ,@body)\n `(,(r 'let) ((,(caar bindings)\n ", +" ,@(cdar bindings)))\n (,(r 'let*) (,@(cdr bindings))\n ", +" ,@body)))))))\n\n (define-syntax letrec*\n (er-macro-transformer\n ", +" (lambda (form r compare)\n (let ((bindings (cadr form))\n (b", +"ody (cddr form)))\n (let ((vars (map (lambda (v) `(,v #f)) (map car bindi", +"ngs)))\n (initials (map (lambda (v) `(,(r 'set!) ,@v)) bindings)))\n", +" `(,(r 'let) (,@vars)\n ,@initials\n ,@body)))))", +")\n\n (define-syntax letrec\n (er-macro-transformer\n (lambda (form rename c", +"ompare)\n `(,(rename 'letrec*) ,@(cdr form)))))\n\n (define-syntax let*-valu", +"es\n (er-macro-transformer\n (lambda (form r c)\n (let ((formals (cadr", +" form)))\n (if (null? formals)\n `(,(r 'let) () ,@(cddr form))", +"\n `(,(r 'call-with-values) (,(r 'lambda) () ,@(cdar formals))\n ", +" (,(r 'lambda) (,@(caar formals))\n (,(r 'let*-values) (,@", +"(cdr formals))\n ,@(cddr form)))))))))\n\n (define-syntax let-valu", +"es\n (er-macro-transformer\n (lambda (form r c)\n `(,(r 'let*-values) ", +",@(cdr form)))))\n\n (define-syntax define-values\n (er-macro-transformer\n ", +"(lambda (form r compare)\n (let ((formal (cadr form))\n (exprs ", +"(cddr form)))\n `(,(r 'begin)\n ,@(let loop ((formal formal))\n ", +" (if (not (pair? formal))\n (if (symbol? formal)", +"\n `((,(r 'define) ,formal #f))\n '(", +"))\n `((,(r 'define) ,(car formal) #f) . ,(loop (cdr formal)))", +"))\n (,(r 'call-with-values) (,(r 'lambda) () ,@exprs)\n (", +",(r 'lambda) ,(r 'args)\n ,@(let loop ((formal formal) (args (r 'a", +"rgs)))\n (if (not (pair? formal))\n (if ", +"(symbol? formal)\n `((,(r 'set!) ,formal ,args))\n ", +" '())\n `((,(r 'set!) ,(car formal) ", +"(,(r 'car) ,args))\n ,@(loop (cdr formal) `(,(r 'cdr) ,a", +"rgs))))))))))))\n\n (define-syntax do\n (er-macro-transformer\n (lambda (for", +"m r compare)\n (let ((bindings (car (cdr form)))\n (finish (ca", +"r (cdr (cdr form))))\n (body (cdr (cdr (cdr form)))))\n `(", +",(r 'let) ,(r 'loop) ,(map (lambda (x)\n (", +"list (car x) (cadr x)))\n bindings)\n ", +" (,(r 'if) ,(car finish)\n (,(r 'begin) ,@(cdr finish))\n ", +"(,(r 'begin) ,@body\n (,(r 'loop) ,@(map (lambda (x)\n ", +" (if (null? (cddr x))\n (ca", +"r x)\n (car (cddr x))))\n ", +" bindings)))))))))\n\n (define-syntax when\n (er-macro-transformer\n ", +" (lambda (expr rename compare)\n (let ((test (cadr expr))\n (", +"body (cddr expr)))\n `(,(rename 'if) ,test\n (,(rename 'begin", +") ,@body)\n #f)))))\n\n (define-syntax unless\n (er-macro-transform", +"er\n (lambda (expr rename compare)\n (let ((test (cadr expr))\n ", +" (body (cddr expr)))\n `(,(rename 'if) ,test\n #f\n ", +" (,(rename 'begin) ,@body))))))\n\n (define-syntax case\n (er-macro-transfo", +"rmer\n (lambda (expr r compare)\n (let ((key (cadr expr))\n (", +"clauses (cddr expr)))\n `(,(r 'let) ((,(r 'key) ,key))\n ,(let ", +"loop ((clauses clauses))\n (if (null? clauses)\n #", +"f\n (begin\n (define clause (car clauses))\n ", +" `(,(r 'if) ,(if (compare (r 'else) (car clause))\n ", +" '#t\n `(,(r 'or)\n ", +" ,@(map (lambda (x)\n ", +" `(,(r 'eqv?) ,(r 'key) (,(r 'quote) ,x)))\n ", +" (car clause))))\n ,(if (com", +"pare (r '=>) (list-ref clause 1))\n `(,(list-ref claus", +"e 2) ,(r 'key))\n `(,(r 'begin) ,@(cdr clause)))\n ", +" ,(loop (cdr clauses)))))))))))\n\n (define-syntax parameterize\n", +" (er-macro-transformer\n (lambda (form r compare)\n (let ((formal (ca", +"dr form))\n (body (cddr form)))\n `(,(r 'with-parameter)\n ", +" (lambda ()\n ,@formal\n ,@body))))))\n\n (define-synt", +"ax letrec-syntax\n (er-macro-transformer\n (lambda (form r c)\n (let (", +"(formal (car (cdr form)))\n (body (cdr (cdr form))))\n `(let", +" ()\n ,@(map (lambda (x)\n `(,(r 'define-syntax) ,(", +"car x) ,(cadr x)))\n formal)\n ,@body)))))\n\n (define", +"-syntax let-syntax\n (er-macro-transformer\n (lambda (form r c)\n `(,(", +"r 'letrec-syntax) ,@(cdr form)))))\n\n (export let let* letrec letrec*\n ", +"let-values let*-values define-values\n quasiquote unquote unquote-splici", +"ng\n and or\n cond case else =>\n do when unless\n ", +" parameterize\n let-syntax letrec-syntax\n syntax-error))\n\n", "", "" }; diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index 8a3d0ce7..ca5d042d 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -104,11 +104,10 @@ pic_dict_dictionary_ref(pic_state *pic) pic_get_args(pic, "dm", &dict, &key); - if (pic_dict_has(pic, dict, key)) { - return pic_values2(pic, pic_dict_ref(pic, dict, key), pic_true_value()); - } else { - return pic_values2(pic, pic_undef_value(), pic_false_value()); + if (! pic_dict_has(pic, dict, key)) { + return pic_undef_value(); } + return pic_dict_ref(pic, dict, key); } static pic_value @@ -120,21 +119,14 @@ pic_dict_dictionary_set(pic_state *pic) pic_get_args(pic, "dmo", &dict, &key, &val); - pic_dict_set(pic, dict, key, val); - - return pic_undef_value(); -} - -static pic_value -pic_dict_dictionary_del(pic_state *pic) -{ - struct pic_dict *dict; - pic_sym *key; - - pic_get_args(pic, "dm", &dict, &key); - - pic_dict_del(pic, dict, key); - + if (pic_undef_p(val)) { + if (pic_dict_has(pic, dict, key)) { + pic_dict_del(pic, dict, key); + } + } + else { + pic_dict_set(pic, dict, key, val); + } return pic_undef_value(); } @@ -319,7 +311,6 @@ pic_init_dict(pic_state *pic) pic_defun(pic, "dictionary", pic_dict_dictionary); pic_defun(pic, "dictionary-ref", pic_dict_dictionary_ref); pic_defun(pic, "dictionary-set!", pic_dict_dictionary_set); - pic_defun(pic, "dictionary-delete!", pic_dict_dictionary_del); pic_defun(pic, "dictionary-size", pic_dict_dictionary_size); pic_defun(pic, "dictionary-map", pic_dict_dictionary_map); pic_defun(pic, "dictionary-for-each", pic_dict_dictionary_for_each); diff --git a/piclib/picrin/base.scm b/piclib/picrin/base.scm index 2aa6a42b..c81744a2 100644 --- a/piclib/picrin/base.scm +++ b/piclib/picrin/base.scm @@ -178,7 +178,6 @@ dictionary dictionary-ref dictionary-set! - dictionary-delete! dictionary-size dictionary-map dictionary-for-each diff --git a/piclib/picrin/macro.scm b/piclib/picrin/macro.scm index e0942dd3..985b5d94 100644 --- a/piclib/picrin/macro.scm +++ b/piclib/picrin/macro.scm @@ -20,14 +20,13 @@ "memoize on symbols" (define cache (make-dictionary)) (lambda (sym) - (call-with-values (lambda () (dictionary-ref cache sym)) - (lambda (value exists) - (if exists - value - (begin - (define val (f sym)) - (dictionary-set! cache sym val) - val)))))) + (define value (dictionary-ref cache sym)) + (if (not (undefined? value)) + value + (begin + (define val (f sym)) + (dictionary-set! cache sym val) + val)))) (define (make-syntactic-closure env free form) @@ -105,11 +104,10 @@ (identifier=? mac-env x mac-env y)))) (walk (lambda (sym) - (call-with-values (lambda () (dictionary-ref icache* sym)) - (lambda (value exists) - (if exists - value - (rename sym))))) + (let ((value (dictionary-ref icache* sym))) + (if (undefined? value) + (rename sym) + value))) (f (walk inject expr) inject compare))))) ;; (define (strip-syntax form) From 111779c39ea5bd60907c3aa2072089bc49c2a81b Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 18:31:46 +0900 Subject: [PATCH 168/177] add pic_reg --- extlib/benz/attr.c | 15 ++++---- extlib/benz/gc.c | 59 +++++++++++++++++++++++------- extlib/benz/include/picrin.h | 4 +- extlib/benz/include/picrin/reg.h | 32 ++++++++++++++++ extlib/benz/include/picrin/value.h | 3 ++ extlib/benz/reg.c | 51 ++++++++++++++++++++++++++ extlib/benz/state.c | 9 +++-- 7 files changed, 148 insertions(+), 25 deletions(-) create mode 100644 extlib/benz/include/picrin/reg.h create mode 100644 extlib/benz/reg.c diff --git a/extlib/benz/attr.c b/extlib/benz/attr.c index 050eaee6..3e0bb192 100644 --- a/extlib/benz/attr.c +++ b/extlib/benz/attr.c @@ -3,21 +3,20 @@ struct pic_dict * pic_attr(pic_state *pic, pic_value obj) { - xh_entry *e; + struct pic_dict *dict; - if (pic_vtype(obj) != PIC_VTYPE_HEAP) { + if (! pic_obj_p(obj)) { pic_errorf(pic, "attribute: expected heap object, but got immediate value ~s", obj); } - e = xh_get_ptr(&pic->attrs, pic_ptr(obj)); - if (e == NULL) { - struct pic_dict *dict = pic_make_dict(pic); + if (! pic_reg_has(pic, pic->attrs, pic_ptr(obj))) { + dict = pic_make_dict(pic); - e = xh_put_ptr(&pic->attrs, pic_ptr(obj), &dict); + pic_reg_set(pic, pic->attrs, pic_ptr(obj), pic_obj_value(dict)); - assert(dict == xh_val(e, struct pic_dict *)); + return dict; } - return xh_val(e, struct pic_dict *); + return pic_dict_ptr(pic_reg_ref(pic, pic->attrs, pic_ptr(obj))); } pic_value diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 65bf219d..56931a72 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -317,6 +317,12 @@ gc_obj_is_marked(struct pic_object *obj) return gc_is_marked(p); } +static bool +gc_value_need_mark(pic_value value) +{ + return pic_obj_p(value) && (! gc_obj_is_marked(pic_obj_ptr(value))); +} + static void gc_unmark(union header *p) { @@ -473,6 +479,13 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) gc_mark_object(pic, (struct pic_object *)sym->str); break; } + case PIC_TT_REG: { + struct pic_reg *reg = (struct pic_reg *)obj; + + reg->prev = pic->regs; + pic->regs = reg; + break; + } case PIC_TT_NIL: case PIC_TT_BOOL: #if PIC_ENABLE_FLOAT @@ -536,8 +549,8 @@ gc_mark_phase(pic_state *pic) pic_callinfo *ci; struct pic_proc **xhandler; size_t j; - xh_entry *it; - struct pic_object *obj; + + assert(pic->regs == NULL); /* checkpoint */ if (pic->cp) { @@ -579,6 +592,11 @@ gc_mark_phase(pic_state *pic) gc_mark_object(pic, (struct pic_object *)pic->macros); } + /* attribute table */ + if (pic->attrs) { + gc_mark_object(pic, (struct pic_object *)pic->attrs); + } + /* error object */ gc_mark(pic, pic->err); @@ -602,18 +620,26 @@ gc_mark_phase(pic_state *pic) /* parameter table */ gc_mark(pic, pic->ptable); - /* attributes */ + /* registries */ do { - j = 0; + struct pic_object *key; + pic_value val; + xh_entry *it; + struct pic_reg *reg; - for (it = xh_begin(&pic->attrs); it != NULL; it = xh_next(it)) { - if (gc_obj_is_marked(xh_key(it, struct pic_object *))) { - obj = (struct pic_object *)xh_val(it, struct pic_dict *); - if (! gc_obj_is_marked(obj)) { - gc_mark_object(pic, obj); + j = 0; + reg = pic->regs; + + while (reg != NULL) { + for (it = xh_begin(®->hash); it != NULL; it = xh_next(it)) { + key = xh_key(it, struct pic_object *); + val = xh_val(it, pic_value); + if (gc_obj_is_marked(key) && gc_value_need_mark(val)) { + gc_mark(pic, val); ++j; } } + reg = reg->prev; } } while (j > 0); } @@ -686,6 +712,11 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) case PIC_TT_SYMBOL: { break; } + case PIC_TT_REG: { + struct pic_reg *reg = (struct pic_reg *)obj; + xh_destroy(®->hash); + break; + } case PIC_TT_NIL: case PIC_TT_BOOL: #if PIC_ENABLE_FLOAT @@ -782,14 +813,16 @@ gc_sweep_phase(pic_state *pic) struct heap_page *page = pic->heap->pages; xh_entry *it, *next; - do { - for (it = xh_begin(&pic->attrs); it != NULL; it = next) { + /* registries */ + while (pic->regs != NULL) { + for (it = xh_begin(&pic->regs->hash); it != NULL; it = next) { next = xh_next(it); if (! gc_obj_is_marked(xh_key(it, struct pic_object *))) { - xh_del_ptr(&pic->attrs, xh_key(it, struct pic_object *)); + xh_del_ptr(&pic->regs->hash, xh_key(it, struct pic_object *)); } } - } while (it != NULL); + pic->regs = pic->regs->prev; + } gc_sweep_symbols(pic); diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index acc68cb6..97edecaf 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -128,7 +128,7 @@ typedef struct { struct pic_dict *globals; struct pic_dict *macros; pic_value libs; - xhash attrs; + struct pic_reg *attrs; pic_value ptable; size_t pnum; @@ -139,6 +139,7 @@ typedef struct { struct pic_heap *heap; struct pic_object **arena; size_t arena_size, arena_idx; + struct pic_reg *regs; struct pic_port *xSTDIN, *xSTDOUT, *xSTDERR; @@ -285,6 +286,7 @@ pic_value pic_fdisplay(pic_state *, pic_value, xFILE *); #include "picrin/symbol.h" #include "picrin/read.h" #include "picrin/vector.h" +#include "picrin/reg.h" #if defined(__cplusplus) } diff --git a/extlib/benz/include/picrin/reg.h b/extlib/benz/include/picrin/reg.h new file mode 100644 index 00000000..d9622c06 --- /dev/null +++ b/extlib/benz/include/picrin/reg.h @@ -0,0 +1,32 @@ +/** + * See Copyright Notice in picrin.h + */ + +#ifndef PICRIN_REG_H +#define PICRIN_REG_H + +#if defined(__cplusplus) +extern "C" { +#endif + +struct pic_reg { + PIC_OBJECT_HEADER + xhash hash; + struct pic_reg *prev; /* for GC */ +}; + +#define pic_reg_p(v) (pic_type(v) == PIC_TT_REG) +#define pic_reg_ptr(v) ((struct pic_reg *)pic_ptr(v)) + +struct pic_reg *pic_make_reg(pic_state *); + +pic_value pic_reg_ref(pic_state *, struct pic_reg *, void *); +void pic_reg_set(pic_state *, struct pic_reg *, void *, pic_value); +void pic_reg_del(pic_state *, struct pic_reg *, void *); +bool pic_reg_has(pic_state *, struct pic_reg *, void *); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/extlib/benz/include/picrin/value.h b/extlib/benz/include/picrin/value.h index c69e09b0..d69eaf59 100644 --- a/extlib/benz/include/picrin/value.h +++ b/extlib/benz/include/picrin/value.h @@ -163,6 +163,7 @@ enum pic_tt { PIC_TT_IREP, PIC_TT_DATA, PIC_TT_DICT, + PIC_TT_REG, PIC_TT_RECORD }; @@ -327,6 +328,8 @@ pic_type_repr(enum pic_tt tt) return "data"; case PIC_TT_DICT: return "dict"; + case PIC_TT_REG: + return "reg"; case PIC_TT_RECORD: return "record"; } diff --git a/extlib/benz/reg.c b/extlib/benz/reg.c new file mode 100644 index 00000000..7bdea261 --- /dev/null +++ b/extlib/benz/reg.c @@ -0,0 +1,51 @@ +/** + * See Copyright Notice in picrin.h + */ + +#include "picrin.h" + +struct pic_reg * +pic_make_reg(pic_state *pic) +{ + struct pic_reg *reg; + + reg = (struct pic_reg *)pic_obj_alloc(pic, sizeof(struct pic_reg), PIC_TT_REG); + reg->prev = NULL; + xh_init_ptr(®->hash, sizeof(pic_value)); + + return reg; +} + +pic_value +pic_reg_ref(pic_state *pic, struct pic_reg *reg, void *key) +{ + xh_entry *e; + + e = xh_get_ptr(®->hash, key); + if (! e) { + pic_errorf(pic, "element not found for a key: ~s", pic_obj_value(key)); + } + return xh_val(e, pic_value); +} + +void +pic_reg_set(pic_state PIC_UNUSED(*pic), struct pic_reg *reg, void *key, pic_value val) +{ + xh_put_ptr(®->hash, key, &val); +} + +bool +pic_reg_has(pic_state PIC_UNUSED(*pic), struct pic_reg *reg, void *key) +{ + return xh_get_ptr(®->hash, key) != NULL; +} + +void +pic_reg_del(pic_state *pic, struct pic_reg *reg, void *key) +{ + if (xh_get_ptr(®->hash, key) == NULL) { + pic_errorf(pic, "no slot named ~s found in registry", pic_obj_value(key)); + } + + xh_del_ptr(®->hash, key); +} diff --git a/extlib/benz/state.c b/extlib/benz/state.c index a555dc34..3190c346 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -205,6 +205,9 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) /* memory heap */ pic->heap = pic_heap_open(pic); + /* registries */ + pic->regs = NULL; + /* symbol table */ xh_init_str(&pic->syms, sizeof(pic_sym *)); @@ -215,7 +218,7 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) pic->macros = NULL; /* attributes */ - xh_init_ptr(&pic->attrs, sizeof(struct pic_dict *)); + pic->attrs = NULL; /* features */ pic->features = pic_nil_value(); @@ -333,6 +336,7 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) /* root tables */ pic->globals = pic_make_dict(pic); pic->macros = pic_make_dict(pic); + pic->attrs = pic_make_reg(pic); /* root block */ pic->cp = pic_malloc(pic, sizeof(pic_checkpoint)); @@ -407,8 +411,8 @@ pic_close(pic_state *pic) pic->err = pic_invalid_value(); pic->globals = NULL; pic->macros = NULL; + pic->attrs = NULL; xh_clear(&pic->syms); - xh_clear(&pic->attrs); pic->features = pic_nil_value(); pic->libs = pic_nil_value(); @@ -428,7 +432,6 @@ pic_close(pic_state *pic) /* free global stacks */ xh_destroy(&pic->syms); - xh_destroy(&pic->attrs); /* free GC arena */ allocf(pic->arena, 0); From b983c77767464e04f4c7f156190d156d20711128 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 18:36:39 +0900 Subject: [PATCH 169/177] use registries for parameter table --- extlib/benz/include/picrin.h | 5 ++--- extlib/benz/state.c | 1 - extlib/benz/var.c | 28 +++++++++------------------- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 97edecaf..9c59ce59 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -92,6 +92,8 @@ typedef struct { pic_code *ip; + pic_value ptable; + struct pic_lib *lib, *prev_lib; pic_sym *sDEFINE, *sLAMBDA, *sIF, *sBEGIN, *sQUOTE, *sSETBANG; @@ -130,9 +132,6 @@ typedef struct { pic_value libs; struct pic_reg *attrs; - pic_value ptable; - size_t pnum; - struct pic_reader *reader; bool gc_enable; diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 3190c346..4724b87a 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -237,7 +237,6 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) /* parameter table */ pic->ptable = pic_nil_value(); - pic->pnum = 0; /* native stack marker */ pic->native_stack_start = &t; diff --git a/extlib/benz/var.c b/extlib/benz/var.c index 95da6b16..5fd44c0b 100644 --- a/extlib/benz/var.c +++ b/extlib/benz/var.c @@ -17,15 +17,12 @@ static pic_value var_get(pic_state *pic, struct pic_proc *var) { pic_value elem, it; - pic_sym *id; - struct pic_dict *dict; - - id = pic_sym_ptr(pic_proc_env_ref(pic, var, "id")); + struct pic_reg *reg; pic_for_each (elem, pic->ptable, it) { - dict = pic_dict_ptr(elem); - if (pic_dict_has(pic, dict, id)) { - return pic_dict_ref(pic, dict, id); + reg = pic_reg_ptr(elem); + if (pic_reg_has(pic, reg, var)) { + return pic_reg_ref(pic, reg, var); } } pic_panic(pic, "logic flaw"); @@ -34,14 +31,11 @@ var_get(pic_state *pic, struct pic_proc *var) static pic_value var_set(pic_state *pic, struct pic_proc *var, pic_value val) { - pic_sym *id; - struct pic_dict *dict; + struct pic_reg *reg; - id = pic_sym_ptr(pic_proc_env_ref(pic, var, "id")); + reg = pic_reg_ptr(pic_car(pic, pic->ptable)); - dict = pic_dict_ptr(pic_car(pic, pic->ptable)); - - pic_dict_set(pic, dict, id, val); + pic_reg_set(pic, reg, var, val); return pic_undef_value(); } @@ -66,16 +60,12 @@ struct pic_proc * pic_make_var(pic_state *pic, pic_value init, struct pic_proc *conv) { struct pic_proc *var; - pic_value converter = conv ? pic_obj_value(conv) : pic_false_value(); - pic_sym *id; var = pic_make_proc(pic, var_call, ""); if (conv != NULL) { - pic_proc_env_set(pic, var, "conv", converter); + pic_proc_env_set(pic, var, "conv", pic_obj_value(conv)); } - id = pic_intern(pic, pic_format(pic, "%d", pic->pnum++)); - pic_proc_env_set(pic, var, "id", pic_obj_value(id)); pic_apply1(pic, var, init); @@ -101,7 +91,7 @@ pic_var_with_parameter(pic_state *pic) pic_get_args(pic, "l", &body); - pic->ptable = pic_cons(pic, pic_obj_value(pic_make_dict(pic)), pic->ptable); + pic->ptable = pic_cons(pic, pic_obj_value(pic_make_reg(pic)), pic->ptable); val = pic_apply0(pic, body); From 44887cdd0c6f7bd1359771899fa7616ddb077d2a Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 18:50:46 +0900 Subject: [PATCH 170/177] add make-registry procedure --- extlib/benz/reg.c | 70 +++++++++++++++++++++++++++++++++++++++++++++ extlib/benz/state.c | 2 ++ 2 files changed, 72 insertions(+) diff --git a/extlib/benz/reg.c b/extlib/benz/reg.c index 7bdea261..b23da584 100644 --- a/extlib/benz/reg.c +++ b/extlib/benz/reg.c @@ -49,3 +49,73 @@ pic_reg_del(pic_state *pic, struct pic_reg *reg, void *key) xh_del_ptr(®->hash, key); } + + +static pic_value +reg_get(pic_state *pic, struct pic_reg *reg, void *key) +{ + if (! pic_reg_has(pic, reg, key)) { + return pic_undef_value(); + } + return pic_reg_ref(pic, reg, key); +} + +static pic_value +reg_set(pic_state *pic, struct pic_reg *reg, void *key, pic_value val) +{ + if (pic_undef_p(val)) { + if (pic_reg_has(pic, reg, key)) { + pic_reg_del(pic, reg, key); + } + } else { + pic_reg_set(pic, reg, key, val); + } + + return pic_undef_value(); +} + +static pic_value +reg_call(pic_state *pic) +{ + struct pic_proc *self = pic_get_proc(pic); + struct pic_reg *reg; + pic_value key, val; + int n; + + n = pic_get_args(pic, "o|o", &key, &val); + + if (! pic_obj_p(key)) { + pic_errorf(pic, "attempted to set a non-object key '~s' in a registory", key); + } + + reg = pic_reg_ptr(pic_proc_env_ref(pic, self, "reg")); + + if (n == 1) { + return reg_get(pic, reg, pic_obj_ptr(key)); + } else { + return reg_set(pic, reg, pic_obj_ptr(key), val); + } +} + +static pic_value +pic_reg_make_registry(pic_state *pic) +{ + struct pic_reg *reg; + struct pic_proc *proc; + + pic_get_args(pic, ""); + + reg = pic_make_reg(pic); + + proc = pic_make_proc(pic, reg_call, ""); + + pic_proc_env_set(pic, proc, "reg", pic_obj_value(reg)); + + return pic_obj_value(proc); +} + +void +pic_init_reg(pic_state *pic) +{ + pic_defun(pic, "make-registry", pic_reg_make_registry); +} diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 4724b87a..1b42a5b4 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -32,6 +32,7 @@ void pic_init_record(pic_state *); void pic_init_eval(pic_state *); void pic_init_lib(pic_state *); void pic_init_attr(pic_state *); +void pic_init_reg(pic_state *); extern const char pic_boot[][80]; @@ -130,6 +131,7 @@ pic_init_core(pic_state *pic) pic_init_eval(pic); DONE; pic_init_lib(pic); DONE; pic_init_attr(pic); DONE; + pic_init_reg(pic); DONE; pic_load_cstr(pic, &pic_boot[0][0]); } From 6af60c9e2b1d02d15a70ada18ed80c108f97ed0f Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 19:19:27 +0900 Subject: [PATCH 171/177] don't use static non-const local variable --- extlib/benz/gc.c | 4 ++-- extlib/benz/include/picrin.h | 2 ++ extlib/benz/state.c | 12 ++++++++++++ extlib/benz/vm.c | 12 +++++------- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 56931a72..bcc9d666 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -760,9 +760,9 @@ static void gc_sweep_page(pic_state *pic, struct heap_page *page) { #if GC_DEBUG - static union header *NIL = (union header *)0xdeadbeef; + static union header * const NIL = (union header *)0xdeadbeef; #else - static union header *NIL = NULL; + static union header * const NIL = NULL; #endif union header *bp, *p, *s = NIL, *t = NIL; diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 9c59ce59..c5c54110 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -144,6 +144,8 @@ typedef struct { pic_value err; + pic_code *iseq; /* for pic_apply_trampoline */ + char *native_stack_start; } pic_state; diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 1b42a5b4..6e174dd1 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -204,6 +204,13 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) goto EXIT_ARENA; } + /* trampoline iseq */ + pic->iseq = allocf(NULL, 2 * sizeof(pic_code)); + + if (! pic->iseq) { + goto EXIT_ISEQ; + } + /* memory heap */ pic->heap = pic_heap_open(pic); @@ -373,6 +380,8 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) return pic; + EXIT_ISEQ: + allocf(pic->arena, 0); EXIT_ARENA: allocf(pic->xp, 0); EXIT_XP: @@ -431,6 +440,9 @@ pic_close(pic_state *pic) allocf(pic->cibase, 0); allocf(pic->xpbase, 0); + /* free trampoline iseq */ + allocf(pic->iseq, 0); + /* free global stacks */ xh_destroy(&pic->syms); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 825b63fd..d8c4d390 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -76,7 +76,7 @@ pic_get_args(pic_state *pic, const char *format, ...) } /* '|' should be followed by at least 1 char */ - assert(opt <= optc); + assert((opt ? 1 : 0) <= optc); /* '*' should not be followed by any char */ assert(format[paramc + opt + optc + rest] == '\0'); @@ -681,7 +681,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) pic_code boot[2]; #if PIC_DIRECT_THREADED_VM - static void *oplabels[] = { + static const void *oplabels[] = { &&L_OP_NOP, &&L_OP_POP, &&L_OP_PUSHUNDEF, &&L_OP_PUSHNIL, &&L_OP_PUSHTRUE, &&L_OP_PUSHFALSE, &&L_OP_PUSHINT, &&L_OP_PUSHCHAR, &&L_OP_PUSHCONST, &&L_OP_GREF, &&L_OP_GSET, &&L_OP_LREF, &&L_OP_LSET, &&L_OP_CREF, &&L_OP_CSET, @@ -1180,13 +1180,11 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args) pic_value pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, pic_value args) { - static pic_code iseq[2]; - pic_value v, it, *sp; pic_callinfo *ci; - PIC_INIT_CODE_I(iseq[0], OP_NOP, 0); - PIC_INIT_CODE_I(iseq[1], OP_TAILCALL, -1); + PIC_INIT_CODE_I(pic->iseq[0], OP_NOP, 0); + PIC_INIT_CODE_I(pic->iseq[1], OP_TAILCALL, -1); *pic->sp++ = pic_obj_value(proc); @@ -1196,7 +1194,7 @@ pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, pic_value args) } ci = PUSHCI(); - ci->ip = (pic_code *)iseq; + ci->ip = pic->iseq; ci->fp = pic->sp; ci->retc = (int)pic_length(pic, args); From 30cbdd5c4f5b853409ae925a20a72f373617a3f1 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 20:20:56 +0900 Subject: [PATCH 172/177] cleanup macro.h --- extlib/benz/include/picrin/macro.h | 4 ---- extlib/benz/lib.c | 16 +++++++++++++++- extlib/benz/macro.c | 26 -------------------------- extlib/benz/state.c | 2 ++ extlib/benz/vm.c | 10 ++++++++++ 5 files changed, 27 insertions(+), 31 deletions(-) diff --git a/extlib/benz/include/picrin/macro.h b/extlib/benz/include/picrin/macro.h index 076c8c15..c0f6fef3 100644 --- a/extlib/benz/include/picrin/macro.h +++ b/extlib/benz/include/picrin/macro.h @@ -19,8 +19,6 @@ struct pic_env { #define pic_env_p(v) (pic_type(v) == PIC_TT_ENV) #define pic_env_ptr(v) ((struct pic_env *)pic_ptr(v)) -struct pic_env *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_env *, pic_sym *, struct pic_env *, pic_sym *); @@ -30,8 +28,6 @@ pic_sym *pic_add_rename(pic_state *, struct pic_env *, pic_sym *); bool pic_find_rename(pic_state *, struct pic_env *, pic_sym *, pic_sym ** /* = NULL */); void pic_put_rename(pic_state *, struct pic_env *, pic_sym *, pic_sym *); -void pic_define_syntactic_keyword(pic_state *, struct pic_env *, pic_sym *, pic_sym *); - #if defined(__cplusplus) } #endif diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 6ece6a1f..e39e0f48 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -4,6 +4,18 @@ #include "picrin.h" +static void +setup_default_env(pic_state *pic, struct pic_env *env) +{ + void pic_define_syntactic_keyword(pic_state *, struct pic_env *, pic_sym *, pic_sym *); + + pic_define_syntactic_keyword(pic, env, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY); + pic_define_syntactic_keyword(pic, env, pic->sIMPORT, pic->rIMPORT); + pic_define_syntactic_keyword(pic, env, pic->sEXPORT, pic->rEXPORT); + pic_define_syntactic_keyword(pic, env, pic->sIN_LIBRARY, pic->rIN_LIBRARY); + pic_define_syntactic_keyword(pic, env, pic->sCOND_EXPAND, pic->rCOND_EXPAND); +} + struct pic_lib * pic_make_library(pic_state *pic, pic_value name) { @@ -15,9 +27,11 @@ pic_make_library(pic_state *pic, pic_value name) pic_errorf(pic, "library name already in use: ~s", name); } - env = pic_null_syntactic_environment(pic); + env = pic_make_env(pic, NULL); exports = pic_make_dict(pic); + setup_default_env(pic, env); + lib = (struct pic_lib *)pic_obj_alloc(pic, sizeof(struct pic_lib), PIC_TT_LIB); lib->name = name; lib->env = env; diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index fbda5faf..b12c6bc6 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -381,32 +381,6 @@ pic_make_env(pic_state *pic, struct pic_env *up) return env; } -struct pic_env * -pic_null_syntactic_environment(pic_state *pic) -{ - struct pic_env *env; - - env = pic_make_env(pic, NULL); - - pic_define_syntactic_keyword(pic, env, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY); - pic_define_syntactic_keyword(pic, env, pic->sIMPORT, pic->rIMPORT); - pic_define_syntactic_keyword(pic, env, pic->sEXPORT, pic->rEXPORT); - pic_define_syntactic_keyword(pic, env, pic->sIN_LIBRARY, pic->rIN_LIBRARY); - pic_define_syntactic_keyword(pic, env, pic->sCOND_EXPAND, pic->rCOND_EXPAND); - - return env; -} - -void -pic_define_syntactic_keyword(pic_state *pic, struct pic_env *env, pic_sym *sym, pic_sym *rsym) -{ - pic_put_rename(pic, env, sym, rsym); - - if (pic->lib && pic->lib->env == env) { - pic_export(pic, sym); - } -} - static pic_value defmacro_call(pic_state *pic) { diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 6e174dd1..adc7b921 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -96,6 +96,8 @@ pic_init_features(pic_state *pic) static void pic_init_core(pic_state *pic) { + void pic_define_syntactic_keyword(pic_state *, struct pic_env *, pic_sym *, pic_sym *); + pic_init_features(pic); pic_deflibrary (pic, "(picrin base)") { diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index d8c4d390..995a6dac 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -393,6 +393,16 @@ pic_get_args(pic_state *pic, const char *format, ...) return argc; } +void +pic_define_syntactic_keyword(pic_state *pic, struct pic_env *env, pic_sym *sym, pic_sym *rsym) +{ + pic_put_rename(pic, env, sym, rsym); + + if (pic->lib && pic->lib->env == env) { + pic_export(pic, sym); + } +} + void pic_define_noexport(pic_state *pic, const char *name, pic_value val) { From 6af9a3ee7d41974176aa19ab37eaf8f9952ce829 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 22:13:46 +0900 Subject: [PATCH 173/177] remove pic_warn --- extlib/benz/include/picrin.h | 7 ------- extlib/benz/vm.c | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index c5c54110..37b83f42 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -243,13 +243,6 @@ void pic_warnf(pic_state *, const char *, ...); const char *pic_errmsg(pic_state *); pic_str *pic_get_backtrace(pic_state *); void pic_print_backtrace(pic_state *, xFILE *); - -/* obsoleted */ -PIC_INLINE void pic_warn(pic_state *pic, const char *msg) -{ - pic_warnf(pic, msg); -} - struct pic_dict *pic_attr(pic_state *, pic_value); pic_value pic_attr_ref(pic_state *, pic_value, const char *); void pic_attr_set(pic_state *, pic_value, const char *, pic_value); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 995a6dac..ab9916fb 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -413,7 +413,7 @@ pic_define_noexport(pic_state *pic, const char *name, pic_value val) if (! pic_find_rename(pic, pic->lib->env, sym, &rename)) { rename = pic_add_rename(pic, pic->lib->env, sym); } else { - pic_warn(pic, "redefining global"); + pic_warnf(pic, "redefining global"); } pic_dict_set(pic, pic->globals, rename, val); From 98857c07265c1878d6717c1c97ddda8c98f97925 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 22:26:21 +0900 Subject: [PATCH 174/177] change pic_find_rename interface --- extlib/benz/include/picrin/macro.h | 2 +- extlib/benz/lib.c | 2 +- extlib/benz/macro.c | 21 +++++++++------------ extlib/benz/vm.c | 6 +++--- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/extlib/benz/include/picrin/macro.h b/extlib/benz/include/picrin/macro.h index c0f6fef3..7d150777 100644 --- a/extlib/benz/include/picrin/macro.h +++ b/extlib/benz/include/picrin/macro.h @@ -25,7 +25,7 @@ bool pic_identifier_eq_p(pic_state *, struct pic_env *, pic_sym *, struct pic_en struct pic_env *pic_make_env(pic_state *, struct pic_env *); pic_sym *pic_add_rename(pic_state *, struct pic_env *, pic_sym *); -bool pic_find_rename(pic_state *, struct pic_env *, pic_sym *, pic_sym ** /* = NULL */); +pic_sym *pic_find_rename(pic_state *, struct pic_env *, pic_sym *); void pic_put_rename(pic_state *, struct pic_env *, pic_sym *, pic_sym *); #if defined(__cplusplus) diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index e39e0f48..9c5468bf 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -165,7 +165,7 @@ export(pic_state *pic, pic_value spec) goto fail; } - if (! pic_find_rename(pic, pic->lib->env, pic_sym_ptr(a), &rename)) { + if ((rename = pic_find_rename(pic, pic->lib->env, pic_sym_ptr(a))) == NULL) { pic_errorf(pic, "export: symbol not defined %s", pic_symbol_name(pic, pic_sym_ptr(a))); } diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index b12c6bc6..a36a8c8c 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -7,10 +7,10 @@ pic_sym * pic_add_rename(pic_state *pic, struct pic_env *env, pic_sym *sym) { - pic_sym *rename; + pic_sym *rename = pic_gensym(pic, sym); - rename = pic_gensym(pic, sym); pic_put_rename(pic, env, sym, rename); + return rename; } @@ -20,16 +20,13 @@ pic_put_rename(pic_state *pic, struct pic_env *env, pic_sym *sym, pic_sym *renam pic_dict_set(pic, env->map, sym, pic_obj_value(rename)); } -bool -pic_find_rename(pic_state *pic, struct pic_env *env, pic_sym *sym, pic_sym **rename) +pic_sym * +pic_find_rename(pic_state *pic, struct pic_env *env, pic_sym *sym) { if (! pic_dict_has(pic, env->map, sym)) { - return false; + return NULL; } - if (rename != NULL) { - *rename = pic_sym_ptr(pic_dict_ref(pic, env->map, sym)); - } - return true; + return pic_sym_ptr(pic_dict_ref(pic, env->map, sym)); } static void @@ -53,7 +50,7 @@ make_identifier(pic_state *pic, pic_sym *sym, struct pic_env *env) pic_sym *rename; while (true) { - if (pic_find_rename(pic, env, sym, &rename)) { + if ((rename = pic_find_rename(pic, env, sym)) != NULL) { return rename; } if (! env->up) @@ -189,7 +186,7 @@ macroexpand_define(pic_state *pic, pic_value expr, struct pic_env *env) pic_errorf(pic, "binding to non-symbol object"); } sym = pic_sym_ptr(var); - if (! pic_find_rename(pic, env, sym, &rename)) { + if ((rename = pic_find_rename(pic, env, sym)) == NULL) { rename = pic_add_rename(pic, env, sym); } val = macroexpand(pic, pic_list_ref(pic, expr, 2), env); @@ -212,7 +209,7 @@ macroexpand_defsyntax(pic_state *pic, pic_value expr, struct pic_env *env) pic_errorf(pic, "binding to non-symbol object"); } sym = pic_sym_ptr(var); - if (! pic_find_rename(pic, env, sym, &rename)) { + if ((rename = pic_find_rename(pic, env, sym)) == NULL) { rename = pic_add_rename(pic, env, sym); } else { pic_warnf(pic, "redefining syntax variable: ~s", pic_obj_value(sym)); diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index ab9916fb..7a062019 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -410,7 +410,7 @@ pic_define_noexport(pic_state *pic, const char *name, pic_value val) sym = pic_intern_cstr(pic, name); - if (! pic_find_rename(pic, pic->lib->env, sym, &rename)) { + if ((rename = pic_find_rename(pic, pic->lib->env, sym)) == NULL) { rename = pic_add_rename(pic, pic->lib->env, sym); } else { pic_warnf(pic, "redefining global"); @@ -434,7 +434,7 @@ pic_ref(pic_state *pic, struct pic_lib *lib, const char *name) sym = pic_intern_cstr(pic, name); - if (! pic_find_rename(pic, lib->env, sym, &rename)) { + if ((rename = pic_find_rename(pic, lib->env, sym)) == NULL) { pic_errorf(pic, "symbol \"%s\" not defined in library ~s", name, lib->name); } @@ -448,7 +448,7 @@ pic_set(pic_state *pic, struct pic_lib *lib, const char *name, pic_value val) sym = pic_intern_cstr(pic, name); - if (! pic_find_rename(pic, lib->env, sym, &rename)) { + if ((rename = pic_find_rename(pic, lib->env, sym)) == NULL) { pic_errorf(pic, "symbol \"%s\" not defined in library ~s", name, lib->name); } From cf411fd62a522972510f3866d2069d9dc111b06f Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 22:36:04 +0900 Subject: [PATCH 175/177] lazy export --- extlib/benz/lib.c | 20 +++++++++++--------- piclib/picrin/macro.scm | 28 ++++++++++++++-------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 9c5468bf..1ac5b879 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -73,7 +73,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, it; - pic_sym *sym, *id, *tag; + pic_sym *sym, *id, *tag, *nick; xh_entry *iter; table = pic_make_dict(pic); @@ -122,8 +122,15 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports) if (! lib) { pic_errorf(pic, "library not found: ~a", spec); } - pic_dict_for_each (sym, lib->exports, iter) { - pic_dict_set(pic, imports, sym, pic_dict_ref(pic, lib->exports, sym)); + pic_dict_for_each (nick, lib->exports, iter) { + pic_sym *realname, *rename; + + realname = pic_sym_ptr(pic_dict_ref(pic, lib->exports, nick)); + + if ((rename = pic_find_rename(pic, lib->env, realname)) == NULL) { + pic_errorf(pic, "attempted to export undefined variable '~s'", pic_obj_value(realname)); + } + pic_dict_set(pic, imports, nick, pic_obj_value(rename)); } } @@ -148,7 +155,6 @@ export(pic_state *pic, pic_value spec) { pic_sym *sRENAME = pic_intern_cstr(pic, "rename"); pic_value a, b; - pic_sym *rename; if (pic_sym_p(spec)) { /* (export a) */ a = b = spec; @@ -165,15 +171,11 @@ export(pic_state *pic, pic_value spec) goto fail; } - if ((rename = pic_find_rename(pic, pic->lib->env, pic_sym_ptr(a))) == NULL) { - 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_ptr(b)), pic_symbol_name(pic, rename)); #endif - pic_dict_set(pic, pic->lib->exports, pic_sym_ptr(b), pic_obj_value(rename)); + pic_dict_set(pic, pic->lib->exports, pic_sym_ptr(b), a); return; diff --git a/piclib/picrin/macro.scm b/piclib/picrin/macro.scm index 985b5d94..e11d4eb7 100644 --- a/piclib/picrin/macro.scm +++ b/piclib/picrin/macro.scm @@ -1,6 +1,19 @@ (define-library (picrin macro) (import (picrin base)) + (export identifier? + identifier=? + make-identifier + make-syntactic-closure + close-syntax + capture-syntactic-environment + sc-macro-transformer + rsc-macro-transformer + er-macro-transformer + ir-macro-transformer + ;; strip-syntax + define-macro) + ;; assumes no derived expressions are provided yet (define (walk proc expr) @@ -125,17 +138,4 @@ (list (r 'define-macro) (car formal) (cons (r 'lambda) (cons (cdr formal) - body))))))) - - (export identifier? - identifier=? - make-identifier - make-syntactic-closure - close-syntax - capture-syntactic-environment - sc-macro-transformer - rsc-macro-transformer - er-macro-transformer - ir-macro-transformer - ;; strip-syntax - define-macro)) + body)))))))) From 2b1fa0692dbfc7fad686b01dee022f343c7ce4d7 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 22:49:49 +0900 Subject: [PATCH 176/177] fix debug print --- 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 1ac5b879..853b61f1 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -172,7 +172,7 @@ export(pic_state *pic, pic_value spec) } #if DEBUG - printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym_ptr(b)), pic_symbol_name(pic, rename)); + printf("* exporting %s as %s\n", pic_symbol_name(pic, pic_sym_ptr(b)), pic_symbol_name(pic, pic_sym_ptr(a))); #endif pic_dict_set(pic, pic->lib->exports, pic_sym_ptr(b), a); From 191d3067f86edf9ade3b2b3b55811b9b871d7ce1 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Jun 2015 22:58:11 +0900 Subject: [PATCH 177/177] Revert "Revert "remove in-library"" This reverts commit 77d3b0b41ecf52d32662eefd9d006809761cf75a. --- extlib/benz/gc.c | 4 ++-- extlib/benz/include/picrin.h | 5 ++--- extlib/benz/lib.c | 38 ++++++------------------------------ extlib/benz/state.c | 2 -- 4 files changed, 10 insertions(+), 39 deletions(-) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index bcc9d666..93650e52 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -520,7 +520,7 @@ 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(sDEFINE_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); @@ -533,7 +533,7 @@ gc_mark_global_symbols(pic_state *pic) 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(rDEFINE_LIBRARY); M(rCOND_EXPAND); M(rCONS); M(rCAR); M(rCDR); M(rNILP); M(rSYMBOLP); M(rPAIRP); diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 37b83f42..5b1bd3f3 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -99,7 +99,7 @@ typedef struct { 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 *sDEFINE_LIBRARY; pic_sym *sCOND_EXPAND, *sAND, *sOR, *sELSE, *sLIBRARY; pic_sym *sONLY, *sRENAME, *sPREFIX, *sEXCEPT; pic_sym *sCONS, *sCAR, *sCDR, *sNILP; @@ -113,7 +113,7 @@ typedef struct { pic_sym *rDEFINE, *rLAMBDA, *rIF, *rBEGIN, *rQUOTE, *rSETBANG; pic_sym *rDEFINE_SYNTAX, *rIMPORT, *rEXPORT; - pic_sym *rDEFINE_LIBRARY, *rIN_LIBRARY; + pic_sym *rDEFINE_LIBRARY; pic_sym *rCOND_EXPAND; pic_sym *rCONS, *rCAR, *rCDR, *rNILP; pic_sym *rSYMBOLP, *rPAIRP; @@ -218,7 +218,6 @@ pic_value pic_eval(pic_state *, pic_value, struct pic_lib *); struct pic_proc *pic_compile(pic_state *, pic_value, struct pic_lib *); pic_value pic_macroexpand(pic_state *, pic_value, struct pic_lib *); -void pic_in_library(pic_state *, pic_value); struct pic_lib *pic_make_library(pic_state *, pic_value); struct pic_lib *pic_find_library(pic_state *, pic_value); diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 853b61f1..8e6516ad 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -12,7 +12,6 @@ setup_default_env(pic_state *pic, struct pic_env *env) pic_define_syntactic_keyword(pic, env, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY); pic_define_syntactic_keyword(pic, env, pic->sIMPORT, pic->rIMPORT); pic_define_syntactic_keyword(pic, env, pic->sEXPORT, pic->rEXPORT); - pic_define_syntactic_keyword(pic, env, pic->sIN_LIBRARY, pic->rIN_LIBRARY); pic_define_syntactic_keyword(pic, env, pic->sCOND_EXPAND, pic->rCOND_EXPAND); } @@ -43,18 +42,6 @@ pic_make_library(pic_state *pic, pic_value name) return lib; } -void -pic_in_library(pic_state *pic, pic_value spec) -{ - struct pic_lib *lib; - - lib = pic_find_library(pic, spec); - if (! lib) { - pic_errorf(pic, "library not found: ~a", spec); - } - pic->lib = lib; -} - struct pic_lib * pic_find_library(pic_state *pic, pic_value spec) { @@ -298,45 +285,33 @@ pic_lib_export(pic_state *pic) static pic_value pic_lib_define_library(pic_state *pic) { - struct pic_lib *prev = pic->lib; + struct pic_lib *lib, *prev = pic->lib; size_t argc, i; pic_value spec, *argv; pic_get_args(pic, "o*", &spec, &argc, &argv); - if (! pic_find_library(pic, spec)) { - pic_make_library(pic, spec); + if ((lib = pic_find_library(pic, spec)) == NULL) { + lib = pic_make_library(pic, spec); } pic_try { - pic_in_library(pic, spec); + pic->lib = lib; for (i = 0; i < argc; ++i) { pic_void(pic_eval(pic, argv[i], pic->lib)); } - pic_in_library(pic, prev->name); + pic->lib = prev; } pic_catch { - pic_in_library(pic, prev->name); /* restores pic->lib even if an error occurs */ + pic->lib = prev; /* restores pic->lib even if an error occured */ pic_raise(pic, pic->err); } return pic_undef_value(); } -static pic_value -pic_lib_in_library(pic_state *pic) -{ - pic_value spec; - - pic_get_args(pic, "o", &spec); - - pic_in_library(pic, spec); - - return pic_undef_value(); -} - void pic_init_lib(pic_state *pic) { @@ -346,5 +321,4 @@ pic_init_lib(pic_state *pic) pic_defmacro(pic, pic->sIMPORT, pic->rIMPORT, pic_lib_import); pic_defmacro(pic, pic->sEXPORT, pic->rEXPORT, pic_lib_export); pic_defmacro(pic, pic->sDEFINE_LIBRARY, pic->rDEFINE_LIBRARY, pic_lib_define_library); - pic_defmacro(pic, pic->sIN_LIBRARY, pic->rIN_LIBRARY, pic_lib_in_library); } diff --git a/extlib/benz/state.c b/extlib/benz/state.c index adc7b921..0caa2a6b 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -269,7 +269,6 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) S(sIMPORT, "import"); S(sEXPORT, "export"); S(sDEFINE_LIBRARY, "define-library"); - S(sIN_LIBRARY, "in-library"); S(sCOND_EXPAND, "cond-expand"); S(sAND, "and"); S(sOR, "or"); @@ -321,7 +320,6 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf) R(rIMPORT, "import"); R(rEXPORT, "export"); R(rDEFINE_LIBRARY, "define-library"); - R(rIN_LIBRARY, "in-library"); R(rCOND_EXPAND, "cond-expand"); R(rCONS, "cons"); R(rCAR, "car");