public bool TryGetAttr(ICallerContext context, SymbolId name, out object value) { if (name == SymbolTable.GeneratorNext) { // next is the most common call on generators, we optimize that call here. We get // two benefits out of this: // 1. Avoid the dictionary lookup for next // 2. Avoid the self-check in the method descriptor (because we know we're binding to a generator) value = new BoundBuiltinFunction(nextFunction, this); return true; } return generatorType.TryGetAttr(context, this, name, out value); }
public bool TryGetAttr(ICallerContext context, SymbolId name, out object value) { switch (name.Id) { case SymbolTable.NameId: value = __name__; return true; case SymbolTable.BasesId: value = BaseClasses; return true; case SymbolTable.ClassId: value = ((IDynamicObject)this).GetDynamicType(); return true; case SymbolTable.SubclassesId: BuiltinFunction rm = BuiltinFunction.MakeMethod("__subclasses__", typeof(DynamicType).GetMethod("LookupSubclasses"), FunctionType.PythonVisible | FunctionType.Method); ; value = new BoundBuiltinFunction(rm, this); return true; case SymbolTable.CallId: //@todo We should provide a method wrapper object rather than directly returning ourselves value = this; return true; default: if (TryLookupSlot(context, name, out value)) { value = Ops.GetDescriptor(value, null, this); return true; } break; } return false; }