Skip to content

Commit

Permalink
Fix issues with MoP and WoD hotfix deserializing.
Browse files Browse the repository at this point in the history
  • Loading branch information
Warpten committed Aug 21, 2016
1 parent 48c452a commit 0a92f6a
Show file tree
Hide file tree
Showing 17 changed files with 396 additions and 166 deletions.
88 changes: 63 additions & 25 deletions WowPacketParserModule.V5_3_0_16981/Hotfix/HotfixSerializer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using Sigil;
using WowPacketParser.Hotfix;
Expand Down Expand Up @@ -27,35 +27,44 @@ public override void GenerateDeserializer()
var propType = propInfo.PropertyType;
var isArray = propType.IsArray;

deserializationEmitter.LoadLocal(deserializationResultLocal);

if (!isArray)
{
var typeCode = Type.GetTypeCode(propType);

deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(0);
deserializationEmitter.NewArray<object>();
if (typeCode == TypeCode.String)
{
var conditionLabel = deserializationEmitter.DefineLabel();
deserializationEmitter.CallVirtual(_binaryReaders[TypeCode.Int16]);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.CallVirtual(typeof(Packet).GetMethod("ReadInt16", Type.EmptyTypes));
deserializationEmitter.LoadConstant(0);
deserializationEmitter.BranchIfLessOrEqual(conditionLabel);
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(0);
deserializationEmitter.NewArray<object>();
deserializationEmitter.CallVirtual(_binaryReaders[typeCode]);
deserializationEmitter.Call(propInfo.GetSetMethod());
deserializationEmitter.MarkLabel(conditionLabel);
}
else
{
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(0);
deserializationEmitter.NewArray<object>();
deserializationEmitter.CallVirtual(_binaryReaders[typeCode]);
deserializationEmitter.Call(propInfo.GetSetMethod());
deserializationEmitter.Call(propInfo.GetSetMethod());
}
}
else
{
var hotfixAttr = propInfo.GetCustomAttribute<HotfixArrayAttribute>();
Trace.Assert(hotfixAttr != null);
var typeCode = Type.GetTypeCode(propType.GetElementType());

deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.LoadConstant(hotfixAttr.Size);
deserializationEmitter.NewArray(propType.GetElementType());
deserializationEmitter.CallVirtual(propInfo.GetSetMethod());
Expand All @@ -65,40 +74,67 @@ public override void GenerateDeserializer()

using (var iterationLocal = deserializationEmitter.DeclareLocal<int>())
{
// for (var i = 0; ...; ...)
deserializationEmitter.LoadConstant(0);
deserializationEmitter.StoreLocal(iterationLocal);

deserializationEmitter.Branch(loopConditionLabel);
deserializationEmitter.MarkLabel(loopBodyLabel);
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.CallVirtual(propInfo.GetGetMethod());
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(1);
deserializationEmitter.NewArray<object>();
deserializationEmitter.Duplicate();
deserializationEmitter.LoadConstant(0);
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.Box<int>();
deserializationEmitter.StoreElement<object>();
if (typeCode == TypeCode.String)
{
var conditionLabel = deserializationEmitter.DefineLabel();
deserializationEmitter.CallVirtual(_binaryReaders[TypeCode.Int16]);

// if (packet.ReadInt16() > 0)
deserializationEmitter.LoadArgument(0); // Packet
deserializationEmitter.CallVirtual(typeof(Packet).GetMethod("ReadInt16", Type.EmptyTypes));
deserializationEmitter.LoadConstant(0);
deserializationEmitter.BranchIfLessOrEqual(conditionLabel);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.CompareGreaterThan();
deserializationEmitter.BranchIfFalse(conditionLabel);

// instance.Property[i] = packet.<Reader>("PropertyName", i);
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.CallVirtual(propInfo.GetGetMethod());
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadArgument(0); // Packet
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(1);
deserializationEmitter.NewArray<object>();
deserializationEmitter.Duplicate();
deserializationEmitter.LoadConstant(0);
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.Box<int>();
deserializationEmitter.StoreElement<object>();
deserializationEmitter.CallVirtual(_binaryReaders[typeCode]);
deserializationEmitter.StoreElement<string>();

deserializationEmitter.MarkLabel(conditionLabel);
}
else
{
// instance.Property[i] = packet.<Reader>("PropertyName", i);
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.CallVirtual(propInfo.GetGetMethod());
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(1);
deserializationEmitter.NewArray<object>();
deserializationEmitter.Duplicate();
deserializationEmitter.LoadConstant(0);
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.Box<int>();
deserializationEmitter.StoreElement<object>();
deserializationEmitter.CallVirtual(_binaryReaders[typeCode]);
deserializationEmitter.StoreElement(propType.GetElementType());
deserializationEmitter.StoreElement(propType.GetElementType());
}

// for (...; ...; i += 1)
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadConstant(1);
deserializationEmitter.Add();
deserializationEmitter.StoreLocal(iterationLocal);
deserializationEmitter.MarkLabel(loopConditionLabel);
// for (...; i < arraySize; ...)
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadConstant(hotfixAttr.Size);
deserializationEmitter.CompareLessThan();
Expand All @@ -107,8 +143,10 @@ public override void GenerateDeserializer()
}
}

// return instance;
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.Return();

