Skip to content

Commit

Permalink
Possible fix for type conversion exception when using Hv1.1 and Hv1.2…
Browse files Browse the repository at this point in the history
… together
  • Loading branch information
pardeike committed Jul 31, 2018
1 parent 86e4d5f commit c28362a
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
36 changes: 35 additions & 1 deletion Harmony/CodeTranspiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,30 @@ public void Add(MethodInfo transpiler)
transpilers.Add(transpiler);
}

private static object ConvertBlock(object originalBlock, Type type)
{
var block = Activator.CreateInstance(type);
Traverse.IterateFields(originalBlock, block, (trvFrom, trvDest) => trvDest.SetValue(trvFrom.GetValue()));
return block;
}

private static object ConvertBlocks(object originalBlocks, Type type)
{
var enumerableAssembly = type.GetGenericTypeDefinition().Assembly;
var genericListType = enumerableAssembly.GetType(typeof(List<>).FullName);
var elementType = type.GetGenericArguments()[0];
var listType = enumerableAssembly.GetType(genericListType.MakeGenericType(new Type[] { elementType }).FullName);
var blocks = Activator.CreateInstance(listType);
var listAdd = blocks.GetType().GetMethod("Add");
foreach (var originalBlock in originalBlocks as IEnumerable)
{
var block = ConvertBlock(originalBlock, elementType);
listAdd.Invoke(blocks, new object[] { block });
}
return blocks;
}

[UpgradeToLatestVersion(1)]
public static object ConvertInstruction(Type type, object op, out Dictionary<string, object> unassigned)
{
var elementTo = Activator.CreateInstance(type, new object[] { OpCodes.Nop, null });
Expand All @@ -45,6 +69,9 @@ public static object ConvertInstruction(Type type, object op, out Dictionary<str
if (name == nameof(CodeInstruction.opcode))
val = ReplaceShortJumps((OpCode)val);
if (name == nameof(ILInstruction.blocks))
val = ConvertBlocks(val, trvDest.GetValueType());
trvDest.SetValue(val);
});
unassigned = nonExisting;
Expand Down Expand Up @@ -176,6 +203,7 @@ public static IEnumerable ConvertInstructionsAndUnassignedValues(Type type, IEnu
return list as IEnumerable;
}

[UpgradeToLatestVersion(1)]
public static IEnumerable<CodeInstruction> ConvertToOurInstructions(IEnumerable instructions, List<object> originalInstructions, Dictionary<object, Dictionary<string, object>> unassignedValues)
{
var result = new List<CodeInstruction>();
Expand All @@ -187,7 +215,13 @@ public static IEnumerable<CodeInstruction> ConvertToOurInstructions(IEnumerable
index++;

var elementTo = new CodeInstruction(OpCodes.Nop, null);
Traverse.IterateFields(op, elementTo, (trvFrom, trvDest) => trvDest.SetValue(trvFrom.GetValue()));
Traverse.IterateFields(op, elementTo, (name, trvFrom, trvDest) =>
{
var val = trvFrom.GetValue();
if (name == nameof(ILInstruction.blocks))
val = ConvertBlocks(val, trvDest.GetValueType());
trvDest.SetValue(val);
});
if (unassignedValues.TryGetValue(op, out var fields))
{
var addExceptionInfo = ShouldAddExceptionInfo(op, index, originalInstructions, newInstructions, unassignedValues);
Expand Down
9 changes: 9 additions & 0 deletions Harmony/Tools/Traverse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,15 @@ public Traverse SetValue(object value)
return this;
}

public Type GetValueType()
{
if (_info is FieldInfo)
return ((FieldInfo)_info).FieldType;
if (_info is PropertyInfo)
return ((PropertyInfo)_info).PropertyType;
return null;
}

Traverse Resolve()
{
if (_root == null && _type != null) return this;
Expand Down

0 comments on commit c28362a

Please sign in to comment.