Reprodução determinística

THotPDF.DeterministicReplayLog regista as decisões externas que podem fazer uma operação comportar-se de forma diferente entre execuções e depois substitui-as pelos resultados gravados durante o replay

Captured decisions

Record and replay

var
  ReplayJSON: AnsiString;
begin
  PDF.DeterministicReplayLog.BeginRecording;
  PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
  ReplayJSON := PDF.DeterministicReplayLog.ExportJSON;

  PDF.DeterministicReplayLog.ImportJSON(ReplayJSON);
  PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
  if not PDF.DeterministicReplayLog.CompleteReplay then
    raise Exception.Create(PDF.DeterministicReplayLog.LastDiagnostic);
end;

Ordering and validation

Cada evento traz um número de sequência monótono, o tipo de evento, o nome, dois argumentos com sinal de 64 bits e um resultado tipado

O replay consome os eventos por ordem e valida a respetiva assinatura completa antes de devolver o resultado gravado; o modo strict lança EHPDFDeterministicReplayMismatch em caso de esgotamento ou divergência, enquanto o modo não strict guarda uma contagem de incoerências e um diagnóstico e usa o resultado observado

CompleteReplay succeeds only after every retained event has been consumed without mismatches or dropped recording events

Bounds and performance

EventLimit defaults to 100,000 events, DroppedEventCount reports overflow, and event storage grows geometrically so append cost remains amortised constant time

O schema JSON é hotpdf-deterministic-replay-v1; os argumentos de 64 bits e os resultados inteiros são codificados como strings decimais, para preservar os valores exatos entre implementações de JSON

APIs relacionadas