[pypy-svn] r8708 - pypy/dist/pypy/lib

pedronis at codespeak.net pedronis at codespeak.net
Sat Jan 29 14:17:30 CET 2005


Author: pedronis
Date: Sat Jan 29 14:17:30 2005
New Revision: 8708

Added:
   pypy/dist/pypy/lib/_classobj.py
Log:
start of impl of old-style classes at app level, not tested nor integrated



Added: pypy/dist/pypy/lib/_classobj.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lib/_classobj.py	Sat Jan 29 14:17:30 2005
@@ -0,0 +1,170 @@
+import sys
+
+obj_setattr = object.__setattr__
+obj_getattribute = object.__getattribute__
+
+MASK = sys.maxint * 2 + 2
+
+def uid(o):
+    return (MASK + id(o)) & (MASK-1)
+
+def type_err(arg, expected, v):
+   raise TypeError("argument %s must be %s, not %s" % (arg, expected, type(v).__name__))
+
+def set_name(cls, name):
+    if not isinstance(name, str):
+        raise TypeError, "__name__ must be a string object"
+    obj_setattr(cls, '__name__', name)
+
+def set_bases(cls, bases):
+    if not isinstance(bases, tuple):
+        raise TypeError, "__bases__ must be a tuple object"
+    for b in bases:
+        if not isinstance(b, classobj):
+            raise TypeError, "__bases__ items must be classes"
+    obj_setattr(cls, '__bases__', bases)
+
+def set_dict(cls, dic):
+    if not isinstance(dic, dict):
+        raise TypeError, "__dict__ must be a dictionary object"
+    # preserved __name__ and __bases__
+    dic['__name__'] = cls.__name__
+    dic['__bases__'] = cls.__bases__
+    obj_setattr(cls, '__dict__', dic)
+
+def retrieve(cls, attr):
+    dic = obj_getattribute(cls, '__dict__')
+    try:
+        return dic[attr]
+    except KeyError:
+        raise AttributeError, attr
+
+def lookup(cls, attr):
+    # returns (value, class it was found in)
+    try:
+        v = retrieve(cls, attr)
+        return v, cls
+    except AttributError:
+        for b in obj_getattribute(cls, '__bases__'):
+            v, found = lookup(b, attr)
+            if found:
+                return v, found
+        return None, None
+
+def mro_lookup(v, name):
+    try:
+        mro = type(v).__mro__
+    except AttributeError:
+        return None
+    for x in mro:
+        if name in x.__dict__:
+            return x.__dict__[name]
+    return None
+    
+
+class classobj(object):
+
+    def __new__(subtype, name, bases, dic):
+        if not isinstance(name, str):
+            type_err('name', 'string', name)
+        if not isinstance(dic, dict):
+            type_err('dict', 'dict', dic)
+
+        try:
+            dic['__doc__']
+        except KeyError:
+            dic['__doc__'] = None
+
+        try:
+            dic['__module__']
+        except:
+            try:
+                g = sys._getframe(1).f_globals
+            except ValueError:
+                pass
+            else:
+                modname = g.get('__name__', None)
+                if modname is not None:
+                    dic['__module__'] = modname
+            
+        if not isinstance(bases, tuple):
+            type_err('bases', 'tuple', bases)
+        
+        if bases is None:
+            bases = ()
+
+        for b in bases:
+            if not isinstance(b, classobj):
+                if callable(type(b)):
+                    return type(b)(name, bases, dic)
+                raise TypeError,"base must be class"
+
+        
+        new_class = object.__new__(classobj)
+
+        obj_setattr(new_class, '__dict__', dic)
+        obj_setattr(new_class, '__name__', name)
+        obj_setattr(new_class, '__bases__', bases)
+
+        return new_class
+
+    def __setattr__(self, attr, value):
+        if attr == '__name__':
+            set_name(self, value)
+        elif attr == '__bases__':
+            set_bases(self, value)
+        elif attr == '__dict__':
+            set_dict(self, value)
+        else:
+            obj_setattr(self, attr, value)
+    
+    def __delattr__(self, attr):
+        if attr in ('__name__', '__bases__', '__dict__'):
+            classobj.__setattr__(self, attr, None)
+        else:
+            object.__delattr__(self, attr)
+    
+
+    def __getattribute__(self, attr):
+        if attr == '__dict__':
+            return obj_getattribute(self, '__dict__')
+        v, found = lookup(self, attr)
+        if not found:
+            raise AttributeError, "class %s has no attribute %s" % (self.__name__, attr)
+        if attr in ('__name__', '__bases__', '__dict__'):
+            return v
+
+        descr_get = mro_lookup(v, '__get__')
+        if descr_get is None:
+            return v
+        return descr_get(v, None, self)
+        
+    def __repr__(self):
+        try:
+            mod = retrieve(self, '__module__')
+            if not isinstance(mod, str):
+                mod = None
+        except AttributeError:
+            mod = None
+        if mod is None:
+            return "<class ?.%s at 0x%x>" % (self.__name__, uid(self))
+        else:
+            return "<class %s.%s at 0x%x>" % (mod, self.__name__, uid(self))
+
+    def __str__(self):
+        try:
+            mod = retrieve(self, '__module__')
+            if not isinstance(mod, str):
+                mod = None
+        except AttributeError:
+            mod = None
+        if mod is None:
+            return self.__name__
+        else:
+            return "%s.%s" % (mod, self.__name__)
+
+
+class instance(object):
+    pass
+ 
+            



More information about the Pypy-commit mailing list