Beispiel #1
0
        internal void MapParameters(bool reduceByRef) {
            if (reduceByRef) {
                _returnArgs = new List<int>();
                if (CompilerHelpers.GetReturnType(_method) != typeof(void)) {
                    _returnArgs.Add(-1);
                }
            }

            BitArray specialParameters = _resolver.MapSpecialParameters(this);

            if (_instanceBuilder == null) {
                _instanceBuilder = new NullArgBuilder();
            }

            for (int infoIndex = 0; infoIndex < _parameterInfos.Length; infoIndex++) {
                if (!IsSpecialParameter(specialParameters, infoIndex)) {
                    if (reduceByRef) {
                        MapParameterReduceByRef(_parameterInfos[infoIndex]);
                    } else {
                        MapParameter(_parameterInfos[infoIndex]);
                    }
                }
            }

            _returnBuilder = MakeReturnBuilder(specialParameters);
        }
Beispiel #2
0
        public KeywordArgBuilder(ArgBuilder builder, int kwArgCount, int kwArgIndex) 
            : base(builder.ParameterInfo) {

            Debug.Assert(BuilderExpectsSingleParameter(builder));
            _builder = builder;

            Debug.Assert(kwArgIndex < kwArgCount);
            _kwArgCount = kwArgCount;
            _kwArgIndex = kwArgIndex;
        }
Beispiel #3
0
        internal MethodTarget(MethodBinder binder, MethodBase method, int parameterCount, ArgBuilder instanceBuilder, IList<ArgBuilder> argBuilders, ReturnBuilder returnBuilder) {
            this._binder = binder;
            this._method = method;
            this._parameterCount = parameterCount;
            this._instanceBuilder = instanceBuilder;
            this._argBuilders = argBuilders;
            this._returnBuilder = returnBuilder;

            //argBuilders.TrimExcess();
        }
        public void SetMemberValue(CodeGenerator generator, ArgBuilder targetObject, string memberName, LocalBuilder memberValue)
        {
            generator.Ldarg(targetObject);
            if (memberValue.LocalType.FullName.StartsWith("System.Nullable`1["))
            {
                generator.Ldloc(memberValue);
                generator.Load(null);
                generator.If(Cmp.EqualTo);
                generator.LoadMember(typeof(DBNull).GetField("Value"));
                generator.Stloc(memberValue);
                generator.EndIf();
            }
            generator.Load(null);
            //如果输出的DataRow对象为空,而创建DataTable结构
            generator.If(Cmp.EqualTo);
            PropertyInfo columns = typeof(DataTable).GetProperty("Columns");

            generator.Ldloc(locDataTable);
            generator.LoadMember(columns);
            generator.Load(memberName);
            generator.Ldtoken(CommonUtils.GetOriginalTypeOfNullableType(memberValue.LocalType.IsEnum ? typeof(int) : memberValue.LocalType));
            generator.Call(typeof(Type).GetMethod("GetTypeFromHandle", new Type[] { typeof(RuntimeTypeHandle) }));
            generator.Call(typeof(DataColumnCollection).GetMethod("Add", new Type[] { typeof(string), typeof(Type) }));
            generator.Pop();

            generator.Ldloc(locMemberValues);
            generator.Load(memberName);
            generator.Ldloc(memberValue);
            if (memberValue.LocalType.IsValueType)
            {
                generator.Box(memberValue.LocalType.IsEnum ? typeof(int) : memberValue.LocalType);
            }
            generator.Call(typeof(Dictionary <string, object>).GetMethod("Add"));
            generator.Else();
            generator.Ldarg(targetObject);
            generator.Load(memberName);
            generator.Ldloc(memberValue);
            if (memberValue.LocalType.IsValueType)
            {
                generator.Box(memberValue.LocalType);
            }
            generator.Call(typeof(DataRow).GetMethod("set_Item", new Type[] { typeof(string), typeof(object) }));
            generator.EndIf();
        }
Beispiel #5
0
        internal MethodCandidate(OverloadResolver resolver, MethodBase method, List<ParameterWrapper> parameters, ParameterWrapper paramsDict,
            ReturnBuilder returnBuilder, ArgBuilder instanceBuilder, IList<ArgBuilder> argBuilders) {

            Assert.NotNull(resolver, method, instanceBuilder, returnBuilder);
            Assert.NotNullItems(parameters);
            Assert.NotNullItems(argBuilders);

            _resolver = resolver;
            _method = method;
            _instanceBuilder = instanceBuilder;
            _argBuilders = argBuilders;
            _returnBuilder = returnBuilder;
            _parameters = parameters;
            _paramsDict = paramsDict;

            _paramsArrayIndex = ParameterWrapper.IndexOfParamsArray(parameters);

            parameters.TrimExcess();
        }
Beispiel #6
0
        public string[] GetBranches(IGetBranchesArgs args)
        {
            if (args.Permanent)
            {
                ThrowPermanentBranchException();
            }

            var ab = new ArgBuilder();

            ab.Add("branch");
            var branches = RunCommand(ab, args)
                           .Select(line => Regex.Match(line, @"^(?<active>\*)? *(?<name>.*)$"));

            if (args.Current)
            {
                branches = branches.Where(b => b.Groups["active"].Value == "*");
            }
            return(branches.Select(b => b.Groups["name"].Value).ToArray());
        }
