Esempio n. 1
0
        public override void ReorderArgumentArray(ref object[] args, object state)
        {
            if (state == null)
            {
                return;
            }

            ReorderState reorder      = (ReorderState)state;
            int          vararg_count = reorder.vararg_count;

            int args_count = args.Length;
            int args_start = 0;

            if (reorder.pass_context)
            {
                args_count--;
                args_start = 1;
            }

            object[] old_args;
            if (vararg_count != -1)
            {
                old_args = new object[args_count + vararg_count - 1];
                Array.Copy(args, args_start, old_args, 0, args_count);
                Array.Copy((Array)args[args.Length - 1], 0, old_args, args.Length - 1, ((Array)args[args.Length - 1]).Length);
            }
            else
            {
                old_args = new object[args_count];
                Array.Copy(args, args_start, old_args, 0, args_count);
            }

            args = old_args;
        }
Esempio n. 2
0
		public override MethodBase BindToMethod (BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state) {
			Type[] types = new Type[args.Length];
			int i = 0;

			foreach (object arg in args) {
				if (arg == null)
					types[i] = typeof (object);
				else
					types[i] = arg.GetType ();
				
				i++;
			}

			int vararg_count;
			Type vararg_type;
			MethodBase method = SelectMethod (bindingAttr, match, types, modifiers, out vararg_count, out vararg_type);
			if (method == null) {
				state = null;
				return null;
			}
				
			bool pass_context = IsPassContext (method);
			if (!pass_context && vararg_count == -1) {
				state = null;
				return method;
			}
		
			object[] new_args;
			if (vararg_count != -1) {
				int new_args_length = args.Length - vararg_count + 1;
				int new_args_start = 0;
				if (pass_context) {
					new_args_length++;
					new_args_start = 1;
				}

				new_args = new object[new_args_length];
				Array.Copy (args, 0, new_args, new_args_start, new_args.Length - 1);
				Array varargs = Array.CreateInstance (vararg_type, vararg_count);
				Array.Copy (args, new_args.Length - 1, varargs, 0, varargs.Length);
				new_args[new_args.Length - 1] = varargs;

				if (pass_context) {
					new_args[0] = Context; 
				}
			} else {
				new_args = new object[args.Length + 1];
				Array.Copy (args, 0, new_args, 1, args.Length);
				new_args[0] = Context;
			}

			args = new_args;
			state = new ReorderState (pass_context, vararg_count);
			return method;
		}
Esempio n. 3
0
        public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state)
        {
            Type[] types = new Type[args.Length];
            int    i     = 0;

            foreach (object arg in args)
            {
                if (arg == null)
                {
                    types[i] = typeof(object);
                }
                else
                {
                    types[i] = arg.GetType();
                }

                i++;
            }

            int        vararg_count;
            Type       vararg_type;
            MethodBase method = SelectMethod(bindingAttr, match, types, modifiers, out vararg_count, out vararg_type);

            if (method == null)
            {
                state = null;
                return(null);
            }

            bool pass_context = IsPassContext(method);

            if (!pass_context && vararg_count == -1)
            {
                state = null;
                return(method);
            }

            object[] new_args;
            if (vararg_count != -1)
            {
                int new_args_length = args.Length - vararg_count + 1;
                int new_args_start  = 0;
                if (pass_context)
                {
                    new_args_length++;
                    new_args_start = 1;
                }

                new_args = new object[new_args_length];
                Array.Copy(args, 0, new_args, new_args_start, new_args.Length - 1);
                Array varargs = Array.CreateInstance(vararg_type, vararg_count);
                Array.Copy(args, new_args.Length - 1, varargs, 0, varargs.Length);
                new_args[new_args.Length - 1] = varargs;

                if (pass_context)
                {
                    new_args[0] = Context;
                }
            }
            else
            {
                new_args = new object[args.Length + 1];
                Array.Copy(args, 0, new_args, 1, args.Length);
                new_args[0] = Context;
            }

            args  = new_args;
            state = new ReorderState(pass_context, vararg_count);
            return(method);
        }