Пример #1
0
            internal TypeEntry(ClassType classType)
            {
                classType.Compile();

                this.DynamicType    = classType.CompiledType;
                this.FactoryMethods = classType.GetFactoryMethods();
            }
Пример #2
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private void CompileClosureClass()
        {
            m_ClosureClass = new NestedClassType(
                containingClass: m_OwnerClass,
                classFullName: m_HostMethod.Name + "<Closure>",
                baseType: typeof(object),
                closureDefinition: this);

            m_ClosureClassConstructor = m_ClosureClass.TypeBuilder.DefineDefaultConstructor(
                MethodAttributes.Public |
                MethodAttributes.ReuseSlot |
                MethodAttributes.SpecialName |
                MethodAttributes.RTSpecialName |
                MethodAttributes.HideBySig);

            var closureWriter = new ImplementationClassWriter <object>(m_ClosureClass);

            if (m_Parent != null)
            {
                m_ParentField = closureWriter.DefineField(
                    name: "Parent",
                    isStatic: false,
                    isPublic: true,
                    fieldType: m_Parent.ClosureClass.TypeBuilder);
            }

            foreach (var capture in m_Captures.Where(c => c.HoistingClosure == this))
            {
                capture.DefineHoistedField(closureWriter);
            }

            foreach (var anonymousMethodOperand in m_AnonymousMethodsToHoist)
            {
                anonymousMethodOperand.CreateAnonymousMethod(m_ClosureClass, closure: this, isStatic: false, isPublic: true);
                anonymousMethodOperand.AnonymousMethod.AcceptVisitor(new ClosureHoistedMethodRewritingVisitor(anonymousMethodOperand.AnonymousMethod, this));
            }

            m_ClosureClass.Compile();
        }