[pypy-svn] r4879 - in pypy/branch/src-newobjectmodel/pypy: interpreter objspace

arigo at codespeak.net arigo at codespeak.net
Thu Jun 3 18:27:33 CEST 2004


Author: arigo
Date: Thu Jun  3 18:27:33 2004
New Revision: 4879

Modified:
   pypy/branch/src-newobjectmodel/pypy/interpreter/function.py
   pypy/branch/src-newobjectmodel/pypy/objspace/trivial.py
Log:
Obscure hacks.


Modified: pypy/branch/src-newobjectmodel/pypy/interpreter/function.py
==============================================================================
--- pypy/branch/src-newobjectmodel/pypy/interpreter/function.py	(original)
+++ pypy/branch/src-newobjectmodel/pypy/interpreter/function.py	Thu Jun  3 18:27:33 2004
@@ -158,7 +158,9 @@
     def descr_function_get(self, w_obj, w_cls):
         space = self.space
         wrap = space.wrap
-        if not space.is_true(space.is_(w_obj, space.w_None)):
+        asking_for_bound = (not space.is_true(space.is_(w_obj, space.w_None)) or
+                      space.is_true(space.is_(w_cls, space.type(space.w_None))))
+        if asking_for_bound:
             if space.is_true(space.is_(w_cls, space.w_None)):
                 w_cls = space.type(w_obj)
             return wrap(Method(space, wrap(self), w_obj, w_cls))

Modified: pypy/branch/src-newobjectmodel/pypy/objspace/trivial.py
==============================================================================
--- pypy/branch/src-newobjectmodel/pypy/objspace/trivial.py	(original)
+++ pypy/branch/src-newobjectmodel/pypy/objspace/trivial.py	Thu Jun  3 18:27:33 2004
@@ -74,7 +74,7 @@
             __getattribute__ = gateway.interp2app(Object.descr__getattribute__.im_func),
             __setattr__ = gateway.interp2app(Object.descr__setattr__.im_func),
             __delattr__ = gateway.interp2app(Object.descr__delattr__.im_func),
-            __str__ = gateway.interp2app(lambda space, w_x: str(w_x)),
+            __str__ = gateway.interp2app(lambda space, w_x: space.repr(w_x)),
             __repr__ = gateway.interp2app(lambda space, w_x: repr(w_x)),
             __class__ = GetSetProperty(self.__class__.type),
             __init__ = gateway.interp2app(Object.descr__init__.im_func),
@@ -146,6 +146,8 @@
         try:
             return typedef.trivialwrapperclass
         except AttributeError:
+            from pypy.interpreter.gateway import interp2app
+            
             # make the base first (assuming single inheritance)
             mro = typedef.mro(self)
             if len(mro) > 1:
@@ -156,12 +158,24 @@
             # in rawdict
             descrdict = {'__internalpypytypedef__': typedef}
             for descrname, descr in typedef.rawdict.items():
-                def fget(w_obj, w_descr=descr, space=self):
-                    return space.get(w_descr, w_obj, space.type(w_obj))
-                def fset(w_obj, w_value, w_descr=descr, space=self):
-                    return space.set(w_descr, w_obj, w_value)
-                def fdel(w_obj, w_descr=descr, space=self):
-                    return space.set(w_descr, w_obj)
+                if isinstance(descr, interp2app):
+                    def fget(w_obj, descr=descr, space=self):
+                        fn = descr.get_function()
+                        return space.wrap(Method(space, space.wrap(fn), w_obj,
+                                                 space.type(w_obj)))
+                    fset = None
+                    fdel = None
+                else:
+                    # more generally, defining a property
+                    def fget(w_obj, descr=descr, space=self):
+                        w_descr = space.wrap(descr)
+                        return space.get(w_descr, w_obj, space.type(w_obj))
+                    def fset(w_obj, w_value, descr=descr, space=self):
+                        w_descr = space.wrap(descr)
+                        return space.set(w_descr, w_obj, w_value)
+                    def fdel(w_obj, descr=descr, space=self):
+                        w_descr = space.wrap(descr)
+                        return space.set(w_descr, w_obj)
                 descrdict[descrname] = property(fget, fset, fdel)
             cls = type('CPyWrapped '+typedef.name, bases, descrdict)
             typedef.trivialwrapperclass = cls



More information about the Pypy-commit mailing list