mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 02:50:32 +00:00
Weaver SyncList code moved into SyncListProcessor
This commit is contained in:
parent
b9ec4a5dc5
commit
5ecb40f055
@ -72,6 +72,7 @@
|
|||||||
<Compile Include="Processors\NetworkBehaviourProcessor.cs" />
|
<Compile Include="Processors\NetworkBehaviourProcessor.cs" />
|
||||||
<Compile Include="Processors\RpcProcessor.cs" />
|
<Compile Include="Processors\RpcProcessor.cs" />
|
||||||
<Compile Include="Processors\SyncEventProcessor.cs" />
|
<Compile Include="Processors\SyncEventProcessor.cs" />
|
||||||
|
<Compile Include="Processors\SyncListProcessor.cs" />
|
||||||
<Compile Include="Processors\SyncObjectProcessor.cs" />
|
<Compile Include="Processors\SyncObjectProcessor.cs" />
|
||||||
<Compile Include="Processors\SyncVarProcessor.cs" />
|
<Compile Include="Processors\SyncVarProcessor.cs" />
|
||||||
<Compile Include="Processors\TargetRpcProcessor.cs" />
|
<Compile Include="Processors\TargetRpcProcessor.cs" />
|
||||||
|
@ -266,7 +266,7 @@ void GenerateConstants()
|
|||||||
|
|
||||||
foreach (FieldDefinition fd in m_SyncObjects)
|
foreach (FieldDefinition fd in m_SyncObjects)
|
||||||
{
|
{
|
||||||
GenerateSyncListInstanceInitializer(ctorWorker, fd);
|
SyncListProcessor.GenerateSyncListInstanceInitializer(ctorWorker, fd);
|
||||||
SyncObjectProcessor.GenerateSyncObjectInitializer(ctorWorker, fd);
|
SyncObjectProcessor.GenerateSyncObjectInitializer(ctorWorker, fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,33 +283,6 @@ void GenerateConstants()
|
|||||||
m_td.Attributes = m_td.Attributes & ~TypeAttributes.BeforeFieldInit;
|
m_td.Attributes = m_td.Attributes & ~TypeAttributes.BeforeFieldInit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// generates 'syncListInt = new SyncListInt()' if user didn't do that yet
|
|
||||||
void GenerateSyncListInstanceInitializer(ILProcessor ctorWorker, FieldDefinition fd)
|
|
||||||
{
|
|
||||||
// check the ctor's instructions for an Stfld op-code for this specific sync list field.
|
|
||||||
foreach (var ins in ctorWorker.Body.Instructions)
|
|
||||||
{
|
|
||||||
if (ins.OpCode.Code == Code.Stfld)
|
|
||||||
{
|
|
||||||
var field = (FieldDefinition)ins.Operand;
|
|
||||||
if (field.DeclaringType == fd.DeclaringType && field.Name == fd.Name)
|
|
||||||
{
|
|
||||||
// Already initialized by the user in the field definition, e.g:
|
|
||||||
// public SyncListInt Foo = new SyncListInt();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not initialized by the user in the field definition, e.g:
|
|
||||||
// public SyncListInt Foo;
|
|
||||||
var listCtor = Weaver.scriptDef.MainModule.ImportReference(fd.FieldType.Resolve().Methods.First<MethodDefinition>(x => x.Name == ".ctor" && !x.HasParameters));
|
|
||||||
|
|
||||||
ctorWorker.Append(ctorWorker.Create(OpCodes.Ldarg_0));
|
|
||||||
ctorWorker.Append(ctorWorker.Create(OpCodes.Newobj, listCtor));
|
|
||||||
ctorWorker.Append(ctorWorker.Create(OpCodes.Stfld, fd));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// This generates code like:
|
// This generates code like:
|
||||||
NetworkBehaviour.RegisterCommandDelegate(base.GetType(), "CmdThrust", new NetworkBehaviour.CmdDelegate(ShipControl.InvokeCmdCmdThrust));
|
NetworkBehaviour.RegisterCommandDelegate(base.GetType(), "CmdThrust", new NetworkBehaviour.CmdDelegate(ShipControl.InvokeCmdCmdThrust));
|
||||||
|
37
Mirror/Weaver/Processors/SyncListProcessor.cs
Normal file
37
Mirror/Weaver/Processors/SyncListProcessor.cs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// SyncList code
|
||||||
|
using System.Linq;
|
||||||
|
using Mono.Cecil;
|
||||||
|
using Mono.Cecil.Cil;
|
||||||
|
|
||||||
|
namespace Mirror.Weaver
|
||||||
|
{
|
||||||
|
public static class SyncListProcessor
|
||||||
|
{
|
||||||
|
// generates 'syncListInt = new SyncListInt()' if user didn't do that yet
|
||||||
|
public static void GenerateSyncListInstanceInitializer(ILProcessor ctorWorker, FieldDefinition fd)
|
||||||
|
{
|
||||||
|
// check the ctor's instructions for an Stfld op-code for this specific sync list field.
|
||||||
|
foreach (var ins in ctorWorker.Body.Instructions)
|
||||||
|
{
|
||||||
|
if (ins.OpCode.Code == Code.Stfld)
|
||||||
|
{
|
||||||
|
var field = (FieldDefinition)ins.Operand;
|
||||||
|
if (field.DeclaringType == fd.DeclaringType && field.Name == fd.Name)
|
||||||
|
{
|
||||||
|
// Already initialized by the user in the field definition, e.g:
|
||||||
|
// public SyncListInt Foo = new SyncListInt();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not initialized by the user in the field definition, e.g:
|
||||||
|
// public SyncListInt Foo;
|
||||||
|
var listCtor = Weaver.scriptDef.MainModule.ImportReference(fd.FieldType.Resolve().Methods.First<MethodDefinition>(x => x.Name == ".ctor" && !x.HasParameters));
|
||||||
|
|
||||||
|
ctorWorker.Append(ctorWorker.Create(OpCodes.Ldarg_0));
|
||||||
|
ctorWorker.Append(ctorWorker.Create(OpCodes.Newobj, listCtor));
|
||||||
|
ctorWorker.Append(ctorWorker.Create(OpCodes.Stfld, fd));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user