summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/mrbgems/README.md4
-rw-r--r--include/mruby.h16
-rw-r--r--include/mruby/array.h1
-rw-r--r--src/gc.c12
-rw-r--r--src/vm.c6
-rw-r--r--tasks/mruby_build.rake4
-rw-r--r--test/t/gc.rb45
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" { */
diff --git a/src/gc.c b/src/gc.c
index 472535925..b3e4b291c 100644
--- a/src/gc.c
+++ b/src/gc.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;
diff --git a/src/vm.c b/src/vm.c
index b84158d1d..8ae28ef5e 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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