[pypy-svn] r7762 - pypy/trunk/src/pypy/objspace/std
arigo at codespeak.net
arigo at codespeak.net
Mon Dec 6 17:30:15 CET 2004
Author: arigo
Date: Mon Dec 6 17:30:15 2004
New Revision: 7762
Modified:
pypy/trunk/src/pypy/objspace/std/fake.py
Log:
Turned the short but buggy and not-RPythonic fake_descriptor() into a
long and verbose but hopefully more correct class W_FakeDescriptor.
Modified: pypy/trunk/src/pypy/objspace/std/fake.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/fake.py (original)
+++ pypy/trunk/src/pypy/objspace/std/fake.py Mon Dec 6 17:30:15 2004
@@ -109,13 +109,53 @@
_fake_type_cache.content[type(list.append)] = fake_builtin_callable
_fake_type_cache.content[type(type(None).__repr__)] = fake_builtin_callable
-from pypy.interpreter.typedef import GetSetProperty
-def fake_descriptor(space, d):
- "NOT_RPYTHON (don't try to fake extra descriptors after initialization!)"
- n = d.__name__
- return space.wrap(GetSetProperty(lambda x:getattr(x, n),
- lambda x,y:setattr(x, n, y)))
+from pypy.interpreter.baseobjspace import Wrappable
+from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.gateway import interp2app
-_fake_type_cache.content[type(file.softspace)] = fake_descriptor
-_fake_type_cache.content[type(type.__dict__['__dict__'])] = fake_descriptor
+class W_FakeDescriptor(Wrappable):
+ # Mimics pypy.interpreter.typedef.GetSetProperty.
+
+ def __init__(self, space, d):
+ self.name = d.__name__
+
+ def descr_descriptor_get(space, w_descriptor, w_obj, w_cls=None):
+ # XXX HAAAAAAAAAAAACK (but possibly a good one)
+ if w_obj == space.w_None and not space.is_true(space.is_(w_cls, space.type(space.w_None))):
+ #print w_descriptor, w_obj, w_cls
+ return w_descriptor
+ else:
+ name = space.unwrap(w_descriptor).name
+ obj = space.unwrap(w_obj)
+ try:
+ val = getattr(obj, name) # this gives a "not RPython" warning
+ except:
+ wrap_exception(space)
+ return space.wrap(val)
+
+ def descr_descriptor_set(space, w_descriptor, w_obj, w_value):
+ name = space.unwrap(w_descriptor).name
+ obj = space.unwrap(w_obj)
+ val = space.unwrap(w_value)
+ try:
+ setattr(obj, name, val) # this gives a "not RPython" warning
+ except:
+ wrap_exception(space)
+
+ def descr_descriptor_del(space, w_descriptor, w_obj):
+ name = space.unwrap(w_descriptor).name
+ obj = space.unwrap(w_obj)
+ try:
+ delattr(obj, name)
+ except:
+ wrap_exception(space)
+
+ typedef = TypeDef("FakeDescriptor",
+ __get__ = interp2app(descr_descriptor_get),
+ __set__ = interp2app(descr_descriptor_set),
+ __delete__ = interp2app(descr_descriptor_del),
+ )
+
+_fake_type_cache.content[type(file.softspace)] = W_FakeDescriptor
+_fake_type_cache.content[type(type.__dict__['__dict__'])] = W_FakeDescriptor
More information about the Pypy-commit
mailing list