From 3ec874db318f0164e10b219a43b700c7ca51d9a4 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Tue, 4 Aug 2015 17:24:59 +0200 Subject: [PATCH] Revert "Sync inherited members." This reverts commit cfd2f265d5ef27972da9c54506fa6cb41434110c. --- OpenRA.Game/Sync.cs | 43 ++++++++++++------------------------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/OpenRA.Game/Sync.cs b/OpenRA.Game/Sync.cs index 1551b5fdd4..0cfe283921 100644 --- a/OpenRA.Game/Sync.cs +++ b/OpenRA.Game/Sync.cs @@ -20,22 +20,20 @@ namespace OpenRA { [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class SyncAttribute : Attribute { } - public interface ISync { } // marker interface + + // Marker interface + public interface ISync { } public static class Sync { - static readonly ConcurrentCache HashMethods = - new ConcurrentCache(GenerateHashFunc); - static readonly ConcurrentCache> HashFunctions = - new ConcurrentCache>( - type => (Func)HashMethods[type].CreateDelegate(typeof(Func))); + static Cache> hashFuncCache = new Cache>(t => GenerateHashFunc(t)); public static int CalculateSyncHash(object obj) { - return HashFunctions[obj.GetType()](obj); + return hashFuncCache[obj.GetType()](obj); } - static readonly Dictionary SpecializedHashMethods = new Dictionary + static Dictionary hashFunctions = new Dictionary() { { typeof(int2), ((Func)HashInt2).Method }, { typeof(CPos), ((Func)HashCPos).Method }, @@ -53,8 +51,8 @@ namespace OpenRA static void EmitSyncOpcodes(Type type, ILGenerator il) { - if (SpecializedHashMethods.ContainsKey(type)) - il.EmitCall(OpCodes.Call, SpecializedHashMethods[type], null); + if (hashFunctions.ContainsKey(type)) + il.EmitCall(OpCodes.Call, hashFunctions[type], null); else if (type == typeof(bool)) { var l = il.DefineLabel(); @@ -72,9 +70,9 @@ namespace OpenRA il.Emit(OpCodes.Xor); } - static DynamicMethod GenerateHashFunc(Type t) + public static Func GenerateHashFunc(Type t) { - var d = new DynamicMethod("Hash_{0}".F(t.Name), typeof(int), new Type[] { typeof(object) }, t); + var d = new DynamicMethod("hash_{0}".F(t.Name), typeof(int), new Type[] { typeof(object) }, t); var il = d.GetILGenerator(); var this_ = il.DeclareLocal(t).LocalIndex; il.Emit(OpCodes.Ldarg_0); @@ -82,17 +80,13 @@ namespace OpenRA il.Emit(OpCodes.Stloc, this_); il.Emit(OpCodes.Ldc_I4_0); - var neededSync = false; - - const BindingFlags Binding = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly; - + const BindingFlags Binding = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; foreach (var field in t.GetFields(Binding).Where(x => x.HasAttribute())) { il.Emit(OpCodes.Ldloc, this_); il.Emit(OpCodes.Ldfld, field); EmitSyncOpcodes(field.FieldType, il); - neededSync = true; } foreach (var prop in t.GetProperties(Binding).Where(x => x.HasAttribute())) @@ -101,23 +95,10 @@ namespace OpenRA il.EmitCall(OpCodes.Call, prop.GetGetMethod(), null); EmitSyncOpcodes(prop.PropertyType, il); - neededSync = true; - } - - if (t.BaseType != null) - { - var baseHashFunc = HashMethods[t.BaseType]; - if (baseHashFunc != null) - { - il.Emit(OpCodes.Ldloc, this_); - il.EmitCall(OpCodes.Call, baseHashFunc, null); - il.Emit(OpCodes.Xor); - neededSync = true; - } } il.Emit(OpCodes.Ret); - return neededSync ? d : null; + return (Func)d.CreateDelegate(typeof(Func)); } public static int HashInt2(int2 i2)