mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
macro mrb_bool() may evaluate arg multiple times; ref #3228
This commit is contained in:
+3
-2
@@ -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);
|
||||
|
||||
+4
-4
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user