[pypy-dev] Fwd: Re: Adding init/variables to W_Root

Armin Rigo armin.rigo at gmail.com
Mon Dec 19 20:57:08 EST 2016


Hi Frank,

On 20 December 2016 at 01:29, Frank Wang <frankw at mit.edu> wrote:
> This also seems to happen in a lot of classes because W_Root is the parent
> class for many classes. Is there a way to universally turn off this
> immutable flag (assuming it's okay) in all classes?

You can hack at the place where the error is raised.  Assuming you're
translating without the JIT, it should not cause too much problems.

As an alternative to adding an attribute to every object, you could
also use a rpython.rlib.rweakref.RWeakKeyDictionary(W_Root, RbFlags),
for some class RbFlags which has got the rb_flags dictionary and/or
any other related data.  The advantage is that it is a less intrusive
change, reduces memory usage if many objects don't need the extra
information at all, and avoids the immutable problem.  The
inconvenient is that going from the object to the rb_flags dictionary
is slower.

There are also alternatives that are better if you are ok with
supporting not *all* objects.  For example, you can edit
objspace/std/mapdict.py to add a new dynamic attribute that is
internally called ``"rbflags", SPECIAL``; see ``"weakref", SPECIAL``
for an existing example.  This would work for all objects that use
mapdicts, i.e. all instances of user-defined classes, and additionally
instances of many built-in types as well---but not instances of the
core types like "int" or "str" or "list" or "tuple" or "dict".


A bientôt,

Armin.


More information about the pypy-dev mailing list