summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby.h15
-rw-r--r--lib/mruby/gem.rb1
-rw-r--r--mrbgems/mruby-enum-lazy/test/lazy.rb2
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c5
-rw-r--r--mrbgems/mruby-pack/src/pack.c2
-rw-r--r--mrbgems/mruby-test/init_mrbtest.c1
-rw-r--r--mrbgems/mruby-test/mrbgem.rake1
-rw-r--r--mrblib/enum.rb2
-rw-r--r--src/class.c8
9 files changed, 27 insertions, 10 deletions
diff --git a/include/mruby.h b/include/mruby.h
index f4d8e229a..b424c20ae 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -829,22 +829,22 @@ MRB_API struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *o
*
* Must be a C string composed of the following format specifiers:
*
- * | char | Ruby type | C types | Notes |
+ * | char | Ruby type | C types | Notes |
* |:----:|----------------|-------------------|----------------------------------------------------|
* | `o` | {Object} | {mrb_value} | Could be used to retrieve any type of argument |
* | `C` | {Class}/{Module} | {mrb_value} | |
* | `S` | {String} | {mrb_value} | when `!` follows, the value may be `nil` |
* | `A` | {Array} | {mrb_value} | when `!` follows, the value may be `nil` |
* | `H` | {Hash} | {mrb_value} | when `!` follows, the value may be `nil` |
- * | `s` | {String} | char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil` |
+ * | `s` | {String} | char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil` |
* | `z` | {String} | char * | `NULL` terminated string; `z!` gives `NULL` for `nil` |
* | `a` | {Array} | {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` |
* | `f` | {Float} | {mrb_float} | |
* | `i` | {Integer} | {mrb_int} | |
* | `b` | boolean | {mrb_bool} | |
* | `n` | {Symbol} | {mrb_sym} | |
- * | `&` | block | {mrb_value} | |
- * | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array. |
+ * | `&` | block | {mrb_value} | &! raises exception if no block given. |
+ * | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; *! avoid copy of the stack. |
* | | | optional | | After this spec following specs would be optional. |
* | `?` | optional given | {mrb_bool} | `TRUE` if preceding argument is given. Used to check optional argument is given. |
*
@@ -1226,6 +1226,13 @@ MRB_API mrb_value mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int argc,
MRB_API mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
/*
+ * Check if a Fiber is alive
+ *
+ * @mrbgem mruby-fiber
+ */
+MRB_API mrb_value mrb_fiber_alive_p(mrb_state *mrb, mrb_value fib);
+
+/*
* FiberError reference
*
* @mrbgem mruby-fiber
diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb
index 3caba92ff..a83ca639f 100644
--- a/lib/mruby/gem.rb
+++ b/lib/mruby/gem.rb
@@ -176,6 +176,7 @@ module MRuby
f.puts %Q[ mrb_load_irep(mrb, gem_mrblib_irep_#{funcname});]
f.puts %Q[ if (mrb->exc) {]
f.puts %Q[ mrb_print_error(mrb);]
+ f.puts %Q[ mrb_close(mrb);]
f.puts %Q[ exit(EXIT_FAILURE);]
f.puts %Q[ }]
end
diff --git a/mrbgems/mruby-enum-lazy/test/lazy.rb b/mrbgems/mruby-enum-lazy/test/lazy.rb
index 940d070e8..1a55d30cf 100644
--- a/mrbgems/mruby-enum-lazy/test/lazy.rb
+++ b/mrbgems/mruby-enum-lazy/test/lazy.rb
@@ -40,7 +40,7 @@ assert("Enumerator::Lazy laziness") do
assert_equal [10,20], a.b
end
-assert("Enumrator::Lazy#to_enum") do
+assert("Enumerator::Lazy#to_enum") do
lazy_enum = (0..Float::INFINITY).lazy.to_enum(:each_slice, 2)
assert_kind_of Enumerator::Lazy, lazy_enum
assert_equal [0*1, 2*3, 4*5, 6*7], lazy_enum.map { |a| a.first * a.last }.first(4)
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index be9033063..275970291 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -274,12 +274,13 @@ mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int len, const mrb_value *a)
* Returns true if the fiber can still be resumed. After finishing
* execution of the fiber block this method will always return false.
*/
-static mrb_value
-fiber_alive_p(mrb_state *mrb, mrb_value self)
+MRB_API mrb_value
+mrb_fiber_alive_p(mrb_state *mrb, mrb_value self)
{
struct mrb_context *c = fiber_check(mrb, self);
return mrb_bool_value(c->status != MRB_FIBER_TERMINATED);
}
+#define fiber_alive_p mrb_fiber_alive_p
static mrb_value
fiber_eq(mrb_state *mrb, mrb_value self)
diff --git a/mrbgems/mruby-pack/src/pack.c b/mrbgems/mruby-pack/src/pack.c
index a3ea77517..d96ef1002 100644
--- a/mrbgems/mruby-pack/src/pack.c
+++ b/mrbgems/mruby-pack/src/pack.c
@@ -729,7 +729,7 @@ pack_m(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, u
count -= count % 3;
}
- dstlen = srclen / 3 * 4;
+ dstlen = (srclen+2) / 3 * 4;
if (count > 0) {
dstlen += (srclen / count) + ((srclen % count) == 0 ? 0 : 1);
}
diff --git a/mrbgems/mruby-test/init_mrbtest.c b/mrbgems/mruby-test/init_mrbtest.c
index 17ac1bdef..7678a5200 100644
--- a/mrbgems/mruby-test/init_mrbtest.c
+++ b/mrbgems/mruby-test/init_mrbtest.c
@@ -31,6 +31,7 @@ mrb_init_mrbtest(mrb_state *mrb)
if (mrb->exc) {
mrb_print_error(mrb);
+ mrb_close(mrb);
exit(EXIT_FAILURE);
}
mrb_close(core_test);
diff --git a/mrbgems/mruby-test/mrbgem.rake b/mrbgems/mruby-test/mrbgem.rake
index 49714078b..7da0b5e50 100644
--- a/mrbgems/mruby-test/mrbgem.rake
+++ b/mrbgems/mruby-test/mrbgem.rake
@@ -101,6 +101,7 @@ MRuby::Gem::Specification.new('mruby-test') do |spec|
end
f.puts %Q[ if (mrb2->exc) {]
f.puts %Q[ mrb_print_error(mrb2);]
+ f.puts %Q[ mrb_close(mrb2);]
f.puts %Q[ exit(EXIT_FAILURE);]
f.puts %Q[ }]
f.puts %Q[ mrb_const_set(mrb2, mrb_obj_value(mrb2->object_class), mrb_intern_lit(mrb2, "GEMNAME"), mrb_str_new(mrb2, "#{g.name}", #{g.name.length}));]
diff --git a/mrblib/enum.rb b/mrblib/enum.rb
index 12bd1d37b..a38f89ded 100644
--- a/mrblib/enum.rb
+++ b/mrblib/enum.rb
@@ -325,7 +325,7 @@ module Enumerable
#
# ISO 15.3.2.2.19
def sort(&block)
- self.map{|*val| val.__svalue}.sort
+ self.map{|*val| val.__svalue}.sort(&block)
end
##
diff --git a/src/class.c b/src/class.c
index 3f24528ca..c761f46af 100644
--- a/src/class.c
+++ b/src/class.c
@@ -593,7 +593,7 @@ mrb_get_argv(mrb_state *mrb)
n: Symbol [mrb_sym]
d: Data [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified
I: Inline struct [void*]
- &: Block [mrb_value]
+ &: Block [mrb_value] &! raises exception if no block given
*: rest argument [mrb_value*,mrb_int] The rest of the arguments as an array; *! avoid copy of the stack
|: optional Following arguments are optional
?: optional given [mrb_bool] true if preceding argument (optional) is given
@@ -937,6 +937,12 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
else {
bp = mrb->c->stack + mrb->c->ci->argc + 1;
}
+ if (*format == '!') {
+ format ++;
+ if (mrb_nil_p(*bp)) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+ }
+ }
*p = *bp;
}
break;