Beispiel #7
0
        public Changeset[] DownloadChangesets(IDownloadChangesetArgs args)
        {
            if (String.IsNullOrEmpty(args.Source))
            {
                throw new ArgumentNullException(nameof(args.Source));
            }

            var ab = new ArgBuilder();

            ab.Add(args.CheckOnly ? "incoming" : "pull");
            ab.Add(args.Source);
            if (args.TargetRev != null)
            {
                ab.Add($"--rev {FormatQuery(args.TargetRev)}");
            }

            var r = RunCommand(ab, args);

            return(args.CheckOnly ? ParseChangesets(r) : new Changeset[] { });
        }
            private void InitArgs(Type objType)
            {
                this.xmlWriterArg    = this.ilg.GetArg(0);
                this.contextArg      = this.ilg.GetArg(2);
                this.dataContractArg = this.ilg.GetArg(3);
                this.objectLocal     = this.ilg.DeclareLocal(objType, "objSerialized");
                ArgBuilder arg = this.ilg.GetArg(1);

                this.ilg.Load(arg);
                if (objType == Globals.TypeOfDateTimeOffsetAdapter)
                {
                    this.ilg.ConvertValue(arg.ArgType, Globals.TypeOfDateTimeOffset);
                    this.ilg.Call(XmlFormatGeneratorStatics.GetDateTimeOffsetAdapterMethod);
                }
                else
                {
                    this.ilg.ConvertValue(arg.ArgType, objType);
                }
                this.ilg.Stloc(this.objectLocal);
            }
        public void GetMemberValue(CodeGenerator generator, ArgBuilder targetObject, string memberName, ref LocalBuilder memberValue)
        {
            Type inputType = targetObject.ArgType;
            MemberInfo memberInfo = ConvertorGeneratorHelper.GetMemberInfo(inputType, memberName);
            if (memberInfo == null)
            {
                return;
            }
            Type srcMemberType = ConvertorGeneratorHelper.GetMemberType(memberInfo);
            Type destMemberType = memberValue.LocalType;
            if (memberValue.LocalType.IsAssignableFrom(srcMemberType))
            {
                generator.Ldarg(targetObject);
                generator.LoadMember(memberInfo);
                generator.Stloc(memberValue);
                return;
            }

            Type converTargetType = ConvertorGeneratorHelper.GetOriginalType(destMemberType);

            Type convertSourceType = ConvertorGeneratorHelper.GetOriginalType(srcMemberType);

            //源字段类型是否实现了IConvertible
            if (typeof(IConvertible).IsAssignableFrom(convertSourceType))
            {
                generator.Ldarg(targetObject);
                generator.LoadMember(memberInfo);
                if (convertSourceType.IsValueType)
                {
                    //一定要是原类型
                    generator.Box(srcMemberType);
                }
                generator.Load(converTargetType);
                generator.Call(typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(Type) }));
                if (destMemberType.IsValueType)
                {
                    generator.UnboxAny(destMemberType);
                }
                generator.Stloc(memberValue);
            }
        }
Beispiel #10
0
        public Changeset[] GetChangesets(IGetChangesetsArgs args)
        {
            var ab = new ArgBuilder();

            if (args.Current)
            {
                ab.Add("parent");
            }
            else
            {
                ab.Add("log");
                if (args.Query != null)
                {
                    ab.Add($"--rev \"{FormatQuery(args.Query)}\"");
                }
            }
            ab.Add($"--template \"{XmlLogTemplate}\"");
            var lines = RunCommand(ab, args);

            return(Changeset.FromXml(lines));
        }
            private void InitArgs(Type objType)
            {
                _xmlWriterArg    = _ilg.GetArg(0);
                _contextArg      = _ilg.GetArg(2);
                _dataContractArg = _ilg.GetArg(3);

                _objectLocal = _ilg.DeclareLocal(objType, "objSerialized");
                ArgBuilder objectArg = _ilg.GetArg(1);

                _ilg.Load(objectArg);

                // Copy the data from the DataTimeOffset object passed in to the DateTimeOffsetAdapter.
                // DateTimeOffsetAdapter is used here for serialization purposes to bypass the ISerializable implementation
                // on DateTimeOffset; which does not work in partial trust.

                if (objType == Globals.TypeOfDateTimeOffsetAdapter)
                {
                    _ilg.ConvertValue(objectArg.ArgType, Globals.TypeOfDateTimeOffset);
                    _ilg.Call(XmlFormatGeneratorStatics.GetDateTimeOffsetAdapterMethod);
                }
                else if (objType == Globals.TypeOfMemoryStreamAdapter)
                {
                    _ilg.ConvertValue(objectArg.ArgType, Globals.TypeOfMemoryStream);
                    _ilg.Call(XmlFormatGeneratorStatics.GetMemoryStreamAdapterMethod);
                }
                //Copy the KeyValuePair<K,T> to a KeyValuePairAdapter<K,T>.
                else if (objType.IsGenericType && objType.GetGenericTypeDefinition() == Globals.TypeOfKeyValuePairAdapter)
                {
                    ClassDataContract dc = (ClassDataContract)DataContract.GetDataContract(objType);
                    _ilg.ConvertValue(objectArg.ArgType, Globals.TypeOfKeyValuePair.MakeGenericType(dc.KeyValuePairGenericArguments !));
                    _ilg.New(dc.KeyValuePairAdapterConstructorInfo !);
                }
                else
                {
                    _ilg.ConvertValue(objectArg.ArgType, objType);
                }
                _ilg.Stloc(_objectLocal);
            }
 internal JsonFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract)
 {
     this.ilg = new CodeGenerator();
     bool allowPrivateMemberAccess = classContract.RequiresMemberAccessForWrite(null);
     try
     {
         this.BeginMethod(this.ilg, "Write" + classContract.StableName.Name + "ToJson", typeof(JsonFormatClassWriterDelegate), allowPrivateMemberAccess);
     }
     catch (SecurityException exception)
     {
         if (!allowPrivateMemberAccess || !exception.PermissionType.Equals(typeof(ReflectionPermission)))
         {
             throw;
         }
         classContract.RequiresMemberAccessForWrite(exception);
     }
     this.InitArgs(classContract.UnderlyingType);
     this.memberNamesArg = this.ilg.GetArg(4);
     this.DemandSerializationFormatterPermission(classContract);
     this.DemandMemberAccessPermission(allowPrivateMemberAccess);
     this.WriteClass(classContract);
     return (JsonFormatClassWriterDelegate) this.ilg.EndMethod();
 }
