1 Year Ago
Fast method body hotload (#931) * 0ms hotload fast path poc when only method bodies change using MonoMod * Print individual changes during compile, show node paths * WIP check if all changes are in method bodies * Add attributes to package assemblies describing changed methods * SupportsILHotloadAttribute is added if only method bodies change * MethodBodyChangeAttribute is added for each changed method * ILHotload looks for SupportsILHotload and MethodBodyChange attributes * Fixed methods with identical IL not being replaced by ILHotload * ILHotload should never run with a debugger attached * Clean up dead code * Detour using a generated dynamic method copy from the replacing method * Documentation for Compiler.SyntaxTree.cs * Added CompilerSettings.SourcePathFilter predicate * Boilerplate for writing ILHotload tests * Fixed how file changes are emulated in FastPathTest * A bit more flexibility in fast path test case code preprocessing * Added failing fast path hotload test for changing method signatures * ILHotload: changes must be specifically within a BlockSyntax of a method * Added Compiler.UpdateParseOptions() for tests to use * Don't use ILHotload if a preprocessor define changed * Incremental syntax tree parsing * Throw when trying to debug an ILHotload swap during a test * Basic incremental compilation * Make generated code more deterministic, nicer for incremental compile * Keep track of which assembly types are actually loaded from * Re-use compiler options where possible * Changed fast hotload log to a trace * Make OnlyMethodBodiesChanged multithreaded, fixed multiple changes in one file * Failing test for property body changes * Cleanup ILHotload tests, failing test for overloaded method * Refactor AST processing for ILHotload * Fixes after refactor, a bit ugly at the moment * Support fast hotload for property accessors * NoticeWidget shows ms if duration < 1s * Call UISystem.OnHotload after an ILHotload * ILHotload test for nested blocks * Fixed ILHotload change detection for nested blocks * Added hotload_fast engine convar to enable / disable IL hotload * Added failing test of typeof(T) in method body hotloads * Failing test for static references * Fix references to members / types in fast-hotloaded method bodies * Allow debugging ILHotload in Sandbox.Test * Test for fast-hotloaded methods with parameter / return types defined in the changed module * Added failing fast hotload test for compiler-generated type changes * Don't attempt fast hotload if any compiler-generated type definitions change * Record event when we ILHotload, matches naming of existing hotloads so we can derive % easily * Remove defunct code about using cecil as the DMDType, not needed since we fix the references ourselves --------- Co-authored-by: Matt Stevens <matt@mattstevens.co.uk>