Esempio n. 1
0
 public Thread(Node node, InstructionStream instructionStream, AutomataContextState contextState) : this()
 {
     CurrentNode        = node;
     InstructionPointer = InstructionStream.InitializeInstructionPointer();
     InstructionStream  = instructionStream.AddReference();
     ContextState       = contextState;
 }
                protected sealed override void DisposeContextState(AutomataContextState contextState)
                {
                    if (contextState == null)
                    {
                        return;
                    }

                    var parserContextState = (ParserAutomataContextState)contextState;

                    parserContextState.ParserContext.Dispose();
                    parserContextState.ParserContext = null;

                    _parserAutomataContextStatesPool.Push(parserContextState);
                }
                protected sealed override AutomataContextState CloneContextState(AutomataContextState contextState)
                {
                    if (contextState == null)
                    {
                        return(null);
                    }

                    var parserContextState = (ParserAutomataContextState)contextState;
                    var cloneContextState  = _parserAutomataContextStatesPool.Count > 0 ? _parserAutomataContextStatesPool.Pop() : new ParserAutomataContextState();
                    var parserContextClone = parserContextState.ParserContext.Clone();

                    parserContextClone.ParserAutomataContext = this;
                    cloneContextState.ParserContext          = parserContextClone;

                    return(cloneContextState);
                }
Esempio n. 4
0
                public Thread(ThreadParent parent, Node node, InstructionStream instructionStream, int instructionPointer, AutomataContextState contextState) : this()
                {
                    CurrentNode        = node;
                    InstructionPointer = instructionPointer;
                    ContextState       = contextState;
                    InstructionStream  = instructionStream.AddReference();

                    InstructionStream.LockPointer(InstructionPointer);

                    if (parent == null)
                    {
                        return;
                    }

                    Parent = parent;
                    Parent.AddReference();
                }
Esempio n. 5
0
                public void Dispose(Process process)
                {
                    if (Parent == null)
                    {
                        Stack?.ReleaseReference();
                        ExecutionQueue?.ReleaseReference();
                        PredicateResultQueue?.ReleaseReference();
                    }
                    else
                    {
                        if (ReferenceEquals(Stack, Parent.Stack) == false)
                        {
                            Stack?.ReleaseReference();
                        }

                        if (ReferenceEquals(ExecutionQueue, Parent.ExecutionQueue) == false)
                        {
                            ExecutionQueue?.ReleaseReference();
                        }

                        if (ReferenceEquals(PredicateResultQueue, Parent.PredicateResultQueue) == false)
                        {
                            PredicateResultQueue?.ReleaseReference();
                        }

                        Parent.ReleaseReference();
                    }

                    InstructionStream.UnlockPointer(InstructionPointer);

                    StartExecutionQueue?.ReleaseReference();
                    InstructionStream.ReleaseReference();

                    process.Context.DisposeContextStateInternal(ContextState);

                    DfaTrails     = null;
                    DfaTrailIndex = -1;

                    Stack               = null;
                    Parent              = null;
                    ContextState        = null;
                    ExecutionQueue      = null;
                    InstructionStream   = null;
                    StartExecutionQueue = null;
                }