예제 #1
0
        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));
        }
예제 #2
0
        public static MethodWrapper MakeForObject(PythonType pt, SymbolId name, Delegate func)
        {
            MethodWrapper ret = new MethodWrapper(pt, name);

            ret.isObjectMethod    = true;
            ret.isBuiltinMethod   = true;
            ret.isSuperTypeMethod = false;

            ret.func       = BuiltinFunction.Make((string)SymbolTable.IdToString(name), func, new MethodBase[] { func.Method });
            ret.funcAsFunc = ret.func as BuiltinFunction;

            //pt.dict[name] = ret;

            return(ret);
        }
예제 #3
0
        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);
        }
예제 #4
0
        public void UpdateFromBases(Tuple mro)
        {
            if (!isSuperTypeMethod)
            {
                return;
            }

            Debug.Assert(mro.Count > 0);
            MethodWrapper current = (MethodWrapper)myField.GetValue(mro[0]);

            for (int i = 1; i < mro.Count; i++)
            {
                if (current != null && !current.isSuperTypeMethod)
                {
                    break;
                }

                object baseTypeObj = mro[i];

                PythonType baseType = baseTypeObj as PythonType;
                if (baseType == null)
                {
                    System.Diagnostics.Debug.Assert(baseTypeObj is DynamicType);
                    continue;
                }
                baseType.Initialize();
                string fieldname = (string)SymbolTable.IdToString(name);

                current = (MethodWrapper)myField.GetValue(baseType);
            }

            if (current != null)
            {
                UpdateFromBase(current);
            }
        }