Author: Philip Jenvey <pjen...@underboss.org> Branch: py3k Changeset: r84693:0d7d00536295 Date: 2016-05-25 20:04 -0700 http://bitbucket.org/pypy/pypy/changeset/0d7d00536295/
Log: merge default diff --git a/lib_pypy/cffi/commontypes.py b/lib_pypy/cffi/commontypes.py --- a/lib_pypy/cffi/commontypes.py +++ b/lib_pypy/cffi/commontypes.py @@ -35,8 +35,11 @@ "you call ffi.set_unicode()" % (commontype,)) else: if commontype == cdecl: - raise api.FFIError("Unsupported type: %r. Please file a bug " - "if you think it should be." % (commontype,)) + raise api.FFIError( + "Unsupported type: %r. Please look at " + "http://cffi.readthedocs.io/en/latest/cdef.html#ffi-cdef-limitations " + "and file an issue if you think this type should really " + "be supported." % (commontype,)) result, quals = parser.parse_type_and_quals(cdecl) # recursive assert isinstance(result, model.BaseTypeByIdentity) diff --git a/pypy/module/__builtin__/functional.py b/pypy/module/__builtin__/functional.py --- a/pypy/module/__builtin__/functional.py +++ b/pypy/module/__builtin__/functional.py @@ -117,8 +117,17 @@ else: compare = space.lt jitdriver = min_jitdriver + any_kwds = bool(args.keywords) args_w = args.arguments_w if len(args_w) > 1: + if unroll and len(args_w) == 2 and not any_kwds: + # a fast path for the common case, useful for interpreted + # mode and to reduce the length of the jit trace + w0, w1 = args_w + if space.is_true(compare(w1, w0)): + return w1 + else: + return w0 w_sequence = space.newtuple(args_w) elif len(args_w): w_sequence = args_w[0] @@ -127,8 +136,8 @@ "%s() expects at least one argument", implementation_of) w_key = None - kwds = args.keywords - if kwds: + if any_kwds: + kwds = args.keywords if kwds[0] == "key" and len(kwds) == 1: w_key = args.keywords_w[0] else: diff --git a/pypy/module/__builtin__/test/test_functional.py b/pypy/module/__builtin__/test/test_functional.py --- a/pypy/module/__builtin__/test/test_functional.py +++ b/pypy/module/__builtin__/test/test_functional.py @@ -585,6 +585,11 @@ assert min([1, 2, 3]) == 1 raises(TypeError, min, 1, 2, bar=2) raises(TypeError, min, 1, 2, key=lambda x: x, bar=2) + assert type(min(1, 1.0)) is int + assert type(min(1.0, 1)) is float + assert type(min(1, 1.0, 1L)) is int + assert type(min(1.0, 1L, 1)) is float + assert type(min(1L, 1, 1.0)) is long def test_max(self): assert max(1, 2) == 2 @@ -592,3 +597,8 @@ assert max([1, 2, 3]) == 3 raises(TypeError, max, 1, 2, bar=2) raises(TypeError, max, 1, 2, key=lambda x: x, bar=2) + assert type(max(1, 1.0)) is int + assert type(max(1.0, 1)) is float + assert type(max(1, 1.0, 1L)) is int + assert type(max(1.0, 1L, 1)) is float + assert type(max(1L, 1, 1.0)) is long diff --git a/pypy/module/_cffi_backend/lib_obj.py b/pypy/module/_cffi_backend/lib_obj.py --- a/pypy/module/_cffi_backend/lib_obj.py +++ b/pypy/module/_cffi_backend/lib_obj.py @@ -196,9 +196,13 @@ if is_getattr and attr == '__dict__': return self.full_dict_copy() if is_getattr and attr == '__class__': - return self.space.type(self) + # used to be space.type(self). But HAAAAAACK! + # That makes help() behave correctly. I couldn't + # find a more reasonable way. Urgh. + from pypy.interpreter.module import Module + return self.space.gettypeobject(Module.typedef) if is_getattr and attr == '__name__': - return self.descr_repr() + return self.space.wrap("%s.lib" % self.libname) raise oefmt(self.space.w_AttributeError, "cffi library '%s' has no function, constant " "or global variable named '%s'", diff --git a/pypy/module/_cffi_backend/test/test_recompiler.py b/pypy/module/_cffi_backend/test/test_recompiler.py --- a/pypy/module/_cffi_backend/test/test_recompiler.py +++ b/pypy/module/_cffi_backend/test/test_recompiler.py @@ -1039,8 +1039,8 @@ assert MYFOO == 42 assert hasattr(lib, '__dict__') assert lib.__all__ == ['MYFOO', 'mybar'] # but not 'myvar' - assert lib.__name__ == repr(lib) - assert lib.__class__ is type(lib) + assert lib.__name__ == '_CFFI_test_import_from_lib.lib' + assert lib.__class__ is type(sys) # !! hack for help() def test_macro_var_callback(self): ffi, lib = self.prepare( diff --git a/pypy/module/cpyext/cdatetime.py b/pypy/module/cpyext/cdatetime.py --- a/pypy/module/cpyext/cdatetime.py +++ b/pypy/module/cpyext/cdatetime.py @@ -1,4 +1,5 @@ from rpython.rtyper.lltypesystem import rffi, lltype +from rpython.rtyper.annlowlevel import llhelper from pypy.module.cpyext.pyobject import PyObject, make_ref from pypy.module.cpyext.api import (cpython_api, CANNOT_FAIL, cpython_struct, PyObjectFields) @@ -16,6 +17,23 @@ ('TimeType', PyTypeObjectPtr), ('DeltaType', PyTypeObjectPtr), ('TZInfoType', PyTypeObjectPtr), + + ('Date_FromDate', lltype.Ptr(lltype.FuncType( + [rffi.INT_real, rffi.INT_real, rffi.INT_real, PyTypeObjectPtr], + PyObject))), + ('Time_FromTime', lltype.Ptr(lltype.FuncType( + [rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, + PyObject, PyTypeObjectPtr], + PyObject))), + ('DateTime_FromDateAndTime', lltype.Ptr(lltype.FuncType( + [rffi.INT_real, rffi.INT_real, rffi.INT_real, + rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, + PyObject, PyTypeObjectPtr], + PyObject))), + ('Delta_FromDelta', lltype.Ptr(lltype.FuncType( + [rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, + PyTypeObjectPtr], + PyObject))), )) @cpython_api([], lltype.Ptr(PyDateTime_CAPI)) @@ -45,6 +63,19 @@ datetimeAPI.c_TZInfoType = rffi.cast( PyTypeObjectPtr, make_ref(space, w_type)) + datetimeAPI.c_Date_FromDate = llhelper( + _PyDate_FromDate.api_func.functype, + _PyDate_FromDate.api_func.get_wrapper(space)) + datetimeAPI.c_Time_FromTime = llhelper( + _PyTime_FromTime.api_func.functype, + _PyTime_FromTime.api_func.get_wrapper(space)) + datetimeAPI.c_DateTime_FromDateAndTime = llhelper( + _PyDateTime_FromDateAndTime.api_func.functype, + _PyDateTime_FromDateAndTime.api_func.get_wrapper(space)) + datetimeAPI.c_Delta_FromDelta = llhelper( + _PyDelta_FromDelta.api_func.functype, + _PyDelta_FromDelta.api_func.get_wrapper(space)) + return datetimeAPI PyDateTime_DateStruct = lltype.ForwardReference() @@ -94,36 +125,40 @@ make_check_function("PyDelta_Check", "timedelta") make_check_function("PyTZInfo_Check", "tzinfo") -# Constructors +# Constructors. They are better used as macros. -@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real], PyObject) -def PyDate_FromDate(space, year, month, day): +@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, PyTypeObjectPtr], + PyObject) +def _PyDate_FromDate(space, year, month, day, w_type): """Return a datetime.date object with the specified year, month and day. """ year = rffi.cast(lltype.Signed, year) month = rffi.cast(lltype.Signed, month) day = rffi.cast(lltype.Signed, day) - w_datetime = PyImport_Import(space, space.wrap("datetime")) - return space.call_method( - w_datetime, "date", + return space.call_function( + w_type, space.wrap(year), space.wrap(month), space.wrap(day)) -@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real], PyObject) -def PyTime_FromTime(space, hour, minute, second, usecond): +@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, + PyObject, PyTypeObjectPtr], PyObject) +def _PyTime_FromTime(space, hour, minute, second, usecond, w_tzinfo, w_type): """Return a ``datetime.time`` object with the specified hour, minute, second and microsecond.""" hour = rffi.cast(lltype.Signed, hour) minute = rffi.cast(lltype.Signed, minute) second = rffi.cast(lltype.Signed, second) usecond = rffi.cast(lltype.Signed, usecond) - w_datetime = PyImport_Import(space, space.wrap("datetime")) - return space.call_method( - w_datetime, "time", + return space.call_function( + w_type, space.wrap(hour), space.wrap(minute), space.wrap(second), - space.wrap(usecond)) + space.wrap(usecond), w_tzinfo) -@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real], PyObject) -def PyDateTime_FromDateAndTime(space, year, month, day, hour, minute, second, usecond): +@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, + rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, + PyObject, PyTypeObjectPtr], PyObject) +def _PyDateTime_FromDateAndTime(space, year, month, day, + hour, minute, second, usecond, + w_tzinfo, w_type): """Return a datetime.datetime object with the specified year, month, day, hour, minute, second and microsecond. """ @@ -134,12 +169,11 @@ minute = rffi.cast(lltype.Signed, minute) second = rffi.cast(lltype.Signed, second) usecond = rffi.cast(lltype.Signed, usecond) - w_datetime = PyImport_Import(space, space.wrap("datetime")) - return space.call_method( - w_datetime, "datetime", + return space.call_function( + w_type, space.wrap(year), space.wrap(month), space.wrap(day), space.wrap(hour), space.wrap(minute), space.wrap(second), - space.wrap(usecond)) + space.wrap(usecond), w_tzinfo) @cpython_api([PyObject], PyObject) def PyDateTime_FromTimestamp(space, w_args): @@ -161,8 +195,10 @@ w_method = space.getattr(w_type, space.wrap("fromtimestamp")) return space.call(w_method, w_args) -@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real], PyObject) -def PyDelta_FromDSU(space, days, seconds, useconds): +@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real, + PyTypeObjectPtr], + PyObject) +def _PyDelta_FromDelta(space, days, seconds, useconds, normalize, w_type): """Return a datetime.timedelta object representing the given number of days, seconds and microseconds. Normalization is performed so that the resulting number of microseconds and seconds lie in the ranges documented for @@ -171,9 +207,8 @@ days = rffi.cast(lltype.Signed, days) seconds = rffi.cast(lltype.Signed, seconds) useconds = rffi.cast(lltype.Signed, useconds) - w_datetime = PyImport_Import(space, space.wrap("datetime")) - return space.call_method( - w_datetime, "timedelta", + return space.call_function( + w_type, space.wrap(days), space.wrap(seconds), space.wrap(useconds)) # Accessors diff --git a/pypy/module/cpyext/include/datetime.h b/pypy/module/cpyext/include/datetime.h --- a/pypy/module/cpyext/include/datetime.h +++ b/pypy/module/cpyext/include/datetime.h @@ -12,6 +12,13 @@ PyTypeObject *TimeType; PyTypeObject *DeltaType; PyTypeObject *TZInfoType; + + /* constructors */ + PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*); + PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, + PyObject*, PyTypeObject*); + PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); + PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); } PyDateTime_CAPI; PyAPI_DATA(PyDateTime_CAPI*) PyDateTimeAPI; @@ -41,6 +48,22 @@ PyObject_HEAD } PyDateTime_TZInfo; +/* Macros for accessing constructors in a simplified fashion. */ +#define PyDate_FromDate(year, month, day) \ + PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) + +#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \ + PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \ + min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType) + +#define PyTime_FromTime(hour, minute, second, usecond) \ + PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \ + Py_None, PyDateTimeAPI->TimeType) + +#define PyDelta_FromDSU(days, seconds, useconds) \ + PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \ + PyDateTimeAPI->DeltaType) + #ifdef __cplusplus } #endif diff --git a/pypy/module/cpyext/test/test_datetime.py b/pypy/module/cpyext/test/test_datetime.py --- a/pypy/module/cpyext/test/test_datetime.py +++ b/pypy/module/cpyext/test/test_datetime.py @@ -4,7 +4,8 @@ class TestDatetime(BaseApiTest): def test_date(self, space, api): - w_date = api.PyDate_FromDate(2010, 06, 03) + date_api = api._PyDateTime_Import() + w_date = api._PyDate_FromDate(2010, 06, 03, date_api.c_DateType) assert space.unwrap(space.str(w_date)) == '2010-06-03' assert api.PyDate_Check(w_date) @@ -15,7 +16,9 @@ assert api.PyDateTime_GET_DAY(w_date) == 3 def test_time(self, space, api): - w_time = api.PyTime_FromTime(23, 15, 40, 123456) + date_api = api._PyDateTime_Import() + w_time = api._PyTime_FromTime(23, 15, 40, 123456, + space.w_None, date_api.c_TimeType) assert space.unwrap(space.str(w_time)) == '23:15:40.123456' assert api.PyTime_Check(w_time) @@ -27,8 +30,10 @@ assert api.PyDateTime_TIME_GET_MICROSECOND(w_time) == 123456 def test_datetime(self, space, api): - w_date = api.PyDateTime_FromDateAndTime( - 2010, 06, 03, 23, 15, 40, 123456) + date_api = api._PyDateTime_Import() + w_date = api._PyDateTime_FromDateAndTime( + 2010, 06, 03, 23, 15, 40, 123456, + space.w_None, date_api.c_DateTimeType) assert space.unwrap(space.str(w_date)) == '2010-06-03 23:15:40.123456' assert api.PyDateTime_Check(w_date) @@ -45,6 +50,7 @@ assert api.PyDateTime_DATE_GET_MICROSECOND(w_date) == 123456 def test_delta(self, space, api): + date_api = api._PyDateTime_Import() w_delta = space.appexec( [space.wrap(3), space.wrap(15)], """(days, seconds): from datetime import timedelta @@ -53,7 +59,7 @@ assert api.PyDelta_Check(w_delta) assert api.PyDelta_CheckExact(w_delta) - w_delta = api.PyDelta_FromDSU(10, 20, 30) + w_delta = api._PyDelta_FromDelta(10, 20, 30, True, date_api.c_DeltaType) assert api.PyDelta_Check(w_delta) assert api.PyDelta_CheckExact(w_delta) @@ -118,6 +124,31 @@ datetime.tzinfo) module.clear_types() + def test_constructors(self): + module = self.import_extension('foo', [ + ("new_date", "METH_NOARGS", + """ PyDateTime_IMPORT; + return PyDateTimeAPI->Date_FromDate( + 2000, 6, 6, PyDateTimeAPI->DateType); + """), + ("new_time", "METH_NOARGS", + """ PyDateTime_IMPORT; + return PyDateTimeAPI->Time_FromTime( + 6, 6, 6, 6, Py_None, PyDateTimeAPI->TimeType); + """), + ("new_datetime", "METH_NOARGS", + """ PyDateTime_IMPORT; + return PyDateTimeAPI->DateTime_FromDateAndTime( + 2000, 6, 6, 6, 6, 6, 6, Py_None, + PyDateTimeAPI->DateTimeType); + """), + ]) + import datetime + assert module.new_date() == datetime.date(2000, 6, 6) + assert module.new_time() == datetime.time(6, 6, 6, 6) + assert module.new_datetime() == datetime.datetime( + 2000, 6, 6, 6, 6, 6, 6) + def test_macros(self): module = self.import_extension('foo', [ ("test_date_macros", "METH_NOARGS", @@ -222,3 +253,9 @@ return obj; """), ]) + import datetime + assert module.test_date_macros() == datetime.date(2000, 6, 6) + assert module.test_datetime_macros() == datetime.datetime( + 2000, 6, 6, 6, 6, 6, 6) + assert module.test_time_macros() == datetime.time(6, 6, 6, 6) + assert module.test_delta_macros() == datetime.timedelta(6, 6, 6) diff --git a/pypy/module/micronumpy/compile.py b/pypy/module/micronumpy/compile.py --- a/pypy/module/micronumpy/compile.py +++ b/pypy/module/micronumpy/compile.py @@ -124,6 +124,9 @@ return w_obj.getdictvalue(self, w_attr) return None + def issubtype_w(self, w_sub, w_type): + return w_sub is w_type + def isinstance_w(self, w_obj, w_tp): try: return w_obj.tp == w_tp diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py --- a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py +++ b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py @@ -1168,8 +1168,8 @@ assert MYFOO == 42 assert hasattr(lib, '__dict__') assert lib.__all__ == ['MYFOO', 'mybar'] # but not 'myvar' - assert lib.__name__ == repr(lib) - assert lib.__class__ is type(lib) + assert lib.__name__ == '_CFFI_test_import_from_lib.lib' + assert lib.__class__ is type(sys) # !! hack for help() def test_macro_var_callback(): ffi = FFI() diff --git a/rpython/flowspace/model.py b/rpython/flowspace/model.py --- a/rpython/flowspace/model.py +++ b/rpython/flowspace/model.py @@ -172,6 +172,9 @@ # Constant(last_exception), see below self.exits = [] # list of Link(s) + def is_final_block(self): + return self.operations == () # return or except block + def at(self): if self.operations and self.operations[0].offset >= 0: return "@%d" % self.operations[0].offset diff --git a/rpython/jit/backend/ppc/regalloc.py b/rpython/jit/backend/ppc/regalloc.py --- a/rpython/jit/backend/ppc/regalloc.py +++ b/rpython/jit/backend/ppc/regalloc.py @@ -605,6 +605,8 @@ def prepare_guard_value(self, op): l0 = self.ensure_reg(op.getarg(0)) l1 = self.ensure_reg_or_16bit_imm(op.getarg(1)) + op.getdescr().make_a_counter_per_value(op, + self.cpu.all_reg_indexes[l0.value]) arglocs = self._prepare_guard(op, [l0, l1]) return arglocs diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py --- a/rpython/rlib/rposix.py +++ b/rpython/rlib/rposix.py @@ -1938,6 +1938,21 @@ error = c_lutimes(pathname, l_timeval2p) handle_posix_error('lutimes', error) +if HAVE_FUTIMES: + c_futimes = external('futimes', + [rffi.INT, TIMEVAL2P], rffi.INT, + save_err=rffi.RFFI_SAVE_ERRNO) + + @specialize.argtype(1) + def futimes(fd, times): + if times is None: + error = c_futimes(fd, lltype.nullptr(TIMEVAL2P.TO)) + else: + with lltype.scoped_alloc(TIMEVAL2P.TO, 2) as l_timeval2p: + times_to_timeval2p(times, l_timeval2p) + error = c_futimes(fd, l_timeval2p) + handle_posix_error('futimes', error) + if HAVE_MKDIRAT: c_mkdirat = external('mkdirat', [rffi.INT, rffi.CCHARP, rffi.INT], rffi.INT, _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit