Ruby Как мы можем разморозить строку, используя указатель

Я просматривал блог и нашел следующий фрагмент кода:

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

1 ответ

Решение

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

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

Другие вопросы по тегам