We need a sprint! :-) Think I've exhausted my pypy hacking for the week...


Well, i'm not sure if this is much better than the last hack, but at least no references to SlotWrapperType anymore... ;-)


Instead of fake_function() as per last mail, add to the bottom of fake_type() similar to before, but only if our ctype has __call__.


def fake_type(space, cpy_type):
    ...
    # return W_Fake

    if hasattr(cpy_type, "__call__"):
        def call_args(self, args):
            try:
                unwrappedargs = [space.unwrap(w_arg) for w_arg in args.args_w]
                unwrappedkwds = dict([(key, space.unwrap(w_value))
                                      for key, w_value in args.kwds_w.items()])
            except UnwrapError, e:
                raise UnwrapError('calling %s: %s' % (cpy_type, e))
            try:
                assert callable(self.val), self.val
                result = apply(self.val, unwrappedargs, unwrappedkwds)
            except:
                wrap_exception(space)
            return space.wrap(result)

        setattr(W_Fake, "call_args", call_args)

    return W_Fake

Will also need some mods to DescrOperation()

    def get_and_call_args(space, w_descr, w_obj, args):
        descr = space.unwrap_builtin(w_descr)
        if hasattr(descr, "call_args"):
            # special-case Functions to avoid infinite recursion
## XXX Tmp comment out
##             if isinstance(descr.code, BuiltinCode):
##                 # this sub-special case is ONLY for performance reasons
##                 w_result = descr.code.performance_shortcut_call_meth(space,
##                                                                      w_obj, args)
##                 if w_result is not None:
##                     return w_result
            return descr.call_args(args.prepend(w_obj))
        else:
            w_impl = space.get(w_descr, w_obj)
            return space.call_args(w_impl, args)


Cheers, Richard



On Wed, 14 Jul 2004, Michael Hudson wrote:

Michael Hudson <[EMAIL PROTECTED]> writes:

Well, I think that could work but I'd prefer a solution with less
special casing.

How does CPython avoid the same problem?

Well, that's fairly easy. In PyPy almost every callable is a Function or Method, hence has a __get__:

types.MethodType.im_func.__get__.__get__.__get__.__get__.__get__.__get__
<method object at 0x4062ec8c>

Hum, not sure what to do about that...

Cheers,
mwh

--
 surely, somewhere, somehow, in the history of computing, at least
 one manual has been written that you could at least remotely
 attempt to consider possibly glancing at.              -- Adam Rixey

_______________________________________________
[EMAIL PROTECTED]
http://codespeak.net/mailman/listinfo/pypy-dev

_______________________________________________
[EMAIL PROTECTED]
http://codespeak.net/mailman/listinfo/pypy-dev

Reply via email to