JPF の state の save と restore について

HeuristicSearch.java を見てみる.
キューには HeuristicState というものが入っている.
キューから hs をとりだして,
HeuristicSearch.restoreState(hs)を呼ぶと復元される.

この実体は,vm.restoreState(hs.getVMState()).(そのあと
depthを設定したりする)
getVMState() は,RestorableVMState 型で,この値は
保存しようとする時に vm.getRestorableState() を呼ぶことで,
RestorableState のコンストラクタを引数vmで呼んで作られる.

RestorableState クラスの注釈には,これを作るのは非常に
重い操作である,と書いてある.
RestorableState のコンストラクタでは,
Path path と
Backtracker.RestorableState bkstate
が,おのおの vm.getClonedPath() と
vm.getBacktracker().getRestorableState() で設定される.

前者はその時点の path の deep copy で,CGやtransaitionたちの
cloneが作られる.

後者は,

      savedKstack = kstack;
      savedSstack = sstack;
      kcur = restorer.getRestorableData();
      scur = ss.getRestoreData();

を実行.

savedKstack, SavedSstack,
kcur, scur
左辺にあるものたちは,DefaultBackTracker.RestorableStateImpl の
フィールド:

    final ImmutableList<KState> savedKstack;
    final ImmutableList<Object> savedSstack;
    final KState kcur;
    final Object scur;

右辺にあるものたちは,DefaultBackTracker クラスで

  protected ImmutableList<KState> kstack;
  protected ImmutableList<Object> sstack;
  protected StateRestorer<KState> restorer;
  protected SystemState ss;

と定義されている.sstack は SystemState 関連であろう.

restorer.getRestorableData() は,いろいろ複雑にたどらされて
(何かのデザインパターンだろうか?) 結局,

      threadsMemento = ks.threads.getMemento();
      cloadersMemento = ks.classLoaders.getMemento();
      heapMemento = ks.heap.getMemento();

を実行する.型は名前からわかるように以下の通り.

    Memento<ThreadList> threadsMemento;
    Memento<ClassLoaderList> cloadersMemento;
    Memento<Heap> heapMemento;

ss.getRestoreData は,SystemState.RestorableMemento クラスの
オブジェクトを作る.

(…書きかけ…)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*