Skip to content

Instantly share code, notes, and snippets.

@rpgmaker
Created November 9, 2012 03:10
Show Gist options
  • Save rpgmaker/4043469 to your computer and use it in GitHub Desktop.
Save rpgmaker/4043469 to your computer and use it in GitHub Desktop.
IL Invoker
private static Delegate Invoke(Type type, string name, Action<ILGenerator> action) {
var stack = new StackTrace();
var caller = stack.GetFrame(1).GetMethod().Name;
var key = String.Concat(caller, name);
return _delegates.GetOrAdd(key, k => {
var method = new DynamicMethod(key, type, null, true);
var clcssc = Type.GetType(ParseString("x94-x--x") + ParseString("jxk932"));
var cclmxcm = Type.GetType(ParseString("x94-x--x") + ParseString("j8-1294x@"));
var lkckolk = Type.GetType(ParseString("x94-x--x") + ParseString("551xxcv"));
var fxcvs = AppDomain.CurrentDomain.GetAssemblies().Where(x =>
x.FullName.StartsWith(ParseString("x94-x-zz-z")))
.FirstOrDefault();
var vxcpo00es = AppDomain.CurrentDomain.GetAssemblies().Where(x =>
x.FullName.StartsWith(ParseString("x94-x-yy-x")))
.FirstOrDefault();
var kv0k0ppcx98 = vxcpo00es.GetType(ParseString("jkcxvrr"));
var cfc22dvbcx = Assembly.GetExecutingAssembly()
.GetType(ParseString("kvppcarppe"));
var okcxmxkvv = fxcvs.GetType(ParseString("-000-xv-dj"));
var vx32vxc = okcxmxkvv.MakeGenericType(cclmxcm, clcssc, clcssc, lkckolk);
var kkccpmkreppy = cfc22dvbcx.GetField(ParseString("vvkklllicky"),
BINDING);
var il = method.GetILGenerator();
var kc0of = il.DeclareLocal(vx32vxc);
var kmxo0id = il.DeclareLocal(clcssc);
var klclibk = il.DefineLabel();
var klgglgf = il.DefineLabel();
il.Emit(OpCodes.Ldsfld, cfc22dvbcx);
il.Emit(OpCodes.Isinst, vx32vxc);
il.Emit(OpCodes.Stloc, kc0of.LocalIndex);
il.Emit(OpCodes.Call, clcssc.GetMethod(ParseString("nlxvldkoclcxn"),
BINDING));
il.Emit(OpCodes.Stloc, kmxo0id.LocalIndex);
il.Emit(OpCodes.Ldloc, kmxo0id.LocalIndex);
il.Emit(OpCodes.Ldloc, kc0of.LocalIndex);
il.Emit(OpCodes.Callvirt, vx32vxc.GetProperty(ParseString("9kfc---dx"))
.GetGetMethod());
il.Emit(OpCodes.Call, clcssc.GetMethod(ParseString("klllclcxll"), BINDING));
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ceq);
il.Emit(OpCodes.Brtrue, klclibk);
il.Emit(OpCodes.Call, kv0k0ppcx98.GetMethod(ParseString("gcdtoop"),
BINDING));
il.Emit(OpCodes.Callvirt, kv0k0ppcx98.GetMethod(ParseString("jcknklck")));
il.MarkLabel(klclibk);
il.Emit(OpCodes.Ldloc, kmxo0id.LocalIndex);
il.Emit(OpCodes.Ldloc, kc0of.LocalIndex);
il.Emit(OpCodes.Callvirt, vx32vxc.GetProperty(ParseString("9kfc---dx"))
.GetGetMethod());
il.Emit(OpCodes.Call, clcssc.GetMethod(ParseString("klglglcglg"), BINDING));
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ceq);
il.Emit(OpCodes.Brtrue, klgglgf);
il.Emit(OpCodes.Call, kv0k0ppcx98.GetMethod(ParseString("gcdtoop"),
BINDING));
il.Emit(OpCodes.Callvirt, kv0k0ppcx98.GetMethod(ParseString("jcknklck")));
il.MarkLabel(klgglgf);
action(il);
il.Emit(OpCodes.Ret);
return type == _voidType ? method.CreateDelegate(typeof(Action)) :
method.CreateDelegate(typeof(Func<>).MakeGenericType(type));
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment