summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrblib/array.rb10
-rw-r--r--tools/mirb/mirb.c3
2 files changed, 11 insertions, 2 deletions
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/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);