private void ProcessPropertySetNormalCompareGeneric(IlBuilder processor) { processor.LoadInt(1); processor.LoadInt(0); var l1 = processor.Instructions[0]; var l2 = processor.Instructions[1]; processor.Instructions.Clear(); var getValueOrDefault = _handler.Import(_pi.PropertyDefinition.PropertyType.GetMethod("GetValueOrDefault")); var getHasValue = _handler.Import(_pi.PropertyDefinition.PropertyType.GetMethod("get_HasValue")); var type = (GenericInstanceType)_pi.PropertyDefinition.PropertyType; var realType = type.GenericArguments[0].FullName; var v0 = processor.DeclareLocal(_pi.PropertyDefinition.PropertyType); var v1 = processor.DeclareLocal(_pi.PropertyDefinition.PropertyType); processor.DeclareLocal(_handler.BoolType); processor.LoadArg(1).SetLoc(0).LoadArg(0).LoadField(_pi.FieldDefinition).SetLoc(1).LoadLocala_S(v0); if (realType == KnownTypesHandler.Decimal) { processor.Call(getValueOrDefault).LoadLocala_S(v1).Call(getValueOrDefault) .Call(_handler.TypeDict[realType]); processor.BrTrue_S(l1).LoadLocala_S(v0).Call(getHasValue).LoadLocala_S(v1).Call(getHasValue); processor.Ceq().LoadInt(0).Ceq().Br_S(l2); } else if (_handler.TypeDict.ContainsKey(realType)) { processor.LoadInt(0).Br_S(l2); var l4 = processor.Instructions[processor.Instructions.Count - 2]; var l3 = processor.Instructions[processor.Instructions.Count - 1]; processor.Instructions.Remove(l3); processor.Instructions.Remove(l4); processor.Call(getHasValue).LoadLocala_S(v1).Call(getHasValue).Bne_Un_S(l1); processor.LoadLocala_S(v0).Call(getHasValue).BrFalse_S(l4).LoadLocala_S(v0); processor.Call(getValueOrDefault).LoadLocala_S(v1).Call(getValueOrDefault) .Call(_handler.TypeDict[realType]).Br_S(l3); processor.Instructions.Add(l4); processor.Instructions.Add(l3); } else { processor.Call(getValueOrDefault); processor.ConvFloaty(realType); processor.LoadLocala_S(v1).Call(getValueOrDefault); processor.ConvFloaty(realType); processor.Bne_Un_S(l1).LoadLocala_S(v0).Call(getHasValue).LoadLocala_S(v1).Call(getHasValue); processor.Ceq().LoadInt(0).Ceq().Br_S(l2); } processor.Instructions.Add(l1); processor.Instructions.Add(l2); processor.Ceq().SetLoc(2).LoadLoc(2); processor.BrTrue_S(_pi.PropertyDefinition.SetMethod.Body.Instructions.LastItem()); }
private static void SetSecendArgForGetNullable(MemberHandler f, IlBuilder il) { if (f.MemberType.IsValueType && f.MemberType == typeof(Guid?)) { il.LoadInt(1); } else if (f.MemberType.IsValueType && f.MemberType == typeof(bool?)) { il.LoadInt(2); } else if (f.MemberType.IsValueType && f.MemberType == typeof(Date?)) { il.LoadInt(3); } else if (f.MemberType.IsValueType && f.MemberType == typeof(Time?)) { il.LoadInt(4); } else { il.LoadInt(0); } }
private void ProcessPropertySetNormalCompareString(IlBuilder processor) { processor.DeclareLocal(_handler.BoolType); processor.LoadArg(1); processor.LoadArg(0); processor.LoadField(_pi.FieldDefinition); var mi = _handler.TypeDict[_pi.PropertyDefinition.PropertyType.FullName]; processor.Call(mi); processor.LoadInt(0); processor.Ceq(); processor.SetLoc(0); processor.LoadLoc(0); processor.BrTrue_S(_pi.PropertyDefinition.SetMethod.Body.Instructions.LastItem()); }
private void GenerateSetValuesDirect(IlBuilder processor, Func <MemberHandler, bool> cb1, Func <MemberHandler, bool> cb2) { // User u = (User)o; processor.DeclareLocal(_model); processor.LoadArg(2).Cast(_model).SetLoc(0); // set values int n = 0; foreach (var f in _info.Members) { if (!f.Is.DbGenerate && !f.Is.HasOne && !f.Is.HasMany && !f.Is.HasAndBelongsToMany) { if (!cb1(f)) { processor.LoadArg(1).LoadArg(0).LoadInt(n); if (cb2(f)) { processor.LoadInt(f.Is.Count ? 1 : 2) .Call(_handler.ModelHandlerBaseTypeNewSpKeyValueDirect); } else { processor.LoadLoc(0); processor.GetMember(f, _handler); if (f.Is.BelongsTo) { processor.CallVirtual(_handler.Import(f.MemberType.GetMethod("get_ForeignKey"))); } else if (f.Is.LazyLoad) { var it = f.MemberType.GetGenericArguments()[0]; processor.CallVirtual(_handler.Import(f.MemberType.GetMethod("get_Value"))); processor.Box(_handler.Import(it)); } else { processor.Box(_handler.Import(f.MemberType)); } processor.Call(_handler.ModelHandlerBaseTypeNewKeyValue); } processor.CallVirtual(_handler.KeyOpValueListAdd); } n++; } } }
private void GenerateLoadRelationValues(bool useIndex, bool noLazy) { int index = _info.SimpleMembers.Length; string methodName = useIndex ? "LoadRelationValuesByIndex" : "LoadRelationValuesByName"; if (noLazy) { methodName = methodName + "NoLazy"; } var method = new MethodDefinition(methodName, MethodAttr, _handler.VoidType); method.Overrides.Add(useIndex ? (noLazy ? _handler.LoadRelationValuesByIndexNoLazy : _handler.LoadRelationValuesByIndex) : (noLazy ? _handler.LoadRelationValuesByNameNoLazy : _handler.LoadRelationValuesByName)); method.Parameters.Add(new ParameterDefinition("o", ParameterAttributes.None, _handler.ObjectType)); method.Parameters.Add(new ParameterDefinition("dr", ParameterAttributes.None, _handler.DataReaderInterface)); var processor = new IlBuilder(method.Body); if (_info.RelationMembers.Length > 0) { // User u = (User)o; processor.DeclareLocal(_model); processor.LoadArg(1).Cast(_model).SetLoc(0); // set values foreach (var f in _info.RelationMembers) { if (f.Is.LazyLoad) { if (noLazy) { processor.LoadLoc(0); processor.GetMember(f, _handler); processor.LoadArg(2); if (useIndex) { processor.LoadInt(index++).CallVirtual(_handler.GetDataReaderMethodInt()); } else { processor.LoadString(f.Name).CallVirtual(_handler.GetDataReaderMethodString()); } processor.LoadInt(0); processor.CallVirtual(_handler.LazyLoadingInterfaceWrite); } } else if (f.Is.BelongsTo) { processor.LoadLoc(0); processor.GetMember(f, _handler); processor.LoadArg(2); if (useIndex) { processor.LoadInt(index++).CallVirtual(_handler.GetDataReaderMethodInt()); } else { processor.LoadString(f.Name).CallVirtual(_handler.GetDataReaderMethodString()); } processor.CallVirtual(_handler.BelongsToInterfaceSetForeignKey); } } } processor.Return(); processor.Append(); _result.Methods.Add(method); }