From 3ceeb0be95874fe867f25004618c31ca8e23ecf4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 25 Jun 2013 15:38:28 +0900 Subject: add mrb_malloc_simple() that returns NULL on error --- include/mruby.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 33a15de0e..29d13c553 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -239,9 +239,10 @@ mrb_sym mrb_intern(mrb_state *mrb,const char *cstr) return mrb_intern_cstr(mrb, cstr); } -void *mrb_malloc(mrb_state*, size_t); -void *mrb_calloc(mrb_state*, size_t, size_t); -void *mrb_realloc(mrb_state*, void*, size_t); +void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */ +void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */ +void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */ +void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */ struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*); void mrb_free(mrb_state*, void*); -- cgit v1.2.3 From 872883747822750413e22b3bc5cdf2acef3b403e Mon Sep 17 00:00:00 2001 From: Cremno Date: Thu, 27 Jun 2013 12:18:35 +0200 Subject: Visual Studio 2013 support + strtof + inline - VC12 has better C99 library support due to C++11 - defined strtof for VC11 or older - define "inline" only if the C compiler is used --- include/mruby/value.h | 40 ++++++++++++++++++++----------------- mrbgems/mruby-math/src/math.c | 22 ++++++++------------ mrbgems/mruby-sprintf/src/sprintf.c | 4 ---- 3 files changed, 30 insertions(+), 36 deletions(-) (limited to 'include') diff --git a/include/mruby/value.h b/include/mruby/value.h index 06241ec76..b86b0e976 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -51,25 +51,29 @@ typedef short mrb_sym; #ifdef _MSC_VER -# define _ALLOW_KEYWORD_MACROS -# include -# define inline __inline +# ifndef __cplusplus +# define inline __inline +# endif # define snprintf _snprintf -# define isnan _isnan -# define isinf(n) (!_finite(n) && !_isnan(n)) -# define strtoll _strtoi64 -# define PRId32 "I32d" -# define PRIi32 "I32i" -# define PRIo32 "I32o" -# define PRIx32 "I32x" -# define PRIX32 "I32X" -# define PRId64 "I64d" -# define PRIi64 "I64i" -# define PRIo64 "I64o" -# define PRIx64 "I64x" -# define PRIX64 "I64X" -#else -# include +# if _MSC_VER < 1800 +# include +# define isnan _isnan +# define isinf(n) (!_finite(n) && !_isnan(n)) +# define strtoll _strtoi64 +# define strtof (float)strtod +# define PRId32 "I32d" +# define PRIi32 "I32i" +# define PRIo32 "I32o" +# define PRIx32 "I32x" +# define PRIX32 "I32X" +# define PRId64 "I64d" +# define PRIi64 "I64i" +# define PRIo64 "I64o" +# define PRIx64 "I64x" +# define PRIX64 "I64X" +# else +# include +# endif #endif typedef uint8_t mrb_bool; diff --git a/mrbgems/mruby-math/src/math.c b/mrbgems/mruby-math/src/math.c index bf3c007b4..bdc7767f7 100644 --- a/mrbgems/mruby-math/src/math.c +++ b/mrbgems/mruby-math/src/math.c @@ -12,8 +12,8 @@ #define domain_error(msg) \ mrb_raise(mrb, E_RANGE_ERROR, "Numerical argument is out of domain - " #msg) -/* math functions not provided under Microsoft Visual C++ */ -#ifdef _MSC_VER +/* math functions not provided by Microsoft Visual C++ 2012 or older */ +#if defined _MSC_VER && _MSC_VER < 1800 #define MATH_TOLERANCE 1E-12 @@ -87,6 +87,12 @@ erfc(double x) return one_sqrtpi*exp(-x*x)*q2; } +double +log2(double x) +{ + return log10(x)/log10(2.0); +} + #endif /* @@ -358,18 +364,6 @@ math_atanh(mrb_state *mrb, mrb_value obj) # define log10(x) ((x) < 0.0 ? nan("") : log10(x)) #endif -#ifndef log2 -#ifndef HAVE_LOG2 -double -log2(double x) -{ - return log10(x)/log10(2.0); -} -#else -extern double log2(double); -#endif -#endif - /* * call-seq: * Math.exp(x) -> float diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index 55698d09f..6479b19bc 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -15,10 +15,6 @@ #include #include -#ifdef _MSC_VER -#include -#endif - #ifdef HAVE_IEEEFP_H #include #endif -- cgit v1.2.3 From bc91bcefcfc0b509cdfa2cd550a395314e280566 Mon Sep 17 00:00:00 2001 From: Cremno Date: Thu, 27 Jun 2013 12:30:25 +0200 Subject: include inttypes.h if _MSC_VER is not defined --- include/mruby/value.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'include') diff --git a/include/mruby/value.h b/include/mruby/value.h index b86b0e976..e78035b5f 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -74,6 +74,8 @@ typedef short mrb_sym; # else # include # endif +#else +# include #endif typedef uint8_t mrb_bool; -- cgit v1.2.3 From 68f31e94f564c48d8677acc8acf3ba46deebf94f Mon Sep 17 00:00:00 2001 From: fleuria Date: Fri, 28 Jun 2013 22:58:19 +0800 Subject: refactor mrb_realloc() remove the redundant codes with mrb_malloc_simple() --- include/mruby.h | 1 + src/gc.c | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 29d13c553..568ed4876 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -242,6 +242,7 @@ mrb_sym mrb_intern(mrb_state *mrb,const char *cstr) void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */ void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */ void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */ +void *mrb_realloc_simple(mrb_state*, void*, size_t); /* return NULL if no memory available */ void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */ struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*); void mrb_free(mrb_state*, void*); diff --git a/src/gc.c b/src/gc.c index 7eee61dc1..6fc400e32 100644 --- a/src/gc.c +++ b/src/gc.c @@ -148,18 +148,28 @@ gettimeofday_time(void) #define GC_STEP_SIZE 1024 + void* -mrb_realloc(mrb_state *mrb, void *p, size_t len) +mrb_realloc_simple(mrb_state *mrb, void *p, size_t len) { void *p2; p2 = (mrb->allocf)(mrb, p, len, mrb->ud); - if (!p2 && len > 0 && mrb->heaps) { mrb_garbage_collect(mrb); p2 = (mrb->allocf)(mrb, p, len, mrb->ud); } + return p2; +} + + +void* +mrb_realloc(mrb_state *mrb, void *p, size_t len) +{ + void *p2; + + p2 = mrb_realloc_simple(mrb, p, len); if (!p2 && len) { if (mrb->out_of_memory) { /* mrb_panic(mrb); */ @@ -185,14 +195,7 @@ mrb_malloc(mrb_state *mrb, size_t len) void* mrb_malloc_simple(mrb_state *mrb, size_t len) { - void *p2; - - p2 = (mrb->allocf)(mrb, 0, len, mrb->ud); - if (!p2 && len > 0 && mrb->heaps) { - mrb_garbage_collect(mrb); - p2 = (mrb->allocf)(mrb, 0, len, mrb->ud); - } - return p2; + return mrb_realloc_simple(mrb, 0, len); } void* -- cgit v1.2.3 From 3f823a0ceeadcba48a332b5d89f867b23c2d332b Mon Sep 17 00:00:00 2001 From: h2so5 Date: Mon, 1 Jul 2013 11:42:38 +0900 Subject: Add mrb_class_get_under() --- include/mruby.h | 1 + src/class.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 568ed4876..b602ba8c9 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -178,6 +178,7 @@ struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super); struct RClass * mrb_module_new(mrb_state *mrb); int mrb_class_defined(mrb_state *mrb, const char *name); struct RClass * mrb_class_get(mrb_state *mrb, const char *name); +struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name); mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj); mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method); diff --git a/src/class.c b/src/class.c index 6eb70dce6..e33ab0153 100644 --- a/src/class.c +++ b/src/class.c @@ -227,7 +227,13 @@ class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) struct RClass * mrb_class_get(mrb_state *mrb, const char *name) { - return class_from_sym(mrb, mrb->object_class, mrb_intern(mrb, name)); + return mrb_class_get_under(mrb, mrb->object_class, name); +} + +struct RClass * +mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name) +{ + return class_from_sym(mrb, outer, mrb_intern(mrb, name)); } /*! -- cgit v1.2.3 From f40bd6cb473fa7a62d9122033141771de844cc68 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Thu, 4 Jul 2013 21:17:20 +0900 Subject: Add comments in mrb_state struct. --- include/mruby.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index b602ba8c9..dd555eb8b 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -73,15 +73,15 @@ enum mrb_fiber_state { struct mrb_context { struct mrb_context *prev; - mrb_value *stack; + mrb_value *stack; /* stack of virtual machine */ mrb_value *stbase, *stend; mrb_callinfo *ci; mrb_callinfo *cibase, *ciend; - mrb_code **rescue; + mrb_code **rescue; /* exception handler stack */ int rsize; - struct RProc **ensure; + struct RProc **ensure; /* ensure handler stack */ int esize; uint8_t status; @@ -97,19 +97,19 @@ enum gc_state { typedef struct mrb_state { void *jmp; - mrb_allocf allocf; + mrb_allocf allocf; /* memory allocation function */ struct mrb_context *c; struct mrb_context *root_c; - struct RObject *exc; - struct iv_tbl *globals; - struct mrb_irep **irep; + struct RObject *exc; /* exception */ + struct iv_tbl *globals; /* global variable table */ + struct mrb_irep **irep; /* program data array */ size_t irep_len, irep_capa; mrb_sym init_sym; struct RObject *top_self; - struct RClass *object_class; + struct RClass *object_class; /* Object class */ struct RClass *class_class; struct RClass *module_class; struct RClass *proc_class; @@ -125,11 +125,11 @@ typedef struct mrb_state { struct RClass *symbol_class; struct RClass *kernel_module; - struct heap_page *heaps; + struct heap_page *heaps; /* heaps for GC */ struct heap_page *sweeps; struct heap_page *free_heaps; size_t live; /* count of live objects */ - struct RBasic *arena[MRB_ARENA_SIZE]; + struct RBasic *arena[MRB_ARENA_SIZE]; /* GC protection array */ int arena_idx; enum gc_state gc_state; /* state of gc */ -- cgit v1.2.3 From 00353a3c42e0a65fbf2e2b355535ff6fce2e872a Mon Sep 17 00:00:00 2001 From: mirichi Date: Sat, 6 Jul 2013 09:10:42 +0900 Subject: khash optimize --- include/mruby/khash.h | 50 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) (limited to 'include') diff --git a/include/mruby/khash.h b/include/mruby/khash.h index db8048f5a..7fec66c19 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -27,12 +27,14 @@ typedef khint_t khiter_t; //extern uint8_t __m[]; /* mask for flags */ -static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; +static const uint8_t __m_empty[8] = {0x02, 0x08, 0x20, 0x80}; +static const uint8_t __m_del[8] = {0x01, 0x04, 0x10, 0x40}; +static const uint8_t __m_either[8] = {0x03, 0x0c, 0x30, 0xc0}; -#define __ac_isempty(e_flag, d_flag, i) (e_flag[(i)/8]&__m[(i)%8]) -#define __ac_isdel(e_flag, d_flag, i) (d_flag[(i)/8]&__m[(i)%8]) -#define __ac_iseither(e_flag, d_flag, i) (__ac_isempty(e_flag,d_flag,i)||__ac_isdel(e_flag,d_flag,i)) +#define __ac_isempty(ed_flag, i) (ed_flag[(i)/4]&__m_empty[(i)%4]) +#define __ac_isdel(ed_flag, i) (ed_flag[(i)/4]&__m_del[(i)%4]) +#define __ac_iseither(ed_flag, i) (ed_flag[(i)/4]&__m_either[(i)%4]) #define khash_power2(v) do { \ v--;\ v |= v >> 1;\ @@ -56,8 +58,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; khint_t size; \ khint_t n_occupied; \ khint_t upper_bound; \ - uint8_t *e_flags; \ - uint8_t *d_flags; \ + uint8_t *ed_flags; \ khkey_t *keys; \ khval_t *vals; \ khint_t mask; \ @@ -98,10 +99,8 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) khint_t sz = h->n_buckets; \ h->size = h->n_occupied = 0; \ h->upper_bound = UPPER_BOUND(sz); \ - h->e_flags = (uint8_t *)mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4); \ - h->d_flags = h->e_flags + sz/8; \ - kh_fill_flags(h->e_flags, 0xff, sz/8); \ - kh_fill_flags(h->d_flags, 0x00, sz/8); \ + h->ed_flags = (uint8_t *)mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4); \ + kh_fill_flags(h->ed_flags, 0xaa, sz/4); \ h->keys = (khkey_t *)mrb_malloc(h->mrb, sizeof(khkey_t)*sz); \ h->vals = (khval_t *)mrb_malloc(h->mrb, sizeof(khval_t)*sz); \ h->mask = sz-1; \ @@ -125,23 +124,22 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) if (h) { \ mrb_free(h->mrb, h->keys); \ mrb_free(h->mrb, h->vals); \ - mrb_free(h->mrb, h->e_flags); \ + mrb_free(h->mrb, h->ed_flags); \ mrb_free(h->mrb, h); \ } \ } \ void kh_clear_##name(kh_##name##_t *h) \ { \ - if (h && h->e_flags) { \ - kh_fill_flags(h->e_flags, 0xff, h->n_buckets/8); \ - kh_fill_flags(h->d_flags, 0x00, h->n_buckets/8); \ + if (h && h->ed_flags) { \ + kh_fill_flags(h->ed_flags, 0xaa, h->n_buckets/4); \ h->size = h->n_occupied = 0; \ } \ } \ khint_t kh_get_##name(kh_##name##_t *h, khkey_t key) \ { \ khint_t k = __hash_func(h->mrb,key) & (h->mask); \ - while (!__ac_isempty(h->e_flags, h->d_flags, k)) { \ - if (!__ac_isdel(h->e_flags, h->d_flags, k)) { \ + while (!__ac_isempty(h->ed_flags, k)) { \ + if (!__ac_isdel(h->ed_flags, k)) { \ if (__hash_equal(h->mrb,h->keys[k], key)) return k; \ } \ k = (k+h->inc) & (h->mask); \ @@ -154,7 +152,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) new_n_buckets = KHASH_MIN_SIZE; \ khash_power2(new_n_buckets); \ { \ - uint8_t *old_e_flags = h->e_flags; \ + uint8_t *old_ed_flags = h->ed_flags; \ khkey_t *old_keys = h->keys; \ khval_t *old_vals = h->vals; \ khint_t old_n_buckets = h->n_buckets; \ @@ -163,12 +161,12 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) kh_alloc_##name(h); \ /* relocate */ \ for (i=0 ; imrb, old_e_flags); \ + mrb_free(h->mrb, old_ed_flags); \ mrb_free(h->mrb, old_keys); \ mrb_free(h->mrb, old_vals); \ } \ @@ -180,27 +178,27 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) kh_resize_##name(h, h->n_buckets*2); \ } \ k = __hash_func(h->mrb,key) & (h->mask); \ - while (!__ac_iseither(h->e_flags, h->d_flags, k)) { \ + while (!__ac_iseither(h->ed_flags, k)) { \ if (__hash_equal(h->mrb,h->keys[k], key)) break; \ k = (k+h->inc) & (h->mask); \ } \ - if (__ac_isempty(h->e_flags, h->d_flags, k)) { \ + if (__ac_isempty(h->ed_flags, k)) { \ /* put at empty */ \ h->keys[k] = key; \ - h->e_flags[k/8] &= ~__m[k%8]; \ + h->ed_flags[k/4] &= ~__m_empty[k%4]; \ h->size++; \ h->n_occupied++; \ - } else if (__ac_isdel(h->e_flags, h->d_flags, k)) { \ + } else if (__ac_isdel(h->ed_flags, k)) { \ /* put at del */ \ h->keys[k] = key; \ - h->d_flags[k/8] &= ~__m[k%8]; \ + h->ed_flags[k/4] &= ~__m_del[k%4]; \ h->size++; \ } \ return k; \ } \ void kh_del_##name(kh_##name##_t *h, khint_t x) \ { \ - h->d_flags[x/8] |= __m[x%8]; \ + h->ed_flags[x/4] |= __m_del[x%4]; \ h->size--; \ } \ kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h) \ @@ -231,7 +229,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) #define kh_del(name, h, k) kh_del_##name(h, k) #define kh_copy(name, mrb, h) kh_copy_##name(mrb, h) -#define kh_exist(h, x) (!__ac_iseither((h)->e_flags, (h)->d_flags, (x))) +#define kh_exist(h, x) (!__ac_iseither((h)->ed_flags, (x))) #define kh_key(h, x) ((h)->keys[x]) #define kh_val(h, x) ((h)->vals[x]) #define kh_value(h, x) ((h)->vals[x]) -- cgit v1.2.3 From 550905000c7007b55f7337e756e7b4ff6a155624 Mon Sep 17 00:00:00 2001 From: mirichi Date: Sun, 7 Jul 2013 09:23:50 +0900 Subject: kh_resize_##name bug fixed. --- include/mruby/khash.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include') diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 7fec66c19..8d2991a1f 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -161,7 +161,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) kh_alloc_##name(h); \ /* relocate */ \ for (i=0 ; i Date: Sun, 7 Jul 2013 14:18:37 +0900 Subject: Change parameter type to suppress -Wsign-compare warnings --- include/mruby.h | 4 ++-- src/object.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index dd555eb8b..e5a5f2c69 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -286,12 +286,12 @@ void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*); } while (0) void mrb_write_barrier(mrb_state *, struct RBasic*); -mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method); +mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method); mrb_value mrb_any_to_s(mrb_state *mrb, mrb_value obj); const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj); struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj); mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c); -mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method); +mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method); int mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c); mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self); mrb_value mrb_obj_clone(mrb_state *mrb, mrb_value self); diff --git a/src/object.c b/src/object.c index e0873175c..aafd2d8fe 100644 --- a/src/object.c +++ b/src/object.c @@ -330,7 +330,7 @@ mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method) } mrb_value -mrb_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method) +mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method) { mrb_value v; @@ -344,7 +344,7 @@ mrb_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, } mrb_value -mrb_check_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method) +mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method) { mrb_value v; -- cgit v1.2.3 From cdb23edf312e868bad3a7f8e8fc1a8aa556bcf4a Mon Sep 17 00:00:00 2001 From: mirichi Date: Sun, 7 Jul 2013 22:17:44 +0900 Subject: It optimizes more. --- include/mruby/khash.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'include') diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 8d2991a1f..f374e0f92 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -97,12 +97,13 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) void kh_alloc_##name(kh_##name##_t *h) \ { \ khint_t sz = h->n_buckets; \ + uint8_t *p = mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4+(sizeof(khkey_t)+sizeof(khval_t))*sz); \ h->size = h->n_occupied = 0; \ h->upper_bound = UPPER_BOUND(sz); \ - h->ed_flags = (uint8_t *)mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4); \ + h->ed_flags = p; \ kh_fill_flags(h->ed_flags, 0xaa, sz/4); \ - h->keys = (khkey_t *)mrb_malloc(h->mrb, sizeof(khkey_t)*sz); \ - h->vals = (khval_t *)mrb_malloc(h->mrb, sizeof(khval_t)*sz); \ + h->keys = (khkey_t *)(p+sizeof(uint8_t)*sz/4); \ + h->vals = (khval_t *)(p+sizeof(uint8_t)*sz/4+sizeof(khkey_t)*sz); \ h->mask = sz-1; \ h->inc = sz/2-1; \ } \ @@ -122,8 +123,6 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) void kh_destroy_##name(kh_##name##_t *h) \ { \ if (h) { \ - mrb_free(h->mrb, h->keys); \ - mrb_free(h->mrb, h->vals); \ mrb_free(h->mrb, h->ed_flags); \ mrb_free(h->mrb, h); \ } \ @@ -167,8 +166,6 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) } \ } \ mrb_free(h->mrb, old_ed_flags); \ - mrb_free(h->mrb, old_keys); \ - mrb_free(h->mrb, old_vals); \ } \ } \ khint_t kh_put_##name(kh_##name##_t *h, khkey_t key) \ -- cgit v1.2.3 From b8a46227ee7f1d14330aa27ec74bcadb66ff3a91 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 10 Jul 2013 13:14:40 +0900 Subject: put pointer tables before bitmap to avoid alignment issues; ref #1353 --- include/mruby/khash.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'include') diff --git a/include/mruby/khash.h b/include/mruby/khash.h index f374e0f92..fb11586d2 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -100,10 +100,10 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) uint8_t *p = mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4+(sizeof(khkey_t)+sizeof(khval_t))*sz); \ h->size = h->n_occupied = 0; \ h->upper_bound = UPPER_BOUND(sz); \ - h->ed_flags = p; \ + h->keys = (khkey_t *)p; \ + h->vals = (khval_t *)(p+sizeof(khkey_t)*sz); \ + h->ed_flags = (p+sizeof(khkey_t)*sz+sizeof(khval_t)*sz); \ kh_fill_flags(h->ed_flags, 0xaa, sz/4); \ - h->keys = (khkey_t *)(p+sizeof(uint8_t)*sz/4); \ - h->vals = (khval_t *)(p+sizeof(uint8_t)*sz/4+sizeof(khkey_t)*sz); \ h->mask = sz-1; \ h->inc = sz/2-1; \ } \ @@ -123,7 +123,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) void kh_destroy_##name(kh_##name##_t *h) \ { \ if (h) { \ - mrb_free(h->mrb, h->ed_flags); \ + mrb_free(h->mrb, h->keys); \ mrb_free(h->mrb, h); \ } \ } \ @@ -165,7 +165,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) kh_value(h,k) = old_vals[i]; \ } \ } \ - mrb_free(h->mrb, old_ed_flags); \ + mrb_free(h->mrb, old_keys); \ } \ } \ khint_t kh_put_##name(kh_##name##_t *h, khkey_t key) \ -- cgit v1.2.3 From efac8db6748ef95c52de32b16a534f7b8cbf982d Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 14 Jul 2013 23:44:29 +0900 Subject: Replace int with mrb_bool because a return value is boolean. --- include/mruby.h | 2 +- src/pool.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index e5a5f2c69..a7f2a49c4 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -378,7 +378,7 @@ struct mrb_pool* mrb_pool_open(mrb_state*); void mrb_pool_close(struct mrb_pool*); void* mrb_pool_alloc(struct mrb_pool*, size_t); void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen); -int mrb_pool_can_realloc(struct mrb_pool*, void*, size_t); +mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t); void* mrb_alloca(mrb_state *mrb, size_t); #if defined(__cplusplus) diff --git a/src/pool.c b/src/pool.c index c992b5e53..81fb83c0c 100644 --- a/src/pool.c +++ b/src/pool.c @@ -118,7 +118,7 @@ mrb_pool_alloc(mrb_pool *pool, size_t len) return page->last; } -int +mrb_bool mrb_pool_can_realloc(mrb_pool *pool, void *p, size_t len) { struct mrb_pool_page *page; @@ -180,7 +180,7 @@ main(void) pool = mrb_pool_open(0); p = mrb_pool_alloc(pool, len); for (i=1; i<20; i++) { - printf("%p (len=%d) %d\n", p, len, mrb_pool_can_realloc(pool, p, len*2)); + printf("%p (len=%d) %ud\n", p, len, mrb_pool_can_realloc(pool, p, len*2)); p = mrb_pool_realloc(pool, p, len, len*2); len *= 2; } -- cgit v1.2.3 From f05580f1bc3bf22c54b4f9f3c2e3d55020e579bf Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Mon, 15 Jul 2013 01:52:47 +0900 Subject: Add comments. --- include/mruby/irep.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/mruby/irep.h b/include/mruby/irep.h index 856b12099..498b58ca3 100644 --- a/include/mruby/irep.h +++ b/include/mruby/irep.h @@ -11,10 +11,11 @@ extern "C" { #endif +/* Program data array struct */ typedef struct mrb_irep { uint32_t idx; - uint16_t nlocals; - uint16_t nregs; + uint16_t nlocals; /* Number of local variables */ + uint16_t nregs; /* Number of register variables */ uint8_t flags; mrb_code *iseq; -- cgit v1.2.3 From 8e42868600e7adcdc5665ff9b0244150296960d6 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Mon, 15 Jul 2013 23:00:54 +0900 Subject: Repalace int with mrb_bool because a return value is boolean. --- include/mruby.h | 18 +++++++++--------- include/mruby/string.h | 2 +- mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 2 +- mrbgems/mruby-range-ext/src/range.c | 4 ++-- src/class.c | 6 +++--- src/codegen.c | 2 +- src/kernel.c | 6 +++--- src/object.c | 10 +++++----- src/range.c | 6 +++--- src/string.c | 4 ++-- src/symbol.c | 4 ++-- 11 files changed, 32 insertions(+), 32 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index a7f2a49c4..85b464b8e 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -176,13 +176,13 @@ void mrb_undef_class_method(mrb_state*, struct RClass*, const char*); mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv); struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super); struct RClass * mrb_module_new(mrb_state *mrb); -int mrb_class_defined(mrb_state *mrb, const char *name); +mrb_bool mrb_class_defined(mrb_state *mrb, const char *name); struct RClass * mrb_class_get(mrb_state *mrb, const char *name); struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name); mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj); mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method); -int mrb_obj_respond_to(struct RClass* c, mrb_sym mid); +mrb_bool mrb_obj_respond_to(struct RClass* c, mrb_sym mid); struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super); struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name); @@ -264,13 +264,13 @@ void mrb_p(mrb_state*, mrb_value); mrb_int mrb_obj_id(mrb_value obj); mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name); -int mrb_obj_eq(mrb_state*, mrb_value, mrb_value); -int mrb_obj_equal(mrb_state*, mrb_value, mrb_value); -int mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2); +mrb_bool mrb_obj_eq(mrb_state*, mrb_value, mrb_value); +mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value); +mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2); mrb_value mrb_Integer(mrb_state *mrb, mrb_value val); mrb_value mrb_Float(mrb_state *mrb, mrb_value val); mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); -int mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); +mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); void mrb_garbage_collect(mrb_state*); void mrb_incremental_gc(mrb_state *); @@ -292,7 +292,7 @@ const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj); struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj); mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c); mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method); -int mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c); +mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c); mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self); mrb_value mrb_obj_clone(mrb_state *mrb, mrb_value self); @@ -369,8 +369,8 @@ void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val); mrb_value mrb_block_proc(void); mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id); -int mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid); -int mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c); +mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid); +mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c); /* memory pool implementation */ typedef struct mrb_pool mrb_pool; diff --git a/include/mruby/string.h b/include/mruby/string.h index 26d1344d8..000c80b09 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -57,7 +57,7 @@ mrb_value mrb_str_to_str(mrb_state *mrb, mrb_value str); mrb_int mrb_str_hash(mrb_state *mrb, mrb_value str); mrb_value mrb_str_buf_append(mrb_state *mrb, mrb_value str, mrb_value str2); mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str); -int mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2); +mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2); mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str); mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len); mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2); diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index 7f2fcf282..eb7194f30 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -38,7 +38,7 @@ p(mrb_state *mrb, mrb_value obj, int prompt) /* Guess if the user might want to enter more * or if he wants an evaluation of his code now */ -int +mrb_bool is_code_block_open(struct mrb_parser_state *parser) { int code_block_open = FALSE; diff --git a/mrbgems/mruby-range-ext/src/range.c b/mrbgems/mruby-range-ext/src/range.c index 377677ffb..4e17dac8c 100644 --- a/mrbgems/mruby-range-ext/src/range.c +++ b/mrbgems/mruby-range-ext/src/range.c @@ -1,7 +1,7 @@ #include "mruby.h" #include "mruby/range.h" -static int +static mrb_bool r_le(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ @@ -15,7 +15,7 @@ r_le(mrb_state *mrb, mrb_value a, mrb_value b) return FALSE; } -static int +static mrb_bool r_lt(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); diff --git a/src/class.c b/src/class.c index 9868d0080..606a54a7c 100644 --- a/src/class.c +++ b/src/class.c @@ -203,7 +203,7 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id return c; } -int +mrb_bool mrb_class_defined(mrb_state *mrb, const char *name) { mrb_value sym = mrb_check_intern_cstr(mrb, name); @@ -1172,7 +1172,7 @@ mrb_bob_missing(mrb_state *mrb, mrb_value mod) return mrb_nil_value(); } -int +mrb_bool mrb_obj_respond_to(struct RClass* c, mrb_sym mid) { khiter_t k; @@ -1196,7 +1196,7 @@ mrb_obj_respond_to(struct RClass* c, mrb_sym mid) return FALSE; /* no method */ } -int +mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid) { return mrb_obj_respond_to(mrb_class(mrb, obj), mid); diff --git a/src/codegen.c b/src/codegen.c index 8dd5a124d..37176653b 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -683,7 +683,7 @@ scope_body(codegen_scope *s, node *tree) return idx - s->idx; } -static int +static mrb_bool nosplat(node *t) { while (t) { diff --git a/src/kernel.c b/src/kernel.c index 965b80b95..ae8d24710 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -26,7 +26,7 @@ typedef enum { NOEX_RESPONDS = 0x80 } mrb_method_flag_t; -int +mrb_bool mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj) { struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern2(mrb, "to_s", 4)); @@ -521,7 +521,7 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) return mrb_yield_internal(mrb, b, 0, 0, self, c); } -int +mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c) { if (mrb_obj_class(mrb, obj) == c) return TRUE; @@ -938,7 +938,7 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) return val; } -static inline int +static inline mrb_bool basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub) { return mrb_respond_to(mrb, obj, id); diff --git a/src/object.c b/src/object.c index 4003452cc..5b2278767 100644 --- a/src/object.c +++ b/src/object.c @@ -11,7 +11,7 @@ #include "mruby/string.h" #include "error.h" -int +mrb_bool mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) { if (mrb_type(v1) != mrb_type(v2)) return FALSE; @@ -33,14 +33,14 @@ mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) } } -int +mrb_bool mrb_obj_equal(mrb_state *mrb, mrb_value v1, mrb_value v2) { /* temporary definition */ return mrb_obj_eq(mrb, v1, v2); } -int +mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2) { mrb_value result; @@ -468,7 +468,7 @@ mrb_any_to_s(mrb_state *mrb, mrb_value obj) * b.kind_of? M #=> true */ -int +mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c) { struct RClass *cl = mrb_class(mrb, obj); @@ -585,7 +585,7 @@ mrb_inspect(mrb_state *mrb, mrb_value obj) return mrb_obj_as_string(mrb, mrb_funcall(mrb, obj, "inspect", 0, 0)); } -int +mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2) { if (mrb_obj_eq(mrb, obj1, obj2)) return TRUE; diff --git a/src/range.c b/src/range.c index 92eddfe8c..6e313df51 100644 --- a/src/range.c +++ b/src/range.c @@ -170,7 +170,7 @@ mrb_range_eq(mrb_state *mrb, mrb_value range) return mrb_true_value(); } -static int +static mrb_bool r_le(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ @@ -184,7 +184,7 @@ r_le(mrb_state *mrb, mrb_value a, mrb_value b) return FALSE; } -static int +static mrb_bool r_gt(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); @@ -197,7 +197,7 @@ r_gt(mrb_state *mrb, mrb_value a, mrb_value b) return FALSE; } -static int +static mrb_bool r_ge(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ diff --git a/src/string.c b/src/string.c index 59a1df455..975f6cdb9 100644 --- a/src/string.c +++ b/src/string.c @@ -595,7 +595,7 @@ mrb_str_cmp_m(mrb_state *mrb, mrb_value str1) return mrb_fixnum_value(result); } -static int +static mrb_bool str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2) { const mrb_int len = RSTRING_LEN(str1); @@ -606,7 +606,7 @@ str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2) return FALSE; } -int +mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2) { if (mrb_obj_equal(mrb, str1, str2)) return TRUE; diff --git a/src/symbol.c b/src/symbol.c index c29f7c6ae..bd8dce7df 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -251,7 +251,7 @@ sym_to_sym(mrb_state *mrb, mrb_value sym) #endif #define is_identchar(c) (SIGN_EXTEND_CHAR(c)!=-1&&(ISALNUM(c) || (c) == '_')) -static int +static mrb_bool is_special_global_name(const char* m) { switch (*m) { @@ -274,7 +274,7 @@ is_special_global_name(const char* m) return !*m; } -static int +static mrb_bool symname_p(const char *name) { const char *m = name; -- cgit v1.2.3 From c852626ea73136aa148f9bca92ecc3babfd28017 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 15:42:56 +0800 Subject: rename mrb_garbage_collect() to mrb_full_gc() --- include/mruby.h | 2 +- src/gc.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 85b464b8e..af6901b52 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -272,7 +272,7 @@ mrb_value mrb_Float(mrb_state *mrb, mrb_value val); mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); -void mrb_garbage_collect(mrb_state*); +void mrb_full_gc(mrb_state*); void mrb_incremental_gc(mrb_state *); int mrb_gc_arena_save(mrb_state*); void mrb_gc_arena_restore(mrb_state*,int); diff --git a/src/gc.c b/src/gc.c index 1dcaf4dd0..9a8fea791 100644 --- a/src/gc.c +++ b/src/gc.c @@ -175,7 +175,7 @@ mrb_realloc_simple(mrb_state *mrb, void *p, size_t len) p2 = (mrb->allocf)(mrb, p, len, mrb->ud); if (!p2 && len > 0 && mrb->heaps) { - mrb_garbage_collect(mrb); + mrb_full_gc(mrb); p2 = (mrb->allocf)(mrb, p, len, mrb->ud); } @@ -390,7 +390,7 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls) static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } }; #ifdef MRB_GC_STRESS - mrb_garbage_collect(mrb); + mrb_full_gc(mrb); #endif if (mrb->gc_threshold < mrb->live) { mrb_incremental_gc(mrb); @@ -986,11 +986,12 @@ mrb_incremental_gc(mrb_state *mrb) GC_TIME_STOP_AND_REPORT; } +/* Perform a full gc cycle */ void -mrb_garbage_collect(mrb_state *mrb) +mrb_full_gc(mrb_state *mrb) { if (mrb->gc_disabled) return; - GC_INVOKE_TIME_REPORT("mrb_garbage_collect()"); + GC_INVOKE_TIME_REPORT("mrb_full_gc()"); GC_TIME_START; if (mrb->gc_state == GC_STATE_SWEEP) { @@ -1082,7 +1083,7 @@ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj) static mrb_value gc_start(mrb_state *mrb, mrb_value obj) { - mrb_garbage_collect(mrb); + mrb_full_gc(mrb); return mrb_nil_value(); } @@ -1452,8 +1453,8 @@ test_incremental_gc(void) puts("test_incremental_gc"); change_gen_gc_mode(mrb, FALSE); - puts(" in mrb_garbage_collect"); - mrb_garbage_collect(mrb); + puts(" in mrb_full_gc"); + mrb_full_gc(mrb); gc_assert(mrb->gc_state == GC_STATE_NONE); puts(" in GC_STATE_NONE"); -- cgit v1.2.3 From 2591922ec29681d60debe23ce99237cf6ec98b18 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 18:18:09 +0800 Subject: rename variable_gray_list to atomic_gray_list --- include/mruby.h | 4 ++-- src/gc.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 85b464b8e..ba9bbf58d 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -134,8 +134,8 @@ typedef struct mrb_state { enum gc_state gc_state; /* state of gc */ int current_white_part; /* make white object by white_part */ - struct RBasic *gray_list; /* list of gray objects */ - struct RBasic *variable_gray_list; /* list of objects to be traversed atomically */ + struct RBasic *gray_list; /* list of gray objects to be traversed incrementally */ + struct RBasic *atomic_gray_list; /* list of objects to be traversed atomically */ size_t gc_live_after_mark; size_t gc_threshold; int gc_interval_ratio; diff --git a/src/gc.c b/src/gc.c index bc0623be1..f335345df 100644 --- a/src/gc.c +++ b/src/gc.c @@ -664,7 +664,7 @@ root_scan_phase(mrb_state *mrb) if (!is_minor_gc(mrb)) { mrb->gray_list = NULL; - mrb->variable_gray_list = NULL; + mrb->atomic_gray_list = NULL; } mrb_gc_mark_gv(mrb); @@ -805,7 +805,7 @@ final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); gc_mark_gray_list(mrb, &mrb->gray_list); - gc_mark_gray_list(mrb, &mrb->variable_gray_list); + gc_mark_gray_list(mrb, &mrb->atomic_gray_list); gc_assert(mrb->gray_list == NULL); gc_assert(mrb->gray_list == NULL); } @@ -933,7 +933,7 @@ clear_all_old(mrb_state *mrb) mrb->is_generational_gc_mode = FALSE; prepare_incremental_sweep(mrb); incremental_gc_until(mrb, GC_STATE_NONE); - mrb->variable_gray_list = mrb->gray_list = NULL; + mrb->atomic_gray_list = mrb->gray_list = NULL; mrb->is_generational_gc_mode = origin_mode; } @@ -1064,8 +1064,8 @@ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj) gc_assert(!is_dead(mrb, obj)); gc_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE); paint_gray(obj); - obj->gcnext = mrb->variable_gray_list; - mrb->variable_gray_list = obj; + obj->gcnext = mrb->atomic_gray_list; + mrb->atomic_gray_list = obj; } /* @@ -1372,7 +1372,7 @@ test_mrb_write_barrier(void) mrb_write_barrier(mrb, obj); gc_assert(is_gray(obj)); - gc_assert(mrb->variable_gray_list == obj); + gc_assert(mrb->atomic_gray_list == obj); puts(" fail with gray"); -- cgit v1.2.3 From 4ad4ce6cafb2d408f0d539362d60ad1620698037 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 24 Jul 2013 23:31:46 +0900 Subject: restore once removed mrb_garbage_collect() --- include/mruby.h | 1 + src/gc.c | 6 ++++++ 2 files changed, 7 insertions(+) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 33d866bd0..70d6940a1 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -272,6 +272,7 @@ mrb_value mrb_Float(mrb_state *mrb, mrb_value val); mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); +void mrb_garbage_collect(mrb_state*); void mrb_full_gc(mrb_state*); void mrb_incremental_gc(mrb_state *); int mrb_gc_arena_save(mrb_state*); diff --git a/src/gc.c b/src/gc.c index 7004c8c6d..c1849885b 100644 --- a/src/gc.c +++ b/src/gc.c @@ -1018,6 +1018,12 @@ mrb_full_gc(mrb_state *mrb) GC_TIME_STOP_AND_REPORT; } +void +mrb_garbage_collect(mrb_state *mrb) +{ + mrb_full_gc(mrb); +} + int mrb_gc_arena_save(mrb_state *mrb) { -- cgit v1.2.3 From e2d36d1336ebb7093b76c3af1a71cd56583e4197 Mon Sep 17 00:00:00 2001 From: fleuria Date: Thu, 25 Jul 2013 02:28:24 +0800 Subject: introduce mrb_assert() in mruby.h --- include/mruby.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 70d6940a1..dcd2aa5fc 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -382,6 +382,13 @@ void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen); mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t); void* mrb_alloca(mrb_state *mrb, size_t); +#ifdef MRB_DEBUG +#include +#define mrb_assert(p) assert(p) +#else +#define mrb_assert(p) ((void)0) +#endif + #if defined(__cplusplus) } /* extern "C" { */ #endif -- cgit v1.2.3