summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/data.h2
-rw-r--r--mrblib/array.rb10
-rw-r--r--src/gc.c12
-rw-r--r--src/kernel.c5
-rw-r--r--src/object.c32
-rw-r--r--tools/mirb/mirb.c3
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
diff --git a/src/gc.c b/src/gc.c
index d84f44377..69e36640d 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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);