private void LayoutInstanceFields(HtmlWriter writer, Type type) { var instanceFields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Array.Sort(instanceFields, (lhs, rhs) => ReflectionHelper.CompareFields(type, lhs, rhs)); int split = instanceFields.Length; for (int i = 0; i < instanceFields.Length; i++) { if (instanceFields[i].DeclaringType != type) { split = i; break; } } writer.Inline("h4", "Instance Fields"); if (split > 0) { LayoutFields(writer, ArrayView(instanceFields, 0, split)); } writer.Inline("h4", "Inherited Fields"); if (split < instanceFields.Length) { LayoutFields(writer, ArrayView(instanceFields, split)); } }
private void LayoutNestedTypes(HtmlWriter writer, Type type) { writer.Inline("h4", "Nested Types"); var nested = type.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic); MakeTable( writer, nested, t => WriteTypeDeclaration(writer, t) ); }
private void InspectAssembly(HtmlWriter writer, Assembly asm) { using (writer.Tag("small")) { writer.AHref("Domain", _completePrefix); } writer.Inline("h2", "Assembly: " + asm.Name); writer.Inline("h4", "Namespaces"); MakeTable( writer, asm.Namespaces, n => NamespaceLink(writer, n, n.RelativeName) ); var unnamed = asm.FindNamespace(""); if (unnamed != null) { writer.Inline("h4", "Types"); InspectNamespace(writer, unnamed); } }
private void InspectNamespace(HtmlWriter writer, Namespace ns) { using (writer.Tag("small")) { AssemblyLink(writer, ns.Assembly); } writer.Inline("h2", ns.FullName); MakeTable( writer, ns.Types, t => WriteShortTypeDeclaration(writer, t) ); }
void InspectDomain(HtmlWriter writer) { writer.Inline("h5", AppDomain.CurrentDomain.FriendlyName); var assemblies = m_Explorer.Assemblies.ToArray(); Array.Sort(assemblies, (lhs, rhs) => lhs.FullName.CompareTo(rhs.FullName)); if (assemblies.Length > 0) { using (writer.ContainerFluid()) using (writer.Tag("code")) { writer.Inline("h6", "// assemblies"); MakeCodeList( writer, assemblies, a => AssemblyLink(writer, a), a => writer.Write(" // " + a.FullName) ); } } }
private void InspectDomain(HtmlWriter writer) { writer.Inline("h2", "Domain: " + AppDomain.CurrentDomain.FriendlyName); var assemblies = _explorer.Assemblies.ToArray(); Array.Sort(assemblies, (lhs, rhs) => lhs.FullName.CompareTo(rhs.FullName)); MakeTable( writer, assemblies, a => AssemblyLink(writer, a), a => writer.Write(a.FullName) ); }
private void InspectAssembly(HtmlWriter writer, Assembly asm) { using (writer.Tag("small")) { DomainLink(writer); } writer.Inline("h5", asm.Name); using (writer.ContainerFluid()) { var namespaces = asm.Namespaces.Where(s => s.Name.Length > 0).ToList(); if (namespaces.Count > 0) { using (writer.ContainerFluid()) using (writer.Tag("code")) { writer.Inline("h6", "// namespaces"); MakeCodeList( writer, namespaces.OrderBy(n => n.Name), n => { writer.Write("namespace "); NamespaceLink(writer, n, n.RelativeName); }); } } var unnamed = asm.FindNamespace(""); if (unnamed != null) { using (writer.ContainerFluid()) using (writer.Tag("code")) { writer.Inline("h6", "// Root namespace"); WriteNamespaceMembers(writer, unnamed); } } } }
private void LayoutInstanceProperties(HtmlWriter writer, Type type) { var instanceProperties = type.GetProperties(k_AllInstanceBindings); if (instanceProperties.Length == 0) { return; } Array.Sort(instanceProperties, (lhs, rhs) => ReflectionHelper.CompareProperties(type, lhs, rhs)); int split = instanceProperties.Length; for (int i = 0; i < instanceProperties.Length; i++) { if (instanceProperties[i].DeclaringType != type) { split = i; break; } } if (split > 0) { using (writer.ContainerFluid()) { writer.Inline("h6", "// Instance properties"); LayoutProperties(writer, ArrayView(instanceProperties, 0, split)); } } if (split < instanceProperties.Length) { using (writer.ContainerFluid()) { writer.Inline("h6", "// Inherited properties"); LayoutProperties(writer, ArrayView(instanceProperties, split)); } } }
private void LayoutInstanceMethods(HtmlWriter writer, Type type) { var instanceMethods = type.GetMethods(k_AllInstanceBindings); if (instanceMethods.Length == 0) { return; } Array.Sort(instanceMethods, (lhs, rhs) => ReflectionHelper.CompareMethods(type, lhs, rhs)); int split = instanceMethods.Length; for (int i = 0; i < instanceMethods.Length; i++) { if (instanceMethods[i].DeclaringType != type) { split = i; break; } } if (split > 0) { using (writer.ContainerFluid()) { writer.Inline("h6", "// Instance methods"); LayoutMethods(writer, ArrayView(instanceMethods, 0, split).Where(m => !m.IsSpecialName)); } } if (split < instanceMethods.Length) { using (writer.ContainerFluid()) { writer.Inline("h6", "// Inherited methods"); LayoutMethods(writer, ArrayView(instanceMethods, split).Where(m => !m.IsSpecialName)); } } }
private void InspectClass(HtmlWriter writer, Type type) { var instanceCtors = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); Array.Sort(instanceCtors, (lhs, rhs) => ReflectionHelper.CompareConstructors(type, lhs, rhs)); writer.Inline("h4", "Constructors"); LayoutCtors(writer, instanceCtors); LayoutInstanceFields(writer, type); LayoutInstanceProperties(writer, type); LayoutInstanceMethods(writer, type); var staticCtor = type.GetConstructors(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Array.Sort(instanceCtors, (lhs, rhs) => ReflectionHelper.CompareConstructors(type, lhs, rhs)); writer.Inline("h4", "Static Constructor"); LayoutCtors(writer, staticCtor); writer.Inline("h4", "Static Fields"); var staticFields = type.GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Array.Sort(staticFields, (lhs, rhs) => ReflectionHelper.CompareFields(type, lhs, rhs)); LayoutStaticFields(writer, staticFields); writer.Inline("h4", "Static Properties"); var staticProperties = type.GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Array.Sort(staticProperties, (lhs, rhs) => ReflectionHelper.CompareProperties(type, lhs, rhs)); LayoutProperties(writer, staticProperties); writer.Inline("h4", "Static Functions"); var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); Array.Sort(staticMethods, (lhs, rhs) => ReflectionHelper.CompareMethods(type, lhs, rhs)); LayoutMethods(writer, staticMethods.Where(m => !m.IsSpecialName)); LayoutNestedTypes(writer, type); }
void WriteNamespaceMembers(HtmlWriter writer, Namespace ns) { using (writer.Tag("code")) { foreach (var group in ns.Types.Where(t => t.DeclaringType == null).GroupBy(t => TypeKinds.Classify(t)).OrderBy(group => group.Key)) { using (writer.ContainerFluid()) { writer.Inline("h6", "// " + group.Key.KindName()); MakeCodeList( writer, group.OrderBy(t => t.Name), t => WriteInlineAttributes(writer, t.GetCustomAttributes(false)), t => WriteShortTypeDeclaration(writer, t) ); } } } }
private void LayoutNestedTypes(HtmlWriter writer, Type type) { var nested = type.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic); if (nested.Length == 0) { return; } using (writer.ContainerFluid()) { writer.Inline("h6", "// Nested types"); MakeCodeList( writer, nested, t => WriteInlineAttributes(writer, t.GetCustomAttributes(false)), t => WriteTypeDeclaration(writer, t) ); } }
void ExecuteLookup(HtmlWriter writer, HttpListenerRequest request) { const string addresses = nameof(addresses); using (writer.Tag("form", "action", CommandUrl("lookup"), "method", "post")) using (writer.ContainerFluid()) using (writer.Tag("div", "class", "form-group")) { writer.Inline("h2", "Paste addresses to look up (hex)"); writer.Tag("textarea", "class", "form-control", "name", addresses, "rows", "10").Dispose(); writer.Break(); writer.InlineTag("input", "type", "submit", "value", "Submit"); } NameValueCollection postValues; using (StreamReader reader = new StreamReader(request.InputStream, request.ContentEncoding)) postValues = System.Web.HttpUtility.ParseQueryString(reader.ReadToEnd()); if (postValues[addresses] != null) { var modules = Process.GetCurrentProcess().Modules; string FindModule(long address) { for (int i = 0; i < modules.Count; i++) { var m = modules[i]; long baseAddress = m.BaseAddress.ToInt64(); if (baseAddress <= address && address < baseAddress + m.ModuleMemorySize) { return(modules[i].ModuleName); } } return("unknown module"); } using (writer.ContainerFluid()) { writer.Inline("h4", "Results"); var lines = postValues[addresses].Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); using (writer.Tag("textarea", "class", "form-control", "rows", "10")) { foreach (var line in lines) { writer.Write(line); writer.Write(", "); int start = line.IndexOf("0x"); if (start >= 0) { int end = line.IndexOf(',', start); if (end < 0) { end = line.Length; } var numberString = line.Substring(start + 2, end - start - 2); if (long.TryParse(numberString, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out long address)) { var jitInfo = Mono.GetJitInfo(new IntPtr(address)); if (jitInfo.Method == null) { writer.Write("unknown method"); } else if (jitInfo.Method is MethodInfo m) { WriteTypeName(writer, m.DeclaringType, true); writer.Write("."); WriteMethodDeclaration(writer, m, true); } else if (jitInfo.Method is ConstructorInfo c) { WriteCtorDeclaration(writer, c, true); } writer.Write(", "); writer.Write(FindModule(address)); } else { writer.Write("failed to parse " + numberString + ","); } } else { writer.Write("failed to parse,"); } writer.Write("\n"); } } } } }
private void InspectClass(HtmlWriter writer, Type type) { var instanceCtors = type.GetConstructors(k_AllInstanceBindings); Array.Sort(instanceCtors, (lhs, rhs) => ReflectionHelper.CompareConstructors(type, lhs, rhs)); if (instanceCtors.Length > 0) { using (writer.ContainerFluid()) { writer.Inline("h6", "// Constructors"); LayoutCtors(writer, instanceCtors); } } var staticCtor = type.GetConstructors(k_AllStaticBindings); if (staticCtor.Length > 0) { Array.Sort(staticCtor, (lhs, rhs) => ReflectionHelper.CompareConstructors(type, lhs, rhs)); using (writer.ContainerFluid()) { writer.Inline("h6", "// Static constructors"); LayoutCtors(writer, staticCtor); } } LayoutInstanceFields(writer, type); var staticFields = type.GetFields(k_AllStaticBindings); if (staticFields.Length > 0) { Array.Sort(staticFields, (lhs, rhs) => ReflectionHelper.CompareFields(type, lhs, rhs)); using (writer.ContainerFluid()) { writer.Inline("h6", "// Static fields"); LayoutStaticFields(writer, staticFields); } } LayoutInstanceProperties(writer, type); var staticProperties = type.GetProperties(k_AllStaticBindings); if (staticProperties.Length > 0) { Array.Sort(staticProperties, (lhs, rhs) => ReflectionHelper.CompareProperties(type, lhs, rhs)); using (writer.ContainerFluid()) { writer.Inline("h6", "Static properties"); LayoutProperties(writer, staticProperties); } } LayoutInstanceMethods(writer, type); var staticMethods = type.GetMethods(k_AllStaticBindings); if (staticMethods.Length > 0) { Array.Sort(staticMethods, (lhs, rhs) => ReflectionHelper.CompareMethods(type, lhs, rhs)); using (writer.ContainerFluid()) { writer.Inline("h6", "// Static functions"); LayoutMethods(writer, staticMethods.Where(m => !m.IsSpecialName)); } } LayoutNestedTypes(writer, type); }