[pypy-issue] [issue1688] TypeError in cffi when weakrefs module isn't an instance of ModuleType

Brodie Rao tracker at bugs.pypy.org
Wed Feb 5 22:06:40 CET 2014


New submission from Brodie Rao <brodie at sf.io>:

Given a script like this:

import __builtin__
oldimport = __import__

class ModuleProxy(object):
    def __init__(self, mod):
        object.__setattr__(self, '_mod', mod)

    def __getattribute__(self, name):
        return getattr(object.__getattribute__(self, '_mod'), name)

    def __setattr__(self, name, value):
        return setattr(object.__getattribute__(self, '_mod'), name, value)

    def __delattr__(self, name):
        return delattr(object.__getattribute__(self, '_mod'), name)

def newimport(name, *args, **kwargs):
    mod = oldimport(name, *args, **kwargs)
    if name == 'weakref':
        return ModuleProxy(mod)
    return mod

__builtin__.__import__ = newimport
import curses

Running it fails with this exception:

Traceback (most recent call last):
  File "app_main.py", line 72, in run_toplevel
  File "badimport.py", line 24, in <module>
    import curses
  File "badimport.py", line 18, in newimport
    mod = oldimport(name, *args, **kwargs)
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib-python/2.7/curses/__init__.py",
line 15, in <module>
    from _curses import *
  File "badimport.py", line 18, in newimport
    mod = oldimport(name, *args, **kwargs)
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib_pypy/_curses.py", line 11, in
<module>
    ffi = FFI()
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib_pypy/cffi/api.py", line 80, in
__init__
    self.BVoidP = self._get_cached_btype(model.voidp_type)
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib_pypy/cffi/api.py", line 322, in
_get_cached_btype
    BType = type.get_cached_btype(self, finishlist)
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib_pypy/cffi/model.py", line 37,
in get_cached_btype
    BType = self.build_backend_type(ffi, finishlist)
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib_pypy/cffi/model.py", line 189,
in build_backend_type
    BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True)
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib_pypy/cffi/model.py", line 37,
in get_cached_btype
    BType = self.build_backend_type(ffi, finishlist)
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib_pypy/cffi/model.py", line 69,
in build_backend_type
    return global_cache(self, ffi, 'new_void_type')
  File "/usr/local/Cellar/pypy/2.2.1/libexec/lib_pypy/cffi/model.py", line 475,
in global_cache
    type(ffi._backend).__typecache = weakref.WeakValueDictionary()
TypeError: can't set attributes on type object 'module'

In more practical terms, this same sort of problem affects Mercurial's
demandimport library (breaking its color extension).

One possible fix might be to replace "ModuleType = type(weakref)" with
types.ModuleType.

----------
messages: 6524
nosy: arigo, brodie, pypy-issue
priority: bug
status: unread
title: TypeError in cffi when weakrefs module isn't an instance of ModuleType

________________________________________
PyPy bug tracker <tracker at bugs.pypy.org>
<https://bugs.pypy.org/issue1688>
________________________________________


More information about the pypy-issue mailing list