Author: Richard Plangger <planri...@gmail.com> Branch: ppc-vsx-support Changeset: r87245:404ba62b0c60 Date: 2016-09-20 13:05 +0200 http://bitbucket.org/pypy/pypy/changeset/404ba62b0c60/
Log: merge default diff --git a/lib-python/2.7/distutils/sysconfig_pypy.py b/lib-python/2.7/distutils/sysconfig_pypy.py --- a/lib-python/2.7/distutils/sysconfig_pypy.py +++ b/lib-python/2.7/distutils/sysconfig_pypy.py @@ -63,8 +63,7 @@ """Initialize the module as appropriate for POSIX systems.""" g = {} g['EXE'] = "" - g['SOABI'] = [s[0] for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION] - g['SO'] = g['SOABI'][0] + g['SO'] = [s[0] for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION][0] g['LIBDIR'] = os.path.join(sys.prefix, 'lib') g['CC'] = "gcc -pthread" # -pthread might not be valid on OS/X, check @@ -76,8 +75,7 @@ """Initialize the module as appropriate for NT""" g = {} g['EXE'] = ".exe" - g['SOABI'] = [s[0] for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION] - g['SO'] = g['SOABI'][0] + g['SO'] = [s[0] for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION][0] global _config_vars _config_vars = g diff --git a/lib-python/2.7/sysconfig.py b/lib-python/2.7/sysconfig.py --- a/lib-python/2.7/sysconfig.py +++ b/lib-python/2.7/sysconfig.py @@ -526,7 +526,10 @@ # PyPy: import imp - _CONFIG_VARS['SOABI'] = [s[0] for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION] + for suffix, mode, type_ in imp.get_suffixes(): + if type_ == imp.C_EXTENSION: + _CONFIG_VARS['SOABI'] = suffix.split('.')[1] + break if args: vals = [] diff --git a/pypy/objspace/std/test/test_typeobject.py b/pypy/objspace/std/test/test_typeobject.py --- a/pypy/objspace/std/test/test_typeobject.py +++ b/pypy/objspace/std/test/test_typeobject.py @@ -797,9 +797,7 @@ class AA(object): __slots__ = ('a',) aa = AA() - # the following line works on CPython >= 2.6 but not on PyPy. - # but see below for more - raises(TypeError, "aa.__class__ = A") + aa.__class__ = A raises(TypeError, "aa.__class__ = object") class Z1(A): pass @@ -861,9 +859,13 @@ __slots__ = ['a', 'b'] class Order2(object): __slots__ = ['b', 'a'] - # the following line works on CPython >= 2.6 but not on PyPy. - # but see below for more - raises(TypeError, "Order1().__class__ = Order2") + Order1().__class__ = Order2 + + # like CPython, the order of slot names doesn't matter + x = Order1() + x.a, x.b = 1, 2 + x.__class__ = Order2 + assert (x.a, x.b) == (1, 2) class U1(object): __slots__ = ['a', 'b'] @@ -873,10 +875,11 @@ __slots__ = ['a', 'b'] class V2(V1): __slots__ = ['c', 'd', 'e'] - # the following line does not work on CPython >= 2.6 either. - # that's just obscure. Really really. So we just ignore - # the whole issue until someone comes complaining. Then we'll - # just kill slots altogether apart from maybe doing a few checks. + # the following line does not work on CPython either: we can't + # change a class if the old and new class have different layouts + # that look compatible but aren't, because they don't have the + # same base-layout class (even if these base classes are + # themselves compatible)... obscure. raises(TypeError, "U2().__class__ = V2") def test_name(self): diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py --- a/pypy/objspace/std/typeobject.py +++ b/pypy/objspace/std/typeobject.py @@ -102,9 +102,10 @@ """ _immutable_ = True - def __init__(self, typedef, nslots, base_layout=None): + def __init__(self, typedef, nslots, newslotnames=[], base_layout=None): self.typedef = typedef self.nslots = nslots + self.newslotnames = newslotnames[:] # make a fixed-size list self.base_layout = base_layout def issublayout(self, parent): @@ -114,6 +115,12 @@ return False return True + def expand(self, hasdict, weakrefable): + """Turn this Layout into a tuple. If two classes get equal + tuples, it means their instances have a fully compatible layout.""" + return (self.typedef, self.newslotnames, self.base_layout, + hasdict, weakrefable) + # possible values of compares_by_identity_status UNKNOWN = 0 @@ -289,8 +296,7 @@ # compute a tuple that fully describes the instance layout def get_full_instance_layout(self): - layout = self.layout - return (layout, self.hasdict, self.weakrefable) + return self.layout.expand(self.hasdict, self.weakrefable) def compute_default_mro(self): return compute_C3_mro(self.space, self) @@ -1001,11 +1007,15 @@ w_self.weakrefable = w_self.weakrefable or w_base.weakrefable return hasoldstylebase + def create_all_slots(w_self, hasoldstylebase, w_bestbase, force_new_layout): + from pypy.objspace.std.listobject import StringSort + base_layout = w_bestbase.layout index_next_extra_slot = base_layout.nslots space = w_self.space dict_w = w_self.dict_w + newslotnames = [] if '__slots__' not in dict_w: wantdict = True wantweakref = True @@ -1031,8 +1041,22 @@ "__weakref__ slot disallowed: we already got one") wantweakref = True else: - index_next_extra_slot = create_slot(w_self, slot_name, - index_next_extra_slot) + newslotnames.append(slot_name) + # Sort the list of names collected so far + sorter = StringSort(newslotnames, len(newslotnames)) + sorter.sort() + # Try to create all slots in order. The creation of some of + # them might silently fail; then we delete the name from the + # list. At the end, 'index_next_extra_slot' has been advanced + # by the final length of 'newslotnames'. + i = 0 + while i < len(newslotnames): + if create_slot(w_self, newslotnames[i], index_next_extra_slot): + index_next_extra_slot += 1 + i += 1 + else: + del newslotnames[i] + # wantdict = wantdict or hasoldstylebase if wantdict: create_dict_slot(w_self) @@ -1041,11 +1065,12 @@ if '__del__' in dict_w: w_self.hasuserdel = True # + assert index_next_extra_slot == base_layout.nslots + len(newslotnames) if index_next_extra_slot == base_layout.nslots and not force_new_layout: return base_layout else: return Layout(base_layout.typedef, index_next_extra_slot, - base_layout=base_layout) + newslotnames, base_layout=base_layout) def create_slot(w_self, slot_name, index_next_extra_slot): space = w_self.space @@ -1058,9 +1083,10 @@ slot_name = space.str_w(space.new_interned_str(slot_name)) # in cpython it is ignored less, but we probably don't care member = Member(index_next_extra_slot, slot_name, w_self) - index_next_extra_slot += 1 w_self.dict_w[slot_name] = space.wrap(member) - return index_next_extra_slot + return True + else: + return False def create_dict_slot(w_self): if not w_self.hasdict: diff --git a/rpython/jit/metainterp/test/test_ajit.py b/rpython/jit/metainterp/test/test_ajit.py --- a/rpython/jit/metainterp/test/test_ajit.py +++ b/rpython/jit/metainterp/test/test_ajit.py @@ -4558,3 +4558,20 @@ self.meta_interp(f, []) self.check_resops(guard_nonnull=0) + def test_loop_before_main_loop(self): + fdriver = JitDriver(greens=[], reds='auto') + gdriver = JitDriver(greens=[], reds='auto') + def f(i, j): + while j > 0: # this loop unrolls because it is in the same + j -= 1 # function as a jit_merge_point() + while i > 0: + fdriver.jit_merge_point() + i -= 1 + def g(i, j, k): + while k > 0: + gdriver.jit_merge_point() + f(i, j) + k -= 1 + + self.meta_interp(g, [5, 5, 5]) + self.check_resops(guard_true=10) # 5 unrolled, plus 5 unrelated diff --git a/rpython/rtyper/rpbc.py b/rpython/rtyper/rpbc.py --- a/rpython/rtyper/rpbc.py +++ b/rpython/rtyper/rpbc.py @@ -646,6 +646,9 @@ def ll_str(self, x): return self.getstr() + def get_ll_eq_function(self): + return None + class MultipleFrozenPBCReprBase(CanBeNull, Repr): def convert_const(self, pbc): @@ -654,6 +657,9 @@ frozendesc = self.rtyper.annotator.bookkeeper.getdesc(pbc) return self.convert_desc(frozendesc) + def get_ll_eq_function(self): + return None + class MultipleUnrelatedFrozenPBCRepr(MultipleFrozenPBCReprBase): """For a SomePBC of frozen PBCs that have no common access set. The only possible operation on such a thing is comparison with 'is'.""" diff --git a/rpython/rtyper/test/test_rpbc.py b/rpython/rtyper/test/test_rpbc.py --- a/rpython/rtyper/test/test_rpbc.py +++ b/rpython/rtyper/test/test_rpbc.py @@ -1729,6 +1729,23 @@ res = self.interpret(f, []) assert res == 42 + def test_equality_of_frozen_pbcs_inside_data_structures(self): + class A: + def _freeze_(self): + return True + a1 = A() + a2 = A() + def f(): + return [a1] == [a1] + def g(i): + x1 = [a1, a2][i] + x2 = [a1, a2][i] + return (x1,) == (x2,) + res = self.interpret(f, []) + assert res == True + res = self.interpret(g, [1]) + assert res == True + # ____________________________________________________________ def test_hlinvoke_simple(): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit