void OnCompileFinished(ExpressionCompilerJob job)
        {
            if (!Enabled || job.UserData != (IntPtr)m_MostRecentUndoEntryId)
            {
                return;
            }

            if (job.Error == null)
            {
                SetPrevFinishedJob(job);
                m_CompileResultHandling = ECompileResultHandling.Success;
            }
            else
            {
                switch (m_CompileResultHandling)
                {
                case ECompileResultHandling.Success:
                    m_DelayedCompileErrorJob = job;
                    m_CompileResultHandling  = ECompileResultHandling.DelayedError;
                    UpdateDelayedCompileErrorDeadline();
                    break;

                case ECompileResultHandling.DelayedError:
                    m_DelayedCompileErrorJob = job;
                    break;

                case ECompileResultHandling.Error:
                    SetPrevFinishedJob(job);
                    break;
                }
            }
        }
 void ErrorRecompileTimer_Tick(object sender, EventArgs e)
 {
     if (!Enabled || m_CompileResultHandling != ECompileResultHandling.DelayedError)
     {
         return;
     }
     if (DateTime.Now < m_DelayedCompileErrorDeadline)
     {
         return;
     }
     SetPrevFinishedJob(m_DelayedCompileErrorJob);
     m_CompileResultHandling = ECompileResultHandling.Error;
 }
        void Enable()
        {
            if (Enabled)
            {
                return;
            }
            m_CompilerThread = new ExpressionCompilerThread();
            m_ErrorRecompileTimer.Start();
            m_ExecFuncForceReEvaluateTimer.Start();

            m_PrevFinishedJob       = null;
            m_CompileResultHandling = ECompileResultHandling.Success;
            StartCompilation(-1);
        }