Advertisement
Guest User

Untitled

a guest
Mar 28th, 2015
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.77 KB | None | 0 0
  1. module ILCreator
  2.  
  3. open System.Reflection
  4. open System.Reflection.Emit
  5. open ILInstructions
  6. open System.Threading
  7. open System
  8. open System.IO
  9.  
  10. // Yep I'm not using this yet
  11. let rec evaluate (il:ILGenerator) expr =
  12.     match expr with
  13.     | PushInt i     -> il.Emit(OpCodes.Ldc_I4, i)
  14.     | Add           -> il.Emit(OpCodes.Add)
  15.     | Sub           -> il.Emit(OpCodes.Sub)
  16.     | Div           -> il.Emit(OpCodes.Div)
  17.     | Mul           -> il.Emit(OpCodes.Mul)
  18.  
  19. let createAssembly name =
  20.     let assemblyName = new AssemblyName(Path.GetFileNameWithoutExtension(name))
  21.     AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save)
  22.    
  23. let createClass (moduleBuilder: ModuleBuilder) name =
  24.     moduleBuilder.DefineType(name, TypeAttributes.Public)
  25.  
  26. let createMethod (typeBuilder : TypeBuilder) name instructions =
  27.     let newMethod = typeBuilder.DefineMethod(name, MethodAttributes.Public ||| MethodAttributes.Static)
  28.     let ilGenerator = newMethod.GetILGenerator()
  29.     List.map (fun i -> ilGenerator.Emit(i)) instructions |> ignore
  30.     newMethod    
  31.  
  32. let generateIL assemblyName expr =
  33.     let assemblyBuilder = createAssembly assemblyName
  34.     let moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName)
  35.     let typeBuilder = createClass moduleBuilder "Program"
  36.  
  37.     // Don't mind this: it is just an example    
  38.     createMethod typeBuilder "MyNewMethod" [OpCodes.Ldc_I4_1; OpCodes.Ldc_I4_1; OpCodes.Add] |> ignore
  39.     let mainMethod = createMethod typeBuilder "Main" [OpCodes.Ldc_I4_0; OpCodes.Ret]
  40.  
  41.     typeBuilder.CreateType()                    |> ignore
  42.     moduleBuilder.CreateGlobalFunctions()       |> ignore
  43.     assemblyBuilder.SetEntryPoint(mainMethod)   |> ignore
  44.     assemblyBuilder.Save(assemblyName)          |> ignore
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement