public unsafe Type EmitType(BCSYM_NamedRoot* pSymbol)
 {
     BCITER_CHILD bciter_child;
     TypeBuilder builder = this.DefineType(BCSYM.PNamedRoot((BCSYM modopt(IsConst)* modopt(IsConst) modopt(IsConst)) pSymbol));
     this.m_types.Add(builder.Name, builder);
     ushort* numPtr2 = BCSYM_NamedRoot.GetCompiler(pSymbol)[12][900];
     BCITER_CHILD.Init(&bciter_child, pSymbol, false, false, false);
     for (BCSYM_NamedRoot* rootPtr = BCITER_CHILD.GetNext(&bciter_child); rootPtr != null; rootPtr = BCITER_CHILD.GetNext(&bciter_child))
     {
         if (((byte) ((*(((byte*) rootPtr)) * 3)[&?s_rgBilkindInfo@BCSYM@@1QBUBilkindInfo@@B] & 0x40)) != 0)
         {
             ushort* numPtr = *((ushort**) (rootPtr + 12));
             if ((numPtr == numPtr2) || (((numPtr != null) && (numPtr2 != null)) && (((byte) (*(((int*) (numPtr - 6))) == *(((int*) (numPtr2 - 6))))) != 0)))
             {
                 this.DefineConstructor(builder, (BCSYM_Proc*) rootPtr).SetImplementationFlags(MethodImplAttributes.CodeTypeMask);
             }
             else
             {
                 this.DefineMethod(builder, (BCSYM_Proc*) rootPtr).SetImplementationFlags(MethodImplAttributes.CodeTypeMask);
             }
         }
     }
     Type type = builder.CreateType();
     this.m_types[builder.Name] = type;
     return type;
 }
