/// <summary> /// Gets a builtin function for the given declaring type and member infos. /// /// Given the same inputs this always returns the same object ensuring there's only 1 builtinfunction /// for each .NET method. /// /// This method takes both a cacheName and a pythonName. The cache name is the real method name. The pythonName /// is the name of the method as exposed to Python. /// </summary> internal static BuiltinFunction /*!*/ GetBuiltinFunction(Type /*!*/ type, string /*!*/ cacheName, string /*!*/ pythonName, FunctionType?funcType, params MemberInfo /*!*/[] /*!*/ mems) { BuiltinFunction res = null; if (mems.Length != 0) { FunctionType ft = funcType ?? GetMethodFunctionType(type, mems); type = GetBaseDeclaringType(type, mems); BuiltinFunctionKey cache = new BuiltinFunctionKey(type, new ReflectionCache.MethodBaseCache(cacheName, GetNonBaseHelperMethodInfos(mems)), ft); lock (_functions) { if (!_functions.TryGetValue(cache, out res)) { if (PythonTypeOps.GetFinalSystemType(type) == type) { IList <MethodInfo> overriddenMethods = NewTypeMaker.GetOverriddenMethods(type, cacheName); if (overriddenMethods.Count > 0) { List <MemberInfo> newMems = new List <MemberInfo>(mems); foreach (MethodInfo mi in overriddenMethods) { newMems.Add(mi); } mems = newMems.ToArray(); } } _functions[cache] = res = BuiltinFunction.MakeMethod(pythonName, ReflectionUtils.GetMethodInfos(mems), type, ft); } } } return(res); }
/// <summary> /// Gets a builtin function for the given declaring type and member infos. /// /// Given the same inputs this always returns the same object ensuring there's only 1 builtinfunction /// for each .NET method. /// /// This method takes both a cacheName and a pythonName. The cache name is the real method name. The pythonName /// is the name of the method as exposed to Python. /// </summary> internal static BuiltinFunction/*!*/ GetBuiltinFunction(Type/*!*/ type, string/*!*/ cacheName, string/*!*/ pythonName, FunctionType? funcType, params MemberInfo/*!*/[]/*!*/ mems) { BuiltinFunction res = null; if (mems.Length != 0) { FunctionType ft = funcType ?? GetMethodFunctionType(type, mems); type = GetBaseDeclaringType(type, mems); BuiltinFunctionKey cache = new BuiltinFunctionKey(type, new ReflectionCache.MethodBaseCache(cacheName, GetNonBaseHelperMethodInfos(mems)), ft); lock (_functions) { if (!_functions.TryGetValue(cache, out res)) { if (PythonTypeOps.GetFinalSystemType(type) == type) { IList<MethodInfo> overriddenMethods = NewTypeMaker.GetOverriddenMethods(type, cacheName); if (overriddenMethods.Count > 0) { List<MemberInfo> newMems = new List<MemberInfo>(mems); foreach (MethodInfo mi in overriddenMethods) { newMems.Add(mi); } mems = newMems.ToArray(); } } _functions[cache] = res = BuiltinFunction.MakeMethod(pythonName, ReflectionUtils.GetMethodInfos(mems), type, ft); } } } return res; }
/// <summary> /// Gets a builtin function for the given declaring type and member infos. /// /// Given the same inputs this always returns the same object ensuring there's only 1 builtinfunction /// for each .NET method. /// /// This method takes both a cacheName and a pythonName. The cache name is the real method name. The pythonName /// is the name of the method as exposed to Python. /// </summary> internal static BuiltinFunction/*!*/ GetBuiltinFunction(Type/*!*/ type, string/*!*/ cacheName, string/*!*/ pythonName, FunctionType? funcType, params MemberInfo/*!*/[]/*!*/ mems) { BuiltinFunction res = null; if (mems.Length != 0) { FunctionType ft = funcType ?? GetMethodFunctionType(type, mems); type = GetBaseDeclaringType(type, mems); BuiltinFunctionKey cache = new BuiltinFunctionKey(type, new ReflectionCache.MethodBaseCache(cacheName, GetNonBaseHelperMethodInfos(mems)), ft); lock (_functions) { if (!_functions.TryGetValue(cache, out res)) { _functions[cache] = res = BuiltinFunction.MakeMethod(pythonName, ReflectionUtils.GetMethodInfos(mems), type, ft); } } } return res; }