refal-5-lambda icon indicating copy to clipboard operation
refal-5-lambda copied to clipboard

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

Open Santalov opened this issue 4 years ago • 0 comments
trafficstars

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

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

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

  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 позже) изменился.

Santalov avatar Feb 17 '21 22:02 Santalov