Beispiel #13
0
        private void CreatePermanentBranch(INewBranchArgs args)
        {
            if (!String.IsNullOrEmpty(args.TargetChangeset))
            {
                throw new NotSupportedException($"'{nameof(args.TargetChangeset)}' is not supported for permanent branches.");
            }

            var ab = new ArgBuilder();

            ab.Add("branch");
            ab.Add($"\"{args.Name}\"");
            ab.AddIf(args.Force, "--force");
            RunCommand(ab, args);

            if (args.Commit)
            {
                Commit(new CommitScmFileArgs
                {
                    RepositoryPath = args.RepositoryPath,
                    Message        = $"Opened branch '{args.Name}'"
                });
            }
        }
        public void EndSetMembers(CodeGenerator generator, ArgBuilder targetObject)
        {
            generator.Ldarg(targetObject);
            generator.Load(null);
            generator.If(Cmp.EqualTo);
            generator.Pop();
            LocalBuilder dataRow = generator.DeclareLocal(typeof(DataRow));

            generator.Ldloc(locDataTable);
            generator.Call(typeof(DataTable).GetMethod("NewRow"));
            generator.Stloc(dataRow);

            LocalBuilder locCurrent    = generator.DeclareLocal(typeof(string));
            LocalBuilder locEnumerator = generator.DeclareLocal(typeof(Dictionary <string, object> .KeyCollection.Enumerator));

            generator.Ldloc(locMemberValues);
            generator.Call(typeof(Dictionary <string, object>).GetMethod("get_Keys"));
            generator.Call(typeof(Dictionary <string, object> .KeyCollection).GetMethod("GetEnumerator"));
            generator.Stloc(locEnumerator);
            MethodInfo getCurrentMethod = typeof(Dictionary <string, object> .KeyCollection.Enumerator).GetMethod("get_Current");
            MethodInfo moveNextMethod   = typeof(Dictionary <string, object> .KeyCollection.Enumerator).GetMethod("MoveNext");

            generator.ForEach(locCurrent, typeof(string), typeof(Dictionary <string, object> .KeyCollection.Enumerator), locEnumerator, getCurrentMethod);

            generator.Ldloc(dataRow);
            generator.Ldloc(locCurrent);

            generator.Ldloc(locMemberValues);
            generator.Ldloc(locCurrent);
            generator.Call(typeof(Dictionary <string, object>).GetMethod("get_Item"));

            generator.Call(typeof(DataRow).GetMethod("set_Item", new Type[] { typeof(string), typeof(object) }));
            generator.EndForEach(moveNextMethod);
            generator.Ldloc(dataRow);
            generator.EndIf();
        }
            internal JsonFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract)
            {
                this.ilg = new CodeGenerator();
                bool allowPrivateMemberAccess = classContract.RequiresMemberAccessForWrite(null);

                try
                {
                    this.BeginMethod(this.ilg, "Write" + classContract.StableName.Name + "ToJson", typeof(JsonFormatClassWriterDelegate), allowPrivateMemberAccess);
                }
                catch (SecurityException exception)
                {
                    if (!allowPrivateMemberAccess || !exception.PermissionType.Equals(typeof(ReflectionPermission)))
                    {
                        throw;
                    }
                    classContract.RequiresMemberAccessForWrite(exception);
                }
                this.InitArgs(classContract.UnderlyingType);
                this.memberNamesArg = this.ilg.GetArg(4);
                this.DemandSerializationFormatterPermission(classContract);
                this.DemandMemberAccessPermission(allowPrivateMemberAccess);
                this.WriteClass(classContract);
                return((JsonFormatClassWriterDelegate)this.ilg.EndMethod());
            }
Beispiel #16
0
        public void CheckoutChangeset(ICheckoutChangesetArgs args)
        {
            var ab = new ArgBuilder();

            ab.Add("update");
            if (args.Clean)
            {
                ab.Add("--clean");
            }
            if (args.TargetRev != null)
            {
                ab.Add(args.TargetRev);
            }
            RunCommand(ab, args);

            if (!String.IsNullOrEmpty(args.NewBranchName))
            {
                CreateBranch(new NewBranchArgs
                {
                    Name           = args.NewBranchName,
                    RepositoryPath = args.RepositoryPath
                });
            }
        }
 private void IsStartElement(ArgBuilder nameArg, ArgBuilder nsArg)
 {
     _ilg.Call(_xmlReaderArg, JsonFormatGeneratorStatics.IsStartElementMethod2, nameArg, nsArg);
 }
 void InitArgs()
 {
     xmlReaderArg = ilg.GetArg(0);
     contextArg = ilg.GetArg(1);
     memberNamesArg = ilg.GetArg(2);
     memberNamespacesArg = ilg.GetArg(3);
 }
Beispiel #19
0
        /// <summary>
        /// Starg
        /// </summary>
        /// <param name="arg"></param>
        public void Starg(ArgBuilder arg)
        {
            Check.Require(arg, "arg");

            this.Starg(arg.Index);
        }
Beispiel #20
0
        /// <summary>
        /// Ldarga ���� Ldarga(int) ����
        /// </summary>
        /// <param name="argBuilder"></param>
        public void Ldarga(ArgBuilder argBuilder)
        {
            Check.Require(argBuilder, "argBuilder");

            this.Ldarga(argBuilder.Index);
        }
 void LoadOutputParametersIntoArray(ParameterInfo[] parameters, LocalBuilder[] parameterLocals, ArgBuilder outputParametersArg, out int outputParameterCount)
 {
     outputParameterCount = 0;
     for (int i = 0; i < parameterLocals.Length; i++)
     {
         if (ServiceReflector.FlowsOut(parameters[i]))
         {
             ilg.Load(outputParametersArg);
             ilg.Load(outputParameterCount);
             ilg.Load(parameterLocals[i]);
             ilg.ConvertValue(parameterLocals[i].LocalType, TypeOfObject);
             ilg.Stelem(TypeOfObject);
             outputParameterCount++;
         }
     }
 }
 void LoadInputParametersIntoLocals(ParameterInfo[] parameters, LocalBuilder[] parameterLocals, ArgBuilder inputParametersArg, out int inputParameterCount)
 {
     inputParameterCount = 0;
     for (int i = 0; i < parameterLocals.Length; i++)
     {
         if (ServiceReflector.FlowsIn(parameters[i]))
         {
             Type parameterType = parameterLocals[i].LocalType;
             ilg.LoadArrayElement(inputParametersArg, inputParameterCount);
             if (!parameterType.IsValueType)
             {
                 ilg.ConvertValue(TypeOfObject, parameterType);
                 ilg.Store(parameterLocals[i]);
             }
             else
             {
                 ilg.Dup();
                 ilg.If();
                 ilg.ConvertValue(TypeOfObject, parameterType);
                 ilg.Store(parameterLocals[i]);
                 ilg.Else();
                 ilg.Pop();
                 ilg.LoadZeroValueIntoLocal(parameterType, parameterLocals[i]);
                 ilg.EndIf();
             }
             inputParameterCount++;
         }
     }
 }
 private void InitArgs()
 {
     _xmlReaderArg = _ilg.GetArg(0);
     _contextArg = _ilg.GetArg(1);
     _memberNamesArg = _ilg.GetArg(2);
     _memberNamespacesArg = _ilg.GetArg(3);
 }
