Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Декомпозиция кода статических ящиков #47

Closed
Mazdaywik opened this issue Jul 29, 2016 · 2 comments
Closed
Assignees

Comments

@Mazdaywik
Copy link
Member

Код, генерируемый для статических ящиков, на уровне RASL’а представляет собой одну команду (#CmdSwap s.ScopeClass e.Name), но по факту генерируется в здоровый кусок кода, содержащий как несколько типовых элементов (начало и конец функции), так и команд, которые можно заменить имеющимися командами RASL’а (после преобразования можно будет выделить #CmdCallSave и команды сплайсов). Останется только добавить характерные примитивные команды для извлечения и сохранения данных в статическом ящике.

Задача в чём-то конкурирует, в чём-то дополняется с задачей #46.

@Mazdaywik Mazdaywik added this to the summer 2016 milestone Jul 29, 2016
@Mazdaywik Mazdaywik self-assigned this Jul 29, 2016
@Mazdaywik Mazdaywik added the task label Jul 29, 2016
Mazdaywik added a commit that referenced this issue Aug 12, 2016
)

Дескрипторы этих объектов являются структурами-наследниками структуры
refalrts::RefalFunction. Наследование без виртуальных функций, поскольку
предполагается, что работа будет выполняться всегда с правильным типом
дескриптора (функция refalrts::RefalSwap::run всегда будет вызываться
для RefalSwap и наоборот, дескриптор RefalSwap всегда будет содержать
в поле функции RefalSwap::run).

Поскольку код тела статического ящика вынесен в рантайм, задачу #47 можно
закрывать как невыполнимую.
@Mazdaywik
Copy link
Member Author

Задачу выполнить уже невозможно, поскольку теперь все статические ящики разделяют одну и ту же функцию.

Даже если бы задача #46 не выполнялась, всё равно она не имела бы пользы, поскольку вынести можно call_left и команды переносов, для остального пришлось бы генерить новые команды. Причём делать режим интерпретации для этих команд было бы нерентабельно: функция использует статические переменные, которые пришлось бы передавать в интерпретатор и для обычных функций (или указатели NULL). Овчинка выделки не стоит.

@Mazdaywik
Copy link
Member Author

В связи с переходом на интерпретацию, имеет смысл, чтобы избежать дублирования кода, удалить из функции refalrts::perform_swap повторяющийся код, заменив его командами в refalrts::RefalSwap::run[] (см. коммит 534ba5d).

@Mazdaywik Mazdaywik reopened this Sep 23, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant