Project

General

Profile

Actions

Bug #18078

closed

rb_fix2uint should avoid method lookup and use FIXNUM_NEGATIVE_P

Added by jhawthorn (John Hawthorn) over 2 years ago. Updated over 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.1.0dev
[ruby-core:104932]

Description

rb_fix2uint checks if the FIXNUM being converted overflows the unsigned int type. Previously this check was being done with rb_num_negative_int_p, which is equivalent to calling the < method on Integer (and checking whether it is overridden), where in this case we are interested in whether the "actual" value can fit inside an unsigned int. This also made rb_fix2uint potentially behave differently than rb_num2uint, which checked the "actual" sign.

This also was slow because rb_num_negative_int_p calls rb_method_basic_definition_p, doing a method lookup to check for < being overridden.

Included is a patch to replace the check in both rb_fix2uint and rb_fix2ushort with FIXNUM_NEGATIVE_P, which simply checks
whether the VALUE is signed. (also submitted as a PR https://github.com/ruby/ruby/pull/4747)

I filed this as a bug, but I don't think this will affect anyone (backport not necessary, nobody should be overriding Integer#< I don't think) other than as a performance improvement.


Files

Updated by jeremyevans0 (Jeremy Evans) over 2 years ago

  • Status changed from Open to Closed
Actions

Also available in: Atom PDF

Like0
Like0