diff --git a/extlib/benz/include/picrin.h b/extlib/benz/include/picrin.h index 54f0c768..ca13b709 100644 --- a/extlib/benz/include/picrin.h +++ b/extlib/benz/include/picrin.h @@ -32,98 +32,13 @@ extern "C" { #include #include -#include "picrin/config.h" - -#include "picrin/compat.h" -#include "picrin/khash.h" +#include "picrin/setup.h" typedef struct pic_state pic_state; -typedef void *(*pic_allocf)(void *, void *, size_t); - #include "picrin/type.h" -#include "picrin/irep.h" -#include "picrin/file.h" -#include "picrin/read.h" -#include "picrin/gc.h" -KHASH_DECLARE(s, struct pic_string *, pic_sym *) - -typedef struct pic_checkpoint { - PIC_OBJECT_HEADER - struct pic_proc *in; - struct pic_proc *out; - int depth; - struct pic_checkpoint *prev; -} pic_checkpoint; - -typedef struct { - int argc, retc; - pic_code *ip; - pic_value *fp; - struct pic_irep *irep; - struct pic_context *cxt; - int regc; - pic_value *regs; - struct pic_context *up; -} pic_callinfo; - -struct pic_state { - pic_allocf allocf; - void *userdata; - - pic_checkpoint *cp; - struct pic_cont *cc; - int ccnt; - - pic_value *sp; - pic_value *stbase, *stend; - - pic_callinfo *ci; - pic_callinfo *cibase, *ciend; - - struct pic_proc **xp; - struct pic_proc **xpbase, **xpend; - - pic_code *ip; - - pic_value ptable; /* list of ephemerons */ - - struct pic_lib *lib, *prev_lib; - - pic_sym *sDEFINE, *sDEFINE_MACRO, *sLAMBDA, *sIF, *sBEGIN, *sSETBANG; - pic_sym *sQUOTE, *sQUASIQUOTE, *sUNQUOTE, *sUNQUOTE_SPLICING; - pic_sym *sSYNTAX_QUOTE, *sSYNTAX_QUASIQUOTE; - pic_sym *sSYNTAX_UNQUOTE, *sSYNTAX_UNQUOTE_SPLICING; - pic_sym *sDEFINE_LIBRARY, *sIMPORT, *sEXPORT, *sCOND_EXPAND; - pic_sym *sCONS, *sCAR, *sCDR, *sNILP, *sSYMBOLP, *sPAIRP; - pic_sym *sADD, *sSUB, *sMUL, *sDIV, *sEQ, *sLT, *sLE, *sGT, *sGE, *sNOT; - - struct pic_lib *PICRIN_BASE; - struct pic_lib *PICRIN_USER; - - pic_value features; - - khash_t(s) oblist; /* string to symbol */ - int ucnt; - struct pic_weak *globals; - struct pic_weak *macros; - pic_value libs; - struct pic_list ireps; /* chain */ - - pic_reader reader; - xFILE files[XOPEN_MAX]; - pic_code iseq[2]; /* for pic_apply_trampoline */ - - bool gc_enable; - struct pic_heap *heap; - struct pic_object **arena; - size_t arena_size, arena_idx; - - pic_value err; - - char *native_stack_start; -}; +typedef void *(*pic_allocf)(void *, void *, size_t); pic_state *pic_open(pic_allocf, void *); void pic_close(pic_state *); @@ -262,6 +177,10 @@ struct pic_string *pic_str_sub(pic_state *, struct pic_string *, int, int); int pic_str_cmp(pic_state *, struct pic_string *, struct pic_string *); int pic_str_hash(pic_state *, struct pic_string *); +/* extra stuff */ + +#include "picrin/state.h" + #include "picrin/blob.h" #include "picrin/cont.h" #include "picrin/data.h" @@ -278,8 +197,6 @@ int pic_str_hash(pic_state *, struct pic_string *); #include "picrin/vector.h" #include "picrin/weak.h" -/* extra stuff */ - void *pic_default_allocf(void *, void *, size_t); struct pic_object *pic_obj_alloc(pic_state *, size_t, enum pic_tt); diff --git a/extlib/benz/include/picrin/setup.h b/extlib/benz/include/picrin/setup.h new file mode 100644 index 00000000..ef10793f --- /dev/null +++ b/extlib/benz/include/picrin/setup.h @@ -0,0 +1,104 @@ +/** + * See Copyright Notice in picrin.h + */ + +#include "picrin/config.h" + +#ifndef PIC_DIRECT_THREADED_VM +# if (defined(__GNUC__) || defined(__clang__)) && __STRICT_ANSI__ != 1 +# define PIC_DIRECT_THREADED_VM 1 +# endif +#endif + +#if PIC_NAN_BOXING && PIC_WORD_BOXING +# error cannot enable both PIC_NAN_BOXING and PIC_WORD_BOXING 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_LIBC +# define PIC_ENABLE_LIBC 1 +#endif + +#ifndef PIC_ENABLE_STDIO +# define PIC_ENABLE_STDIO 1 +#endif + +#ifndef PIC_JMPBUF +# include +# define PIC_JMPBUF 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_ABORT +# define PIC_ABORT(pic) abort() +#endif + +#ifndef PIC_ARENA_SIZE +# define PIC_ARENA_SIZE (8 * 1024) +#endif + +#ifndef PIC_HEAP_PAGE_SIZE +# define PIC_HEAP_PAGE_SIZE (4 * 1024 * 1024) +#endif + +#ifndef PIC_PAGE_REQUEST_THRESHOLD +# define PIC_PAGE_REQUEST_THRESHOLD(total) ((total) * 77 / 100) +#endif + +#ifndef PIC_STACK_SIZE +# define PIC_STACK_SIZE 2048 +#endif + +#ifndef PIC_RESCUE_SIZE +# define PIC_RESCUE_SIZE 30 +#endif + +#ifndef PIC_SYM_POOL_SIZE +# define PIC_SYM_POOL_SIZE (2 * 1024) +#endif + +#ifndef PIC_IREP_SIZE +# define PIC_IREP_SIZE 8 +#endif + +#ifndef PIC_POOL_SIZE +# 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 + +#if DEBUG +# include +# define GC_STRESS 0 +# define VM_DEBUG 1 +# define GC_DEBUG 0 +# define GC_DEBUG_DETAIL 0 +#endif + +#include "picrin/compat.h" diff --git a/extlib/benz/include/picrin/state.h b/extlib/benz/include/picrin/state.h new file mode 100644 index 00000000..59655643 --- /dev/null +++ b/extlib/benz/include/picrin/state.h @@ -0,0 +1,101 @@ +/** + * See Copyright Notice in picrin.h + */ + +#ifndef PICRIN_STATE_H +#define PICRIN_STATE_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#include "picrin/khash.h" + +#include "picrin/irep.h" +#include "picrin/file.h" +#include "picrin/read.h" +#include "picrin/gc.h" + +KHASH_DECLARE(s, struct pic_string *, pic_sym *) + +typedef struct pic_checkpoint { + PIC_OBJECT_HEADER + struct pic_proc *in; + struct pic_proc *out; + int depth; + struct pic_checkpoint *prev; +} pic_checkpoint; + +typedef struct { + int argc, retc; + pic_code *ip; + pic_value *fp; + struct pic_irep *irep; + struct pic_context *cxt; + int regc; + pic_value *regs; + struct pic_context *up; +} pic_callinfo; + +struct pic_state { + pic_allocf allocf; + void *userdata; + + pic_checkpoint *cp; + struct pic_cont *cc; + int ccnt; + + pic_value *sp; + pic_value *stbase, *stend; + + pic_callinfo *ci; + pic_callinfo *cibase, *ciend; + + struct pic_proc **xp; + struct pic_proc **xpbase, **xpend; + + pic_code *ip; + + pic_value ptable; /* list of ephemerons */ + + struct pic_lib *lib, *prev_lib; + + pic_sym *sDEFINE, *sDEFINE_MACRO, *sLAMBDA, *sIF, *sBEGIN, *sSETBANG; + pic_sym *sQUOTE, *sQUASIQUOTE, *sUNQUOTE, *sUNQUOTE_SPLICING; + pic_sym *sSYNTAX_QUOTE, *sSYNTAX_QUASIQUOTE; + pic_sym *sSYNTAX_UNQUOTE, *sSYNTAX_UNQUOTE_SPLICING; + pic_sym *sDEFINE_LIBRARY, *sIMPORT, *sEXPORT, *sCOND_EXPAND; + pic_sym *sCONS, *sCAR, *sCDR, *sNILP, *sSYMBOLP, *sPAIRP; + pic_sym *sADD, *sSUB, *sMUL, *sDIV, *sEQ, *sLT, *sLE, *sGT, *sGE, *sNOT; + + struct pic_lib *PICRIN_BASE; + struct pic_lib *PICRIN_USER; + + pic_value features; + + khash_t(s) oblist; /* string to symbol */ + int ucnt; + struct pic_weak *globals; + struct pic_weak *macros; + pic_value libs; + struct pic_list ireps; /* chain */ + + pic_reader reader; + xFILE files[XOPEN_MAX]; + pic_code iseq[2]; /* for pic_apply_trampoline */ + + bool gc_enable; + struct pic_heap *heap; + struct pic_object **arena; + size_t arena_size, arena_idx; + + pic_value err; + + char *native_stack_start; +}; + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/extlib/benz/include/picrin/type.h b/extlib/benz/include/picrin/type.h index f6cda486..25bc9a4c 100644 --- a/extlib/benz/include/picrin/type.h +++ b/extlib/benz/include/picrin/type.h @@ -197,6 +197,7 @@ struct pic_proc; struct pic_port; struct pic_error; struct pic_env; +struct pic_lib; /* set aliases to basic types */ typedef struct pic_symbol pic_sym;