diff options
| -rw-r--r-- | doc/mrbgems/README.md | 4 | ||||
| -rw-r--r-- | include/mruby.h | 16 | ||||
| -rw-r--r-- | include/mruby/array.h | 1 | ||||
| -rw-r--r-- | src/gc.c | 12 | ||||
| -rw-r--r-- | src/vm.c | 6 | ||||
| -rw-r--r-- | tasks/mruby_build.rake | 4 | ||||
| -rw-r--r-- | test/t/gc.rb | 45 |
7 files changed, 74 insertions, 14 deletions
diff --git a/doc/mrbgems/README.md b/doc/mrbgems/README.md index cc28f48f8..9e930d8b2 100644 --- a/doc/mrbgems/README.md +++ b/doc/mrbgems/README.md @@ -27,6 +27,10 @@ A remote GIT repository location for a GEM is also supported: conf.gem :git => 'https://github.com/masuidrive/mrbgems-example.git', :branch => 'master' ``` +``` +conf.gem :github => 'masuidrive/mrbgems-example', :branch => 'master' +``` + ## GEM Structure diff --git a/include/mruby.h b/include/mruby.h index 197961c86..845443a1b 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -121,9 +121,9 @@ typedef struct mrb_state { size_t gc_threshold; int gc_interval_ratio; int gc_step_ratio; - int gc_disabled; - int gc_full; - int is_generational_gc_mode; + unsigned int gc_disabled:1; + unsigned int gc_full:1; + unsigned int is_generational_gc_mode:1; size_t majorgc_old_threshold; struct alloca_header *mems; @@ -241,16 +241,6 @@ void mrb_write_barrier(mrb_state *, struct RBasic*); #define MRUBY_VERSION "Rite" -#ifdef DEBUG -#undef DEBUG -#endif - -#if 0 -#define DEBUG(x) x -#else -#define DEBUG(x) -#endif - mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, mrb_int 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); diff --git a/include/mruby/array.h b/include/mruby/array.h index 2857ec75d..c5959bbe6 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -55,6 +55,7 @@ mrb_value mrb_ary_new4(mrb_state *mrb, int n, const mrb_value *elts); mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr); mrb_value mrb_ary_entry(mrb_value ary, int offset); mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self); +mrb_value mrb_ary_clear(mrb_state *mrb, mrb_value self); #if defined(__cplusplus) } /* extern "C" { */ @@ -147,8 +147,10 @@ gettimeofday_time(void) #ifdef GC_DEBUG #include <assert.h> #define gc_assert(expect) assert(expect) +#define DEBUG(x) (x) #else #define gc_assert(expect) ((void)0) +#define DEBUG(x) #endif #define GC_STEP_SIZE 1024 @@ -206,6 +208,7 @@ struct heap_page { struct heap_page *next; struct heap_page *free_next; struct heap_page *free_prev; + unsigned int old:1; RVALUE objects[MRB_HEAP_PAGE_SIZE]; }; @@ -762,6 +765,11 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) int dead_slot = 1; int full = (page->freelist == NULL); + if (is_minor_gc(mrb) && page->old) { + /* skip a slot which doesn't contain any young object */ + p = e; + dead_slot = 0; + } while (p<e) { if (is_dead(mrb, &p->as.basic)) { if (p->as.basic.tt != MRB_TT_FREE) { @@ -792,6 +800,10 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) if (full && freed > 0) { link_free_heap_page(mrb, page); } + if (page->freelist == NULL && is_minor_gc(mrb)) + page->old = TRUE; + else + page->old = FALSE; page = page->next; } tried_sweep += MRB_HEAP_PAGE_SIZE; @@ -49,7 +49,11 @@ The value below allows about 60000 recursive calls in the simplest case. */ #define MRB_STACK_MAX ((1<<18) - MRB_STACK_GROWTH) #endif - +#ifdef VM_DEBUG +# define DEBUG(x) (x) +#else +# define DEBUG(x) +#endif static inline void stack_copy(mrb_value *dst, const mrb_value *src, size_t size) diff --git a/tasks/mruby_build.rake b/tasks/mruby_build.rake index 65c80ab6a..d5dc075c3 100644 --- a/tasks/mruby_build.rake +++ b/tasks/mruby_build.rake @@ -67,6 +67,10 @@ module MRuby end def load_external_gem(params) + if params[:github] + params[:git] = "[email protected]:#{params[:github]}.git" + end + if params[:git] url = params[:git] gemdir = "build/mrbgems/#{url.match(/([-_\w]+)(\.[-_\w]+|)$/).to_a[1]}" diff --git a/test/t/gc.rb b/test/t/gc.rb new file mode 100644 index 000000000..410272797 --- /dev/null +++ b/test/t/gc.rb @@ -0,0 +1,45 @@ +# Not ISO specified + +assert('GC.enable') do + GC.disable == false + GC.enable == true + GC.enable == false +end + +assert('GC.disable') do + begin + GC.disable == false + GC.disable == true + ensure + GC.enable + end +end + +assert('GC.interval_ratio=') do + origin = GC.interval_ratio + begin + (GC.interval_ratio = 150) == 150 + ensure + GC.interval_ratio = origin + end +end + +assert('GC.step_ratio=') do + origin = GC.step_ratio + begin + (GC.step_ratio = 150) == 150 + ensure + GC.step_ratio = origin + end +end + +assert('GC.generational_mode=') do + origin = GC.generational_mode + begin + (GC.generational_mode = false) == false + (GC.generational_mode = true) == true + (GC.generational_mode = true) == true + ensure + GC.generational_mode = origin + end +end |
