Skip to content

Commit

Permalink
1.0.2 - 2019/03/18
Browse files Browse the repository at this point in the history
@2019.1
  • Loading branch information
ErikMoczi committed Mar 19, 2019
1 parent fb7e74a commit 1087318
Show file tree
Hide file tree
Showing 13 changed files with 654 additions and 611 deletions.
7 changes: 7 additions & 0 deletions package/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog

## [1.0.2] - 2019-03-18

### Changed
- Fixed issue with population of Syncvar variable on a class derived from a networkbehaviour base class (case 1066429)
- Fixed issue with IsDynamic not working on .net 3.5 profile (use something else)]
- Fixed file lock error when building under certain conditions (case 1115492)

## [1.0.1] - 2019-02-14

### Changed
Expand Down
16 changes: 8 additions & 8 deletions package/Editor/Tools/Weaver/Helpers.cs
Expand Up @@ -58,7 +58,7 @@ public static ISymbolReaderProvider GetSymbolReaderProvider(string inputFile)
return null;
}

public static bool InheritsFromSyncList(TypeReference typeRef)
public static bool InheritsFromSyncList(TypeReference typeRef, Weaver weaver)
{
try
{
Expand All @@ -68,14 +68,14 @@ public static bool InheritsFromSyncList(TypeReference typeRef)
return false;
}

foreach (var type in ResolveInheritanceHierarchy(typeRef))
foreach (var type in ResolveInheritanceHierarchy(typeRef, weaver))
{
// only need to check for generic instances, as we're looking for SyncList<T>
if (type.IsGenericInstance)
{
// resolves the instance type to it's generic type definition, for example SyncList<Int> to SyncList<T>
var typeDef = type.Resolve();
if (typeDef.HasGenericParameters && typeDef.FullName == Weaver.SyncListType.FullName)
if (typeDef.HasGenericParameters && typeDef.FullName == weaver.SyncListType.FullName)
{
return true;
}
Expand All @@ -90,19 +90,19 @@ public static bool InheritsFromSyncList(TypeReference typeRef)
return false;
}

public static IEnumerable<TypeReference> ResolveInheritanceHierarchy(TypeReference type)
public static IEnumerable<TypeReference> ResolveInheritanceHierarchy(TypeReference type, Weaver weaver)
{
// for value types the hierarchy is pre-defined as "<Self> : System.ValueType : System.Object"
if (type.IsValueType)
{
yield return type;
yield return Weaver.valueTypeType;
yield return Weaver.objectType;
yield return weaver.valueTypeType;
yield return weaver.objectType;
yield break;
}

// resolve entire hierarchy from <Self> to System.Object
while (type != null && type.FullName != Weaver.objectType.FullName)
while (type != null && type.FullName != weaver.objectType.FullName)
{
yield return type;

Expand All @@ -127,7 +127,7 @@ public static IEnumerable<TypeReference> ResolveInheritanceHierarchy(TypeReferen
}


yield return Weaver.objectType;
yield return weaver.objectType;
}

public static string DestinationFileFor(string outputDir, string assemblyPath)
Expand Down
40 changes: 21 additions & 19 deletions package/Editor/Tools/Weaver/MessageClassProcessor.cs
Expand Up @@ -7,32 +7,34 @@ namespace Unity.UNetWeaver
class MessageClassProcessor
{
TypeDefinition m_td;
Weaver m_Weaver;

public MessageClassProcessor(TypeDefinition td)
public MessageClassProcessor(TypeDefinition td, Weaver weaver)
{
Weaver.DLog(td, "MessageClassProcessor for " + td.Name);
m_td = td;
m_Weaver = weaver;
m_Weaver.DLog(td, "MessageClassProcessor for " + td.Name);
}

public void Process()
{
Weaver.DLog(m_td, "MessageClassProcessor Start");
m_Weaver.DLog(m_td, "MessageClassProcessor Start");

Weaver.ResetRecursionCount();
m_Weaver.ResetRecursionCount();

GenerateSerialization();
if (Weaver.fail)
if (m_Weaver.fail)
{
return;
}

GenerateDeSerialization();
Weaver.DLog(m_td, "MessageClassProcessor Done");
m_Weaver.DLog(m_td, "MessageClassProcessor Done");
}

void GenerateSerialization()
{
Weaver.DLog(m_td, " GenerateSerialization");
m_Weaver.DLog(m_td, " GenerateSerialization");
foreach (var m in m_td.Methods)
{
if (m.Name == "Serialize")
Expand All @@ -49,7 +51,7 @@ void GenerateSerialization()
{
if (field.FieldType.FullName == m_td.FullName)
{
Weaver.fail = true;
m_Weaver.fail = true;
Log.Error("GenerateSerialization for " + m_td.Name + " [" + field.FullName + "]. [MessageBase] member cannot be self referencing.");
return;
}
Expand All @@ -58,9 +60,9 @@ void GenerateSerialization()
MethodDefinition serializeFunc = new MethodDefinition("Serialize", MethodAttributes.Public |
MethodAttributes.Virtual |
MethodAttributes.HideBySig,
Weaver.voidType);
m_Weaver.voidType);

serializeFunc.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType)));
serializeFunc.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, m_Weaver.m_ScriptDef.MainModule.ImportReference(m_Weaver.NetworkWriterType)));
ILProcessor serWorker = serializeFunc.Body.GetILProcessor();

foreach (var field in m_td.Fields)
Expand All @@ -70,19 +72,19 @@ void GenerateSerialization()

if (field.FieldType.Resolve().HasGenericParameters)
{
Weaver.fail = true;
m_Weaver.fail = true;
Log.Error("GenerateSerialization for " + m_td.Name + " [" + field.FieldType + "/" + field.FieldType.FullName + "]. [MessageBase] member cannot have generic parameters.");
return;
}

if (field.FieldType.Resolve().IsInterface)
{
Weaver.fail = true;
m_Weaver.fail = true;
Log.Error("GenerateSerialization for " + m_td.Name + " [" + field.FieldType + "/" + field.FieldType.FullName + "]. [MessageBase] member cannot be an interface.");
return;
}

MethodReference writeFunc = Weaver.GetWriteFunc(field.FieldType);
MethodReference writeFunc = m_Weaver.GetWriteFunc(field.FieldType);
if (writeFunc != null)
{
serWorker.Append(serWorker.Create(OpCodes.Ldarg_1));
Expand All @@ -92,7 +94,7 @@ void GenerateSerialization()
}
else
{
Weaver.fail = true;
m_Weaver.fail = true;
Log.Error("GenerateSerialization for " + m_td.Name + " unknown type [" + field.FieldType + "/" + field.FieldType.FullName + "]. [MessageBase] member variables must be basic types.");
return;
}
Expand All @@ -104,7 +106,7 @@ void GenerateSerialization()

void GenerateDeSerialization()
{
Weaver.DLog(m_td, " GenerateDeserialization");
m_Weaver.DLog(m_td, " GenerateDeserialization");
foreach (var m in m_td.Methods)
{
if (m.Name == "Deserialize")
Expand All @@ -119,17 +121,17 @@ void GenerateDeSerialization()
MethodDefinition serializeFunc = new MethodDefinition("Deserialize", MethodAttributes.Public |
MethodAttributes.Virtual |
MethodAttributes.HideBySig,
Weaver.voidType);
m_Weaver.voidType);

serializeFunc.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkReaderType)));
serializeFunc.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, m_Weaver.m_ScriptDef.MainModule.ImportReference(m_Weaver.NetworkReaderType)));
ILProcessor serWorker = serializeFunc.Body.GetILProcessor();

