private void DisassembleAndWrite(ClrMethod method, Remote.MethodJitResult result, ArchitectureMode architecture, Translator translator, Reference <ulong> methodAddressRef, TextWriter writer) { writer.WriteLine(method.GetFullSignature()); switch (result.Status) { case Remote.MethodJitStatus.FailedOpenGenericWithNoAttribute: writer.WriteLine(" ; Open generics cannot be JIT-compiled."); writer.WriteLine(" ; However you can use attribute SharpLab.Runtime.JitGeneric to specify argument types."); writer.WriteLine(" ; Example: [JitGeneric(typeof(int)), JitGeneric(typeof(string))] void M<T>() { ... }."); return; } var info = FindNonEmptyHotColdInfo(method); if (info == null) { if (result.IsGeneric) { writer.WriteLine(" ; Failed to find HotColdInfo for generic method (reference types?)."); writer.WriteLine(" ; If you know a solution, please comment at https://github.com/ashmind/SharpLab/issues/99."); return; } writer.WriteLine(" ; Failed to find HotColdInfo — please report at https://github.com/ashmind/SharpLab/issues."); return; } var methodAddress = info.HotStart; methodAddressRef.Value = methodAddress; using (var disasm = new Disassembler(new IntPtr(unchecked ((long)methodAddress)), (int)info.HotSize, architecture, methodAddress)) { foreach (var instruction in disasm.Disassemble()) { writer.Write(" L"); writer.Write((instruction.Offset - methodAddress).ToString("x4")); writer.Write(": "); writer.WriteLine(translator.Translate(instruction)); } } }
private (ClrMethod method, HotColdRegions regions) ResolveJitResult(ClrRuntime runtime, Remote.MethodJitResult result) { ClrMethod methodByPointer = null; if (result.Pointer != null) { methodByPointer = runtime.GetMethodByAddress((ulong)result.Pointer.Value.ToInt64()); if (methodByPointer != null) { if (!result.IsSuccess) { return(methodByPointer, null); } var regionsByPointer = FindNonEmptyHotColdInfo(methodByPointer); if (regionsByPointer != null) { return(methodByPointer, regionsByPointer); } } } var methodByHandle = runtime.GetMethodByHandle((ulong)result.Handle.ToInt64()); if (methodByHandle == null) { return(methodByPointer, null); } if (!result.IsSuccess) { return(methodByHandle, null); } var regionsByHandle = FindNonEmptyHotColdInfo(methodByHandle); if (regionsByHandle == null && methodByPointer != null) { return(methodByPointer, null); } return(methodByHandle, regionsByHandle); }