//----------------------------------------------------------------------------------------------------------------------------------------------------- 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; }
//----------------------------------------------------------------------------------------------------------------------------------------------------- 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); }
//------------------------------------------------------------------------------------------------------------------------------------------------- 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); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- public ClosureHoistedMethodRewritingVisitor(MethodMember hoistedMethod, ClosureDefinition hoistingClosure) { m_HoistedMethod = hoistedMethod; m_HoistingClosure = hoistingClosure; }