Exemplo n.º 2
0
        public unsafe Type EmitType(BCSYM_NamedRoot *pSymbol)
        {
            BCITER_CHILD bciter_child;
            TypeBuilder  builder = this.DefineType(BCSYM.PNamedRoot((BCSYM modopt(IsConst) * modopt(IsConst) modopt(IsConst))pSymbol));

            this.m_types.Add(builder.Name, builder);
            ushort *numPtr2 = BCSYM_NamedRoot.GetCompiler(pSymbol)[12][900];

            BCITER_CHILD.Init(&bciter_child, pSymbol, false, false, false);
            for (BCSYM_NamedRoot *rootPtr = BCITER_CHILD.GetNext(&bciter_child); rootPtr != null; rootPtr = BCITER_CHILD.GetNext(&bciter_child))
            {
                if (((byte)((*(((byte *)rootPtr)) * 3)[&?s_rgBilkindInfo@BCSYM@@1QBUBilkindInfo@@B] & 0x40)) != 0)
Exemplo n.º 3
0
        public unsafe void FindMethods(BCSYM_NamedRoot *pAnonymousType, TypeBuilder typeBuilder, ref ConstructorBuilder ctorBuilder, ref MethodBuilder toStringBuilder, ref MethodBuilder equalsObjBuilder, ref MethodBuilder equalsTypeBuilder, ref MethodBuilder getHashBuilder)
        {
            BCITER_CHILD bciter_child;
            Compiler *   compilerPtr = BCSYM_NamedRoot.GetCompiler(pAnonymousType);
            ushort *     numPtr4     = Compiler.AddString(compilerPtr, & ?? _C@_1BC@GFPIDKBJ@?$AAT?$AAo?$AAS?$AAt?$AAr?$AAi?$AAn?$AAg?$AA?$AA@);
            ushort *     numPtr3     = Compiler.AddString(compilerPtr, & ?? _C@_1O@FOCMPMJF@?$AAE?$AAq?$AAu?$AAa?$AAl?$AAs?$AA?$AA@);
            ushort *     numPtr2     = Compiler.AddString(compilerPtr, & ?? _C@_1BI@KCPDAEGD@?$AAG?$AAe?$AAt?$AAH?$AAa?$AAs?$AAh?$AAC?$AAo?$AAd?$AAe?$AA?$AA@);
            ushort *     numPtr      = *((ushort **)(*(((int *)(compilerPtr + 12))) + 900));

            BCITER_CHILD.Init(&bciter_child, pAnonymousType, false, false, false);
            for (BCSYM_NamedRoot *rootPtr = BCITER_CHILD.GetNext(&bciter_child); rootPtr != null; rootPtr = BCITER_CHILD.GetNext(&bciter_child))
            {
                if (BCSYM.IsProc((BCSYM * modopt(IsConst) modopt(IsConst))rootPtr))
                {
                    int num = *((int *)(rootPtr + 12));
                    if (StringPool.IsEqual((ushort modopt(IsConst) *)num, (ushort modopt(IsConst) *)numPtr4))
                    {
                        toStringBuilder = this.DefineMethod(typeBuilder, (BCSYM_Proc *)rootPtr);
                    }
 public override unsafe bool TryGetType(BCSYM_NamedRoot* pSymbol, ref Type type)
 {
     string key = new string(*((char**) (pSymbol + 12)));
     return this.m_types.TryGetValue(key, out type);
 }
 protected virtual unsafe TypeBuilder DefineType(BCSYM_NamedRoot* pSymbol)
 {
     TypeBuilder builder;
     string name = new string(*((char**) (pSymbol + 12)));
     TypeAttributes typeAttributes = GetTypeAttributes(pSymbol);
     if (BCSYM.IsClass((BCSYM modopt(IsConst)* modopt(IsConst) modopt(IsConst)) pSymbol) && (BCSYM_Class.GetBaseClass(BCSYM.PClass((BCSYM modopt(IsConst)* modopt(IsConst) modopt(IsConst)) pSymbol)) != null))
     {
         Type parent = this.m_symbolMap.GetType(BCSYM_Class.GetBaseClass(BCSYM.PClass((BCSYM modopt(IsConst)* modopt(IsConst) modopt(IsConst)) pSymbol)));
         builder = this.m_moduleBuilder.DefineType(name, typeAttributes, parent);
     }
     else
     {
         builder = this.m_moduleBuilder.DefineType(name, typeAttributes);
     }
     if (BCSYM.IsGeneric((BCSYM* modopt(IsConst) modopt(IsConst)) pSymbol))
     {
         int num = BCSYM.GetGenericParamCount((BCSYM* modopt(IsConst) modopt(IsConst)) pSymbol);
         string[] names = new string[num];
         BCSYM_GenericParam* paramPtr2 = BCSYM.GetFirstGenericParam((BCSYM* modopt(IsConst) modopt(IsConst)) pSymbol);
         int index = 0;
         if (0 < num)
         {
             do
             {
                 ushort* numPtr = *((ushort**) (paramPtr2 + 12));
                 names[index] = new string((char*) numPtr);
                 paramPtr2 = *((BCSYM_GenericParam**) (paramPtr2 + 80));
                 index++;
             }
             while (index < num);
         }
         GenericTypeParameterBuilder[] builderArray = builder.DefineGenericParameters(names);
         BCSYM_GenericParam* pParam = BCSYM.GetFirstGenericParam((BCSYM* modopt(IsConst) modopt(IsConst)) pSymbol);
         int num2 = 0;
         if (0 < num)
         {
             do
             {
                 this.DefineGenericTypeParameter(builder, builderArray[num2], pParam);
                 pParam = *((BCSYM_GenericParam**) (pParam + 80));
                 num2++;
             }
             while (num2 < num);
         }
     }
     return builder;
 }
 public unsafe PropertyAndField FindPropertyAndField(BCSYM_NamedRoot* pAnonymousType, BCSYM_GenericParam* pParam, TypeBuilder typeBuilder, bool* modopt(IsImplicitlyDereferenced) hasKey)
 public unsafe void FindMethods(BCSYM_NamedRoot* pAnonymousType, TypeBuilder typeBuilder, ref ConstructorBuilder ctorBuilder, ref MethodBuilder toStringBuilder, ref MethodBuilder equalsObjBuilder, ref MethodBuilder equalsTypeBuilder, ref MethodBuilder getHashBuilder)
 {
     BCITER_CHILD bciter_child;
     Compiler* compilerPtr = BCSYM_NamedRoot.GetCompiler(pAnonymousType);
     ushort* numPtr4 = Compiler.AddString(compilerPtr, &??_C@_1BC@GFPIDKBJ@?$AAT?$AAo?$AAS?$AAt?$AAr?$AAi?$AAn?$AAg?$AA?$AA@);
     ushort* numPtr3 = Compiler.AddString(compilerPtr, &??_C@_1O@FOCMPMJF@?$AAE?$AAq?$AAu?$AAa?$AAl?$AAs?$AA?$AA@);
     ushort* numPtr2 = Compiler.AddString(compilerPtr, &??_C@_1BI@KCPDAEGD@?$AAG?$AAe?$AAt?$AAH?$AAa?$AAs?$AAh?$AAC?$AAo?$AAd?$AAe?$AA?$AA@);
     ushort* numPtr = *((ushort**) (*(((int*) (compilerPtr + 12))) + 900));
     BCITER_CHILD.Init(&bciter_child, pAnonymousType, false, false, false);
     for (BCSYM_NamedRoot* rootPtr = BCITER_CHILD.GetNext(&bciter_child); rootPtr != null; rootPtr = BCITER_CHILD.GetNext(&bciter_child))
     {
         if (BCSYM.IsProc((BCSYM* modopt(IsConst) modopt(IsConst)) rootPtr))
         {
             int num = *((int*) (rootPtr + 12));
             if (StringPool.IsEqual((ushort modopt(IsConst)*) num, (ushort modopt(IsConst)*) numPtr4))
             {
                 toStringBuilder = this.DefineMethod(typeBuilder, (BCSYM_Proc*) rootPtr);
             }
             else if (StringPool.IsEqual((ushort modopt(IsConst)*) num, (ushort modopt(IsConst)*) numPtr))
             {
                 ctorBuilder = this.DefineConstructor(typeBuilder, (BCSYM_Proc*) rootPtr);
             }
             else if (StringPool.IsEqual((ushort modopt(IsConst)*) num, (ushort modopt(IsConst)*) numPtr2))
             {
                 getHashBuilder = this.DefineMethod(typeBuilder, (BCSYM_Proc*) rootPtr);
             }
             else if (StringPool.IsEqual((ushort modopt(IsConst)*) num, (ushort modopt(IsConst)*) numPtr3))
             {
                 if (StringPool.IsEqual(BCSYM_NamedRoot.GetEmittedName(BCSYM.PNamedRoot(BCSYM_Param.GetType(BCSYM_Proc.GetFirstParam((BCSYM_Proc modopt(IsConst)* modopt(IsConst) modopt(IsConst)) rootPtr)))), BCSYM_NamedRoot.GetEmittedName((BCSYM_NamedRoot modopt(IsConst)* modopt(IsConst) modopt(IsConst)) pAnonymousType)))
                 {
                     equalsTypeBuilder = this.DefineMethod(typeBuilder, (BCSYM_Proc*) rootPtr);
                 }
                 else
                 {
                     equalsObjBuilder = this.DefineMethod(typeBuilder, (BCSYM_Proc*) rootPtr);
                 }
             }
         }
     }
 }
 public unsafe Type EmitType(BCSYM_NamedRoot* pSymbol)
 {
     TypeBuilder builder = this.DefineType(BCSYM.PNamedRoot((BCSYM modopt(IsConst)* modopt(IsConst) modopt(IsConst)) pSymbol));
     this.m_types.Add(builder.Name, builder);
     bool hasKey = false;
     int num2 = BCSYM.GetGenericParamCount((BCSYM* modopt(IsConst) modopt(IsConst)) pSymbol);
     PropertyAndField[] properties = new PropertyAndField[num2];
     BCSYM_GenericParam* pParam = BCSYM.GetFirstGenericParam((BCSYM* modopt(IsConst) modopt(IsConst)) pSymbol);
     int index = 0;
     if (0 < num2)
     {
         do
         {
             PropertyAndField prop = this.FindPropertyAndField(pSymbol, pParam, builder, &hasKey);
             properties[index] = prop;
             this.EmitProperty(prop);
             pParam = *((BCSYM_GenericParam**) (pParam + 80));
             index++;
         }
         while (index < num2);
     }
     ConstructorBuilder ctorBuilder = null;
     MethodBuilder toStringBuilder = null;
     MethodBuilder equalsObjBuilder = null;
     MethodBuilder equalsTypeBuilder = null;
     MethodBuilder getHashBuilder = null;
     this.FindMethods(pSymbol, builder, ref ctorBuilder, ref toStringBuilder, ref equalsObjBuilder, ref equalsTypeBuilder, ref getHashBuilder);
     this.EmitCtor(properties, ctorBuilder);
     this.EmitToString(properties, toStringBuilder);
     if (hasKey)
     {
         Type interfaceType = typeof(IEquatable<>).MakeGenericType(new Type[] { builder });
         builder.AddInterfaceImplementation(interfaceType);
         this.EmitEqualsTyped(properties, equalsTypeBuilder);
         this.EmitEqualsObj(builder, equalsObjBuilder, equalsTypeBuilder);
         this.EmitGetHashCode(properties, getHashBuilder);
     }
     Type type = builder.CreateType();
     this.m_types[builder.Name] = type;
     return type;
 }