def check_and_find_best_base(space, bases_w): """The best base is one of the bases in the given list: the one whose layout a new type should use as a starting point. This version checks that bases_w is an acceptable tuple of bases. """ w_bestbase = find_best_base(space, bases_w) if w_bestbase is None: raise OperationError(space.w_TypeError, space.wrap("a new-style class can't have " "only classic bases")) if not w_bestbase.instancetypedef.acceptable_as_base_class: raise operationerrfmt(space.w_TypeError, "type '%N' is not an " "acceptable base class", w_bestbase) # check that all other bases' layouts are superclasses of the bestbase w_bestlayout = w_bestbase.w_same_layout_as or w_bestbase for w_base in bases_w: if isinstance(w_base, W_TypeObject): w_layout = w_base.w_same_layout_as or w_base if not issublayout(w_bestlayout, w_layout): raise OperationError(space.w_TypeError, space.wrap("instance layout conflicts in " "multiple inheritance")) return w_bestbase
def issublayout(w_layout1, w_layout2): space = w_layout2.space while w_layout1 is not w_layout2: w_layout1 = find_best_base(space, w_layout1.bases_w) if w_layout1 is None: return False w_layout1 = w_layout1.w_same_layout_as or w_layout1 return True
def get_parent_layout(w_type): """Compute the most parent class of 'w_type' whose layout is the same as 'w_type', or None if all parents of 'w_type' have a different layout than 'w_type'. """ w_starttype = w_type while len(w_type.bases_w) > 0: w_bestbase = find_best_base(w_type.space, w_type.bases_w) if w_type.instancetypedef is not w_bestbase.instancetypedef: break if w_type.nslots != w_bestbase.nslots: break w_type = w_bestbase if w_type is not w_starttype: return w_type else: return None
def best_base(space, bases_w): if not bases_w: return None return find_best_base(bases_w)
def descr__base(space, w_type): from pypy.objspace.std.typeobject import find_best_base w_type = _check(space, w_type) return find_best_base(space, w_type.bases_w)
def best_base(space, bases_w): if not bases_w: return None return find_best_base(bases_w)
def descr__base(space, w_type): from pypy.objspace.std.typeobject import find_best_base w_type = _check(space, w_type) return find_best_base(space, w_type.bases_w)