internal void AddTask(Node downNode, PointerToNode ptrUpNode) { ObjectHashtable objHash; MemoSpecState memo = this.state.Memorize(this.varsHash, out objHash); this.AddTask(downNode, new Data(memo, objHash, ptrUpNode)); }
private void getUpNode(Node downNode, MemoSpecState memo, out Variable[] vars1, out Node upNode, out Variable[] vars2) { NodeAndVariables nodeVars = this.getUpNodes(downNode)[memo.MemoState] as NodeAndVariables; if (nodeVars == null) { vars1 = null; upNode = null; vars2 = null; } else { vars1 = memo.Variables; upNode = nodeVars.Node; vars2 = nodeVars.Variables; } }
protected override void DispatchNode(Node downNode, object o) { Data data = o as Data; MemoSpecState memo = data.MemoSpecState; PointerToNode ptrUpNode = data.PointerToNode; this.state.Recall(memo, data.ObjectHashtable); BTType btType = Annotation.GetNodeBTType(downNode); if (btType == BTType.Static) { Node nextDownNode = this.state.InterpretNode(downNode); this.AddTask(nextDownNode, ptrUpNode); } else { Variable[] vars1; Node upNode; Variable[] vars2; this.getUpNode(downNode, memo, out vars1, out upNode, out vars2); if (upNode != null) { SpecializingVisitor.createSubstitution(vars2, vars1, ptrUpNode, upNode); } else if (btType == BTType.eXclusive) { this.CallVisitorMethod(downNode, data); } else { upNode = ptrUpNode.Node = downNode.Clone(); for (int i = 0; i < downNode.NextArray.Count; i++) { this.AddTask(downNode.NextArray[i], new PointerToNode(upNode, i)); } } } if (ptrUpNode.Node != null) { this.setUpAndDownNode(downNode, memo, ptrUpNode.Node); } }
internal void Recall(MemoSpecState memo, ObjectHashtable objHash) { this.state.Recall(memo.MemoState, objHash); }
internal Data(MemoSpecState memo, ObjectHashtable objHash, PointerToNode ptrUpNode) { this.MemoSpecState = memo; this.ObjectHashtable = objHash; this.PointerToNode = ptrUpNode; }
private void setUpAndDownNode(Node downNode, MemoSpecState memo, Node upNode) { this.getUpNodes(downNode)[memo.MemoState] = new NodeAndVariables(upNode, memo.Variables); }