// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка;

простір мавка {
  дія отримати_інформацію_падіння(
    М: *Машина,
    вихід: *ІнформаціяПадіння
  ) -> логічне {
    якщо М.стан_падіння {
      змінна інформація_падіння: ІнформаціяПадіння;
      інформація_падіння.значення = М.значення_падіння;

      змінна шлях = М.місцезнаходження_падіння.шлях_або_код як *ПредметДаних;
      змінна рядок = М.місцезнаходження_падіння.рядок_або_позиція_вказівки;

      якщо шлях != пусто {
        якщо шлях.клас == М.клас_Код {
          змінна код = шлях як *ПредметКоду;
          шлях = код.шлях;
          рядок = природне(знайти_рядок_вказівки(код.місцезнаходження_вказівок, п32(рядок)));
        }
      }

      інформація_падіння.місцезнаходження = МісцезнаходженняІнформаціїПадіння {
        шлях = шлях,
        рядок = рядок,
      };

      змінна накопичувач_історії = зробити_накопичувач<ЕлементІсторіїЗдійсненняІнформаціїПадіння>(М, 0);

      змінна п: природне = 0;

      поки п < М.історія_здійснення.розмір {
        змінна елемент_історії = М.історія_здійснення.дані[п];
        змінна елемент_історії_виконання: ЕлементІсторіїЗдійсненняІнформаціїПадіння;

        якщо елемент_історії.предмет_дії != пусто {
          змінна шлях = елемент_історії.місцезнаходження.шлях_або_код як *ПредметДаних;
          змінна рядок = елемент_історії.місцезнаходження.рядок_або_позиція_вказівки;

          якщо шлях != пусто {
            якщо шлях.клас == М.клас_Код {
              змінна код = шлях як *ПредметКоду;
              шлях = код.шлях;
              рядок = природне(знайти_рядок_вказівки(код.місцезнаходження_вказівок, п32(рядок)));
            }
          }

          елемент_історії_виконання.місцезнаходження = МісцезнаходженняІнформаціїПадіння {
            шлях = шлях,
            рядок = рядок
          };

          елемент_історії_виконання.назва = елемент_історії.предмет_дії.назва;

          покласти_в_накопичувач<ЕлементІсторіїЗдійсненняІнформаціїПадіння>(М, накопичувач_історії::адреса, елемент_історії_виконання);
        }

        п += 1;
      }

      обернути_накопичувач<ЕлементІсторіїЗдійсненняІнформаціїПадіння>(М, накопичувач_історії::адреса);

      інформація_падіння.розмір_історії = накопичувач_історії.розмір;
      інформація_падіння.історія = накопичувач_історії.дані;

      вихід::вміст = інформація_падіння;

      вернути так;
    }

    вернути ні;
  }

  дія знищити_інформацію_падіння(
    М: *Машина,
    інформація_падіння: ІнформаціяПадіння
  ) {
    звільнити(М, інформація_падіння.історія);
  }
}