Beispiel #24
0
        public void GetMemberValue(CodeGenerator generator, ArgBuilder targetObject, string memberName, ref LocalBuilder memberValue)
        {
            LocalBuilder tempLocal    = generator.DeclareLocal(typeof(object), "dataColumn");
            Type         targetType   = memberValue.LocalType;
            Type         originalType = ConvertorGeneratorHelper.GetOriginalType(targetType);

            generator.Ldarg(targetObject);
            generator.Load(memberName);
            generator.Call(typeof(IDictionary).GetMethod("get_Item", new Type[] { typeof(object) }));
            generator.Stloc(tempLocal);

            generator.Ldloc(tempLocal);
            generator.LoadMember(typeof(DBNull).GetField("Value", BindingFlags.Static | BindingFlags.Public));
            generator.If(Cmp.EqualTo);
            generator.LoadDefaultValue(targetType);
            generator.Stloc(memberValue);
            generator.Else();
            generator.Ldloc(tempLocal);
            //值是否是目标类型的对象
            generator.InternalILGenerator.Emit(OpCodes.Isinst, targetType);
            generator.InternalILGenerator.Emit(OpCodes.Ldnull);
            generator.InternalILGenerator.Emit(OpCodes.Cgt_Un);
            generator.Load(true);
            generator.If(Cmp.EqualTo);
            generator.Ldloc(tempLocal);
            if (targetType.IsValueType)
            {
                generator.UnboxAny(targetType);
            }
            generator.Stloc(memberValue);
            generator.Else();
            if (targetType == typeof(Guid))
            {
                generator.Ldloc(tempLocal);
                generator.InternalILGenerator.Emit(OpCodes.Isinst, typeof(string));
                generator.InternalILGenerator.Emit(OpCodes.Ldnull);
                generator.InternalILGenerator.Emit(OpCodes.Cgt_Un);
                generator.Load(true);
                generator.If(Cmp.EqualTo);
                generator.Ldloc(tempLocal);
                generator.New(typeof(Guid).GetConstructor(new Type[] { typeof(string) }));
                generator.Stloc(memberValue);
            }
            else
            {
                generator.Ldloc(tempLocal);
                generator.InternalILGenerator.Emit(OpCodes.Isinst, typeof(IConvertible));
                generator.InternalILGenerator.Emit(OpCodes.Ldnull);
                generator.InternalILGenerator.Emit(OpCodes.Cgt_Un);
                generator.Load(true);
                generator.If(Cmp.EqualTo);
                generator.Ldloc(tempLocal);
                generator.Load(originalType);
                generator.Call(typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(Type) }));
                if (targetType.IsValueType)
                {
                    generator.UnboxAny(targetType);
                }
                generator.Stloc(memberValue);
            }
            generator.Else();
            generator.LoadDefaultValue(targetType);
            generator.Stloc(memberValue);
            generator.EndIf();
            generator.EndIf();
            generator.EndIf();
        }
Beispiel #25
0
 internal VariantBuilder(VarEnum targetComType, ArgBuilder builder)
 {
     _targetComType = targetComType;
     _argBuilder    = builder;
 }
 private void InitArgs()
 {
     this.xmlReaderArg = this.ilg.GetArg(0);
     this.contextArg = this.ilg.GetArg(1);
     this.memberNamesArg = this.ilg.GetArg(2);
     this.memberNamespacesArg = this.ilg.GetArg(3);
 }
 private CodeGenerator GenerateCollectionReaderHelper(CollectionDataContract collectionContract, bool isGetOnlyCollection)
 {
     this.ilg = new CodeGenerator();
     bool allowPrivateMemberAccess = collectionContract.RequiresMemberAccessForRead(null);
     try
     {
         if (isGetOnlyCollection)
         {
             this.ilg.BeginMethod("Read" + collectionContract.StableName.Name + "FromXmlIsGetOnly", Globals.TypeOfXmlFormatGetOnlyCollectionReaderDelegate, allowPrivateMemberAccess);
         }
         else
         {
             this.ilg.BeginMethod("Read" + collectionContract.StableName.Name + "FromXml" + string.Empty, Globals.TypeOfXmlFormatCollectionReaderDelegate, allowPrivateMemberAccess);
         }
     }
     catch (SecurityException exception)
     {
         if (!allowPrivateMemberAccess || !exception.PermissionType.Equals(typeof(ReflectionPermission)))
         {
             throw;
         }
         collectionContract.RequiresMemberAccessForRead(exception);
     }
     this.InitArgs();
     this.DemandMemberAccessPermission(allowPrivateMemberAccess);
     this.collectionContractArg = this.ilg.GetArg(4);
     return this.ilg;
 }
Beispiel #28
0
 public void EndSetMembers(CodeGenerator generator, ArgBuilder targetObject)
 {
 }
Beispiel #29
0
 internal VariantBuilder(VarEnum targetComType, ArgBuilder builder) {
     _targetComType = targetComType;
     _argBuilder = builder;
 }
            private void InitArgs(Type objType)
            {
                _xmlWriterArg = _ilg.GetArg(0);
                _contextArg = _ilg.GetArg(2);
                _dataContractArg = _ilg.GetArg(3);

                _objectLocal = _ilg.DeclareLocal(objType, "objSerialized");
                ArgBuilder objectArg = _ilg.GetArg(1);
                _ilg.Load(objectArg);

                // Copy the data from the DataTimeOffset object passed in to the DateTimeOffsetAdapter.
                // DateTimeOffsetAdapter is used here for serialization purposes to bypass the ISerializable implementation
                // on DateTimeOffset; which does not work in partial trust.

                if (objType == Globals.TypeOfDateTimeOffsetAdapter)
                {
                    _ilg.ConvertValue(objectArg.ArgType, Globals.TypeOfDateTimeOffset);
                    _ilg.Call(XmlFormatGeneratorStatics.GetDateTimeOffsetAdapterMethod);
                }
                //Copy the KeyValuePair<K,T> to a KeyValuePairAdapter<K,T>. 
                else if (objType.GetTypeInfo().IsGenericType && objType.GetGenericTypeDefinition() == Globals.TypeOfKeyValuePairAdapter)
                {
                    ClassDataContract dc = (ClassDataContract)DataContract.GetDataContract(objType);
                    _ilg.ConvertValue(objectArg.ArgType, Globals.TypeOfKeyValuePair.MakeGenericType(dc.KeyValuePairGenericArguments));
                    _ilg.New(dc.KeyValuePairAdapterConstructorInfo);
                }
                else
                {
                    _ilg.ConvertValue(objectArg.ArgType, objType);
                }
                _ilg.Stloc(_objectLocal);
            }
