diff options
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-hash-ext/mrblib/hash.rb | 14 | ||||
| -rw-r--r-- | mrbgems/mruby-hash-ext/test/hash.rb | 12 | ||||
| -rw-r--r-- | mrblib/compar.rb | 32 | ||||
| -rw-r--r-- | src/class.c | 2 | ||||
| -rw-r--r-- | src/gc.c | 15 | ||||
| -rw-r--r-- | src/variable.c | 3 | ||||
| -rw-r--r-- | src/vm.c | 2 |
8 files changed, 46 insertions, 36 deletions
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index 710ccbab6..b439b7378 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -69,7 +69,7 @@ f_eval(mrb_state *mrb, mrb_value self) void mrb_mruby_eval_gem_init(mrb_state* mrb) { - mrb_define_class_method(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(3)); + mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(3)); } void diff --git a/mrbgems/mruby-hash-ext/mrblib/hash.rb b/mrbgems/mruby-hash-ext/mrblib/hash.rb index 723a0b907..bf3836514 100644 --- a/mrbgems/mruby-hash-ext/mrblib/hash.rb +++ b/mrbgems/mruby-hash-ext/mrblib/hash.rb @@ -13,4 +13,18 @@ class Hash alias each_pair each alias update merge! + + def fetch(key, none=NONE, &block) + unless self.key?(key) + if block + block.call + elsif none != NONE + none + else + raise RuntimeError, "Key not found: #{key}" + end + else + self[key] + end + end end diff --git a/mrbgems/mruby-hash-ext/test/hash.rb b/mrbgems/mruby-hash-ext/test/hash.rb index cdf00173a..661da3af3 100644 --- a/mrbgems/mruby-hash-ext/test/hash.rb +++ b/mrbgems/mruby-hash-ext/test/hash.rb @@ -27,3 +27,15 @@ assert('Hash#values_at') do h = Hash.new { |hash,k| hash[k] = k } assert_equal keys, h.values_at(*keys) end + +assert('Hash#fetch') do + h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" } + assert_equal "feline", h.fetch("cat") + assert_equal "mickey", h.fetch("mouse", "mickey") + assert_equal "minny", h.fetch("mouse"){"minny"} + begin + h.fetch("gnu") + rescue => e + assert_kind_of(StandardError, e); + end +end diff --git a/mrblib/compar.rb b/mrblib/compar.rb index 44595974a..84b962598 100644 --- a/mrblib/compar.rb +++ b/mrblib/compar.rb @@ -14,11 +14,8 @@ module Comparable cmp = self <=> other if cmp.nil? raise ArgumentError, "comparison of #{self.class} with #{other.class} failed" - elsif cmp < 0 - true - else - false end + cmp < 0 end ## @@ -31,11 +28,8 @@ module Comparable cmp = self <=> other if cmp.nil? raise ArgumentError, "comparison of #{self.class} with #{other.class} failed" - elsif cmp <= 0 - true - else - false end + cmp <= 0 end ## @@ -46,11 +40,7 @@ module Comparable # ISO 15.3.3.2.3 def == other cmp = self <=> other - if cmp == 0 - true - else - false - end + cmp == 0 end ## @@ -63,11 +53,8 @@ module Comparable cmp = self <=> other if cmp.nil? raise ArgumentError, "comparison of #{self.class} with #{other.class} failed" - elsif cmp > 0 - true - else - false end + cmp > 0 end ## @@ -80,11 +67,8 @@ module Comparable cmp = self <=> other if cmp.nil? raise ArgumentError, "comparison of #{self.class} with #{other.class} failed" - elsif cmp >= 0 - true - else - false end + cmp >= 0 end ## @@ -95,10 +79,6 @@ module Comparable # # ISO 15.3.3.2.6 def between?(min, max) - if self < min or self > max - false - else - true - end + self >= min and self <= max end end diff --git a/src/class.c b/src/class.c index bb6a97c65..a4f9f2873 100644 --- a/src/class.c +++ b/src/class.c @@ -1986,7 +1986,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.20 */ mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.21 */ mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.23 */ - mrb_define_method(mrb, mod, "constants", mrb_mod_constants, MRB_ARGS_NONE()); /* 15.2.2.4.24 */ + mrb_define_method(mrb, mod, "constants", mrb_mod_constants, MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */ mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */ mrb_define_method(mrb, mod, "const_missing", mrb_mod_const_missing, MRB_ARGS_REQ(1)); mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_REQ(1)); @@ -448,26 +448,27 @@ mark_context_stack(mrb_state *mrb, struct mrb_context *c) static void mark_context(mrb_state *mrb, struct mrb_context *c) { - size_t i; - size_t e; + int i, e = 0; mrb_callinfo *ci; /* mark stack */ mark_context_stack(mrb, c); - /* mark ensure stack */ - e = (c->ci) ? c->ci->eidx : 0; - for (i=0; i<e; i++) { - mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); - } /* mark VM stack */ if (c->cibase) { for (ci = c->cibase; ci <= c->ci; ci++) { + if (ci->eidx > e) { + e = ci->eidx; + } mrb_gc_mark(mrb, (struct RBasic*)ci->env); mrb_gc_mark(mrb, (struct RBasic*)ci->proc); mrb_gc_mark(mrb, (struct RBasic*)ci->target_class); } } + /* mark ensure stack */ + for (i=0; i<e; i++) { + mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); + } /* mark fibers */ if (c->prev && c->prev->fib) { mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib); diff --git a/src/variable.c b/src/variable.c index 90f0831da..231697d47 100644 --- a/src/variable.c +++ b/src/variable.c @@ -970,13 +970,16 @@ mrb_value mrb_mod_constants(mrb_state *mrb, mrb_value mod) { mrb_value ary; + mrb_bool inherit = TRUE; struct RClass *c = mrb_class_ptr(mod); + mrb_get_args(mrb, "|b", &inherit); ary = mrb_ary_new(mrb); while (c) { if (c->iv) { iv_foreach(mrb, c->iv, const_i, &ary); } + if (!inherit) break; c = c->super; if (c == mrb->object_class) break; } @@ -143,7 +143,7 @@ stack_extend_alloc(mrb_state *mrb, int room) /* Use linear stack growth. It is slightly slower than doubling the stack space, but it saves memory on small devices. */ - if (room <= size) + if (room <= MRB_STACK_GROWTH) size += MRB_STACK_GROWTH; else size += room; |
