aboutsummaryrefslogtreecommitdiffstats
path: root/complex.c
diff options
context:
space:
mode:
authormrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-16 04:25:35 +0000
committermrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-16 04:25:35 +0000
commit1860a8b2ac3642651558ec91943ee51823cb0ca6 (patch)
tree7f4bef580bb1699e43a180c484ceb823ebf33a6f /complex.c
parent99378689848418ca391ccdc631b8ffb572c52b15 (diff)
downloadruby-1860a8b2ac3642651558ec91943ee51823cb0ca6.tar.gz
complex.c: optimize Numeric#polar and Numeric#arg
* complex.c (numeric_polar): optimize for Integer, Float, and Rational. * complex.c (numeric_arg): directly create the value of pi. * complex.c (f_negative_p): optimize for Integer, Float, and Rational. * rational.c (INT_NEGATIVE_P): move the definition into internal.h. * internal.h (INT_NEGATIVE_P): ditto. * numeric.c (rb_float_abs): rename from flo_abs and export to be used from other source files.. * internal.h (rb_float_abs): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56809 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'complex.c')
-rw-r--r--complex.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/complex.c b/complex.c
index 5b5f17edfa..1a851dd3b5 100644
--- a/complex.c
+++ b/complex.c
@@ -182,8 +182,12 @@ fun2(quo)
inline static int
f_negative_p(VALUE x)
{
- if (FIXNUM_P(x))
- return FIXNUM_NEGATIVE_P(x);
+ if (RB_INTEGER_TYPE_P(x))
+ return INT_NEGATIVE_P(x);
+ else if (RB_FLOAT_TYPE_P(x))
+ return RFLOAT_VALUE(x) < 0.0;
+ else if (RB_TYPE_P(x, T_RATIONAL))
+ return INT_NEGATIVE_P(RRATIONAL(x)->num);
return rb_num_negative_p(x);
}
@@ -2045,8 +2049,8 @@ static VALUE
numeric_arg(VALUE self)
{
if (f_positive_p(self))
- return INT2FIX(0);
- return rb_const_get(rb_mMath, id_PI);
+ return INT2FIX(0);
+ return DBL2NUM(M_PI);
}
/*
@@ -2062,6 +2066,8 @@ numeric_rect(VALUE self)
return rb_assoc_new(self, INT2FIX(0));
}
+static VALUE float_arg(VALUE self);
+
/*
* call-seq:
* num.polar -> array
@@ -2071,7 +2077,25 @@ numeric_rect(VALUE self)
static VALUE
numeric_polar(VALUE self)
{
- return rb_assoc_new(f_abs(self), f_arg(self));
+ VALUE abs, arg;
+
+ if (RB_INTEGER_TYPE_P(self)) {
+ abs = rb_int_abs(self);
+ arg = numeric_arg(self);
+ }
+ else if (RB_FLOAT_TYPE_P(self)) {
+ abs = rb_float_abs(self);
+ arg = float_arg(self);
+ }
+ else if (RB_TYPE_P(self, T_RATIONAL)) {
+ abs = rb_rational_abs(self);
+ arg = numeric_arg(self);
+ }
+ else {
+ abs = f_abs(self);
+ arg = f_arg(self);
+ }
+ return rb_assoc_new(abs, arg);
}
/*