diff options
| -rw-r--r-- | include/mruby/data.h | 2 | ||||
| -rw-r--r-- | mrblib/array.rb | 10 | ||||
| -rw-r--r-- | src/gc.c | 12 | ||||
| -rw-r--r-- | src/kernel.c | 5 | ||||
| -rw-r--r-- | src/object.c | 32 | ||||
| -rw-r--r-- | tools/mirb/mirb.c | 3 |
6 files changed, 35 insertions, 29 deletions
diff --git a/include/mruby/data.h b/include/mruby/data.h index b9bedb3f9..ed49393f7 100644 --- a/include/mruby/data.h +++ b/include/mruby/data.h @@ -40,7 +40,7 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void * void *mrb_get_datatype(mrb_state *mrb, mrb_value, const struct mrb_data_type*); void *mrb_check_datatype(mrb_state *mrb, mrb_value, const struct mrb_data_type*); #define Data_Get_Struct(mrb,obj,type,sval) do {\ - sval = mrb_check_datatype(mrb, obj, type); \ + *(void**)&sval = mrb_check_datatype(mrb, obj, type); \ } while (0) #if defined(__cplusplus) diff --git a/mrblib/array.rb b/mrblib/array.rb index 3c4e2dd76..56bf5ceb2 100644 --- a/mrblib/array.rb +++ b/mrblib/array.rb @@ -11,8 +11,14 @@ class Array # ISO 15.2.12.5.10 def each(&block) idx, length = -1, self.length-1 - while(idx < length) - block.call(self[idx += 1]) + while idx < length and length < self.length and length = self.length-1 + elm = self[idx += 1] + unless elm + if elm == nil and length >= self.length + break + end + end + block.call(elm) end self end @@ -983,7 +983,7 @@ mrb_field_write_barrier(mrb_state *mrb, struct RBasic *obj, struct RBasic *value gc_assert(!is_dead(mrb, value) && !is_dead(mrb, obj)); gc_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE); - if (is_minor_gc(mrb) || mrb->gc_state == GC_STATE_MARK) { + if (is_generational(mrb) || mrb->gc_state == GC_STATE_MARK) { add_gray_list(mrb, value); } else { @@ -1188,13 +1188,13 @@ gc_generational_mode_get(mrb_state *mrb, mrb_value self) static mrb_value gc_generational_mode_set(mrb_state *mrb, mrb_value self) { - mrb_value enable; + int enable; - mrb_get_args(mrb, "o", &enable); - if (mrb->is_generational_gc_mode != mrb_test(enable)) - change_gen_gc_mode(mrb, mrb_test(enable)); + mrb_get_args(mrb, "b", &enable); + if (mrb->is_generational_gc_mode != enable) + change_gen_gc_mode(mrb, enable); - if (mrb_test(enable)) + if (enable) return mrb_true_value(); else return mrb_false_value(); diff --git a/src/kernel.c b/src/kernel.c index 5e8a2f5aa..de4e474b3 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -728,10 +728,7 @@ class_instance_method_list(mrb_state *mrb, int argc, mrb_value *argv, struct RCl recur = TRUE; } else { - mrb_value r; - - mrb_get_args(mrb, "o", &r); - recur = mrb_test(r); + mrb_get_args(mrb, "b", &recur); } ary = mrb_ary_new(mrb); oldklass = 0; diff --git a/src/object.c b/src/object.c index 51b5c12d9..99034e3be 100644 --- a/src/object.c +++ b/src/object.c @@ -112,10 +112,10 @@ nil_inspect(mrb_state *mrb, mrb_value obj) static mrb_value true_and(mrb_state *mrb, mrb_value obj) { - mrb_value obj2; + int obj2; - mrb_get_args(mrb, "o", &obj2); - return mrb_test(obj2)?mrb_true_value():mrb_false_value(); + mrb_get_args(mrb, "b", &obj2); + return obj2 ? mrb_true_value() : mrb_false_value(); } /* 15.2.5.3.2 */ @@ -131,10 +131,10 @@ true_and(mrb_state *mrb, mrb_value obj) static mrb_value true_xor(mrb_state *mrb, mrb_value obj) { - mrb_value obj2; + int obj2; - mrb_get_args(mrb, "o", &obj2); - return mrb_test(obj2)?mrb_false_value():mrb_true_value(); + mrb_get_args(mrb, "b", &obj2); + return obj2 ? mrb_false_value() : mrb_true_value(); } /* 15.2.5.3.3 */ @@ -171,9 +171,9 @@ true_to_s(mrb_state *mrb, mrb_value obj) static mrb_value true_or(mrb_state *mrb, mrb_value obj) { - mrb_value obj2; + int obj2; - mrb_get_args(mrb, "o", &obj2); + mrb_get_args(mrb, "b", &obj2); return mrb_true_value(); } @@ -202,9 +202,9 @@ true_or(mrb_state *mrb, mrb_value obj) static mrb_value false_and(mrb_state *mrb, mrb_value obj) { - mrb_value obj2; + int obj2; - mrb_get_args(mrb, "o", &obj2); + mrb_get_args(mrb, "b", &obj2); return mrb_false_value(); } @@ -224,10 +224,10 @@ false_and(mrb_state *mrb, mrb_value obj) static mrb_value false_xor(mrb_state *mrb, mrb_value obj) { - mrb_value obj2; + int obj2; - mrb_get_args(mrb, "o", &obj2); - return mrb_test(obj2)?mrb_true_value():mrb_false_value(); + mrb_get_args(mrb, "b", &obj2); + return obj2 ? mrb_true_value() : mrb_false_value(); } /* 15.2.4.3.3 */ @@ -244,10 +244,10 @@ false_xor(mrb_state *mrb, mrb_value obj) static mrb_value false_or(mrb_state *mrb, mrb_value obj) { - mrb_value obj2; + int obj2; - mrb_get_args(mrb, "o", &obj2); - return mrb_test(obj2)?mrb_true_value():mrb_false_value(); + mrb_get_args(mrb, "b", &obj2); + return obj2 ? mrb_true_value() : mrb_false_value(); } /* 15.2.6.3.3 */ diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index b89c63cff..85c3249d2 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -159,6 +159,7 @@ main(void) mrb_value result; int n; int code_block_open = FALSE; + int ai; print_hint(); @@ -172,6 +173,7 @@ main(void) cxt = mrbc_context_new(mrb); cxt->capture_errors = 1; + ai = mrb_gc_arena_save(mrb); while (TRUE) { #ifndef ENABLE_READLINE print_cmdline(code_block_open); @@ -253,6 +255,7 @@ main(void) ruby_code[0] = '\0'; last_code_line[0] = '\0'; mrb_parser_free(parser); + mrb_gc_arena_restore(mrb, ai); } } mrbc_context_free(mrb, cxt); |
