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 switch (name) { case "__mro__": member = AddMember(name, PythonCollectionType.CreateList(DeclaringModule.Interpreter, LocationInfo.Empty, Mro), true); return(member); } } if (Push()) { try { foreach (var m in Mro.Reverse()) { if (m == this) { return(member); } member = member ?? m.GetMember(name); } } finally { Pop(); } } return(null); }
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); } }