зеркало из https://github.com/github/ruby.git
Родитель
106744107b
Коммит
472e7b8518
|
@ -2,14 +2,6 @@ module RubyVM::MJIT
|
|||
# Every class under this namespace is a pointer. Even if the type is
|
||||
# immediate, it shouldn't be dereferenced until `*` is called.
|
||||
module CPointer
|
||||
# Patched PACK_MAP to support unsigned operations
|
||||
PACK_MAP = Fiddle::PackInfo::PACK_MAP.dup
|
||||
PACK_MAP.keys.each do |type|
|
||||
if type.negative? || type == Fiddle::TYPE_VOIDP
|
||||
PACK_MAP[type] = PACK_MAP[type].upcase
|
||||
end
|
||||
end
|
||||
|
||||
# Note: We'd like to avoid alphabetic method names to avoid a conflict
|
||||
# with member methods. to_i and to_s are considered an exception.
|
||||
class Struct
|
||||
|
@ -188,7 +180,7 @@ module RubyVM::MJIT
|
|||
# @param fiddle_type [Integer] Fiddle::TYPE_*
|
||||
def self.define(fiddle_type)
|
||||
size = Fiddle::PackInfo::SIZE_MAP.fetch(fiddle_type)
|
||||
pack = PACK_MAP.fetch(fiddle_type)
|
||||
pack = Fiddle::PackInfo::PACK_MAP.fetch(fiddle_type)
|
||||
|
||||
Class.new(self) do
|
||||
define_method(:initialize) do |addr|
|
||||
|
@ -252,13 +244,13 @@ module RubyVM::MJIT
|
|||
# @param value [Integer, RubyVM::MJIT::CPointer::Struct] an address itself or an object that return an address with to_i
|
||||
def []=(index, value)
|
||||
Fiddle::Pointer.new(@addr + index * Fiddle::SIZEOF_VOIDP)[0, Fiddle::SIZEOF_VOIDP] =
|
||||
[value.to_i].pack(PACK_MAP[Fiddle::TYPE_VOIDP])
|
||||
[value.to_i].pack(Fiddle::PackInfo::PACK_MAP[Fiddle::TYPE_VOIDP])
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dest_addr
|
||||
Fiddle::Pointer.new(@addr)[0, Fiddle::SIZEOF_VOIDP].unpack1(PACK_MAP[Fiddle::TYPE_VOIDP])
|
||||
Fiddle::Pointer.new(@addr)[0, Fiddle::SIZEOF_VOIDP].unpack1(Fiddle::PackInfo::PACK_MAP[Fiddle::TYPE_VOIDP])
|
||||
end
|
||||
|
||||
def self.define(block)
|
||||
|
@ -272,7 +264,7 @@ module RubyVM::MJIT
|
|||
# @param value [Integer, RubyVM::MJIT::CPointer::Struct] an address itself, or an object that return an address with to_i
|
||||
define_singleton_method(:[]=) do |addr, value|
|
||||
value = value.to_i
|
||||
Fiddle::Pointer.new(addr)[0, Fiddle::SIZEOF_VOIDP] = [value].pack(PACK_MAP[Fiddle::TYPE_VOIDP])
|
||||
Fiddle::Pointer.new(addr)[0, Fiddle::SIZEOF_VOIDP] = [value].pack(Fiddle::PackInfo::PACK_MAP[Fiddle::TYPE_VOIDP])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче