tmptrash/irma

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()