Beispiel #1
0
        /// <summary>
        /// Encodes a control-flow graph.
        /// </summary>
        /// <param name="graph">The control-flow graph to encode.</param>
        /// <returns>An LNode that represents the control-flow graph.</returns>
        public LNode Encode(FlowGraph graph)
        {
            var blockNameSet = new UniqueNameSet <UniqueTag>(
                tag => tag.Name, "block_");
            var valueNameSet = new UniqueNameSet <UniqueTag>(
                tag => tag.Name, "val_", blockNameSet);

            // Reserve special names.
            valueNameSet.ReserveName(CodeSymbols.Result.Name);
            valueNameSet.ReserveName(tryFlowExceptionSymbol.Name);

            var blockNameMap = new UniqueNameMap <UniqueTag>(blockNameSet);
            var valueNameMap = new UniqueNameMap <UniqueTag>(valueNameSet);

            var blockNodes = new List <LNode>();

            foreach (var block in graph.BasicBlocks)
            {
                var paramNodes = block.Parameters
                                 .EagerSelect(param =>
                                              Factory.Call(
                                                  parameterSymbol,
                                                  Encode(param.Type),
                                                  EncodeUniqueTag(param.Tag, valueNameMap)));

                var instrNodes = block.NamedInstructions
                                 .Select(instr =>
                                         Factory.Call(
                                             CodeSymbols.Assign,
                                             EncodeUniqueTag(instr.Tag, valueNameMap),
                                             Encode(instr.Instruction, valueNameMap)))
                                 .ToArray();

                blockNodes.Add(
                    Factory.Call(
                        block.Tag == graph.EntryPointTag
                            ? entryPointBlockSymbol
                            : basicBlockSymbol,
                        EncodeUniqueTag(block.Tag, blockNameMap),
                        Factory.Call(CodeSymbols.AltList, paramNodes),
                        Factory.Call(CodeSymbols.Braces, instrNodes),
                        Encode(block.Flow, blockNameMap, valueNameMap)));
            }
            return(Factory.Braces(blockNodes));
        }
Beispiel #2
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        protected ClassType(DynamicModule module, TypeKey key, string classFullName, Type baseType, ClassType containingClass)
        {
            var resolvedBaseType = TypeTemplate.Resolve(baseType);

            m_Key     = key;
            m_Module  = module;
            m_Writers = new List <ClassWriterBase>();
            m_Members = new List <MemberBase>();
            m_MembersByDeclarations = new Dictionary <MemberInfo, MemberBase>();
            m_MembersByName         = new Dictionary <string, MemberBase>();
            m_FactoryMethods        = new List <MethodInfo>();
            m_MemberNames           = new UniqueNameSet();
            m_NotImplementedMembers = new HashSet <MemberInfo>();
            m_NotImplementedMembers.UnionWith(TypeMemberCache.Of(resolvedBaseType).ImplementableMembers);
            m_CompiledType     = null;
            m_DependencyFields = new List <FieldMember>();
            m_NestedClasses    = new List <NestedClassType>();

            //m_TypeBuilder = module.ModuleBuilder.DefineType(classFullName, DefaultTypeAtributes, resolvedBaseType);

            // ReSharper disable once DoNotCallOverridableMethodsInConstructor
            m_TypeBuilder = CreateTypeBuilder(module, classFullName, resolvedBaseType, containingClass);
        }