Esempio n. 1
0
        private void OverrideSpecialName(MethodInfo mi, Dictionary<string, string[]> specialNames, Dictionary<PropertyInfo, PropertyBuilder> overridden) {
            if (!mi.IsVirtual || mi.IsFinal) {
                // TODO: A better check here would be mi.IsFamily && mi.IsSpecialName.  But we need to also check
                // the other property method (getter if we're a setter, setter if we're a getter) because if one is protected
                // and the other isn't we need to still override both (so our newslot property is also both a getter and a setter).
                if ((mi.IsProtected() || mi.IsSpecialName) && (mi.Name.StartsWith("get_") || mi.Name.StartsWith("set_"))) {
                    // need to be able to call into protected getter/setter methods from derived types,
                    // even if these methods aren't virtual and we are in partial trust.
                    specialNames[mi.Name] = new[] { mi.Name };
                    MethodBuilder mb = CreateSuperCallHelper(mi);

                    foreach (PropertyInfo pi in mi.DeclaringType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) {

                        if (pi.GetGetMethod(true).MemberEquals(mi) || pi.GetSetMethod(true).MemberEquals(mi)) {
                            AddPublicProperty(mi, overridden, mb, pi);
                            break;
                        }
                    }
                }
            } else if (!TryOverrideProperty(mi, specialNames, overridden)) {
                string name;
                EventInfo[] eis = mi.DeclaringType.GetEvents(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                foreach (EventInfo ei in eis) {
                    if (ei.GetAddMethod().MemberEquals(mi)) {
                        if (NameConverter.TryGetName(DynamicHelpers.GetPythonTypeFromType(mi.DeclaringType), ei, mi, out name) == NameType.None) return;
                        CreateVTableEventOverride(mi, mi.Name);
                        return;
                    } else if (ei.GetRemoveMethod().MemberEquals(mi)) {
                        if (NameConverter.TryGetName(DynamicHelpers.GetPythonTypeFromType(mi.DeclaringType), ei, mi, out name) == NameType.None) return;
                        CreateVTableEventOverride(mi, mi.Name);
                        return;
                    }
                }

                OverrideBaseMethod(mi, specialNames);
            }
        }
Esempio n. 2
0
        private void OverrideBaseMethod(MethodInfo mi, Dictionary<string, string[]> specialNames) {
            if ((!mi.IsVirtual || mi.IsFinal) && !mi.IsProtected()) {
                return;
            }

            PythonType basePythonType = GetBaseTypeForMethod(mi);

            string name = null;
            if (NameConverter.TryGetName(basePythonType, mi, out name) == NameType.None)
                return;

            if (mi.DeclaringType == typeof(object) && mi.Name == "Finalize") return;

            specialNames[mi.Name] = new[] { mi.Name };

            if (!mi.IsStatic) {
                CreateVTableMethodOverride(mi, name);
            }
            if (!mi.IsAbstract) {
                CreateSuperCallHelper(mi);
            }
        }
Esempio n. 3
0
        private static MethodInfo FilterProtectedGetterOrSetter(MethodInfo info, bool privateBinding) {
            if (info != null) {
                if (privateBinding || info.IsPublic) {
                    return info;
                }

                if (info.IsProtected()) {
                    return info;
                }
            }

            return null;
        }
Esempio n. 4
0
        private void OverrideBaseMethod(MethodInfo mi) {
            if ((!mi.IsVirtual || mi.IsFinal) && !mi.IsProtected()) {
                return;
            }

            Type baseType;
            if (_baseType == mi.DeclaringType || _baseType.IsSubclassOf(mi.DeclaringType)) {
                baseType = _baseType;
            } else {
                // We must be inherting from an interface
                Debug.Assert(mi.DeclaringType.IsInterface);
                baseType = mi.DeclaringType;
            }

            string name = null;
            if (!TryGetName(baseType, mi, out name)) return;

            if (mi.DeclaringType == typeof(object) && mi.Name == "Finalize") return;

            _specialNames.SetSpecialName(mi.Name);

            if (!mi.IsStatic) {
                CreateVTableMethodOverride(mi, name);
            }
            if (!mi.IsAbstract) {
                CreateSuperCallHelper(mi);
            }
        }
Esempio n. 5
0
        private void OverrideSpecialName(MethodInfo mi, Dictionary<PropertyInfo, PropertyBuilder> overridden) {
            if (!mi.IsVirtual || mi.IsFinal) {
                if ((mi.IsProtected() || mi.IsSpecialName) && (mi.Name.StartsWith("get_") || mi.Name.StartsWith("set_"))) {
                    // need to be able to call into protected getter/setter methods from derived types,
                    // even if these methods aren't virtual and we are in partial trust.
                    _specialNames.SetSpecialName(mi.Name);
                    MethodBuilder mb = CreateSuperCallHelper(mi);

                    foreach (PropertyInfo pi in mi.DeclaringType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) {
                        if (pi.GetGetMethod(true) == mi || pi.GetSetMethod(true) == mi) {
                            AddPublicProperty(mi, overridden, mb, pi);
                            break;
                        }
                    }
                }
            } else if (!TryOverrideProperty(mi, overridden)) {
                EventInfo[] eis = mi.DeclaringType.GetEvents(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                foreach (EventInfo ei in eis) {
                    if (ei.GetAddMethod() == mi) {
                        CreateVTableMethodOverride(mi, mi.Name);
                        return;
                    } else if (ei.GetRemoveMethod() == mi) {
                        CreateVTableMethodOverride(mi, mi.Name);
                        return;
                    }
                }

                OverrideBaseMethod(mi);
            }
        }
Esempio n. 6
0
 static void ConsiderMethod(MethodInfo m, Dictionary<IPersistentVector, IList<MethodInfo>> mm)
 {
     IPersistentVector mk = MSig(m);
     if (!(mm.ContainsKey(mk)
         || !(m.IsPublic || m.IsProtected())
         || m.IsStatic
         || m.IsFinal))
         AddMethod(mm, mk, m);
 }