Commit cd20c903 authored by mgravell's avatar mgravell

use LocalBuilder instead of hard-coded _{0|1|2} in Rainbow

parent 61d1061b
......@@ -109,13 +109,13 @@ private static bool AreEqual<U>(U first, U second)
var il = dm.GetILGenerator();
// change list
il.DeclareLocal(typeof(List<Change>));
il.DeclareLocal(typeof(Change));
il.DeclareLocal(typeof(object)); // boxed change
var list = il.DeclareLocal(typeof(List<Change>));
var change = il.DeclareLocal(typeof(Change));
var boxed = il.DeclareLocal(typeof(object)); // boxed change
il.Emit(OpCodes.Newobj, typeof(List<Change>).GetConstructor(Type.EmptyTypes));
// [list]
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Stloc, list);
foreach (var prop in RelevantProperties())
{
......@@ -138,7 +138,7 @@ private static bool AreEqual<U>(U first, U second)
// [original prop val, current prop val, current prop val boxed]
}
il.Emit(OpCodes.Stloc_2);
il.Emit(OpCodes.Stloc, boxed);
// [original prop val, current prop val]
il.EmitCall(OpCodes.Call, typeof(Snapshot<T>).GetMethod(nameof(AreEqual), BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(new Type[] { prop.PropertyType }), null);
......@@ -153,7 +153,7 @@ private static bool AreEqual<U>(U first, U second)
il.Emit(OpCodes.Dup);
// [change,change]
il.Emit(OpCodes.Stloc_1);
il.Emit(OpCodes.Stloc, change);
// [change]
il.Emit(OpCodes.Ldstr, prop.Name);
......@@ -161,18 +161,18 @@ private static bool AreEqual<U>(U first, U second)
il.Emit(OpCodes.Callvirt, typeof(Change).GetMethod("set_Name"));
// []
il.Emit(OpCodes.Ldloc_1);
il.Emit(OpCodes.Ldloc, change);
// [change]
il.Emit(OpCodes.Ldloc_2);
il.Emit(OpCodes.Ldloc, boxed);
// [change, boxed]
il.Emit(OpCodes.Callvirt, typeof(Change).GetMethod("set_NewValue"));
// []
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ldloc, list);
// [change list]
il.Emit(OpCodes.Ldloc_1);
il.Emit(OpCodes.Ldloc, change);
// [change list, change]
il.Emit(OpCodes.Callvirt, typeof(List<Change>).GetMethod("Add"));
// []
......@@ -180,7 +180,7 @@ private static bool AreEqual<U>(U first, U second)
il.MarkLabel(skip);
}
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ldloc, list);
// [change list]
il.Emit(OpCodes.Ret);
......@@ -195,14 +195,14 @@ private static bool AreEqual<U>(U first, U second)
var il = dm.GetILGenerator();
il.DeclareLocal(typeof(T));
var typed = il.DeclareLocal(typeof(T));
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Stloc, typed);
foreach (var prop in RelevantProperties())
{
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ldloc, typed);
// [clone]
il.Emit(OpCodes.Ldarg_0);
// [clone, source]
......@@ -213,7 +213,7 @@ private static bool AreEqual<U>(U first, U second)
}
// Load new constructed obj on eval stack -> 1 item on stack
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ldloc, typed);
// Return constructed object. --> 0 items on stack
il.Emit(OpCodes.Ret);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment