Advertisement
Guest User

Untitled

a guest
Sep 24th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 2.87 KB | None | 0 0
  1. diff -r 838c4df236cd -r 02a99370f6b3 pypy/module/__builtin__/compiling.py
  2. --- a/pypy/module/__builtin__/compiling.py      Tue Sep 17 17:03:35 2019 +0300
  3. +++ b/pypy/module/__builtin__/compiling.py      Tue Sep 24 17:27:53 2019 +0200
  4. @@ -96,13 +96,33 @@
  5.      frame = space.getexecutioncontext().gettopframe()
  6.      frame.exec_(w_prog, w_globals, w_locals)
  7.  
  8. +def _update_bases(space, w_bases):
  9. +    bases_w = space.listview(w_bases)
  10. +    new_bases_w = []
  11. +    changed = False
  12. +    for w_base in bases_w:
  13. +        w_meth = space.lookup(w_base, '__mro_entries__')
  14. +        if w_meth is not None:
  15. +            new_base_w = space.get_and_call_function(w_meth, w_base, w_bases)
  16. +            if not space.isinstance_w(new_base_w, space.w_tuple):
  17. +                raise oefmt(space.w_TypeError, "__mro_entries__ must return a tuple")
  18. +            new_bases_w.extend(space.fixedview(new_base_w))
  19. +            changed = True
  20. +        else:
  21. +            new_bases_w.append(w_base)
  22. +    if not changed:
  23. +        return bases_w
  24. +    return new_bases_w
  25. +
  26.  def build_class(space, w_func, w_name, __args__):
  27.      from pypy.objspace.std.typeobject import _calculate_metaclass, W_TypeObject
  28.      from pypy.interpreter.nestedscope import Cell
  29.      if not isinstance(w_func, Function):
  30.          raise oefmt(space.w_TypeError, "__build_class__: func must be a function")
  31. -    bases_w, kwds_w = __args__.unpack()
  32. -    w_bases = space.newtuple(bases_w)
  33. +    orig_bases_w, kwds_w = __args__.unpack()
  34. +    w_orig_bases = space.newtuple(orig_bases_w)
  35. +    bases_w = _update_bases(space, w_orig_bases)
  36. +    w_bases = space.newtuple(bases_w[:])
  37.      w_meta = kwds_w.pop('metaclass', None)
  38.      if w_meta is not None:
  39.          isclass = space.isinstance_w(w_meta, space.w_type)
  40. @@ -144,6 +164,8 @@
  41.      frame = space.createframe(code, w_func.w_func_globals, w_func)
  42.      frame.setdictscope(w_namespace)
  43.      w_cell = frame.run()
  44. +    if bases_w is not orig_bases_w:
  45. +        space.setitem(w_namespace, space.newtext("__orig_bases__"), w_orig_bases)
  46.      keywords = kwds_w.keys()
  47.      args = Arguments(space,
  48.                       args_w=[w_name, w_bases, w_namespace],
  49.  
  50.  
  51. diff -r 838c4df236cd -r 02a99370f6b3 pypy/objspace/std/typeobject.py
  52. --- a/pypy/objspace/std/typeobject.py   Tue Sep 17 17:03:35 2019 +0300
  53. +++ b/pypy/objspace/std/typeobject.py   Tue Sep 24 17:27:53 2019 +0200
  54. @@ -808,6 +808,11 @@
  55.      # above to be seen by the jit.
  56.      _check_new_args(space, w_name, w_bases, w_dict)
  57.      bases_w = space.fixedview(w_bases)
  58. +    for w_base in bases_w:
  59. +        if space.lookup(w_base, '__mro_entries__') is not None:
  60. +            raise oefmt(space.w_TypeError,
  61. +                        "type() doesn't support MRO entry resolution; "
  62. +                        "use types.new_class()")
  63.  
  64.      w_winner = _calculate_metaclass(space, w_typetype, bases_w)
  65.      if not space.is_w(w_winner, w_typetype):
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement