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

Условия изменяют указатели открывающих скобок в поле зрения #343

Open
Santalov opened this issue Feb 17, 2021 · 0 comments
Assignees
Labels

Comments

@Santalov
Copy link
Contributor

При использовании пошагового отладчика возникает проблема, что некоторые точки остановки не срабатывают. Это вызвано неожиданным изменением указателей на открывающие скобки активации, которые сохраняются для запоминания точек остановки.

Под неожиданным изменением подразумевается, что выполнение текущего шага Рефал-машиной не должно изменять часть поля зрения, находящуюся за пределами первичного активного подвыражения. Но каким-то образом в процессе вычисления условий это происходит, и меняются указатели на скобки активации. Структура поля зрения сохраняется правильной, меняется только расположение в памяти.

Способ повторения следующий:

  1. Добавить печати указателей на открывающие скобки активации, модифицировав файлы отладчика:

Изменить функцию backtrace_option, печатающую стек скобок активации, в src/lib/debug/refalrts-debugger.cpp:1083:

if (skeleton) {
      fprintf(out, "<%s ...> %p\n", function->function_info->name.name, begin);
 } else {

Изменить функцию handle_function_call, обрабатывающую шаг исполнения, в src/lib/debug/refalrts-debugger.cpp:1384:

if (is_debug_stop(begin, callee)) {
    printf(
      "Step #%d; Function <%s ...> %p\n",
      m_vm->step_counter(), callee == 0 ? "" : callee->name.name,
      begin
    );
    if (debugger_loop(begin, end) == refalrts::cExit) {
      return cExit;
    }
}
  1. Пересобрать компилятор Рефала-5λ
  2. Скомпилировать следующую программу:
*$EXTERN True, False

$ENTRY Go {
    e.Any, <And <A> <B>> : True = <Prout 'Done'>;
}

And {
    e.B False e.E = False;
    e.Trues = True;
}

A {
    e.Any = True;
}

B {
    e.Any, <Or <C> <D>>: True = True;
}

Or {
    e.B True e.E = True;
    e.Falses = False;
}

C {
    e.Any = True;
}

D {
    e.Any = True;
}
  1. Создать в папке с исполняемым файлом конфигурационный файл @refal-5-lambda-diagnostics.ini, содержащий стоку enable-debugger = true.
  2. Запустить программу и выполнить команды пошагового отладчика:
break #6
run
backtrace
break ^2
run

В результате точка остановки ^2 будет пропущена.
Выполнив программу по шагам можно увидеть следующую картину:

stopped on step
Step #0; Function < ...> 009afae0
debug>break #6
debug>run
stopped on function breakpoint
Step #6; Function <C ...> 029bbd40
debug>bt
@0   ^0    <C ...> 029bbd40
@1         <D ...> 029bbd70
@2   ^1    <Or ...> 029bbcc0
@3   ^2    <B?1 ...> 029bbca0
@4   ^4    <And ...> 029bbc80
@5   ^5    <Go?1 ...> 029bbc60
debug>step
stopped on step
Step #7; Function <D ...> 029bbd70
debug>
stopped on step
Step #8; Function <Or ...> 029bbcc0
debug>
stopped on step
Step #9; Function <B ...> 029bbcd0
debug>

Как видно, указатель на открывающую скобку активации функции B?1 (тоже самое, что B позже) изменился.

@Mazdaywik Mazdaywik self-assigned this Feb 18, 2021
@Mazdaywik Mazdaywik added the bug label Feb 18, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants