public static MethodWrapper Make(DynamicType pt, SymbolId name) { MethodWrapper ret = new MethodWrapper(pt, name); object meth; if (pt.dict.TryGetValue(name, out meth)) { object otherMeth; if (!pt.TryLookupSlotInBases(DefaultContext.Default, name, out otherMeth) || otherMeth != meth) { ret.SetDeclaredMethod(meth); } else { // they did __foo__ = myBase.__foo__, we'll just ignore it... ret.UpdateFromBases(pt.MethodResolutionOrder); } } else { ret.UpdateFromBases(pt.MethodResolutionOrder); } //pt.dict[name] = ret; //??? return ret; }
public static MethodWrapper MakeForObject(DynamicType pt, SymbolId name, Delegate func) { MethodWrapper ret = new MethodWrapper(pt, name); ret.isObjectMethod = true; ret.isBuiltinMethod = true; ret.isSuperTypeMethod = false; ret.func = BuiltinFunction.MakeMethod((string)SymbolTable.IdToString(name), func.Method, FunctionType.Function); ret.funcAsFunc = ret.func as BuiltinFunction; //pt.dict[name] = ret; return ret; }
protected void AddProtocolWrappersForObject() { __getitem__F = MethodWrapper.MakeUndefined(this, SymbolTable.GetItem); __setitem__F = MethodWrapper.MakeUndefined(this, SymbolTable.SetItem); __getattribute__F = MethodWrapper.MakeForObject(this, SymbolTable.GetAttribute, new CallTarget2(GetAttributeMethod)); __getattr__F = MethodWrapper.MakeUndefined(this, SymbolTable.GetAttr); __setattr__F = MethodWrapper.MakeForObject(this, SymbolTable.SetAttr, new CallTarget3(SetAttrMethod)); __delattr__F = MethodWrapper.MakeForObject(this, SymbolTable.DelAttr, new CallTarget2(DelAttrMethod)); __cmp__F = MethodWrapper.MakeUndefined(this, SymbolTable.Cmp); __str__F = MethodWrapper.MakeForObject(this, SymbolTable.String, new CallTarget1(StrMethod)); __repr__F = MethodWrapper.MakeForObject(this, SymbolTable.Repr, new CallTarget1(ReprMethod)); __hash__F = MethodWrapper.MakeForObject(this, SymbolTable.Hash, new CallTarget1(HashMethod)); }
private void UpdateFromBase(MethodWrapper mw) { func = mw.func; funcAsFunc = mw.func as BuiltinFunction; isObjectMethod = mw.isObjectMethod; isBuiltinMethod = mw.isBuiltinMethod; isSuperTypeMethod = true; }
protected void AddProtocolWrappers() { if (type == typeof(object)) { AddProtocolWrappersForObject(); return; } __getitem__F = MethodWrapper.Make(this, SymbolTable.GetItem); __setitem__F = MethodWrapper.Make(this, SymbolTable.SetItem); __getattribute__F = MethodWrapper.Make(this, SymbolTable.GetAttribute); __getattr__F = MethodWrapper.Make(this, SymbolTable.GetAttr); __setattr__F = MethodWrapper.Make(this, SymbolTable.SetAttr); __delattr__F = MethodWrapper.Make(this, SymbolTable.DelAttr); __cmp__F = MethodWrapper.Make(this, SymbolTable.Cmp); __repr__F = MethodWrapper.Make(this, SymbolTable.Repr); __str__F = MethodWrapper.Make(this, SymbolTable.String); __hash__F = MethodWrapper.Make(this, SymbolTable.Hash); }