diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-10-24 01:30:31 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-10-24 01:30:31 +0900 |
| commit | c45ed46f28b2d73aa36eeb0539cb0f3bc173b528 (patch) | |
| tree | 34e08709db894240e9f8d7ecf80c5c0ad01779a9 /src | |
| parent | 7061658b5b4ea488580a1c0d522ab62b74243603 (diff) | |
| download | mruby-c45ed46f28b2d73aa36eeb0539cb0f3bc173b528.tar.gz mruby-c45ed46f28b2d73aa36eeb0539cb0f3bc173b528.zip | |
macro mrb_bool() may evaluate arg multiple times; ref #3228
Diffstat (limited to 'src')
| -rw-r--r-- | src/kernel.c | 5 | ||||
| -rw-r--r-- | src/range.c | 8 |
2 files changed, 7 insertions, 6 deletions
diff --git a/src/kernel.c b/src/kernel.c index 09b3d9337..df237cd46 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -960,10 +960,11 @@ obj_respond_to(mrb_state *mrb, mrb_value self) if (!respond_to_p) { rtm_id = mrb_intern_lit(mrb, "respond_to_missing?"); if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) { - mrb_value args[2]; + mrb_value args[2], v; args[0] = mid; args[1] = mrb_bool_value(priv); - return mrb_bool_value(mrb_bool(mrb_funcall_argv(mrb, self, rtm_id, 2, args))); + v = mrb_funcall_argv(mrb, self, rtm_id, 2, args); + return mrb_bool_value(mrb_bool(v)); } } return mrb_bool_value(respond_to_p); diff --git a/src/range.c b/src/range.c index bc8b11419..079a1035e 100644 --- a/src/range.c +++ b/src/range.c @@ -152,7 +152,7 @@ mrb_range_eq(mrb_state *mrb, mrb_value range) { struct RRange *rr; struct RRange *ro; - mrb_value obj; + mrb_value obj, v1, v2; mrb_get_args(mrb, "o", &obj); @@ -163,9 +163,9 @@ mrb_range_eq(mrb_state *mrb, mrb_value range) rr = mrb_range_ptr(range); ro = mrb_range_ptr(obj); - if (!mrb_bool(mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg)) || - !mrb_bool(mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end)) || - rr->excl != ro->excl) { + v1 = mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg); + v2 = mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end); + if (!mrb_bool(v1) || !mrb_bool(v2) || rr->excl != ro->excl) { return mrb_false_value(); } return mrb_true_value(); |
