diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-05-17 05:59:36 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-05-17 05:59:36 +0000 |
commit | 8953b97d725218e9e5aed831b5c117623c19909a (patch) | |
tree | 5edcd32f8bc6d75be2069bfaaa4641d98347d917 | |
parent | ce34a90fb52ed3bd381c849794dce211d4b4ff69 (diff) | |
download | ruby-8953b97d725218e9e5aed831b5c117623c19909a.tar.gz |
numeric.c: compare_with_zero
* numeric.c (compare_with_zero): raise TypeError when not
comparable with 0.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50520 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | numeric.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -162,6 +162,17 @@ rb_num_to_uint(VALUE val, unsigned int *ret) #define method_basic_p(klass) rb_method_basic_definition_p(klass, mid) +static VALUE +compare_with_zero(VALUE num, ID mid) +{ + VALUE zero = INT2FIX(0); + VALUE r = rb_check_funcall(num, mid, 1, &zero); + if (r == Qundef) { + rb_cmperr(mid, zero); + } + return r; +} + static inline int positive_int_p(VALUE num) { @@ -175,7 +186,7 @@ positive_int_p(VALUE num) if (method_basic_p(rb_cBignum)) return BIGNUM_POSITIVE_P(num); } - return RTEST(rb_funcall(num, mid, 1, INT2FIX(0))); + return RTEST(compare_with_zero(num, mid)); } static inline int @@ -191,7 +202,7 @@ negative_int_p(VALUE num) if (method_basic_p(rb_cBignum)) return BIGNUM_NEGATIVE_P(num); } - return RTEST(rb_funcall(num, mid, 1, INT2FIX(0))); + return RTEST(compare_with_zero(num, mid)); } int |