_deserializer = deserializationEmitter.CreateDelegate();
}
catch (SigilVerificationException sve)
Expand Down
88 changes: 63 additions & 25 deletions WowPacketParserModule.V5_4_0_17359/Hotfix/HotfixSerializer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using Sigil;
using WowPacketParser.Hotfix;
Expand Down Expand Up @@ -27,35 +27,44 @@ public override void GenerateDeserializer()
var propType = propInfo.PropertyType;
var isArray = propType.IsArray;

deserializationEmitter.LoadLocal(deserializationResultLocal);

if (!isArray)
{
var typeCode = Type.GetTypeCode(propType);

deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(0);
deserializationEmitter.NewArray<object>();
if (typeCode == TypeCode.String)
{
var conditionLabel = deserializationEmitter.DefineLabel();
deserializationEmitter.CallVirtual(_binaryReaders[TypeCode.Int16]);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.CallVirtual(typeof(Packet).GetMethod("ReadInt16", Type.EmptyTypes));
deserializationEmitter.LoadConstant(0);
deserializationEmitter.BranchIfLessOrEqual(conditionLabel);
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(0);
deserializationEmitter.NewArray<object>();
deserializationEmitter.CallVirtual(_binaryReaders[typeCode]);
deserializationEmitter.Call(propInfo.GetSetMethod());
deserializationEmitter.MarkLabel(conditionLabel);
}
else
{
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(0);
deserializationEmitter.NewArray<object>();
deserializationEmitter.CallVirtual(_binaryReaders[typeCode]);
deserializationEmitter.Call(propInfo.GetSetMethod());
deserializationEmitter.Call(propInfo.GetSetMethod());
}
}
else
{
var hotfixAttr = propInfo.GetCustomAttribute<HotfixArrayAttribute>();
Trace.Assert(hotfixAttr != null);
var typeCode = Type.GetTypeCode(propType.GetElementType());

deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.LoadConstant(hotfixAttr.Size);
deserializationEmitter.NewArray(propType.GetElementType());
deserializationEmitter.CallVirtual(propInfo.GetSetMethod());
Expand All @@ -65,40 +74,67 @@ public override void GenerateDeserializer()

using (var iterationLocal = deserializationEmitter.DeclareLocal<int>())
{
// for (var i = 0; ...; ...)
deserializationEmitter.LoadConstant(0);
deserializationEmitter.StoreLocal(iterationLocal);

deserializationEmitter.Branch(loopConditionLabel);
deserializationEmitter.MarkLabel(loopBodyLabel);
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.CallVirtual(propInfo.GetGetMethod());
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(1);
deserializationEmitter.NewArray<object>();
deserializationEmitter.Duplicate();
deserializationEmitter.LoadConstant(0);
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.Box<int>();
deserializationEmitter.StoreElement<object>();
if (typeCode == TypeCode.String)
{
var conditionLabel = deserializationEmitter.DefineLabel();
deserializationEmitter.CallVirtual(_binaryReaders[TypeCode.Int16]);

// if (packet.ReadInt16() > 0)
deserializationEmitter.LoadArgument(0); // Packet
deserializationEmitter.CallVirtual(typeof(Packet).GetMethod("ReadInt16", Type.EmptyTypes));
deserializationEmitter.LoadConstant(0);
deserializationEmitter.BranchIfLessOrEqual(conditionLabel);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.CompareGreaterThan();
deserializationEmitter.BranchIfFalse(conditionLabel);

// instance.Property[i] = packet.<Reader>("PropertyName", i);
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.CallVirtual(propInfo.GetGetMethod());
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadArgument(0); // Packet
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(1);
deserializationEmitter.NewArray<object>();
deserializationEmitter.Duplicate();
deserializationEmitter.LoadConstant(0);
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.Box<int>();
deserializationEmitter.StoreElement<object>();
deserializationEmitter.CallVirtual(_binaryReaders[typeCode]);
deserializationEmitter.StoreElement<string>();

deserializationEmitter.MarkLabel(conditionLabel);
}
else
{
// instance.Property[i] = packet.<Reader>("PropertyName", i);
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.CallVirtual(propInfo.GetGetMethod());
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadArgument(0);
deserializationEmitter.LoadConstant(propInfo.Name);
deserializationEmitter.LoadConstant(1);
deserializationEmitter.NewArray<object>();
deserializationEmitter.Duplicate();
deserializationEmitter.LoadConstant(0);
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.Box<int>();
deserializationEmitter.StoreElement<object>();
deserializationEmitter.CallVirtual(_binaryReaders[typeCode]);
deserializationEmitter.StoreElement(propType.GetElementType());
deserializationEmitter.StoreElement(propType.GetElementType());
}

// for (...; ...; i += 1)
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadConstant(1);
deserializationEmitter.Add();
deserializationEmitter.StoreLocal(iterationLocal);
deserializationEmitter.MarkLabel(loopConditionLabel);
// for (...; i < arraySize; ...)
deserializationEmitter.LoadLocal(iterationLocal);
deserializationEmitter.LoadConstant(hotfixAttr.Size);
deserializationEmitter.CompareLessThan();
Expand All @@ -107,8 +143,10 @@ public override void GenerateDeserializer()
}
}

// return instance;
deserializationEmitter.LoadLocal(deserializationResultLocal);
deserializationEmitter.Return();

_deserializer = deserializationEmitter.CreateDelegate();
}
catch (SigilVerificationException sve)
Expand Down
Loading

0 comments on commit 0a92f6a

Please sign in to comment.