private LinkerSymbol CreateCustomAttributesTable(MosaUnit unit) { var symbolName = Metadata.CustomAttributesTable + unit.FullName; var customAttributesTableSymbol = Linker.GetSymbol(symbolName); if (customAttributesTableSymbol.Size != 0) { return(customAttributesTableSymbol); } // Emit custom attributes table customAttributesTableSymbol = Linker.DefineSymbol(symbolName, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0); var writer = new EndianAwareBinaryWriter(customAttributesTableSymbol.Stream, Architecture.Endianness); // 1. Number of Custom Attributes writer.Write(unit.CustomAttributes.Count, TypeLayout.NativePointerSize); // 2. Pointers to Custom Attributes for (int i = 0; i < unit.CustomAttributes.Count; i++) { // Get custom attribute var ca = unit.CustomAttributes[i]; // Build definition var customAttributeTableSymbol = CreateCustomAttribute(unit, ca, i); // Link Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributesTableSymbol, writer.Position, customAttributeTableSymbol, 0); writer.WriteZeroBytes(TypeLayout.NativePointerSize); } return(customAttributesTableSymbol); }
protected bool Select(TreeNode node, MosaUnit selected) { if (node == null) { return(false); } if (node.Tag != null) { if (node.Tag == selected) { treeView.SelectedNode = node; node.EnsureVisible(); return(true); } } foreach (TreeNode children in node.Nodes) { if (Select(children, selected)) { return(true); } } return(false); }
private LinkerSymbol CreateCustomAttributesTable(MosaUnit unit) { // Emit custom attributes table var customAttributesTableSymbol = Linker.CreateSymbol(unit.FullName + Metadata.CustomAttributesTable, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0); var writer1 = new EndianAwareBinaryWriter(customAttributesTableSymbol.Stream, Architecture.Endianness); // 1. Number of Custom Attributes writer1.Write(unit.CustomAttributes.Count, TypeLayout.NativePointerSize); // 2. Pointers to Custom Attributes // Create the definitions along the way for (int i = 0; i < unit.CustomAttributes.Count; i++) { // Get custom attribute var ca = unit.CustomAttributes[i]; // Build definition var customAttributeTableSymbol = CreateCustomAttribute(unit, ca, i); // Link Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributesTableSymbol, (int)writer1.Position, 0, customAttributeTableSymbol, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); } // Return customAttributesTableSymbol for linker usage return(customAttributesTableSymbol); }
protected void Select(MosaUnit selected) { if (selected == null) { return; } foreach (TreeNode node in treeView.Nodes) { if (Select(node, selected)) { return; } } }
private LinkerSymbol CreateCustomAttribute(MosaUnit unit, MosaCustomAttribute ca, int position) { // Emit custom attribute list string name = unit.FullName + ">>" + position.ToString() + ":" + ca.Constructor.DeclaringType.Name; var customAttributeSymbol = Linker.DefineSymbol(Metadata.CustomAttribute + name, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0); var writer1 = new EndianAwareBinaryWriter(customAttributeSymbol.Stream, Architecture.Endianness); // 1. Pointer to Attribute Type Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, writer1.Position, Metadata.TypeDefinition + ca.Constructor.DeclaringType.FullName, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); // 2. Pointer to Constructor Method Definition Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, writer1.Position, Metadata.MethodDefinition + ca.Constructor.FullName, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); // 3. Number of Arguments (Both unnamed and named) writer1.Write((uint)(ca.Arguments.Length + ca.NamedArguments.Length), TypeLayout.NativePointerSize); // 4. Pointers to Custom Attribute Arguments (Both unnamed and named) for (int i = 0; i < ca.Arguments.Length; i++) { // Build definition var customAttributeArgumentSymbol = CreateCustomAttributeArgument(name, i, null, ca.Arguments[i], false); // Link Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, writer1.Position, customAttributeArgumentSymbol, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); } foreach (var namedArg in ca.NamedArguments) { // Build definition var customAttributeArgumentSymbol = CreateCustomAttributeArgument(name, 0, namedArg.Name, namedArg.Argument, namedArg.IsField); // Link Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, writer1.Position, customAttributeArgumentSymbol, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); } return(customAttributeSymbol); }
public void EnqueueForResolve(MosaUnit unit) { resolveQueue.Enqueue(unit); }
private void ResolveCustomAttributes(MosaUnit.MutatorBase unit, IHasCustomAttribute obj) { foreach (var attr in obj.CustomAttributes) { MosaType type = metadata.Loader.GetType(attr.AttributeType.ToTypeSig()); MethodDef ctor = ((IMethodDefOrRef)attr.Constructor).ResolveMethod(); MosaMethod mosaCtor = null; foreach (var method in type.Methods) { var desc = method.GetUnderlyingObject<UnitDesc<MethodDef, MethodSig>>(); if (desc.Token.Token == ctor.MDToken) { mosaCtor = method; break; } } if (mosaCtor == null) throw new AssemblyLoadException(); var values = new MosaCustomAttribute.Argument[attr.ConstructorArguments.Count]; for (int i = 0; i < values.Length; i++) values[i] = ToMosaCAArgument(attr.ConstructorArguments[i]); var namedArgs = new MosaCustomAttribute.NamedArgument[attr.NamedArguments.Count]; for (int i = 0; i < namedArgs.Length; i++) { var namedArg = attr.NamedArguments[i]; namedArgs[i] = new MosaCustomAttribute.NamedArgument(namedArg.Name, namedArg.IsField, ToMosaCAArgument(namedArg.Argument)); } unit.CustomAttributes.Add(new MosaCustomAttribute(mosaCtor, values, namedArgs)); } }
private LinkerSymbol CreateCustomAttributesTable(MosaUnit unit) { // Emit custom attributes table var customAttributesTableSymbol = Linker.CreateSymbol(unit.FullName + Metadata.CustomAttributesTable, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0); var writer1 = new EndianAwareBinaryWriter(customAttributesTableSymbol.Stream, Architecture.Endianness); // 1. Number of Custom Attributes writer1.Write(unit.CustomAttributes.Count, TypeLayout.NativePointerSize); // 2. Pointers to Custom Attributes // Create the definitions along the way for (int i = 0; i < unit.CustomAttributes.Count; i++) { // Get custom attribute var ca = unit.CustomAttributes[i]; // Build definition var customAttributeTableSymbol = CreateCustomAttribute(unit, ca, i); // Link Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributesTableSymbol, (int)writer1.Position, 0, customAttributeTableSymbol, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); } // Return customAttributesTableSymbol for linker usage return customAttributesTableSymbol; }
private LinkerSymbol CreateCustomAttribute(MosaUnit unit, MosaCustomAttribute ca, int position) { // Emit custom attribute list string name = unit.FullName + ">>" + position.ToString() + ":" + ca.Constructor.DeclaringType.Name; var customAttributeSymbol = Linker.CreateSymbol(name + Metadata.CustomAttribute, SectionKind.ROData, TypeLayout.NativePointerAlignment, 0); var writer1 = new EndianAwareBinaryWriter(customAttributeSymbol.Stream, Architecture.Endianness); // 1. Pointer to Attribute Type Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, (int)writer1.Position, 0, ca.Constructor.DeclaringType.FullName + Metadata.TypeDefinition, SectionKind.ROData, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); // 2. Pointer to Constructor Method Definition Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, (int)writer1.Position, 0, ca.Constructor.FullName + Metadata.MethodDefinition, SectionKind.ROData, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); // 3. Number of Arguments (Both unnamed and named) writer1.Write((uint)(ca.Arguments.Length + ca.NamedArguments.Length), TypeLayout.NativePointerSize); // 4. Pointers to Custom Attribute Arguments (Both unnamed and named) for (int i = 0; i < ca.Arguments.Length; i++) { // Build definition var customAttributeArgumentSymbol = CreateCustomAttributeArgument(name, i, null, ca.Arguments[i], false); // Link Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, (int)writer1.Position, 0, customAttributeArgumentSymbol, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); } foreach (var namedArg in ca.NamedArguments) { // Build definition var customAttributeArgumentSymbol = CreateCustomAttributeArgument(name, 0, namedArg.Name, namedArg.Argument, namedArg.IsField); // Link Linker.Link(LinkType.AbsoluteAddress, NativePatchType, customAttributeSymbol, (int)writer1.Position, 0, customAttributeArgumentSymbol, 0); writer1.WriteZeroBytes(TypeLayout.NativePointerSize); } // Return customAttributeSymbol for linker usage return customAttributeSymbol; }
protected HashSet <MosaUnit> GetIncluded(string value, out MosaUnit selected) { selected = null; value = value.Trim(); if (string.IsNullOrWhiteSpace(value)) { return(null); } if (value.Length < 1) { return(null); } var include = new HashSet <MosaUnit>(); MosaUnit typeSelected = null; MosaUnit methodSelected = null; foreach (var type in Compiler.TypeSystem.AllTypes) { bool typeIncluded = false; var typeMatch = type.FullName.Contains(value); if (typeMatch) { include.Add(type); include.AddIfNew(type.Module); if (typeSelected == null) { typeSelected = type; } } foreach (var method in type.Methods) { bool methodMatch = method.FullName.Contains(value); if (typeMatch || methodMatch) { include.Add(method); include.AddIfNew(type); include.AddIfNew(type.Module); if (methodMatch && methodSelected == null) { methodSelected = method; } } } foreach (var property in type.Properties) { if (typeIncluded || property.FullName.Contains(value)) { include.Add(property); include.AddIfNew(type); include.AddIfNew(type.Module); } } } selected = methodSelected ?? typeSelected; return(include); }
public void Resolve() { foreach (var unit in metadata.Loader.LoadedUnits) { if (unit is MosaType) { MosaType type = (MosaType)unit; using (var mosaType = metadata.Controller.MutateType(type)) { TypeDef typeDef = type.GetUnderlyingObject <UnitDesc <TypeDef, TypeSig> >().Definition; if (typeDef.BaseType != null) { mosaType.BaseType = metadata.Loader.GetType(typeDef.BaseType.ToTypeSig()); } if (typeDef.DeclaringType != null) { mosaType.DeclaringType = metadata.Loader.GetType(typeDef.DeclaringType.ToTypeSig()); } if (typeDef.IsEnum) { mosaType.ElementType = metadata.Loader.GetType(typeDef.GetEnumUnderlyingType()); } foreach (var iface in typeDef.Interfaces) { mosaType.Interfaces.Add(metadata.Loader.GetType(iface.Interface.ToTypeSig())); } if (typeDef.BaseType != null) { ResolveInterfacesInBaseTypes(mosaType, type.BaseType); } } ResolveType(type); } else if (unit is MosaField || unit is MosaMethod || unit is MosaModule || unit is MosaProperty) { resolveQueue.Enqueue(unit); } } while (resolveQueue.Count > 0) { MosaUnit unit = resolveQueue.Dequeue(); if (unit is MosaType) { ResolveType((MosaType)unit); } if (unit is MosaField) { ResolveField((MosaField)unit); } if (unit is MosaMethod) { ResolveMethod((MosaMethod)unit); } if (unit is MosaProperty) { ResolveProperty((MosaProperty)unit); } if (unit is MosaModule) { MosaModule module = (MosaModule)unit; using (var mosaModule = metadata.Controller.MutateModule(module)) ResolveCustomAttributes(mosaModule, module.GetUnderlyingObject <UnitDesc <ModuleDef, object> >().Definition); } } foreach (var module in metadata.Cache.Modules.Values) { ModuleDef moduleDef = module.GetUnderlyingObject <UnitDesc <ModuleDef, object> >().Definition; if (moduleDef.EntryPoint != null) { using (var mosaModule = metadata.Controller.MutateModule(module)) mosaModule.EntryPoint = metadata.Cache.GetMethodByToken(new ScopedToken(moduleDef, moduleDef.EntryPoint.MDToken)); } } while (arrayResolveQueue.Count > 0) { MosaType type = arrayResolveQueue.Dequeue(); type.FinishSZArray(); } }
private void ResolveCustomAttributes(MosaUnit.MutatorBase unit, IHasCustomAttribute obj) { // TODO: More detail parsing foreach (var attr in obj.CustomAttributes) { MosaType type = metadata.Loader.GetType(attr.AttributeType.ToTypeSig()); MethodDef ctor = ((IMethodDefOrRef)attr.Constructor).ResolveMethod(); MosaMethod mosaCtor = null; foreach (var method in type.Methods) { var desc = method.GetUnderlyingObject<UnitDesc<MethodDef, MethodSig>>(); if (desc.Token.Token == ctor.MDToken) { mosaCtor = method; break; } } if (mosaCtor == null) throw new AssemblyLoadException(); object[] values = new object[attr.ConstructorArguments.Count]; for (int i = 0; i < values.Length; i++) { if (attr.ConstructorArguments[i].Value is UTF8String) values[i] = ((UTF8String)attr.ConstructorArguments[i].Value).String; else values[i] = attr.ConstructorArguments[i].Value; } unit.CustomAttributes.Add(new MosaCustomAttribute(mosaCtor, values)); } }