Fix real time mutation problem and compile() problem
Closed this issue · 1 comments
Есть одна фундаментальная проблема с мутациями line
. Когда мы изменяем код в реальном времени, нам нужно его перекомпилировать (вызвать метод compile()
). Нужно это из за того, что нужно построить карту соответствий операторов ifzzz
, loop
, func
с end
. Но в этом случае теряется метаинформация о выполнении скрипта (текущий стек, значение регистров и т.д.). В Tierra
и Avida
это решается тем, что все операторы реально независимые и ветвление осуществляется с помощью поиска соседнего "шаблона". В нашем случае это оператор end
. Например, если у нас есть такой код: [1,ifp,2,end]
, то при выполнении оператора ifp
(if ax > 0), соответствующий ему end
будет искаться со смещения 2
до конца. Этот подход решает нашу проблему, но значительно затратный по производительности. Нужно подумать как еще это можно решить.
upd: Это решилось динамическим compile()
. Сейчас любое изменение в коде требует вызова этого метода. При этом не теряется метаинформация (стек вызовов, текущая выполняемая строка и т.д.)
Финальное решение - функция updateMetadata()