diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/mrbconf.h | 6 | ||||
| -rw-r--r-- | include/mruby.h | 79 | ||||
| -rw-r--r-- | include/mruby/array.h | 40 | ||||
| -rw-r--r-- | include/mruby/boxing_word.h | 2 | ||||
| -rw-r--r-- | include/mruby/class.h | 2 | ||||
| -rw-r--r-- | include/mruby/compile.h | 2 | ||||
| -rw-r--r-- | include/mruby/dump.h | 2 | ||||
| -rw-r--r-- | include/mruby/error.h | 7 | ||||
| -rw-r--r-- | include/mruby/gc.h | 5 | ||||
| -rw-r--r-- | include/mruby/hash.h | 2 | ||||
| -rw-r--r-- | include/mruby/numeric.h | 12 | ||||
| -rw-r--r-- | include/mruby/proc.h | 7 | ||||
| -rw-r--r-- | include/mruby/string.h | 7 | ||||
| -rw-r--r-- | include/mruby/value.h | 12 | ||||
| -rw-r--r-- | include/mruby/version.h | 8 |
15 files changed, 147 insertions, 46 deletions
diff --git a/include/mrbconf.h b/include/mrbconf.h index 4796919c2..b246b970c 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -52,12 +52,6 @@ /* number of object per heap page */ //#define MRB_HEAP_PAGE_SIZE 1024 -/* use segmented list for IV table */ -//#define MRB_USE_IV_SEGLIST - -/* initial size for IV khash; ignored when MRB_USE_IV_SEGLIST is set */ -//#define MRB_IVHASH_INIT_SIZE 8 - /* if _etext and _edata available, mruby can reduce memory used by symbols */ //#define MRB_USE_ETEXT_EDATA diff --git a/include/mruby.h b/include/mruby.h index 8adce289b..18f54fd2f 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -65,6 +65,13 @@ #include "mrbconf.h" +#ifndef DBL_EPSILON +#define DBL_EPSILON ((double)2.22044604925031308085e-16L) +#endif +#ifndef LDBL_EPSILON +#define LDBL_EPSILON (1.08420217248550443401e-19L) +#endif + #ifdef MRB_USE_FLOAT #define MRB_FLOAT_EPSILON FLT_EPSILON #else @@ -113,7 +120,7 @@ typedef struct { mrb_value *stackent; int nregs; int ridx; - int eidx; + int epos; struct REnv *env; mrb_code *pc; /* return address */ mrb_code *err; /* error position */ @@ -143,7 +150,7 @@ struct mrb_context { mrb_code **rescue; /* exception handler stack */ int rsize; struct RProc **ensure; /* ensure handler stack */ - int esize; + int esize, eidx; enum mrb_fiber_state status; mrb_bool vmexec; @@ -152,14 +159,6 @@ struct mrb_context { struct mrb_jmpbuf; -typedef struct { - const char *filename; - int lineno; - struct RClass *klass; - char sep; - mrb_sym method_id; -} mrb_backtrace_entry; - typedef void (*mrb_atexit_func)(struct mrb_state*); #define MRB_STATE_NO_REGEXP 1 @@ -174,15 +173,9 @@ typedef struct mrb_state { struct mrb_context *c; struct mrb_context *root_c; + struct iv_tbl *globals; /* global variable table */ struct RObject *exc; /* exception */ - struct { - struct RObject *exc; - int n; - int n_allocated; - mrb_backtrace_entry *entries; - } backtrace; - struct iv_tbl *globals; /* global variable table */ struct RObject *top_self; struct RClass *object_class; /* Object class */ @@ -1043,11 +1036,27 @@ MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val); MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); +static inline int mrb_gc_arena_save(mrb_state*); +static inline void mrb_gc_arena_restore(mrb_state*,int); + +static inline int +mrb_gc_arena_save(mrb_state *mrb) +{ + return mrb->gc.arena_idx; +} + +static inline void +mrb_gc_arena_restore(mrb_state *mrb, int idx) +{ + mrb->gc.arena_idx = idx; +} + +MRB_API int mrb_gc_arena_save(mrb_state*); +MRB_API void mrb_gc_arena_restore(mrb_state*,int); + MRB_API void mrb_garbage_collect(mrb_state*); MRB_API void mrb_full_gc(mrb_state*); MRB_API void mrb_incremental_gc(mrb_state *); -MRB_API int mrb_gc_arena_save(mrb_state*); -MRB_API void mrb_gc_arena_restore(mrb_state*,int); MRB_API void mrb_gc_mark(mrb_state*,struct RBasic*); #define mrb_gc_mark_value(mrb,val) do {\ if (!mrb_immediate_p(val)) mrb_gc_mark((mrb), mrb_basic_ptr(val)); \ @@ -1121,6 +1130,11 @@ MRB_API mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg); MRB_API mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv); MRB_API mrb_value mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv, mrb_value self, struct RClass *c); +/* continue execution to the proc */ +/* this function should always be called as the last function of a method */ +/* e.g. return mrb_yield_cont(mrb, proc, self, argc, argv); */ +mrb_value mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const mrb_value *argv); + /* mrb_gc_protect() leaves the object in the arena */ MRB_API void mrb_gc_protect(mrb_state *mrb, mrb_value obj); /* mrb_gc_register() keeps the object from GC. */ @@ -1187,6 +1201,33 @@ MRB_API void mrb_show_copyright(mrb_state *mrb); MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...); +#if 0 +/* memcpy and memset does not work with gdb reverse-next on my box */ +/* use naive memcpy and memset instead */ +#undef memcpy +#undef memset +static inline void* +mrbmemcpy(void *dst, const void *src, size_t n) +{ + char *d = (char*)dst; + const char *s = (const char*)src; + while (n--) + *d++ = *s++; + return d; +} +#define memcpy(a,b,c) mrbmemcpy(a,b,c) + +static inline void* +mrbmemset(void *s, int c, size_t n) +{ + char *t = (char*)s; + while (n--) + *t++ = c; + return s; +} +#define memset(a,b,c) mrbmemset(a,b,c) +#endif + MRB_END_DECL #endif /* MRUBY_H */ diff --git a/include/mruby/array.h b/include/mruby/array.h index e553faf92..bd3124d8c 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -21,22 +21,48 @@ typedef struct mrb_shared_array { mrb_value *ptr; } mrb_shared_array; +#define MRB_ARY_EMBED_LEN_MAX ((mrb_int)(sizeof(void*)*3/sizeof(mrb_value))) struct RArray { MRB_OBJECT_HEADER; - mrb_int len; union { - mrb_int capa; - mrb_shared_array *shared; - } aux; - mrb_value *ptr; + struct { + mrb_int len; + union { + mrb_int capa; + mrb_shared_array *shared; + } aux; + mrb_value *ptr; + } heap; + mrb_value embed[MRB_ARY_EMBED_LEN_MAX]; + } as; }; #define mrb_ary_ptr(v) ((struct RArray*)(mrb_ptr(v))) #define mrb_ary_value(p) mrb_obj_value((void*)(p)) #define RARRAY(v) ((struct RArray*)(mrb_ptr(v))) -#define RARRAY_LEN(a) (RARRAY(a)->len) -#define RARRAY_PTR(a) ((const mrb_value*)RARRAY(a)->ptr) +#define MRB_ARY_EMBED 4 +#define MRB_ARY_EMBED_MASK 3 +#define ARY_EMBED_P(a) ((a)->flags & MRB_ARY_EMBED) +#define ARY_SET_EMBED_FLAG(a) ((a)->flags |= MRB_ARY_EMBED) +#define ARY_UNSET_EMBED_FLAG(a) ((a)->flags &= ~(MRB_ARY_EMBED|MRB_ARY_EMBED_MASK)) +#define ARY_EMBED_LEN(a) ((a)->flags & MRB_ARY_EMBED_MASK) +#define ARY_SET_EMBED_LEN(a,len) (a)->flags = ((a)->flags&~MRB_ARY_EMBED_MASK) | ((len)&MRB_ARY_EMBED_MASK); +#define ARY_EMBED_PTR(a) (&((a)->as.embed[0])) + +#define ARY_LEN(a) (ARY_EMBED_P(a)?ARY_EMBED_LEN(a):(a)->as.heap.len) +#define ARY_PTR(a) (ARY_EMBED_P(a)?ARY_EMBED_PTR(a):(a)->as.heap.ptr) +#define RARRAY_LEN(a) ARY_LEN(RARRAY(a)) +#define RARRAY_PTR(a) ARY_PTR(RARRAY(a)) +#define ARY_SET_LEN(a,n) do {\ + if (ARY_EMBED_P(a)) {\ + mrb_assert((n) <= MRB_ARY_EMBED_LEN_MAX); \ + ARY_SET_EMBED_LEN(a,n);\ + }\ + else\ + (a)->as.heap.len = (n);\ +} while (0) +#define ARY_CAPA(a) (ARY_EMBED_P(a)?MRB_ARY_EMBED_LEN_MAX:(a)->as.heap.aux.capa) #define MRB_ARY_SHARED 256 #define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED) #define ARY_SET_SHARED_FLAG(a) ((a)->flags |= MRB_ARY_SHARED) diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index 6ca491585..d1c457fae 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -66,7 +66,7 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); #define mrb_ptr(o) (o).value.p #define mrb_cptr(o) (o).value.vp->p #define mrb_float(o) (o).value.fp->f -#define mrb_fixnum(o) (o).value.i +#define mrb_fixnum(o) ((mrb_int)(o).value.i) #define mrb_symbol(o) (o).value.sym static inline enum mrb_vtype diff --git a/include/mruby/class.h b/include/mruby/class.h index ce953af3b..0526386d6 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -51,7 +51,7 @@ mrb_class(mrb_state *mrb, mrb_value v) } } -// TODO: figure out where to put user flags +/* TODO: figure out where to put user flags */ #define MRB_FLAG_IS_FROZEN (1 << 18) #define MRB_FLAG_IS_PREPENDED (1 << 19) #define MRB_FLAG_IS_ORIGIN (1 << 20) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index ad3f19db1..13e04d0fc 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -33,6 +33,8 @@ typedef struct mrbc_context { mrb_bool no_exec:1; mrb_bool keep_lv:1; mrb_bool no_optimize:1; + + size_t parser_nerr; } mrbc_context; MRB_API mrbc_context* mrbc_context_new(mrb_state *mrb); diff --git a/include/mruby/dump.h b/include/mruby/dump.h index 165a20b3f..f56d66a32 100644 --- a/include/mruby/dump.h +++ b/include/mruby/dump.h @@ -52,7 +52,7 @@ MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*); /* Rite Binary File header */ #define RITE_BINARY_IDENT "RITE" #define RITE_BINARY_IDENT_LIL "ETIR" -#define RITE_BINARY_FORMAT_VER "0003" +#define RITE_BINARY_FORMAT_VER "0004" #define RITE_COMPILER_NAME "MATZ" #define RITE_COMPILER_VERSION "0000" diff --git a/include/mruby/error.h b/include/mruby/error.h index bb67e7bd8..0a262550e 100644 --- a/include/mruby/error.h +++ b/include/mruby/error.h @@ -32,6 +32,13 @@ MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_va /* declaration for fail method */ MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value); +struct RBreak { + MRB_OBJECT_HEADER; + struct iv_tbl *iv; + struct RProc *proc; + mrb_value val; +}; + /** * Protect * diff --git a/include/mruby/gc.h b/include/mruby/gc.h index 81950f169..ce214aa56 100644 --- a/include/mruby/gc.h +++ b/include/mruby/gc.h @@ -17,7 +17,9 @@ MRB_BEGIN_DECL struct mrb_state; -typedef void (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data); +#define MRB_EACH_OBJ_OK 0 +#define MRB_EACH_OBJ_BREAK 1 +typedef int (mrb_each_object_callback)(struct mrb_state *mrb, struct RBasic *obj, void *data); void mrb_objspace_each_objects(struct mrb_state *mrb, mrb_each_object_callback *callback, void *data); MRB_API void mrb_free_context(struct mrb_state *mrb, struct mrb_context *c); @@ -62,6 +64,7 @@ typedef struct mrb_gc { size_t threshold; int interval_ratio; int step_ratio; + mrb_bool iterating :1; mrb_bool disabled :1; mrb_bool full :1; mrb_bool generational :1; diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 55ad6a921..1a870785a 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -24,7 +24,7 @@ struct RHash { #define mrb_hash_ptr(v) ((struct RHash*)(mrb_ptr(v))) #define mrb_hash_value(p) mrb_obj_value((void*)(p)) -MRB_API mrb_value mrb_hash_new_capa(mrb_state*, int); +MRB_API mrb_value mrb_hash_new_capa(mrb_state*, mrb_int); /* * Initializes a new hash. diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index 36489b1ce..40c8c4a20 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -16,9 +16,13 @@ */ MRB_BEGIN_DECL -#define POSFIXABLE(f) ((f) <= MRB_INT_MAX) -#define NEGFIXABLE(f) ((f) >= MRB_INT_MIN) -#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f)) +#define TYPED_POSFIXABLE(f,t) ((f) <= (t)MRB_INT_MAX) +#define TYPED_NEGFIXABLE(f,t) ((f) >= (t)MRB_INT_MIN) +#define TYPED_FIXABLE(f,t) (TYPED_POSFIXABLE(f,t) && TYPED_NEGFIXABLE(f,t)) +#define POSFIXABLE(f) TYPED_POSFIXABLE(f,mrb_int) +#define NEGFIXABLE(f) TYPED_NEGFIXABLE(f,mrb_int) +#define FIXABLE(f) TYPED_FIXABLE(f,mrb_int) +#define FIXABLE_FLOAT(f) TYPED_FIXABLE(f,double) MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val); MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base); @@ -42,9 +46,11 @@ mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y); # define MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS #endif +/* // Clang 3.8 and 3.9 have problem compiling mruby in 32-bit mode, when MRB_INT64 is set // because of missing __mulodi4 and similar functions in its runtime. We need to use custom // implementation for them. +*/ #ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS #if defined(__clang__) && (__clang_major__ == 3) && (__clang_minor__ >= 8) && \ defined(MRB_32BIT) && defined(MRB_INT64) diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 5965a2b39..9c2666289 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -18,8 +18,11 @@ MRB_BEGIN_DECL struct REnv { MRB_OBJECT_HEADER; mrb_value *stack; - mrb_sym mid; ptrdiff_t cioff; + union { + mrb_sym mid; + struct mrb_context *c; + } cxt; }; #define MRB_SET_ENV_STACK_LEN(e,len) (e)->flags = (unsigned int)(len) @@ -52,6 +55,8 @@ struct RProc { #define MRB_PROC_CFUNC_P(p) (((p)->flags & MRB_PROC_CFUNC) != 0) #define MRB_PROC_STRICT 256 #define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0) +#define MRB_PROC_ORPHAN 512 +#define MRB_PROC_ORPHAN_P(p) (((p)->flags & MRB_PROC_ORPHAN) != 0) #define mrb_proc_ptr(v) ((struct RProc*)(mrb_ptr(v))) diff --git a/include/mruby/string.h b/include/mruby/string.h index b18093218..c3fbb063d 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -84,6 +84,13 @@ MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*); void mrb_gc_free_str(mrb_state*, struct RString*); MRB_API void mrb_str_modify(mrb_state*, struct RString*); + +/* + * Finds the index of a substring in a string + */ +MRB_API mrb_int mrb_str_index(mrb_state*, mrb_value, const char*, mrb_int, mrb_int); +#define mrb_str_index_lit(mrb, str, lit, off) mrb_str_index(mrb, str, lit, mrb_strlen_lit(lit), off); + /* * Appends self to other. Returns self as a concatnated string. * diff --git a/include/mruby/value.h b/include/mruby/value.h index 54d197f8f..98c68d657 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -116,7 +116,8 @@ enum mrb_vtype { MRB_TT_DATA, /* 21 */ MRB_TT_FIBER, /* 22 */ MRB_TT_ISTRUCT, /* 23 */ - MRB_TT_MAXDEFINE /* 24 */ + MRB_TT_BREAK, /* 24 */ + MRB_TT_MAXDEFINE /* 25 */ }; #include <mruby/object.h> @@ -266,6 +267,14 @@ mrb_undef_value(void) } #ifdef MRB_USE_ETEXT_EDATA +#if (defined(__APPLE__) && defined(__MACH__)) +#include <mach-o/getsect.h> +static inline mrb_bool +mrb_ro_data_p(const char *p) +{ + return (const char*)get_etext() < p && p < (const char*)get_edata(); +} +#else extern char _etext[]; #ifdef MRB_NO_INIT_ARRAY_START extern char _edata[]; @@ -284,6 +293,7 @@ mrb_ro_data_p(const char *p) return _etext < p && p < (char*)&__init_array_start; } #endif +#endif #else # define mrb_ro_data_p(p) FALSE #endif diff --git a/include/mruby/version.h b/include/mruby/version.h index 20c39ec79..8414bf204 100644 --- a/include/mruby/version.h +++ b/include/mruby/version.h @@ -42,7 +42,7 @@ MRB_BEGIN_DECL /* * Minor release version number. */ -#define MRUBY_RELEASE_MINOR 2 +#define MRUBY_RELEASE_MINOR 3 /* * Tiny release version number. @@ -62,17 +62,17 @@ MRB_BEGIN_DECL /* * Release year. */ -#define MRUBY_RELEASE_YEAR 2015 +#define MRUBY_RELEASE_YEAR 2017 /* * Release month. */ -#define MRUBY_RELEASE_MONTH 11 +#define MRUBY_RELEASE_MONTH 7 /* * Release day. */ -#define MRUBY_RELEASE_DAY 17 +#define MRUBY_RELEASE_DAY 4 /* * Release date as a string. |
