Skip to content

Instantly share code, notes, and snippets.

@kekyo
Last active June 2, 2024 09:13
Show Gist options
  • Select an option

  • Save kekyo/bc8e411b846c98d2f2ae7b839ef77fea to your computer and use it in GitHub Desktop.

Select an option

Save kekyo/bc8e411b846c98d2f2ae7b839ef77fea to your computer and use it in GitHub Desktop.

Revisions

  1. kekyo revised this gist Jun 2, 2024. No changes.
  2. kekyo revised this gist Jun 2, 2024. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion opcodegen.cs
    Original file line number Diff line number Diff line change
    @@ -72,7 +72,7 @@ static void GenerateCecil()
    }).
    Where(entry => entry.name != null && entry.opCode.OpCodeType != Mono.Cecil.Cil.OpCodeType.Nternal).
    OrderBy(entry => entry.opCode.Value).
    Select(entry => (entry.fieldName, name: entry.opCode.Name!.Replace('_', '.').TrimEnd('.').ToLowerInvariant())).
    Select(entry => (entry.fieldName, name: entry.name)).
    ToArray();

    Console.WriteLine("namespace chibild.Internal;");
  3. kekyo revised this gist Jun 2, 2024. 1 changed file with 74 additions and 9 deletions.
    83 changes: 74 additions & 9 deletions opcodegen.cs
    Original file line number Diff line number Diff line change
    @@ -1,28 +1,31 @@
    using System;
    using System;
    using System.Linq;

    namespace ConsoleApp1;

    class Program
    {
    static void Main(string[] args)
    static void GenerateReflectionEmit()
    {
    var emitOpCodes =
    typeof(System.Reflection.Emit.OpCodes).GetFields().Where(field =>
    field.IsPublic && field.IsStatic && field.IsInitOnly &&
    field.FieldType.FullName == "System.Reflection.Emit.OpCode").
    typeof(System.Reflection.Emit.OpCodes).GetFields().
    Where(field => field is
    {
    IsPublic: true, IsStatic: true, IsInitOnly: true,
    FieldType.FullName: "System.Reflection.Emit.OpCode"
    }).
    Select(field => (fieldName: field.Name, opCode: (System.Reflection.Emit.OpCode)field.GetValue(null)!)).
    Where(entry => entry.opCode.OpCodeType != System.Reflection.Emit.OpCodeType.Nternal).
    OrderBy(entry => entry.opCode.Value).
    Select(entry => (entry.fieldName, name: entry.opCode.Name!.Replace('_', '.').TrimEnd('.').ToLowerInvariant())).
    ToArray();

    Console.WriteLine("namespace chibicc.toolchain;");
    Console.WriteLine("namespace chibicc.toolchain.Internal;");
    Console.WriteLine();
    Console.WriteLine("public static class ReflectionOpCodeDefinition");
    Console.WriteLine("internal static class ReflectionEmitDefinition");
    Console.WriteLine("{");

    Console.WriteLine(" public static readonly System.Collections.Generic.Dictionary<string. System.Reflection.Emit.OpCode> GetOpCodes() =>");
    Console.WriteLine(" public static System.Collections.Generic.Dictionary<string, System.Reflection.Emit.OpCode> GetOpCodes() =>");
    Console.WriteLine(" new(System.StringComparer.OrdinalIgnoreCase)");
    Console.WriteLine(" {");

    @@ -35,4 +38,66 @@ static void Main(string[] args)
    Console.WriteLine(" };");
    Console.WriteLine("}");
    }
    }

    static void GenerateCecil()
    {
    var emitOpCodeBytes =
    typeof(System.Reflection.Emit.OpCodes).GetFields().
    Where(field => field is
    {
    IsPublic: true, IsStatic: true, IsInitOnly: true,
    FieldType.FullName: "System.Reflection.Emit.OpCode"
    }).
    Select(field => (fieldName: field.Name, opCode: (System.Reflection.Emit.OpCode)field.GetValue(null)!)).
    Where(entry => entry.opCode.OpCodeType != System.Reflection.Emit.OpCodeType.Nternal).
    ToDictionary(
    entry => entry.opCode.Value,
    entry => (entry.fieldName, name: entry.opCode.Name!.Replace('_', '.').TrimEnd('.').ToLowerInvariant()));

    var cecilOpCodes = typeof(Mono.Cecil.Cil.OpCodes).GetFields().
    Where(field =>
    field.IsPublic && field.IsStatic && field.IsInitOnly &&
    field.FieldType.FullName == "Mono.Cecil.Cil.OpCode").
    Select(field =>
    {
    var opCode = (Mono.Cecil.Cil.OpCode)field.GetValue(null)!;
    if (emitOpCodeBytes.TryGetValue(opCode.Value, out var entry))
    {
    return (fieldName: field.Name, opCode, name: entry.name);
    }
    else
    {
    return (null!, default, null!);
    }
    }).
    Where(entry => entry.name != null && entry.opCode.OpCodeType != Mono.Cecil.Cil.OpCodeType.Nternal).
    OrderBy(entry => entry.opCode.Value).
    Select(entry => (entry.fieldName, name: entry.opCode.Name!.Replace('_', '.').TrimEnd('.').ToLowerInvariant())).
    ToArray();

    Console.WriteLine("namespace chibild.Internal;");
    Console.WriteLine();
    Console.WriteLine("internal static class CecilDefinition");
    Console.WriteLine("{");

    Console.WriteLine(" public static System.Collections.Generic.Dictionary<string, Mono.Cecil.Cil.OpCode> GetOpCodes() =>");
    Console.WriteLine(" new(System.StringComparer.OrdinalIgnoreCase)");
    Console.WriteLine(" {");

    foreach (var entry in cecilOpCodes)
    {
    Console.WriteLine(
    $" {{ \"{entry.name}\", Mono.Cecil.Cil.OpCodes.{entry.fieldName} }},");
    }

    Console.WriteLine(" };");
    Console.WriteLine("}");

    }

    static void Main(string[] args)
    {
    GenerateReflectionEmit();
    GenerateCecil();
    }
    }
  4. kekyo created this gist Jun 2, 2024.
    38 changes: 38 additions & 0 deletions opcodegen.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    using System;
    using System.Linq;

    namespace ConsoleApp1;

    class Program
    {
    static void Main(string[] args)
    {
    var emitOpCodes =
    typeof(System.Reflection.Emit.OpCodes).GetFields().Where(field =>
    field.IsPublic && field.IsStatic && field.IsInitOnly &&
    field.FieldType.FullName == "System.Reflection.Emit.OpCode").
    Select(field => (fieldName: field.Name, opCode: (System.Reflection.Emit.OpCode)field.GetValue(null)!)).
    Where(entry => entry.opCode.OpCodeType != System.Reflection.Emit.OpCodeType.Nternal).
    OrderBy(entry => entry.opCode.Value).
    Select(entry => (entry.fieldName, name: entry.opCode.Name!.Replace('_', '.').TrimEnd('.').ToLowerInvariant())).
    ToArray();

    Console.WriteLine("namespace chibicc.toolchain;");
    Console.WriteLine();
    Console.WriteLine("public static class ReflectionOpCodeDefinition");
    Console.WriteLine("{");

    Console.WriteLine(" public static readonly System.Collections.Generic.Dictionary<string. System.Reflection.Emit.OpCode> GetOpCodes() =>");
    Console.WriteLine(" new(System.StringComparer.OrdinalIgnoreCase)");
    Console.WriteLine(" {");

    foreach (var entry in emitOpCodes)
    {
    Console.WriteLine(
    $" {{ \"{entry.name}\", System.Reflection.Emit.OpCodes.{entry.fieldName} }},");
    }

    Console.WriteLine(" };");
    Console.WriteLine("}");
    }
    }