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; }
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)
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; }