private static MethodIL EmitInitBlock(MethodDesc method, bool unaligned) { ILEmitter emit = new ILEmitter(); ILCodeStream codeStream = emit.NewCodeStream(); codeStream.EmitLdArg(0); codeStream.EmitLdArg(1); codeStream.EmitLdArg(2); if (unaligned) { codeStream.EmitUnaligned(); } codeStream.Emit(ILOpcode.initblk); codeStream.Emit(ILOpcode.ret); return(emit.Link(method)); }
private static MethodIL EmitReadWrite(MethodDesc method, bool write, bool unaligned = false) { Debug.Assert(method.Signature.IsStatic && method.Signature.Length == (write ? 2 : 1)); TypeSystemContext context = method.Context; ILEmitter emit = new ILEmitter(); ILCodeStream codeStream = emit.NewCodeStream(); codeStream.EmitLdArg(0); if (write) { codeStream.EmitLdArg(1); } if (unaligned) { codeStream.EmitUnaligned(); } codeStream.Emit(write ? ILOpcode.stobj : ILOpcode.ldobj, emit.NewToken(context.GetSignatureVariable(0, method: true))); codeStream.Emit(ILOpcode.ret); return(emit.Link(method)); }