diff options
| -rw-r--r-- | mrbgems/mruby-enum-ext/test/enum.rb | 12 | ||||
| -rw-r--r-- | mrbgems/mruby-fiber/src/fiber.c | 21 | ||||
| -rw-r--r-- | mrbgems/mruby-fiber/test/fiber.rb | 13 | ||||
| -rw-r--r-- | mrblib/kernel.rb | 2 | ||||
| -rw-r--r-- | src/array.c | 8 | ||||
| -rw-r--r-- | src/gc.c | 3 | ||||
| -rw-r--r-- | src/numeric.c | 6 |
7 files changed, 57 insertions, 8 deletions
diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb index a7762231b..a14d7f492 100644 --- a/mrbgems/mruby-enum-ext/test/enum.rb +++ b/mrbgems/mruby-enum-ext/test/enum.rb @@ -41,3 +41,15 @@ assert("Enumerable#group_by") do assert_equal [1, 4], r[1] assert_equal [2, 5], r[2] end + +assert("Enumerable#sort_by") do + assert_equal ["car", "train", "bicycle"], %w{car bicycle train}.sort_by {|e| e.length} +end + +assert("Enumerable#first") do + a = [1, 2, 3] + assert_equal 1, a.first + assert_equal [1, 2], a.first(2) + assert_equal [1, 2, 3], a.first(10) + assert_nil [].first +end diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index a2ce52954..f67e02e56 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -3,6 +3,8 @@ #include "mruby/class.h" #include "mruby/proc.h" +#define fiber_ptr(o) ((struct RFiber*)mrb_ptr(o)) + #define FIBER_STACK_INIT_SIZE 64 #define FIBER_CI_INIT_SIZE 8 @@ -62,7 +64,7 @@ static mrb_value fiber_init(mrb_state *mrb, mrb_value self) { static const struct mrb_context mrb_context_zero = { 0 }; - struct RFiber *f = (struct RFiber*)mrb_ptr(self); + struct RFiber *f = fiber_ptr(self); struct mrb_context *c; struct RProc *p; mrb_callinfo *ci; @@ -114,8 +116,9 @@ fiber_init(mrb_state *mrb, mrb_value self) static struct mrb_context* fiber_check(mrb_state *mrb, mrb_value fib) { - struct RFiber *f = (struct RFiber*)mrb_ptr(fib); + struct RFiber *f = fiber_ptr(fib); + mrb_assert(f->tt == MRB_TT_FIBER); if (!f->cxt) { mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized Fiber"); } @@ -212,6 +215,19 @@ fiber_alive_p(mrb_state *mrb, mrb_value self) return mrb_bool_value(c->status != MRB_FIBER_TERMINATED); } +static mrb_value +fiber_eq(mrb_state *mrb, mrb_value self) +{ + mrb_value other; + mrb_get_args(mrb, "o", &other); + + if(mrb_type(other) != MRB_TT_FIBER) { + return mrb_false_value(); + } + return mrb_bool_value(fiber_ptr(self) == fiber_ptr(other)); +} + + mrb_value mrb_fiber_yield(mrb_state *mrb, int len, mrb_value *a) { @@ -286,6 +302,7 @@ mrb_mruby_fiber_gem_init(mrb_state* mrb) mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE()); mrb_define_method(mrb, c, "resume", fiber_resume, MRB_ARGS_ANY()); mrb_define_method(mrb, c, "alive?", fiber_alive_p, MRB_ARGS_NONE()); + mrb_define_method(mrb, c, "==", fiber_eq, MRB_ARGS_REQ(1)); mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY()); mrb_define_class_method(mrb, c, "current", fiber_current, MRB_ARGS_NONE()); diff --git a/mrbgems/mruby-fiber/test/fiber.rb b/mrbgems/mruby-fiber/test/fiber.rb index 216ad5572..5e42e9c57 100644 --- a/mrbgems/mruby-fiber/test/fiber.rb +++ b/mrbgems/mruby-fiber/test/fiber.rb @@ -17,6 +17,19 @@ assert('Fiber#alive?') { r1 == true and r2 == false } +assert('Fiber#==') do + root = Fiber.current + assert_equal root, root + assert_equal root, Fiber.current + assert_false root != Fiber.current + f = Fiber.new { + assert_false root == Fiber.current + } + f.resume + assert_false f == root + assert_true f != root +end + assert('Fiber.yield') { f = Fiber.new{|x| Fiber.yield(x == 3)} f.resume(3) diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index fd4dc04ac..81d7acf5d 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -45,7 +45,7 @@ module Kernel while(true) yield end - rescue => StopIteration + rescue StopIteration nil end diff --git a/src/array.c b/src/array.c index 90a608b70..12dca3a95 100644 --- a/src/array.c +++ b/src/array.c @@ -79,9 +79,9 @@ mrb_ary_new(mrb_state *mrb) * */ static inline void -array_copy(mrb_value *dst, const mrb_value *src, size_t size) +array_copy(mrb_value *dst, const mrb_value *src, mrb_int size) { - size_t i; + mrb_int i; for (i = 0; i < size; i++) { dst[i] = src[i]; @@ -238,7 +238,9 @@ mrb_ary_s_create(mrb_state *mrb, mrb_value self) int len; mrb_get_args(mrb, "*", &vals, &len); - return mrb_ary_new_from_values(mrb, len, vals); + mrb_assert(len <= MRB_INT_MAX); /* A rare case. So choosed assert() not raise(). */ + + return mrb_ary_new_from_values(mrb, (mrb_int)len, vals); } static void @@ -697,6 +697,9 @@ root_scan_phase(mrb_state *mrb) mrb_gc_mark(mrb, (struct RBasic*)mrb->exc); mark_context(mrb, mrb->root_c); + if (mrb->root_c->fib) { + mrb_gc_mark(mrb, (struct RBasic*)mrb->root_c->fib); + } if (mrb->root_c != mrb->c) { mark_context(mrb, mrb->c); } diff --git a/src/numeric.c b/src/numeric.c index b0b80c523..6adfff344 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -962,8 +962,9 @@ fix_xor(mrb_state *mrb, mrb_value x) #define NUMERIC_SHIFT_WIDTH_MAX (MRB_INT_BIT-1) static mrb_value -lshift(mrb_state *mrb, mrb_int val, size_t width) +lshift(mrb_state *mrb, mrb_int val, mrb_int width) { + mrb_assert(width >= 0); if (width > NUMERIC_SHIFT_WIDTH_MAX) { mrb_raisef(mrb, E_RANGE_ERROR, "width(%S) > (%S:MRB_INT_BIT-1)", mrb_fixnum_value(width), @@ -974,8 +975,9 @@ lshift(mrb_state *mrb, mrb_int val, size_t width) } static mrb_value -rshift(mrb_int val, size_t width) +rshift(mrb_int val, mrb_int width) { + mrb_assert(width >= 0); if (width >= NUMERIC_SHIFT_WIDTH_MAX) { if (val < 0) { val = -1; |