Beispiel #31
0
 /// <summary>
 /// The underlying builder should expect a single parameter as KeywordArgBuilder is responsible
 /// for calculating the correct parameter to use
 /// </summary>
 /// <param name="builder"></param>
 internal static bool BuilderExpectsSingleParameter(ArgBuilder builder) {
     return (((SimpleArgBuilder)builder).Index == 0);
 }
Beispiel #32
0
 protected string[] RunCommand(string exeName, ArgBuilder args, string workingDir)
 {
     return(RunCommand(exeName, args, null, workingDir));
 }
 internal void Ldarga(ArgBuilder argBuilder) {
     Ldarga(argBuilder.Index);
 }
 void LoadTarget(ArgBuilder targetArg, Type targetType)
 {
     ilg.Load(targetArg);
     ilg.ConvertValue(targetArg.ArgType, targetType);
     if (targetType.IsValueType)
     {
         LocalBuilder targetLocal = ilg.DeclareLocal(targetType, "target");
         ilg.Store(targetLocal);
         ilg.LoadAddress(targetLocal);
     }
 }
 void InitILGeneration(Type[] argTypes, string[] argNames, bool isStatic) {
     this.methodEndLabel = ilGen.DefineLabel();
     this.retLabel = ilGen.DefineLabel();
     this.blockStack = new Stack();
     this.whileStack = new Stack();
     this.currentScope = new LocalScope();
     this.freeLocals = new Dictionary<Tuple<Type, string>, Queue<LocalBuilder>>(); 
     this.argList = new Dictionary<string, ArgBuilder>();
     // this ptr is arg 0 for non static, assuming ref type (not value type) 
     if (!isStatic)
         argList.Add("this", new ArgBuilder("this", 0, this.typeBuilder.BaseType));
     for (int i = 0; i < argTypes.Length; i++) {
         ArgBuilder arg = new ArgBuilder(argNames[i], argList.Count, argTypes[i]);
         argList.Add(arg.Name, arg);
         this.methodBuilder.DefineParameter(arg.Index, ParameterAttributes.None, arg.Name);
     }
 }
            void InitArgs(Type objType)
            {
                xmlWriterArg = ilg.GetArg(0);
                contextArg = ilg.GetArg(2);
                dataContractArg = ilg.GetArg(3);

                objectLocal = ilg.DeclareLocal(objType, "objSerialized");
                ArgBuilder objectArg = ilg.GetArg(1);
                ilg.Load(objectArg);

                // Copy the data from the DataTimeOffset object passed in to the DateTimeOffsetAdapter.
                // DateTimeOffsetAdapter is used here for serialization purposes to bypass the ISerializable implementation
                // on DateTimeOffset; which does not work in partial trust.

                if (objType == Globals.TypeOfDateTimeOffsetAdapter)
                {
                    ilg.ConvertValue(objectArg.ArgType, Globals.TypeOfDateTimeOffset);
                    ilg.Call(XmlFormatGeneratorStatics.GetDateTimeOffsetAdapterMethod);
                }
                else
                {
                    ilg.ConvertValue(objectArg.ArgType, objType);
                }
                ilg.Stloc(objectLocal);
            }
Beispiel #37
0
 protected string[] RunCommand(ArgBuilder args, ICredentials creds, string workingDir)
 {
     return(RunCommand(DefaultExeName, args, creds, workingDir));
 }
Beispiel #38
0
        /// <summary>
        /// LdargAddress ���ز�����ַ��ILû�����ָ������ݲ��������ͷֱ���ò�ͬ��ILָ�
        /// ������Ϊֵ����ʱ��ͨ������Ldargaָ����ز�����ַ
        /// ���β�Ϊֵ����ʱ��ֱ�ӵ���Ldarg���ز���
        /// </summary>
        /// <param name="argBuilder"></param>
        public void LdargAddress(ArgBuilder argBuilder)
        {
            Check.Require(argBuilder, "argBuilder");

            if (argBuilder.ArgType.IsValueType)
            {
                this.Ldarga(argBuilder);
            }
            else
            {
                this.Ldarg(argBuilder);
            }
        }
