Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r87965:14a2e7623816 Date: 2016-10-27 23:19 +0100 http://bitbucket.org/pypy/pypy/changeset/14a2e7623816/
Log: merge heads diff --git a/lib_pypy/_collections.py b/lib_pypy/_collections.py --- a/lib_pypy/_collections.py +++ b/lib_pypy/_collections.py @@ -29,7 +29,7 @@ class deque(object): def __new__(cls, iterable=(), *args, **kw): - self = super(deque, cls).__new__(cls, *args, **kw) + self = super(deque, cls).__new__(cls) self.clear() return self diff --git a/lib_pypy/_ctypes/structure.py b/lib_pypy/_ctypes/structure.py --- a/lib_pypy/_ctypes/structure.py +++ b/lib_pypy/_ctypes/structure.py @@ -229,7 +229,7 @@ __metaclass__ = StructOrUnionMeta def __new__(cls, *args, **kwds): - self = super(_CData, cls).__new__(cls, *args, **kwds) + self = super(_CData, cls).__new__(cls) if '_abstract_' in cls.__dict__: raise TypeError("abstract class") if hasattr(cls, '_ffistruct_'): diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py --- a/pypy/interpreter/error.py +++ b/pypy/interpreter/error.py @@ -73,11 +73,8 @@ exc_value = str(w_value) else: w = space.wrap - if space.is_w(space.type(self.w_type), space.w_str): - exc_typename = space.str_w(self.w_type) - else: - exc_typename = space.str_w( - space.getattr(self.w_type, w('__name__'))) + exc_typename = space.str_w( + space.getattr(self.w_type, w('__name__'))) if space.is_w(w_value, space.w_None): exc_value = "" else: diff --git a/pypy/interpreter/function.py b/pypy/interpreter/function.py --- a/pypy/interpreter/function.py +++ b/pypy/interpreter/function.py @@ -611,7 +611,7 @@ class StaticMethod(W_Root): """The staticmethod objects.""" - _immutable_fields_ = ['w_function'] + _immutable_fields_ = ['w_function?'] def __init__(self, w_function): self.w_function = w_function @@ -622,13 +622,16 @@ def descr_staticmethod__new__(space, w_subtype, w_function): instance = space.allocate_instance(StaticMethod, w_subtype) - instance.__init__(w_function) - return space.wrap(instance) + instance.__init__(space.w_None) + return instance + + def descr_init(self, space, w_function): + self.w_function = w_function class ClassMethod(W_Root): """The classmethod objects.""" - _immutable_fields_ = ['w_function'] + _immutable_fields_ = ['w_function?'] def __init__(self, w_function): self.w_function = w_function @@ -641,8 +644,11 @@ def descr_classmethod__new__(space, w_subtype, w_function): instance = space.allocate_instance(ClassMethod, w_subtype) - instance.__init__(w_function) - return space.wrap(instance) + instance.__init__(space.w_None) + return instance + + def descr_init(self, space, w_function): + self.w_function = w_function class FunctionWithFixedCode(Function): can_change_code = False diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py --- a/pypy/interpreter/typedef.py +++ b/pypy/interpreter/typedef.py @@ -686,15 +686,17 @@ (e.g. C().f()). The instance is ignored except for its class.""", __get__ = interp2app(StaticMethod.descr_staticmethod_get), __new__ = interp2app(StaticMethod.descr_staticmethod__new__.im_func), + __init__=interp2app(StaticMethod.descr_init), __func__= interp_attrproperty_w('w_function', cls=StaticMethod), ) ClassMethod.typedef = TypeDef( 'classmethod', - __new__ = interp2app(ClassMethod.descr_classmethod__new__.im_func), - __get__ = interp2app(ClassMethod.descr_classmethod_get), - __func__= interp_attrproperty_w('w_function', cls=ClassMethod), - __doc__ = """classmethod(function) -> class method + __new__=interp2app(ClassMethod.descr_classmethod__new__.im_func), + __init__=interp2app(ClassMethod.descr_init), + __get__=interp2app(ClassMethod.descr_classmethod_get), + __func__=interp_attrproperty_w('w_function', cls=ClassMethod), + __doc__="""classmethod(function) -> class method Convert a function to be a class method. diff --git a/pypy/module/__builtin__/test/test_descriptor.py b/pypy/module/__builtin__/test/test_descriptor.py --- a/pypy/module/__builtin__/test/test_descriptor.py +++ b/pypy/module/__builtin__/test/test_descriptor.py @@ -20,6 +20,12 @@ x = Static(1) assert isinstance(x, Static) + class C(Static): + def __init__(self, callable): + super(C, self).__init__(callable) + y = C(1) + assert isinstance(y, C) + def test_classmethod(self): class C(object): def f(cls, stuff): @@ -41,8 +47,14 @@ x = Classm(1) assert isinstance(x, Classm) + class C(Classm): + def __init__(self, callable): + super(C, self).__init__(callable) + y = C(1) + assert isinstance(y, C) + def test_property_simple(self): - + class a(object): def _get(self): return 42 def _set(self, value): raise AttributeError @@ -98,7 +110,7 @@ assert message.startswith('super(type, obj): obj must be an instance or subtype of type') def test_super_various(self): - + class A(object): def meth(self, a): return "A(%r)" % a @@ -352,10 +364,10 @@ def test_property_subclass_with_init(self): l = [] - + def x(self): l.append('x') - + class P(property): def __init__(self): property.__init__(self, x) diff --git a/pypy/objspace/std/objectobject.py b/pypy/objspace/std/objectobject.py --- a/pypy/objspace/std/objectobject.py +++ b/pypy/objspace/std/objectobject.py @@ -91,11 +91,17 @@ from pypy.objspace.std.typeobject import _precheck_for_new w_type = _precheck_for_new(space, w_type) - # don't allow arguments if the default object.__init__() is about - # to be called if _excess_args(__args__): + w_parent_new, _ = space.lookup_in_type_where(w_type, '__new__') w_parent_init, _ = space.lookup_in_type_where(w_type, '__init__') - if w_parent_init is space.w_object: + if (w_parent_new is not space.w_object and + w_parent_init is not space.w_object): + # 2.7: warn about excess arguments when both methods are + # overridden + space.warn(space.wrap("object() takes no parameters"), + space.w_DeprecationWarning, 1) + elif (w_parent_new is not space.w_object or + w_parent_init is space.w_object): raise oefmt(space.w_TypeError, "object() takes no parameters") if w_type.is_abstract(): @@ -108,11 +114,18 @@ def descr__init__(space, w_obj, __args__): - # don't allow arguments unless __new__ is overridden if _excess_args(__args__): w_type = space.type(w_obj) + w_parent_init, _ = space.lookup_in_type_where(w_type, '__init__') w_parent_new, _ = space.lookup_in_type_where(w_type, '__new__') - if w_parent_new is space.w_object: + if (w_parent_init is not space.w_object and + w_parent_new is not space.w_object): + # 2.7: warn about excess arguments when both methods are + # overridden + space.warn(space.wrap("object.__init__() takes no parameters"), + space.w_DeprecationWarning, 1) + elif (w_parent_init is not space.w_object or + w_parent_new is space.w_object): raise oefmt(space.w_TypeError, "object.__init__() takes no parameters") diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py --- a/rpython/rlib/rposix.py +++ b/rpython/rlib/rposix.py @@ -249,6 +249,7 @@ SEEK_SET = rffi_platform.DefinedConstantInteger('SEEK_SET') SEEK_CUR = rffi_platform.DefinedConstantInteger('SEEK_CUR') SEEK_END = rffi_platform.DefinedConstantInteger('SEEK_END') + O_NONBLOCK = rffi_platform.DefinedConstantInteger('O_NONBLOCK') OFF_T_SIZE = rffi_platform.SizeOf('off_t') HAVE_UTIMES = rffi_platform.Has('utimes') @@ -2353,3 +2354,42 @@ def cpu_count(): return rffi.cast(lltype.Signed, _cpu_count()) + +if not _WIN32: + eci_status_flags = eci.merge(ExternalCompilationInfo(separate_module_sources=[""" + RPY_EXTERN + int rpy_get_status_flags(int fd) + { + int flags; + flags = fcntl(fd, F_GETFL, 0); + return flags; + } + + RPY_EXTERN + int rpy_set_status_flags(int fd, int flags) + { + int res; + res = fcntl(fd, F_SETFL, flags); + return res; + } + """], post_include_bits=[ + "RPY_EXTERN int rpy_get_status_flags(int);\n" + "RPY_EXTERN int rpy_set_status_flags(int, int);"] + )) + + + c_get_status_flags = external('rpy_get_status_flags', [rffi.INT], + rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO, + compilation_info=eci_status_flags) + c_set_status_flags = external('rpy_set_status_flags', [rffi.INT, rffi.INT], + rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO, + compilation_info=eci_status_flags) + + def get_status_flags(fd): + res = c_get_status_flags(fd) + res = handle_posix_error('get_status_flags', res) + return res + + def set_status_flags(fd, flags): + res = c_set_status_flags(fd, flags) + handle_posix_error('set_status_flags', res) diff --git a/rpython/rlib/test/test_rposix.py b/rpython/rlib/test/test_rposix.py --- a/rpython/rlib/test/test_rposix.py +++ b/rpython/rlib/test/test_rposix.py @@ -612,3 +612,15 @@ def test_cpu_count(): cc = rposix.cpu_count() assert cc >= 1 + +@rposix_requires('set_status_flags') +def test_set_status_flags(): + fd1, fd2 = os.pipe() + try: + flags = rposix.get_status_flags(fd1) + assert flags & rposix.O_NONBLOCK == 0 + rposix.set_status_flags(fd1, flags | rposix.O_NONBLOCK) + assert rposix.get_status_flags(fd1) & rposix.O_NONBLOCK != 0 + finally: + os.close(fd1) + os.close(fd2) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit