Skip to content

Instantly share code, notes, and snippets.

View xoofx's full-sized avatar
🏠
Working from home

Alexandre Mutel xoofx

🏠
Working from home
View GitHub Profile
@xoofx
xoofx / CecilTool.cs
Last active June 6, 2019 13:56
List usage of non public Method/Field/Type members from a specified assembly to any external assembly references
using System;
using System.Collections.Generic;
using System.IO;
using CecilTool;
using Mono.Cecil;
namespace CecilTool
{
/// <summary>
/// Simple tool using Mono.Cecil to dump the list of usage of internals methods/fields
@xoofx
xoofx / BenchDelegatesApp.cs
Created February 19, 2019 19:56
Benchmarks of calli vs delegate
// | Method | Mean | Error | StdDev |
// |------------- |----------:|----------:|----------:|
// | Calli | 0.6718 ns | 0.0013 ns | 0.0012 ns |
// | Delegate | 1.1366 ns | 0.0099 ns | 0.0088 ns |
// | FastDelegate | 1.6239 ns | 0.0103 ns | 0.0097 ns |
// MyClassLib.cs is compiled in another project (havent tested if compiling with Fody is working with BenchmarkDotnet in the same project)
// This file is referencing BenchDelegates.MyClassLib
using System;
@xoofx
xoofx / BenchInterfaceVsIndirectCalls.cs
Created November 30, 2018 14:29
Interface vs direct calls
// Gist that shows the difference of an interface call
// Two cases in this benchmark:
// - Dictionary that should not inline
// - List that should inline
// We are also using the enumerator to show the impact on allocation as well.
/*
Method | Mean | Error | StdDev | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
------------------- |----------:|----------:|----------:|------------:|------------:|------------:|--------------------:|
ProcessDictionary | 27.109 ns | 0.1258 ns | 0.1176 ns | - | - | - | - |
@xoofx
xoofx / GetGenericTypeInstances.cs
Last active June 29, 2021 10:05
Gets the list of the generic type instances used in an assembly
public static class AssemblyHelper
{
/// <summary>
/// Gets the list of concrete generic type instances used in an assembly.
/// See remarks
/// </summary>
/// <param name="assembly">The assembly</param>
/// <returns>The list of generic type instances</returns>
/// <remarks>
/// Note that this method is fetching only direct type instances (through type, method argument or fields)
@xoofx
xoofx / BenchVirtualVsDelegate.cs
Created February 22, 2018 08:46
Bench Virtual Call vs Delegate Call
// BenchmarkDotNet=v0.10.12, OS=Windows 10 Redstone 3 [1709, Fall Creators Update] (10.0.16299.248)
// Intel Core i7-4980HQ CPU 2.80GHz (Haswell), 1 CPU, 8 logical cores and 4 physical cores
// Frequency=2728070 Hz, Resolution=366.5595 ns, Timer=TSC
// [Host] : .NET Framework 4.6.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.2633.0
// DefaultJob : .NET Framework 4.6.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.2633.0
//
//
// Method | Mean | Error | StdDev |
// ------------- |----------:|----------:|----------:|
// VirtualCall | 0.9152 ns | 0.0393 ns | 0.0368 ns |
@xoofx
xoofx / asm
Last active November 25, 2017 08:49
Sleef_sin_u10_vs_u35
function Sleef_sinf_u10:
subq $184, %rsp
movaps %xmm15, 160(%rsp)
movaps %xmm14, 144(%rsp)
movaps %xmm13, 128(%rsp)
movaps %xmm12, 112(%rsp)
movaps %xmm11, 96(%rsp)
movaps %xmm10, 80(%rsp)
movaps %xmm9, 64(%rsp)
@xoofx
xoofx / MessSafeStack.cs
Last active June 6, 2017 14:28
Mess the stack by using plain safe code (cheating through ExplicitLayout/FieldOffset)
// hack for https://twitter.com/ashmind/status/871357443036467201
// Write to the stack through FieldOffset and Virtual methods (no unsafe, not using System.Runtime.InteropServices directly into a method)
// valid only for x86-32bits (need to change int Address to long in order to have it working for x64)
// The basic idea is to use FieldOffset on a struct to reinterpret an object reference
// and using this trick to take an address on the stack that doesn't involve manipulating directly IntPtr or unsafe code...
using System.Runtime.InteropServices;
class Program
@xoofx
xoofx / SafeNotSafe.cs
Created June 6, 2017 09:30
Proof of concept of (un)safe code breaking https://unbreakable-test.azurewebsites.net/
// proof of concept for breaking https://unbreakable-test.azurewebsites.net/
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
static class Program {
[MethodImpl(MethodImplOptions.NoInlining)]
public static void MethodToPatch()
{
}
@xoofx
xoofx / coreclr_internal_calls.txt
Created January 4, 2017 22:26
List of files making an internal fcall/qcall in CoreCLR
// From https://github.com/dotnet/coreclr/tree/edc1320180a3d68a16855da8da82f01871bf3a1d/src/mscorlib
// 109 Files (over a total of 974 cs files) in System.Private.CoreLib.dll (ex mscorlib.dll)
// are making an internal fcall/qcall to a function inside coreclr.dll
// In total 967 internal fcall/qcall functions are imported
Internal\Runtime\Augments\RuntimeThread.cs
Microsoft\Win32\OAVariantLib.cs
System\AppDomain.cs
System\ArgIterator.cs
System\Array.cs
@xoofx
xoofx / DiscriminatedUnionFSharp.cs
Created October 28, 2016 07:20
.NET Code generated for a Shape F# discriminated union
// .NET Code generated for the F# type:
// type Shape =
// | Rectangle of width : float * length : float
// | Circle of radius : float
// | Triangle of width : float * height : float
using Microsoft.FSharp.Core;
using System;
using System.Collections;
using System.Diagnostics;