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) ...@@ -109,13 +109,13 @@ private static bool AreEqual<U>(U first, U second)
var il = dm.GetILGenerator(); var il = dm.GetILGenerator();
// change list // change list
il.DeclareLocal(typeof(List<Change>)); var list = il.DeclareLocal(typeof(List<Change>));
il.DeclareLocal(typeof(Change)); var change = il.DeclareLocal(typeof(Change));
il.DeclareLocal(typeof(object)); // boxed change var boxed = il.DeclareLocal(typeof(object)); // boxed change
il.Emit(OpCodes.Newobj, typeof(List<Change>).GetConstructor(Type.EmptyTypes)); il.Emit(OpCodes.Newobj, typeof(List<Change>).GetConstructor(Type.EmptyTypes));
// [list] // [list]
il.Emit(OpCodes.Stloc_0); il.Emit(OpCodes.Stloc, list);
foreach (var prop in RelevantProperties()) foreach (var prop in RelevantProperties())
{ {
...@@ -138,7 +138,7 @@ private static bool AreEqual<U>(U first, U second) ...@@ -138,7 +138,7 @@ private static bool AreEqual<U>(U first, U second)
// [original prop val, current prop val, current prop val boxed] // [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] // [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); 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) ...@@ -153,7 +153,7 @@ private static bool AreEqual<U>(U first, U second)
il.Emit(OpCodes.Dup); il.Emit(OpCodes.Dup);
// [change,change] // [change,change]
il.Emit(OpCodes.Stloc_1); il.Emit(OpCodes.Stloc, change);
// [change] // [change]
il.Emit(OpCodes.Ldstr, prop.Name); il.Emit(OpCodes.Ldstr, prop.Name);
...@@ -161,18 +161,18 @@ private static bool AreEqual<U>(U first, U second) ...@@ -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.Callvirt, typeof(Change).GetMethod("set_Name"));
// [] // []
il.Emit(OpCodes.Ldloc_1); il.Emit(OpCodes.Ldloc, change);
// [change] // [change]
il.Emit(OpCodes.Ldloc_2); il.Emit(OpCodes.Ldloc, boxed);
// [change, boxed] // [change, boxed]
il.Emit(OpCodes.Callvirt, typeof(Change).GetMethod("set_NewValue")); il.Emit(OpCodes.Callvirt, typeof(Change).GetMethod("set_NewValue"));
// [] // []
il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ldloc, list);
// [change list] // [change list]
il.Emit(OpCodes.Ldloc_1); il.Emit(OpCodes.Ldloc, change);
// [change list, change] // [change list, change]
il.Emit(OpCodes.Callvirt, typeof(List<Change>).GetMethod("Add")); il.Emit(OpCodes.Callvirt, typeof(List<Change>).GetMethod("Add"));
// [] // []
...@@ -180,7 +180,7 @@ private static bool AreEqual<U>(U first, U second) ...@@ -180,7 +180,7 @@ private static bool AreEqual<U>(U first, U second)
il.MarkLabel(skip); il.MarkLabel(skip);
} }
il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ldloc, list);
// [change list] // [change list]
il.Emit(OpCodes.Ret); il.Emit(OpCodes.Ret);
...@@ -195,14 +195,14 @@ private static bool AreEqual<U>(U first, U second) ...@@ -195,14 +195,14 @@ private static bool AreEqual<U>(U first, U second)
var il = dm.GetILGenerator(); var il = dm.GetILGenerator();
il.DeclareLocal(typeof(T)); var typed = il.DeclareLocal(typeof(T));
il.Emit(OpCodes.Newobj, ctor); il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Stloc_0); il.Emit(OpCodes.Stloc, typed);
foreach (var prop in RelevantProperties()) foreach (var prop in RelevantProperties())
{ {
il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ldloc, typed);
// [clone] // [clone]
il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_0);
// [clone, source] // [clone, source]
...@@ -213,7 +213,7 @@ private static bool AreEqual<U>(U first, U second) ...@@ -213,7 +213,7 @@ private static bool AreEqual<U>(U first, U second)
} }
// Load new constructed obj on eval stack -> 1 item on stack // 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 // Return constructed object. --> 0 items on stack
il.Emit(OpCodes.Ret); 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