summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMau Magnaguagno <maumagnaguagno@gmail.com>2022-12-21 02:28:48 -0300
committerGitHub <noreply@github.com>2022-12-20 21:28:48 -0800
commit1e989c49a823c7257040fdd1d712a06a5acd6a60 (patch)
treece1d5c75e991dd9bca4f5f4b90f08ad95e4909ed
parent502ca37dde288d20fed6e6ea34f4ab3299de7777 (diff)
downloadruby-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.rb5
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