diff options
author | Mau Magnaguagno <maumagnaguagno@gmail.com> | 2022-12-21 02:28:48 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-20 21:28:48 -0800 |
commit | 1e989c49a823c7257040fdd1d712a06a5acd6a60 (patch) | |
tree | ce1d5c75e991dd9bca4f5f4b90f08ad95e4909ed | |
parent | 502ca37dde288d20fed6e6ea34f4ab3299de7777 (diff) | |
download | ruby-1e989c49a823c7257040fdd1d712a06a5acd6a60.tar.gz |
MJIT: Refactor Compiler#cast_offset (#6967)
Subtract max value from offset when sign bit is set, without string operations.
-rw-r--r-- | lib/mjit/compiler.rb | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/lib/mjit/compiler.rb b/lib/mjit/compiler.rb index 972137e383..fae51d6114 100644 --- a/lib/mjit/compiler.rb +++ b/lib/mjit/compiler.rb @@ -817,9 +817,8 @@ class RubyVM::MJIT::Compiler # Interpret unsigned long as signed long (VALUE -> OFFSET) def cast_offset(offset) - bits = "%0#{8 * Fiddle::SIZEOF_VOIDP}d" % offset.to_s(2) - if bits[0] == '1' # negative - offset = -bits.chars.map { |i| i == '0' ? '1' : '0' }.join.to_i(2) - 1 + if offset >= 1 << 8 * Fiddle::SIZEOF_VOIDP - 1 # negative + offset -= 1 << 8 * Fiddle::SIZEOF_VOIDP end offset end |