public override IEnumerable <string> GetMemberNames()
        {
            var names = new HashSet <string>();

            names.UnionWith(Members.Keys);
            foreach (var m in Mro.Skip(1))
            {
                names.UnionWith(m.GetMemberNames());
            }
            return(DeclaringModule.Interpreter.LanguageVersion.Is3x() ? names.Concat(_classMethods).Distinct() : names);
        }
Esempio n. 2
0
        /// <summary>
        /// Creates a new type for a built-in exception which is the root concrete type.
        /// </summary>
        private static PythonType /*!*/ CreateSubType(PythonType /*!*/ baseType, Type /*!*/ concreteType, Func <string, Exception, Exception> exceptionMaker)
        {
            Assert.NotNull(baseType, concreteType);

            PythonType myType = DynamicHelpers.GetPythonTypeFromType(concreteType);

            myType.ResolutionOrder = Mro.Calculate(myType, new PythonType[] { baseType });
            myType.BaseTypes       = new PythonType[] { baseType };
            myType.HasDictionary   = true;
            myType._makeException  = exceptionMaker;

            return(myType);
        }
Esempio n. 3
0
        public override IEnumerable <string> GetMemberNames()
        {
            var names = new HashSet <string>();

            lock (_lock) {
                names.UnionWith(Members.Keys);
            }
            foreach (var m in Mro.Skip(1))
            {
                names.UnionWith(m.GetMemberNames());
            }
            return(names);
        }
Esempio n. 4
0
        public IEnumerable <string> GetMemberNames(IModuleContext moduleContext)
        {
            var names = new HashSet <string>();

            lock (_members) {
                names.UnionWith(_members.Keys);
            }

            foreach (var m in Mro.Skip(1))
            {
                names.UnionWith(m.GetMemberNames(moduleContext));
            }

            return(names);
        }
        public override IMember GetMember(string name)
        {
            IMember member;

            lock (_lock) {
                if (Members.TryGetValue(name, out member))
                {
                    return(member);
                }

                // Special case names that we want to add to our own Members dict
                var is3x = DeclaringModule.Interpreter.LanguageVersion.Is3x();
                switch (name)
                {
                case "__mro__":
                case "mro":
                    return(is3x ? PythonCollectionType.CreateList(DeclaringModule.Interpreter, LocationInfo.Empty, Mro) : UnknownType);

                case "__dict__":
                    return(is3x ? DeclaringModule.Interpreter.GetBuiltinType(BuiltinTypeId.Dict) : UnknownType);

                case @"__weakref__":
                    return(is3x ? DeclaringModule.Interpreter.GetBuiltinType(BuiltinTypeId.Object) : UnknownType);
                }
            }
            if (Push(this))
            {
                try {
                    foreach (var m in Mro.Reverse())
                    {
                        if (m == this)
                        {
                            return(member);
                        }
                        member = member ?? m.GetMember(name);
                    }
                } finally {
                    Pop();
                }
            }
            return(null);
        }
        public IMember GetMember(IModuleContext context, string name)
        {
            IMember member;

            lock (_members) {
                if (_members.TryGetValue(name, out member))
                {
                    return(member);
                }

                // Special case names that we want to add to our own _members dict
                switch (name)
                {
                case "__mro__":
                    member = _members[name] = new AstPythonSequence(
                        (context as IPythonInterpreter)?.GetBuiltinType(BuiltinTypeId.Tuple),
                        DeclaringModule,
                        Mro,
                        (context as IPythonInterpreter)?.GetBuiltinType(BuiltinTypeId.TupleIterator)
                        );
                    return(member);
                }
            }
            if (Push())
            {
                try {
                    foreach (var m in Mro.Reverse())
                    {
                        if (m == this)
                        {
                            return(member);
                        }
                        member = member ?? m.GetMember(context, name);
                    }
                } finally {
                    Pop();
                }
            }
            return(null);
        }
        public override IMember GetMember(string name)
        {
            // Push/Pop should be lock protected.
            if (Members.TryGetValue(name, out var member))
            {
                return(member);
            }

            // Special case names that we want to add to our own Members dict
            var is3x = DeclaringModule.Interpreter.LanguageVersion.Is3x();

            switch (name)
            {
            case "__mro__":
            case "mro":
                return(is3x ? PythonCollectionType.CreateList(DeclaringModule.Interpreter, Mro) : UnknownType as IMember);

            case "__dict__":
                return(is3x ? DeclaringModule.Interpreter.GetBuiltinType(BuiltinTypeId.Dict) : UnknownType);

            case @"__weakref__":
                return(is3x ? DeclaringModule.Interpreter.GetBuiltinType(BuiltinTypeId.Object) : UnknownType);
            }

            using (_memberGuard.Push(this, out var reentered)) {
                if (!reentered)
                {
                    foreach (var m in Mro.Reverse())
                    {
                        if (m == this)
                        {
                            return(member);
                        }
                        member = member ?? m.GetMember(name);
                    }
                }
                return(null);
            }
        }