public unsafe void TestWriteAssemblerCode() { var method = new DynamicMethod(Guid.NewGuid().ToString(), typeof(object), new[] { typeof(object) }, typeof(string), true); using (var il = new GroboIL(method, false)) { il.Ldarg(0); il.Isinst(typeof(int?)); il.Ret(); } method.CreateDelegate(typeof(Func <object, object>)); var pointer = DynamicMethodInvokerBuilder.DynamicMethodPointerExtractor(method); var b = (byte *)pointer; //var zzz = Convert.FromBase64String(@"VldVU0FSTInOSItsJFhIi3wkYEGJyonRRInDRInQVQ8oBg8oZhAPKMgPKOwPKNAPKPQPKNgPKPwPWUUAD1llEA9ZTTAPWW1AD1lVYA9ZdXAPWZ2QAAAAD1m9oAAAAPIPfMHyD3zl8g980/IPfPfyD3zC8g985g9Y4A8oRiAPKMgPKNAPKNgPWUUgD1lNUA9ZlYAAAAAPWZ2wAAAA8g98wfIPfNPyD3zCD1jgD1ilwAAAAA8rJ0iBxdAAAABIg8cQ/8gPhVf///9Ig8YwXf/LD4VG////Z0ONBFJnQY0EgsHgBEiYSAHF/8kPhSn///9BWltdX17D"); var zzz = Convert.FromBase64String(@"VldVU0FSTInOSItsJFBIi3wkWEGJyonRRInDRInQVQ8oBg8oZhAPKMgPKOwPKNAPKPQPKNgPKPwPWUUAD1llEA9ZTTAPWW1AD1lVYA9ZdXAPWZ2QAAAAD1m9oAAAAPIPfMHyD3zl8g980/IPfPfyD3zC8g985g9Y4A8oRiAPKMgPKNAPKNgPWUUgD1lNUA9ZlYAAAAAPWZ2wAAAA8g98wfIPfNPyD3zCD1jgD1ilwAAAAA8rJ0iBxdAAAABIg8cQ/8gPhVf///9Ig8YwXf/LD4VG////Z0ONBFJnQY0EgsHgBEiYSAHF/8kPhSn///9BWltdX17D"); fixed(byte *z = &zzz[0]) { b = z; for (int i = 0; i < 20; ++i) { for (int j = 0; j < 10; ++j) { Console.Write(string.Format("{0:X2} ", *b++)); } Console.WriteLine(); } } }
private static Func <MethodBase, DynamicMethod> EmitTryCastToDynamicMethod() { var method = new DynamicMethod(Guid.NewGuid().ToString(), typeof(DynamicMethod), new[] { typeof(MethodBase) }, typeof(string), true); using (var il = new GroboIL(method)) { var RTDynamicMethod_t = typeof(DynamicMethod).GetNestedType("RTDynamicMethod", BindingFlags.NonPublic); if (RTDynamicMethod_t == null) { throw new InvalidOperationException("Missing type 'System.Reflection.Emit.DynamicMethod.RTDynamicMethod'"); } il.Ldarg(0); // stack: [method] il.Isinst(RTDynamicMethod_t); // stack: [method as RTDynamicMethod] il.Dup(); // stack: [method as RTDynamicMethod, method as RTDynamicMethod] var retLabel = il.DefineLabel("ret"); il.Brfalse(retLabel); // if(!(method is RTDynamicMethod)] goto ret; stack: [method as RTDynamicMethod] var m_owner_f = RTDynamicMethod_t.GetField("m_owner", BindingFlags.Instance | BindingFlags.NonPublic); if (m_owner_f == null) { throw new InvalidOperationException("Missing field 'System.Reflection.Emit.DynamicMethod.RTDynamicMethod.m_owner'"); } il.Ldfld(m_owner_f); // stack: [((RTDynamicMethod)method).m_owner] il.MarkLabel(retLabel); il.Ret(); } return((Func <MethodBase, DynamicMethod>)method.CreateDelegate(typeof(Func <MethodBase, DynamicMethod>))); }
private static Func <Type, bool> BuildIsATypeBuilderInstChecker() { var dynamicMethod = new DynamicMethod(Guid.NewGuid().ToString(), typeof(bool), new[] { typeof(Type) }, typeof(ReflectionExtensions), true); using (var il = new GroboIL(dynamicMethod)) { il.Ldarg(0); il.Isinst(typeBuilderInstType); il.Ldnull(); il.Cgt(true); il.Ret(); } return((Func <Type, bool>)dynamicMethod.CreateDelegate(typeof(Func <Type, bool>))); }
protected override bool EmitInternal(UnaryExpression node, EmittingContext context, GroboIL.Label returnDefaultValueLabel, ResultType whatReturn, bool extend, out Type resultType) { Type operandType; var result = ExpressionEmittersCollection.Emit(node.Operand, context, returnDefaultValueLabel, ResultType.Value, extend, out operandType); GroboIL il = context.Il; if (operandType.IsValueType) { il.Box(operandType); } il.Isinst(node.Type); if (node.Type.IsValueType) { il.Unbox_Any(node.Type); } resultType = node.Type; return(result); }
private static Func <object, object> EmitResolveVarArgsMethod() { var method = new DynamicMethod(Guid.NewGuid().ToString(), typeof(object), new[] { typeof(object) }, typeof(string), true); using (var il = new GroboIL(method)) { var VarArgMethod_t = typeof(DynamicMethod).Assembly.GetType("System.Reflection.Emit.VarArgMethod"); if (VarArgMethod_t == null) { throw new InvalidOperationException("Missing type 'System.Reflection.Emit.VarArgMethod'"); } il.Ldarg(0); // stack: [value] il.Isinst(VarArgMethod_t); // stack: [(VarArgMethod)value] var retLabel = il.DefineLabel("ret"); il.Dup(); // stack: [(VarArgMethod)value, (VarArgMethod)value] il.Brfalse(retLabel); // if(!(value is VarArgMethod)) goto ret; stack: [value as VarArgMethod] var m_method_f = VarArgMethod_t.GetField("m_method", BindingFlags.Instance | BindingFlags.NonPublic); if (m_method_f == null) { throw new InvalidOperationException("Missing field 'System.Reflection.Emit.VarArgMethod.m_method'"); } var m_dynamicMethod_f = VarArgMethod_t.GetField("m_dynamicMethod", BindingFlags.Instance | BindingFlags.NonPublic); if (m_dynamicMethod_f == null) { throw new InvalidOperationException("Missing field 'System.Reflection.Emit.VarArgMethod.m_dynamicMethod'"); } var temp = il.DeclareLocal(VarArgMethod_t); il.Dup(); il.Stloc(temp); // temp = (VarArgMethod)value; stack: [(VarArgMethod)value] il.Ldfld(m_method_f); // stack: [((VarArgMethod)value).m_method] il.Dup(); // stack: [((VarArgMethod)value).m_method, ((VarArgMethod)value).m_method] il.Brtrue(retLabel); // if(((VarArgMethod)value).m_method != null) goto ret; stack: [((VarArgMethod)value).m_method] il.Pop(); // stack: [] il.Ldloc(temp); // stack: [(VarArgMethod)value] il.Ldfld(m_dynamicMethod_f); // stack: [((VarArgMethod)value).m_dynamicMethod] il.MarkLabel(retLabel); il.Ret(); } return((Func <object, object>)method.CreateDelegate(typeof(Func <object, object>))); }
private static Func <object, object> EmitResolveGenericMethodInfo() { var method = new DynamicMethod(Guid.NewGuid().ToString(), typeof(object), new[] { typeof(object) }, typeof(string), true); using (var il = new GroboIL(method)) { var GenericMethodInfo_t = typeof(DynamicMethod).Assembly.GetType("System.Reflection.Emit.GenericMethodInfo"); if (GenericMethodInfo_t == null) { throw new InvalidOperationException("Missing type 'System.Reflection.Emit.GenericMethodInfo'"); } il.Ldarg(0); // stack: [value] il.Isinst(GenericMethodInfo_t); // stack: [(GenericMethodInfo)value] var retLabel = il.DefineLabel("ret"); il.Dup(); // stack: [(GenericMethodInfo)value, (GenericMethodInfo)value] il.Brfalse(retLabel); // if(!(value is GenericMethodInfo)) goto ret; stack: [value as GenericMethodInfo] var m_methodHandle_f = GenericMethodInfo_t.GetField("m_methodHandle", BindingFlags.Instance | BindingFlags.NonPublic); if (m_methodHandle_f == null) { throw new InvalidOperationException("Missing field 'System.Reflection.Emit.GenericMethodInfo.m_methodHandle'"); } var m_context_f = GenericMethodInfo_t.GetField("m_context", BindingFlags.Instance | BindingFlags.NonPublic); if (m_context_f == null) { throw new InvalidOperationException("Missing field 'System.Reflection.Emit.GenericMethodInfo.m_context'"); } var temp = il.DeclareLocal(GenericMethodInfo_t); il.Dup(); il.Stloc(temp); // temp = (GenericMethodInfo)value; stack: [(GenericMethodInfo)value] il.Ldfld(m_methodHandle_f); // stack: [((GenericMethodInfo)value).m_methodHandle] il.Ldloc(temp); // stack: [((GenericMethodInfo)value).m_methodHandle, (GenericMethodInfo)value] il.Ldfld(m_context_f); // stack: [((GenericMethodInfo)value).m_methodHandle, ((GenericMethodInfo)value).m_context] var getMethodFromHandle_m = HackHelpers.GetMethodDefinition <int>(x => MethodBase.GetMethodFromHandle(default(RuntimeMethodHandle), default(RuntimeTypeHandle))); il.Call(getMethodFromHandle_m); // stack: [MethodBase.GetMethodFromHandle(((GenericMethodInfo)value).m_methodHandle, ((GenericMethodInfo)value).m_context)] il.MarkLabel(retLabel); il.Ret(); } return((Func <object, object>)method.CreateDelegate(typeof(Func <object, object>))); }