1 | #include <mruby.h>
|
---|
2 | #include <mruby/error.h>
|
---|
3 | #include <mruby/array.h>
|
---|
4 |
|
---|
5 | static mrb_value
|
---|
6 | protect_cb(mrb_state *mrb, mrb_value b)
|
---|
7 | {
|
---|
8 | return mrb_yield_argv(mrb, b, 0, NULL);
|
---|
9 | }
|
---|
10 |
|
---|
11 | static mrb_value
|
---|
12 | run_protect(mrb_state *mrb, mrb_value self)
|
---|
13 | {
|
---|
14 | mrb_value b;
|
---|
15 | mrb_value ret[2];
|
---|
16 | mrb_bool state;
|
---|
17 | mrb_get_args(mrb, "&", &b);
|
---|
18 | ret[0] = mrb_protect(mrb, protect_cb, b, &state);
|
---|
19 | ret[1] = mrb_bool_value(state);
|
---|
20 | return mrb_ary_new_from_values(mrb, 2, ret);
|
---|
21 | }
|
---|
22 |
|
---|
23 | static mrb_value
|
---|
24 | run_ensure(mrb_state *mrb, mrb_value self)
|
---|
25 | {
|
---|
26 | mrb_value b, e;
|
---|
27 | mrb_get_args(mrb, "oo", &b, &e);
|
---|
28 | return mrb_ensure(mrb, protect_cb, b, protect_cb, e);
|
---|
29 | }
|
---|
30 |
|
---|
31 | static mrb_value
|
---|
32 | run_rescue(mrb_state *mrb, mrb_value self)
|
---|
33 | {
|
---|
34 | mrb_value b, r;
|
---|
35 | mrb_get_args(mrb, "oo", &b, &r);
|
---|
36 | return mrb_rescue(mrb, protect_cb, b, protect_cb, r);
|
---|
37 | }
|
---|
38 |
|
---|
39 | static mrb_value
|
---|
40 | run_rescue_exceptions(mrb_state *mrb, mrb_value self)
|
---|
41 | {
|
---|
42 | mrb_value b, r;
|
---|
43 | struct RClass *cls[1];
|
---|
44 | mrb_get_args(mrb, "oo", &b, &r);
|
---|
45 | cls[0] = E_TYPE_ERROR;
|
---|
46 | return mrb_rescue_exceptions(mrb, protect_cb, b, protect_cb, r, 1, cls);
|
---|
47 | }
|
---|
48 |
|
---|
49 | void
|
---|
50 | mrb_mruby_error_gem_test(mrb_state *mrb)
|
---|
51 | {
|
---|
52 | struct RClass *cls;
|
---|
53 |
|
---|
54 | cls = mrb_define_class(mrb, "ExceptionTest", mrb->object_class);
|
---|
55 | mrb_define_module_function(mrb, cls, "mrb_protect", run_protect, MRB_ARGS_NONE() | MRB_ARGS_BLOCK());
|
---|
56 | mrb_define_module_function(mrb, cls, "mrb_ensure", run_ensure, MRB_ARGS_REQ(2));
|
---|
57 | mrb_define_module_function(mrb, cls, "mrb_rescue", run_rescue, MRB_ARGS_REQ(2));
|
---|
58 | mrb_define_module_function(mrb, cls, "mrb_rescue_exceptions", run_rescue_exceptions, MRB_ARGS_REQ(2));
|
---|
59 | }
|
---|