mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Avoid runtime evaluation for MRB_WITHOUT_FLOAT
This commit is contained in:
+1
-8
@@ -104,14 +104,7 @@ module Integral
|
||||
raise ArgumentError, "step can't be 0" if step == 0
|
||||
return to_enum(:step, num, step) unless block
|
||||
|
||||
i = self
|
||||
if Object.const_defined?(:Float) &&
|
||||
(kind_of?(Float) || num.kind_of?(Float) || step.kind_of?(Float))
|
||||
i = i.to_f
|
||||
num = num.to_f unless num == nil
|
||||
step = step.to_f
|
||||
end
|
||||
|
||||
i = __coerce_step_counter(num, step)
|
||||
if num == nil
|
||||
while true
|
||||
block.call(i)
|
||||
|
||||
@@ -154,6 +154,22 @@ num_div(mrb_state *mrb, mrb_value x)
|
||||
#endif
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
num_coerce_step_counter(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
mrb_value counter = self, num, step;
|
||||
|
||||
mrb_get_args(mrb, "oo", &num, &step);
|
||||
|
||||
#ifndef MRB_WITHOUT_FLOAT
|
||||
if (mrb_float_p(self) || mrb_float_p(num) || mrb_float_p(step)) {
|
||||
counter = mrb_funcall(mrb, counter, "to_f", 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return counter;
|
||||
}
|
||||
|
||||
#ifndef MRB_WITHOUT_FLOAT
|
||||
/********************************************************************
|
||||
*
|
||||
@@ -1542,6 +1558,7 @@ mrb_init_numeric(mrb_state *mrb)
|
||||
mrb_define_method(mrb, numeric, ">=", num_ge, MRB_ARGS_REQ(1));
|
||||
mrb_define_method(mrb, numeric, "finite?", num_finite_p, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, numeric, "infinite?",num_infinite_p, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, numeric, "__coerce_step_counter", num_coerce_step_counter, MRB_ARGS_REQ(2));
|
||||
|
||||
/* Integer Class */
|
||||
integer = mrb_define_class(mrb, "Integer", numeric); /* 15.2.8 */
|
||||
|
||||
Reference in New Issue
Block a user