[pypy-svn] r4825 - pypy/branch/src-newobjectmodel/goal
hpk at codespeak.net
hpk at codespeak.net
Wed Jun 2 17:19:45 CEST 2004
Author: hpk
Date: Wed Jun 2 17:19:44 2004
New Revision: 4825
Modified:
pypy/branch/src-newobjectmodel/goal/objectspace-reconstruct.py
Log:
state of thoughts ...
Modified: pypy/branch/src-newobjectmodel/goal/objectspace-reconstruct.py
==============================================================================
--- pypy/branch/src-newobjectmodel/goal/objectspace-reconstruct.py (original)
+++ pypy/branch/src-newobjectmodel/goal/objectspace-reconstruct.py Wed Jun 2 17:19:44 2004
@@ -1,11 +1,10 @@
def __getattribute__(w_obj,w_name):
- type = space.gettype(w_obj)
name = space.unwrap(w_name)
- w_descr = type.lookup(name)
+ w_descr = space.lookup(w_obj, name)
if w_descr is not None:
if space.is_data_descr(w_descr):
- return space.get(w_descr,w_obj,space.wrap(type))
+ return space.get(w_descr,w_obj,space.type(w_obj))
w_dict = space.getdict(w_obj)
if w_dict is not None:
try:
@@ -18,23 +17,147 @@
raise OperationError(space.w_AttributeError,w_name)
def space.getattr(w_obj,w_name):
- type = space.gettype(w_obj)
- w_descr = type.lookup('__getattribute__')
- w_impl = space.get(w_descr,w_obj, space.wrap(type))
+ w_descr = space.lookup(w_obj, '__getattribute__')
try:
- return space.call_function(w_impl, w_name)
+ return space.get_and_call_function(w_descr, w_obj, w_name)
except: # AttributeError
- w_descr = type.lookup('__getattr__')
+ w_descr = space.lookup(w_obj, '__getattr__')
if w_descr is None:
raise
- w_impl = space.get(w_descr,w_obj, space.wrap(type))
- return space.call_function(w_descr,w_obj, space.wrap(type))
+ return space.get_and_call_function(w_descr, w_obj, w_name)
def space.get(w_obj,w_name):
- type = space.gettype(w_obj)
- w_descr = type.lookup('__get__')
+ w_descr = space.lookup(w_obj, '__get__')
if w_descr is not None:
- w_impl = space.get(w_descr,w_obj, space.wrap(type))
- return space.call_function(w_impl, w_name)
+ return space.get_and_call(w_descr, w_obj, space.newtuple([w_name]))
else:
return w_obj
+
+def space.call(w_obj, w_args, w_kwargs):
+ w_descr = space.lookup(w_obj, '__call__')
+ if w_descr is None:
+ raise OperationError(space.w_TypeError, space.wrap('...'))
+ return space.get_and_call(w_descr, w_obj, w_args, w_kwargs)
+
+
+class BaseObjSpace:
+ def get_and_call(self, w_descr, w_obj, w_args, w_kwargs):
+ if isinstance(w_descr, W_Function):
+ args_w = space.unpacktuple(w_args)
+ return w_descr.func.call(space.newtuple([w_obj]+args_w),w_kwargs)
+ else:
+ w_bound = space.get(w_descr,w_obj,space.gettype(w_obj))
+ return space.call(w_bound, w_args, w_kwargs)
+
+class Wrappable:
+ def __wrap__(self, space):
+ return self
+
+class Function(Wrappable):
+ TypeDef = Type("function", [], {
+ '__call__' : app_descr_function_call,
+ 'func_code' : Property(func_code_getter)
+ })
+
+class BuiltinType:
+ def __init__(self, name, bases, rawdict):
+ self.name = name
+ self.bases = bases
+ self.rawdict = rawdict
+ self.mro = []
+
+class W_Function:
+ def __init__(self, space, func):
+ self.func = func
+ self.space = space
+
+ def gettype(self):
+ space = self.space
+ try:
+ return space.FunctionType
+ except AttributeError:
+ space.FunctionType = f = Type(space, [space.ObjectType])
+ f.dict_w['__call__'] = space.wrap(app_descr_function_call)
+ func_code_property = Property(func_code_getter)
+ f.dict_w['func_code'] = space.wrap(func_code_property)
+ return f
+
+class StdObjectSpace:
+ def lookup(space, w_obj, name):
+ typ = space._gettype(w_obj)
+ return space.wrap(typ.lookup(name))
+
+ def type(space,w_obj):
+ return space.wrap(space._gettype(w_obj))
+
+ def _gettype
+ try:
+ return space._types[w_obj.__class__]
+ except KeyError:
+ typ = space.buildtype(w_obj.TypeDef)
+ space._types[w_obj.__class__] = typ
+ return typ
+
+ def buildtype(space, typedef):
+ typ = Type(w_
+ for name, value
+
+ def wrap(space, obj):
+
+ assert self.space == space
+ return W_Type(space, self)
+
+def trivspace.lookup(space, w_obj, name):
+ if isinstance(w_obj, Wrappable):
+ for basedef in w_obj.TypeDef.mro():
+ if name in basedef.rawdict:
+ return space.wrap(basedef.rawdict[name])
+ return None
+ else:
+ for cls in w_obj.__class__.__mro__:
+ if name in cls.__dict__:
+ return cls.__dict__[name]
+ return None
+
+
+def func_code_getter(space,w_func):
+ return space.wrap(w_func.func.code)
+
+def object___class__(space,w_obj):
+ return space.type(w_obj)
+
+def descr_function_call(space, w_func, w_args, w_kwds):
+ return w_func.func.call(w_args, w_kwds)
+app_descr_function_call = gateway.interp2app(descr_function_call)
+
+
+
+
+class Property:
+ def __init__(self, fget, fset=None, fdel=None, doc=None):
+ self.fget = fget
+ self.fset = fset
+ self.fdel = fdel
+ self.doc = doc
+ def __wrap__(self, space):
+ return W_Property(space, self)
+
+class W_Property(...Wrapped):
+ def __init__(self, space, property):
+ self.space = space
+ self.property = property
+ def gettype(self):
+ space = self.space
+ try:
+ return space.PropertyType
+ except AttributeError:
+ space.PropertyType = t = Type(space, "builtin-property", [])
+ t.dict_w["__get__"] = space.wrap(app_descr_property_get)
+ return t
+
+def descr_property_get(space, w_property, w_obj, w_ignored):
+ return w_property.property.fget(space, w_obj)
+
+app_descr_property_get = gateway.interp2app(descr_property_get)
+
+
More information about the Pypy-commit
mailing list