mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
math.c: deoptimize
* math.c (Get_Double): restrict direct casting only when Fixnum#to_f is not redefined, and convert with rb_to_float(). [Feature #10785] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49434 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d77ae2c2f4
commit
a1f8fbd18d
1 changed files with 17 additions and 2 deletions
19
math.c
19
math.c
|
@ -21,10 +21,18 @@
|
|||
|
||||
#define RB_BIGNUM_TYPE_P(x) RB_TYPE_P((x), T_BIGNUM)
|
||||
|
||||
static ID id_to_f;
|
||||
|
||||
VALUE rb_mMath;
|
||||
VALUE rb_eMathDomainError;
|
||||
|
||||
#define Get_Double(x) FIXNUM_P(x) ? (double)FIX2LONG(x) : NUM2DBL(x)
|
||||
#define fix_to_f_optimizable() rb_method_basic_definition_p(rb_cFixnum, id_to_f)
|
||||
#define Get_Float(x) \
|
||||
((RB_TYPE_P((x), T_FLOAT) ? (void)0 : ((x) = rb_to_float(x))), RFLOAT_VALUE(x))
|
||||
#define Get_Double(x) \
|
||||
(FIXNUM_P(x) && fix_to_f_optimizable() ? \
|
||||
(double)FIX2LONG(x) : \
|
||||
Get_Float(x))
|
||||
|
||||
#define domain_error(msg) \
|
||||
rb_raise(rb_eMathDomainError, "Numerical argument is out of domain - " #msg)
|
||||
|
@ -929,7 +937,7 @@ exp1(sqrt)
|
|||
|
||||
|
||||
void
|
||||
Init_Math(void)
|
||||
InitVM_Math(void)
|
||||
{
|
||||
rb_mMath = rb_define_module("Math");
|
||||
rb_eMathDomainError = rb_define_class_under(rb_mMath, "DomainError", rb_eStandardError);
|
||||
|
@ -983,3 +991,10 @@ Init_Math(void)
|
|||
rb_define_module_function(rb_mMath, "gamma", math_gamma, 1);
|
||||
rb_define_module_function(rb_mMath, "lgamma", math_lgamma, 1);
|
||||
}
|
||||
|
||||
void
|
||||
Init_Math(void)
|
||||
{
|
||||
id_to_f = rb_intern_const("to_f");
|
||||
InitVM(Math);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue