summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-03-12 22:14:08 +0900
committerGitHub <[email protected]>2018-03-12 22:14:08 +0900
commit59dabb38abffc9ea438032df363a65c72f84db8c (patch)
treef3c85d7541a128406e9e417955a5314d10cc3b32
parent843053c97c57472439b3502d2f260cf9e7f6c015 (diff)
parenta5ac49de3038955732d9d06271a5df9175e86669 (diff)
downloadmruby-59dabb38abffc9ea438032df363a65c72f84db8c.tar.gz
mruby-59dabb38abffc9ea438032df363a65c72f84db8c.zip
Merge pull request #3963 from dearblue/forced-block-arguments
Give me block by mrb_get_args() (forced block arguments)
-rw-r--r--include/mruby.h2
-rw-r--r--src/class.c8
2 files changed, 8 insertions, 2 deletions
diff --git a/include/mruby.h b/include/mruby.h
index ab6b5b3d6..3e13050b6 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -843,7 +843,7 @@ MRB_API struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *o
* | `i` | {Integer} | {mrb_int} | |
* | `b` | boolean | {mrb_bool} | |
* | `n` | {Symbol} | {mrb_sym} | |
- * | `&` | block | {mrb_value} | |
+ * | `&` | block | {mrb_value} | when &! gives raised exception if no block given. |
* | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array. |
* | &vert; | 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. |
diff --git a/src/class.c b/src/class.c
index 3f24528ca..b01bbc4e8 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] when &! gives raised 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;