public void PushContext(WamInstructionStream instructionStream) { if (instructionStream == null) { throw new ArgumentNullException("instructionStream"); } var context = new WamContext(); _contextStack.Push(context); CurrentContext = context; State = WamMachineStates.Run; InstructionPointer = new WamInstructionPointer(instructionStream); ReturnInstructionPointer = WamInstructionPointer.Undefined; StackIndex = 0; Environment = null; ChoicePoint = null; ArgumentRegisters.Clear(); TemporaryRegisters.Clear(); CurrentStructure = null; CurrentStructureIndex = -1; }
bool Backtrack() { if (State != WamMachineStates.Backtrack) { throw new InvalidOperationException("Backtrack not required."); } if (ChoicePoint == null) { return(false); } UnwindTrail(); Environment = ChoicePoint.Environment; StackIndex = ChoicePoint.StackIndex; ReturnInstructionPointer = ChoicePoint.ReturnInstructionPointer; ArgumentRegisters.Copy(ChoicePoint.ArgumentRegisters); CutChoicePoint = ChoicePoint.CutChoicePoint; InstructionPointer = ChoicePoint.BacktrackInstructionPointer; PredicateEnumerator = ChoicePoint.PredicateEnumerator; return(true); }