public static INode Read(InspectableAssembly ia, MethodSignature signature, MethodBodyBlock rawBody) { /*Console.WriteLine("=== IL Bytes ==="); foreach (var b in ilBytes) Console.Write("{0:X2} ", b); Console.WriteLine();*/ var parser = new ILMethodParser(ia, signature, rawBody); return parser.Parse(); }
public MethodSignature Clone() { var ret = new MethodSignature() { ReturnType = ReturnType, Flags = Flags, ThisType = ThisType, NumGeneric = NumGeneric, NumNormal = NumNormal, ParameterTypes = new List<ElementType>() }; foreach (var type in ParameterTypes) ret.ParameterTypes.Add(type); return ret; }
public static MethodSignature ParseMethodSignature(InspectableAssembly ia, byte[] blob) { var ret = new MethodSignature(); int index = 0; ret.Flags = (EMethodFlags)blob[index++]; if (ret.Flags.HasFlag(EMethodFlags.Generic)) ret.NumGeneric = UncompressInt(blob, ref index); ret.NumNormal = UncompressInt(blob, ref index); ret.ReturnType = ReadType(ia, blob, ref index); if (ret.Flags.HasFlag(EMethodFlags.ExplicitThis)) { ret.ThisType = ReadType(ia, blob, ref index); ret.NumNormal--; } for(int i = 0; i < ret.NumNormal; i++) { ret.ParameterTypes.Add(ReadType(ia, blob, ref index)); } return ret; }
public void ParseMethods(MethodDefinitionHandleCollection methods, string name, MethodSignature signature) { foreach (var methodHandle in methods) { var method = Reader.GetMethodDefinition(methodHandle); var methodName = Reader.GetString(method.Name); if (name == string.Empty || name == methodName) { if (signature != null) { var sig = ILReader.ParseMethodSignature(this, Reader.GetBlobBytes(method.Signature)); #if DEBUG_SIG Console.WriteLine("=== Sig ==="); foreach (var b in sig) Console.Write("{0:X2} ", b); Console.WriteLine(); #endif if (sig != signature) continue; } var m = ParseMethodHeader(methodHandle, false); ParseMethodBody(m); } } }
public void ParseClass(TypeDefinitionHandle typeHandle, string methodName = "", MethodSignature signature = null) { var type = Reader.GetTypeDefinition(typeHandle); var typeName = Reader.GetString(type.Name); if (CilParser.IgnoreClassList.Contains(typeName)) return; var fqName = GetFullyQualifiedName(type); Class clazz; if (Context.Program.Classes.ContainsKey(fqName)) clazz = Context.Program.Classes[fqName]; else { clazz = new Class(fqName); Context.AddClass(this, typeHandle, clazz); } //Console.WriteLine("=== Class: " + fqName + " ==="); if (methodName != null) { ParseMethods(type.GetMethods(), methodName, signature); } }