QSBReaderWriterProcessor: improve a bit

This commit is contained in:
JohnCorby 2022-02-13 19:45:29 -08:00
parent e324fed48e
commit ae45805172
2 changed files with 22 additions and 11 deletions

View File

@ -1,6 +1,8 @@
using Mirror; using Mirror;
using Mirror.Weaver; using Mirror.Weaver;
using Mono.Cecil; using Mono.Cecil;
using System;
using System.Diagnostics;
namespace MirrorWeaver namespace MirrorWeaver
{ {
@ -12,51 +14,59 @@ namespace MirrorWeaver
/// traverses from non generic classes up thru base types /// traverses from non generic classes up thru base types
/// in order to replace generic parameters with their corresponding generic arguments. /// in order to replace generic parameters with their corresponding generic arguments.
/// </summary> /// </summary>
public static void Process(AssemblyDefinition assembly, Writers writers, Readers readers, ref bool weavingFailed) public static void Process(ModuleDefinition module, Writers writers, Readers readers, ref bool weavingFailed)
{ {
var NetworkWriter_Write = assembly.MainModule.ImportReference(typeof(NetworkWriter).GetMethod(nameof(NetworkWriter.Write))); var sw = Stopwatch.StartNew();
var NetworkReader_Read = assembly.MainModule.ImportReference(typeof(NetworkReader).GetMethod(nameof(NetworkReader.Read)));
foreach (var type in assembly.MainModule.GetTypes()) var NetworkWriter_Write = typeof(NetworkWriter).GetMethod(nameof(NetworkWriter.Write));
var NetworkReader_Read = typeof(NetworkReader).GetMethod(nameof(NetworkReader.Read));
var count = 0;
foreach (var type in module.GetTypes())
{ {
if (type.HasGenericParameters) continue; if (type.HasGenericParameters) continue;
TypeReference currentType = type; TypeReference currentType = type;
while (currentType != null) while (currentType != null)
{ {
foreach (var method in currentType.Resolve().Methods) var currentTypeDef = currentType.Resolve();
foreach (var method in currentTypeDef.Methods)
{ {
if (!method.HasBody) continue; if (!method.HasBody) continue;
foreach (var instruction in method.Body.Instructions) foreach (var instruction in method.Body.Instructions)
{ {
if (instruction.Operand is not GenericInstanceMethod calledMethod) continue; if (instruction.Operand is not GenericInstanceMethod calledMethod) continue;
if (calledMethod.DeclaringType.Name == NetworkWriter_Write.DeclaringType.Name && if (calledMethod.DeclaringType.FullName == NetworkWriter_Write.DeclaringType.FullName &&
calledMethod.Name == NetworkWriter_Write.Name) calledMethod.Name == NetworkWriter_Write.Name)
{ {
var argType = calledMethod.GenericArguments[0]; var argType = calledMethod.GenericArguments[0];
if (argType is GenericParameter genericParameter && genericParameter.Owner == currentType.Resolve()) if (argType is GenericParameter genericParameter && genericParameter.Owner == currentTypeDef)
argType = ((GenericInstanceType)currentType).GenericArguments[genericParameter.Position]; argType = ((GenericInstanceType)currentType).GenericArguments[genericParameter.Position];
writers.GetWriteFunc(argType, ref weavingFailed); writers.GetWriteFunc(argType, ref weavingFailed);
count++;
} }
else if (calledMethod.DeclaringType.Name == NetworkReader_Read.DeclaringType.Name && else if (calledMethod.DeclaringType.FullName == NetworkReader_Read.DeclaringType.FullName &&
calledMethod.Name == NetworkReader_Read.Name) calledMethod.Name == NetworkReader_Read.Name)
{ {
var argType = calledMethod.GenericArguments[0]; var argType = calledMethod.GenericArguments[0];
if (argType is GenericParameter genericParameter && genericParameter.Owner == currentType.Resolve()) if (argType is GenericParameter genericParameter && genericParameter.Owner == currentTypeDef)
argType = ((GenericInstanceType)currentType).GenericArguments[genericParameter.Position]; argType = ((GenericInstanceType)currentType).GenericArguments[genericParameter.Position];
readers.GetReadFunc(argType, ref weavingFailed); readers.GetReadFunc(argType, ref weavingFailed);
count++;
} }
} }
} }
currentType = currentType.Resolve()?.BaseType; currentType = currentTypeDef.BaseType;
} }
} }
Console.WriteLine($"got/generated {count} read/write funcs in {sw.ElapsedMilliseconds} ms");
} }
} }
} }

View File

@ -193,13 +193,14 @@ namespace Mirror.Weaver
Stopwatch rwstopwatch = Stopwatch.StartNew(); Stopwatch rwstopwatch = Stopwatch.StartNew();
// Need to track modified from ReaderWriterProcessor too because it could find custom read/write functions or create functions for NetworkMessages // Need to track modified from ReaderWriterProcessor too because it could find custom read/write functions or create functions for NetworkMessages
modified = ReaderWriterProcessor.Process(CurrentAssembly, resolver, Log, writers, readers, ref WeavingFailed); modified = ReaderWriterProcessor.Process(CurrentAssembly, resolver, Log, writers, readers, ref WeavingFailed);
MirrorWeaver.QSBReaderWriterProcessor.Process(CurrentAssembly, writers, readers, ref WeavingFailed);
rwstopwatch.Stop(); rwstopwatch.Stop();
Console.WriteLine($"Find all reader and writers took {rwstopwatch.ElapsedMilliseconds} milliseconds"); Console.WriteLine($"Find all reader and writers took {rwstopwatch.ElapsedMilliseconds} milliseconds");
ModuleDefinition moduleDefinition = CurrentAssembly.MainModule; ModuleDefinition moduleDefinition = CurrentAssembly.MainModule;
Console.WriteLine($"Script Module: {moduleDefinition.Name}"); Console.WriteLine($"Script Module: {moduleDefinition.Name}");
MirrorWeaver.QSBReaderWriterProcessor.Process(moduleDefinition, writers, readers, ref WeavingFailed);
modified |= WeaveModule(moduleDefinition); modified |= WeaveModule(moduleDefinition);
if (WeavingFailed) if (WeavingFailed)