Beispiel #1
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public ClosureDefinition(StatementBlock scopeBlock)
        {
            m_HostScopeBlock          = scopeBlock;
            m_HostMethod              = scopeBlock.OwnerMethod;
            m_AnonymousMethodsToHoist = new HashSet <IAnonymousMethodOperand>();
            m_OwnerClass              = scopeBlock.OwnerMethod.OwnerClass;
            m_Captures          = new HashSet <OperandCapture>();
            m_Parent            = null;
            m_Children          = new List <ClosureDefinition>();
            m_RewrittenOperands = new Dictionary <OperandCapture, IOperand>();
            m_ClosureClass      = null;
        }
Beispiel #2
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public void AttachToParent(ClosureDefinition parent)
        {
            ValidateMutability();

            if (m_Parent != null)
            {
                throw new InvalidOperationException("Current closure already has a parent closure attached.");
            }

            m_Parent = parent;

            if (parent != null)
            {
                parent.m_Children.Add(this);
            }
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private void LinkParentChildClosures()
        {
            foreach (var closure in m_Closures.Values)
            {
                var parentClosure = TryFindParentClosure(closure);

                if (parentClosure != null)
                {
                    closure.AttachToParent(parentClosure);
                }
                else
                {
                    Debug.Assert(m_OutermostClosure == null, "Duplicate outermost closure identified.");
                    m_OutermostClosure = closure;
                }
            }
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private ClosureDefinition TryFindParentClosure(ClosureDefinition closure)
        {
            var scopeBlock = closure.HostScopeBlock.ParentBlock;

            while (scopeBlock != null)
            {
                ClosureDefinition parentClosure;

                if (m_Closures.TryGetValue(scopeBlock, out parentClosure))
                {
                    return(parentClosure);
                }

                scopeBlock = scopeBlock.ParentBlock;
            }

            return(null);
        }
Beispiel #5
0
        //-------------------------------------------------------------------------------------------------------------------------------------------------

        public void HoistInClosure(ClosureDefinition closure)
        {
            this.HoistingClosure = closure;
        }
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private void FindInnermostClosure()
        {
            Debug.Assert(m_OutermostClosure != null, "Closures are required, but no closures were defined.");
            m_InnermostClosure = m_Closures.Values.Single(closure => closure.ChildCount == 0);
        }
Beispiel #7
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public ClosureHoistedMethodRewritingVisitor(MethodMember hoistedMethod, ClosureDefinition hoistingClosure)
        {
            m_HoistedMethod   = hoistedMethod;
            m_HoistingClosure = hoistingClosure;
        }