private static void SetupForProcessing(Activity activity, bool canBeExecuted, ref ChildActivity nextActivity, ref Stack <ChildActivity> activitiesRemaining)
 {
     if (!nextActivity.Equals(ChildActivity.Empty))
     {
         if (activitiesRemaining == null)
         {
             activitiesRemaining = new Stack <ChildActivity>();
         }
         activitiesRemaining.Push(nextActivity);
     }
     nextActivity = new ChildActivity(activity, canBeExecuted);
 }
        private static void ProcessActivityTreeCore(ChildActivity currentActivity, ActivityCallStack parentChain, ProcessActivityTreeOptions options, ProcessActivityCallback callback, ref IList <ValidationError> validationErrors)
        {
            ChildActivity         empty = ChildActivity.Empty;
            Stack <ChildActivity> activitiesRemaining = null;

            if (parentChain == null)
            {
                parentChain = new ActivityCallStack();
            }
            if (options.OnlyVisitSingleLevel)
            {
                ProcessActivity(currentActivity, ref empty, ref activitiesRemaining, parentChain, ref validationErrors, options, callback);
            }
            else
            {
                while (!currentActivity.Equals(ChildActivity.Empty))
                {
                    if (object.ReferenceEquals(currentActivity.Activity, popActivity))
                    {
                        parentChain.Pop().Activity.SetCached();
                    }
                    else
                    {
                        SetupForProcessing(popActivity, true, ref empty, ref activitiesRemaining);
                        ProcessActivity(currentActivity, ref empty, ref activitiesRemaining, parentChain, ref validationErrors, options, callback);
                        parentChain.Push(currentActivity);
                    }
                    currentActivity = empty;
                    if ((activitiesRemaining != null) && (activitiesRemaining.Count > 0))
                    {
                        empty = activitiesRemaining.Pop();
                    }
                    else
                    {
                        empty = ChildActivity.Empty;
                    }
                }
            }
        }