Beispiel #39
0
        protected string[] RunCommand(string exeName, ArgBuilder args, IScmCommandArgsBase cmd)
        {
            var credentials = (cmd as IRemoteScmCommandArgsBase)?.Credentials;

            return(RunCommand(exeName, args, credentials, cmd.RepositoryPath));
        }
 CodeGenerator GenerateCollectionReaderHelper(CollectionDataContract collectionContract, bool isGetOnlyCollection)
 {
     ilg = new CodeGenerator();
     bool memberAccessFlag = collectionContract.RequiresMemberAccessForRead(null);
     try
     {
         if (isGetOnlyCollection)
         {
             ilg.BeginMethod("Read" + collectionContract.StableName.Name + "FromXml" + "IsGetOnly", Globals.TypeOfXmlFormatGetOnlyCollectionReaderDelegate, memberAccessFlag);
         }
         else
         {
             ilg.BeginMethod("Read" + collectionContract.StableName.Name + "FromXml" + string.Empty, Globals.TypeOfXmlFormatCollectionReaderDelegate, memberAccessFlag);
         }
     }
     catch (SecurityException securityException)
     {
         if (memberAccessFlag && securityException.PermissionType.Equals(typeof(ReflectionPermission)))
         {
             collectionContract.RequiresMemberAccessForRead(securityException);
         }
         else
         {
             throw;
         }
     }
     InitArgs();
     DemandMemberAccessPermission(memberAccessFlag);
     collectionContractArg = ilg.GetArg(4);
     return ilg;
 }
 internal void Ldarg(ArgBuilder arg) {
     Ldarg(arg.Index);
 }
 void IsStartElement(ArgBuilder nameArg, ArgBuilder nsArg)
 {
     ilg.Call(xmlReaderArg, XmlFormatGeneratorStatics.IsStartElementMethod2, nameArg, nsArg);
 }
 private void InitArgs(Type objType)
 {
     this.xmlWriterArg = this.ilg.GetArg(0);
     this.contextArg = this.ilg.GetArg(2);
     this.dataContractArg = this.ilg.GetArg(3);
     this.objectLocal = this.ilg.DeclareLocal(objType, "objSerialized");
     ArgBuilder arg = this.ilg.GetArg(1);
     this.ilg.Load(arg);
     if (objType == Globals.TypeOfDateTimeOffsetAdapter)
     {
         this.ilg.ConvertValue(arg.ArgType, Globals.TypeOfDateTimeOffset);
         this.ilg.Call(XmlFormatGeneratorStatics.GetDateTimeOffsetAdapterMethod);
     }
     else
     {
         this.ilg.ConvertValue(arg.ArgType, objType);
     }
     this.ilg.Stloc(this.objectLocal);
 }
 internal void LdargAddress(ArgBuilder argBuilder) {
     if (argBuilder.ArgType.IsValueType)
         Ldarga(argBuilder);
     else
         Ldarg(argBuilder);
 }
 internal void LdargAddress(ArgBuilder argBuilder)
 {
     if (argBuilder.ArgType.IsValueType)
     {
         this.Ldarga(argBuilder);
     }
     else
     {
         this.Ldarg(argBuilder);
     }
 }
 internal void Starg(ArgBuilder arg)
 {
     Starg(arg.Index);
 }
        public void GetMemberValue(CodeGenerator generator, ArgBuilder targetObject, string memberName, ref LocalBuilder memberValue)
        {
            MethodInfo getMethod;
            bool       mustBeUnBox = false;

            switch (Type.GetTypeCode(memberValue.LocalType))
            {
            //从实测的效果来看,使用特定的函数将不会提高性能,反而性能会更低。
            case TypeCode.Boolean:
                getMethod = typeof(IDataRecord).GetMethod("GetBoolean");
                break;

            case TypeCode.Byte:
                getMethod = typeof(IDataRecord).GetMethod("GetByte");
                break;

            case TypeCode.Char:
                getMethod = typeof(IDataRecord).GetMethod("GetChar");
                break;

            case TypeCode.DateTime:
                getMethod = typeof(IDataRecord).GetMethod("GetDateTime");
                break;

            case TypeCode.Decimal:
                getMethod = typeof(IDataRecord).GetMethod("GetDecimal");
                break;

            case TypeCode.Double:
                getMethod = typeof(IDataRecord).GetMethod("GetDouble");
                break;

            case TypeCode.Single:
                getMethod = typeof(IDataRecord).GetMethod("GetFloat");
                break;

            case TypeCode.UInt16:
                getMethod = typeof(IDataRecord).GetMethod("GetInt16");
                break;

            case TypeCode.Int32:
                getMethod = typeof(IDataRecord).GetMethod("GetInt32");
                break;

            case TypeCode.Int64:
                getMethod = typeof(IDataRecord).GetMethod("GetInt64");
                break;

            case TypeCode.String:
                getMethod = typeof(IDataRecord).GetMethod("GetString");
                break;

            default:
                getMethod   = typeof(IDataRecord).GetMethod("GetValue");
                mustBeUnBox = true;
                break;
            }
            if (memberValue.LocalType == typeof(Guid))
            {
                getMethod   = typeof(IDataRecord).GetMethod("GetGuid");
                mustBeUnBox = false;
            }

            var index = generator.DeclareLocal(typeof(int));

            generator.Ldarg(targetObject);
            generator.Load(memberName);
            generator.Call(typeof(IDataRecord).GetMethod("GetOrdinal"));
            generator.Stloc(index);

            generator.Ldarg(targetObject);
            generator.Ldloc(index);
            generator.Call(typeof(IDataRecord).GetMethod("IsDBNull"));
            generator.If();   //if

            generator.LoadDefaultValue(memberValue.LocalType);
            generator.Stloc(memberValue);

            generator.Else(); //else

            generator.Ldarg(targetObject);
            generator.Ldloc(index);
            generator.Call(getMethod);

            if (memberValue.LocalType.IsValueType && mustBeUnBox)
            {
                generator.UnboxAny(memberValue.LocalType);
            }

            generator.Stloc(memberValue);

            generator.EndIf(); //end
        }
        //This code is not tested
        internal void StoreOutParam(ArgBuilder arg, object value)
        {
            Type destType = arg.ArgType;
            if (!destType.IsByRef)
                throw new InvalidOperationException("OutParametersMustBeByRefTypeReceived"); //.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.OutParametersMustBeByRefTypeReceived, DataContract.GetClrTypeFullName(destType))));
            destType = destType.GetElementType();

            Type sourceType;
            if (value is ArgBuilder)
                sourceType = ((ArgBuilder) value).ArgType;
            else if (value is LocalBuilder)
                sourceType = ((LocalBuilder) value).LocalType;
            else if (value != null)
                sourceType = value.GetType();
            else
                sourceType = null;

            Load(arg);
            Load(value);
            if (sourceType != null)
                ConvertAddress(sourceType, destType);
            Stind(destType);
        }
        public override ConvertHandler GetConvertHandler(Type inputType, Type outputType, object inputObject, object outputObject, Dictionary<string, string> mappingNames, List<string> ignoreList, Dictionary<int, string> mappingOrders, bool mappingSpecifiedOnly)
        {
            //保存目标字段名,目标MemberInfo
            Dictionary<string, string> distToSrc = new Dictionary<string, string>();
            Dictionary<string, MemberInfo> members = new Dictionary<string, MemberInfo>();
            //先查找显式映射
            foreach (string sourceName in mappingNames.Keys)
            {
                MemberInfo sourceMember = ConvertorGeneratorHelper.GetMemberInfo(inputType, sourceName);
                Check.Require(sourceMember != null, string.Format("member named {0} could not be found in {1}", sourceName, outputType.FullName));
                distToSrc.Add(mappingNames[sourceName], sourceName);
                members.Add(mappingNames[sourceName], sourceMember);
            }
            //如果不是只显式映射
            if (!mappingSpecifiedOnly)
            {
                Dictionary<string, MemberInfo> sourceMembers = ConvertorGeneratorHelper.GetMembers(inputType);
                foreach (string sourceName in sourceMembers.Keys)
                {
                    if (!ignoreList.Contains(sourceName) && !distToSrc.ContainsKey(sourceName))
                    {
                        distToSrc.Add(sourceName, sourceName);
                        members.Add(sourceName, sourceMembers[sourceName]);
                    }
                }
            }

            CodeGenerator gen = new CodeGenerator();
            gen.BeginMethod("m" + Guid.NewGuid().ToString("N"), typeof(ConvertHandler));

            ArgBuilder inputObjectArg = new ArgBuilder(0, inputType);
            ArgBuilder outputObjectArg = new ArgBuilder(1, outputType);

            int currentCount = 0;
            int memberCount = members.Count;
            string[] keys = new string[memberCount];
            distToSrc.Keys.CopyTo(keys, 0);
            List<string> keyList = new List<string>(keys);
            MemberSetterGenerator.BeginSetMembers(gen, outputObjectArg);
            //按排序顺序
            while (currentCount < memberCount)
            {
                currentCount++;
                string targetName = ConvertorGeneratorHelper.GetCurrentKey(mappingOrders, currentCount, keyList);
                if (string.IsNullOrEmpty(targetName))
                {
                    continue;
                }
                string sourceName = distToSrc[targetName];
                if (MemberGetterGenerator.ContainsMember(sourceName, inputType, inputObject) && MemberSetterGenerator.ContainsMember(targetName, outputType, outputObject))
                {
                    Type targetType = ConvertorGeneratorHelper.GetMemberType(members[targetName]);

                    LocalBuilder memberValue = gen.DeclareLocal(targetType, "memberValue");

                    MemberGetterGenerator.GetMemberValue(gen, inputObjectArg, sourceName, ref memberValue);

                    MemberSetterGenerator.SetMemberValue(gen, outputObjectArg, targetName, memberValue);
                }
            }
            gen.Ldarg(outputObjectArg);
            MemberSetterGenerator.EndSetMembers(gen, outputObjectArg);
            return (ConvertHandler)gen.EndMethod();
        }
        // TODO: We might want to add bitmap of all consumed arguments and allow to consume an arbitrary argument, not just the next one.
        public void AddBuilder(ArgBuilder builder) {
            ContractUtils.Requires(builder.ConsumedArgumentCount != ArgBuilder.AllArguments);

            _arguments.Add(builder);
            _argIndex += builder.ConsumedArgumentCount;
        }
Beispiel #51
0
 protected string[] RunCommand(ArgBuilder args, IScmCommandArgsBase cmd)
 {
     return(RunCommand(DefaultExeName, args, cmd));
 }