foreach (var field in m_td.Fields)
{
if (field.IsStatic || field.IsPrivate || field.IsSpecialName)
continue;

MethodReference readerFunc = Weaver.GetReadFunc(field.FieldType);
MethodReference readerFunc = m_Weaver.GetReadFunc(field.FieldType);
if (readerFunc != null)
{
serWorker.Append(serWorker.Create(OpCodes.Ldarg_0));
Expand All @@ -139,7 +141,7 @@ void GenerateDeSerialization()
}
else
{
Weaver.fail = true;
m_Weaver.fail = true;
Log.Error("GenerateDeSerialization for " + m_td.Name + " unknown type [" + field.FieldType + "]. [SyncVar] member variables must be basic types.");
return;
}
Expand Down
32 changes: 17 additions & 15 deletions package/Editor/Tools/Weaver/MonoBehaviourProcessor.cs
Expand Up @@ -7,10 +7,12 @@ namespace Unity.UNetWeaver
class MonoBehaviourProcessor
{
TypeDefinition m_td;
Weaver m_Weaver;

public MonoBehaviourProcessor(TypeDefinition td)
public MonoBehaviourProcessor(TypeDefinition td, Weaver weaver)
{
m_td = td;
m_Weaver = weaver;
}

public void Process()
Expand All @@ -26,17 +28,17 @@ void ProcessSyncVars()
{
foreach (var ca in fd.CustomAttributes)
{
if (ca.AttributeType.FullName == Weaver.SyncVarType.FullName)
if (ca.AttributeType.FullName == m_Weaver.SyncVarType.FullName)
{
Log.Error("Script " + m_td.FullName + " uses [SyncVar] " + fd.Name + " but is not a NetworkBehaviour.");
Weaver.fail = true;
m_Weaver.fail = true;
}
}

if (Helpers.InheritsFromSyncList(fd.FieldType))
if (Helpers.InheritsFromSyncList(fd.FieldType, m_Weaver))
{
Log.Error(string.Format("Script {0} defines field {1} with type {2}, but it's not a NetworkBehaviour", m_td.FullName, fd.Name, Helpers.PrettyPrintType(fd.FieldType)));
Weaver.fail = true;
m_Weaver.fail = true;
}
}
}
Expand All @@ -48,45 +50,45 @@ void ProcessMethods()
{
foreach (var ca in md.CustomAttributes)
{
if (ca.AttributeType.FullName == Weaver.CommandType.FullName)
if (ca.AttributeType.FullName == m_Weaver.CommandType.FullName)
{
Log.Error("Script " + m_td.FullName + " uses [Command] " + md.Name + " but is not a NetworkBehaviour.");
Weaver.fail = true;
m_Weaver.fail = true;
}

if (ca.AttributeType.FullName == Weaver.ClientRpcType.FullName)
if (ca.AttributeType.FullName == m_Weaver.ClientRpcType.FullName)
{
Log.Error("Script " + m_td.FullName + " uses [ClientRpc] " + md.Name + " but is not a NetworkBehaviour.");
Weaver.fail = true;
m_Weaver.fail = true;
}

if (ca.AttributeType.FullName == Weaver.TargetRpcType.FullName)
if (ca.AttributeType.FullName == m_Weaver.TargetRpcType.FullName)
{
Log.Error("Script " + m_td.FullName + " uses [TargetRpc] " + md.Name + " but is not a NetworkBehaviour.");
Weaver.fail = true;
m_Weaver.fail = true;
}

var attrName = ca.Constructor.DeclaringType.ToString();

if (attrName == "UnityEngine.Networking.ServerAttribute")
{
Log.Error("Script " + m_td.FullName + " uses the attribute [Server] on the method " + md.Name + " but is not a NetworkBehaviour.");
Weaver.fail = true;
m_Weaver.fail = true;
}
else if (attrName == "UnityEngine.Networking.ServerCallbackAttribute")
{
Log.Error("Script " + m_td.FullName + " uses the attribute [ServerCallback] on the method " + md.Name + " but is not a NetworkBehaviour.");
Weaver.fail = true;
m_Weaver.fail = true;
}
else if (attrName == "UnityEngine.Networking.ClientAttribute")
{
Log.Error("Script " + m_td.FullName + " uses the attribute [Client] on the method " + md.Name + " but is not a NetworkBehaviour.");
Weaver.fail = true;
m_Weaver.fail = true;
}
else if (attrName == "UnityEngine.Networking.ClientCallbackAttribute")
{
Log.Error("Script " + m_td.FullName + " uses the attribute [ClientCallback] on the method " + md.Name + " but is not a NetworkBehaviour.");
Weaver.fail = true;
m_Weaver.fail = true;
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion package/Editor/Tools/Weaver/Program.cs
Expand Up @@ -31,7 +31,8 @@ public static bool Process(string unityEngine, string unetDLL, string outputDire
CheckAssemblies(assemblies);
Log.WarningMethod = printWarning;
Log.ErrorMethod = printError;
return Weaver.WeaveAssemblies(assemblies, extraAssemblyPaths, null, outputDirectory, unityEngine, unetDLL);
Weaver weaver = new Weaver();
return weaver.WeaveAssemblies(assemblies, extraAssemblyPaths, null, outputDirectory, unityEngine, unetDLL);
}

private static void CheckDLLPath(string path)
Expand Down

0 comments on commit 1087318

Please sign in to comment.