internal static int AddOverload(List<Overload>/*!!*/ overloads, MethodInfo/*!*/ realOverload, FunctionImplOptions options) { Overload overload = Overload.Create(realOverload, options); if (overload == null) return DRoutine.InvalidOverloadIndex; int i = 0; while (i < overloads.Count && overloads[i].ParamCount < overload.ParamCount) i++; overloads.Insert(i, overload); return i; }
/// <summary> /// Used by full-reflect. /// </summary> public PhpLibraryFunction(PhpLibraryFunctionDesc/*!*/ functionDesc, Name name, FunctionImplOptions options, int estimatedOverloadCount) : base(functionDesc) { this.name = name; this.options = options; this.overloads = new List<Overload>(estimatedOverloadCount); }
/// <summary> /// Creates an instance of the <see cref="ImplementsFunctionAttribute"/> attribute. /// </summary> /// <param name="name">The name of the PHP function implemented by marked method.</param> /// <param name="options">Options.</param> public ImplementsFunctionAttribute(string name, FunctionImplOptions options) { this.name = name; this.options = options; }
/// <summary> /// Creates an overload of the function. May return <B>null</B> on error. /// </summary> internal static Overload Create(MethodInfo/*!*/ realOverload, FunctionImplOptions options) { ParameterInfo[] parameters = realOverload.GetParameters(); OverloadFlags flags = OverloadFlags.None; short param_count = (short)parameters.Length; if (parameters.Length >= 1 && parameters[0].ParameterType == Types.ScriptContext[0]) { flags |= OverloadFlags.NeedsScriptContext; param_count--; } if (parameters.Length > 0 && parameters[parameters.Length - 1].IsDefined(typeof(ParamArrayAttribute), false)) { flags |= OverloadFlags.IsVararg; param_count--; } if ((options & FunctionImplOptions.NeedsThisReference) != 0) { param_count--; flags |= OverloadFlags.NeedsThisReference; } if ((options & FunctionImplOptions.NeedsVariables) != 0) { param_count--; flags |= OverloadFlags.NeedsVariables; } if ((options & FunctionImplOptions.NeedsNamingContext) != 0) { param_count--; flags |= OverloadFlags.NeedsNamingContext; } if ((options & FunctionImplOptions.NeedsClassContext) != 0) { param_count--; flags |= OverloadFlags.NeedsClassContext; } if ((options & FunctionImplOptions.NotSupported) != 0) { flags |= OverloadFlags.NotSupported; } return new Overload(realOverload, parameters, param_count, flags); }