public override void Emit(IEasyMember member, ILGenerator gen) { if (this._reference != null) { ArgumentsUtil.EmitLoadOwnerAndReference(this._reference, gen); } else if (this._expression != null) { this._expression.Emit(member, gen); } else if (member.ReturnType != typeof(void)) { OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(gen, member.ReturnType); } gen.Emit(OpCodes.Ret); }
private void EmitByRef(ILGenerator gen) { var elementType = type.GetElementType(); if (IsPrimitiveOrClass(elementType)) { OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(gen, elementType); OpCodeUtil.EmitStoreIndirectOpCodeForType(gen, elementType); } else if (elementType.GetTypeInfo().IsGenericParameter || elementType.GetTypeInfo().IsValueType) { gen.Emit(OpCodes.Initobj, elementType); } else { throw new ProxyGenerationException("Can't emit default value for reference of type " + elementType); } }
public void Emit(IMemberEmitter member, ILGenerator gen) { if (reference != null) { ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen); } else if (expression != null) { expression.Emit(member, gen); } else { if (member.ReturnType != typeof(void)) { OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(gen, member.ReturnType); } } gen.Emit(OpCodes.Ret); }
public override void Emit(IMemberEmitter member, ILGenerator gen) { // TODO: check if this can be simplified by using more of OpCodeUtil and other existing types if (IsPrimitiveOrClass(type)) { OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(gen, type); } else if (type.IsValueType || type.IsGenericParameter) { // TODO: handle decimal explicitly var local = gen.DeclareLocal(type); gen.Emit(OpCodes.Ldloca_S, local); gen.Emit(OpCodes.Initobj, type); gen.Emit(OpCodes.Ldloc, local); } else if (type.IsByRef) { EmitByRef(gen); } else { throw new ProxyGenerationException("Can't emit default value for type " + type); } }