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 クラスの
オブジェクトを作る.
(…書きかけ…)