Ruby's callcc
przechwytuje bieżącą kontynuację, którą można później wywołać w celu przywrócenia kontroli, ale nie danych. Chciałbym uchwycić obecną kontynuację wraz z obecnym obrazem pamięci.Punkt kontrolny i przywracanie sterty w Ruby
Wydaje mi się, że chwytanie sterty nie powinno być trudne; Mogę polegać na ObjectSpace::each_object
i ObjectSpace::dump_all
lub Marshal.dump
lub po prostu Object.clone
. Jednak nie widzę żadnego prostego sposobu na przywrócenie sterty. Idealnie, chciałbym przemieścić mapę object_id -> object
, przywracając stary obraz obiektu dla każdego object_id
(i ponownie dodając object_id
, jeśli odpowiedni obiekt został GC'd). Nic dziwnego, że nie ma api poziomów na poziomie Ruby, który pozwala mi to zrobić. Zastanawiam się, czy są jakieś haki niskopoziomowe do GC Rubiego, z których mogę korzystać.
Każda pomoc jest doceniana, w tym sugestie dotyczące alternatywnych podejść.