2016-02-04 5 views
3

Я собирался через блог и нашел следующий фрагмент кода:Рубин Как можно разморозить строку, используя указатель

require 'fiddle' 
str = 'water'.freeze 
str.frozen? # true 

memory_address = str.object_id * 2 
Fiddle::Pointer.new(memory_address)[1] &= ~8 
str.frozen? # false 

Может кто-нибудь объяснить, что я не мог понять, как следующая строка фактически разморозить строку.

Fiddle::Pointer.new(memory_address)[1] &= ~8 

ответ

4

МРТ куча магазины RValue Struct по этому адресу, первое поле, что это флаг, который имеет битовую FL_FREEZE, указывающей, является ли объект замороженным - 11 биты в целом числе, в x86 байтах идут в обратном порядке, так что это могут быть доступны как третий бит второго байта.

Код устанавливает бит до нуля, таким образом, «размораживание» объекта

 Смежные вопросы

  • Нет связанных вопросов^_^