Author: Maciej Fijalkowski <fij...@gmail.com> Branch: Changeset: r78530:9f734aff75ff Date: 2015-07-12 20:11 +0200 http://bitbucket.org/pypy/pypy/changeset/9f734aff75ff/
Log: merge diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py --- a/pypy/config/pypyoption.py +++ b/pypy/config/pypyoption.py @@ -23,14 +23,14 @@ default_modules.update([ "_codecs", "gc", "_weakref", "marshal", "errno", "imp", "math", "cmath", "_sre", "_pickle_support", "operator", "parser", "symbol", "token", "_ast", - "_io", "_random", "__pypy__", "_testing" + "_io", "_random", "__pypy__", "_testing", "time" ]) # --allworkingmodules working_modules = default_modules.copy() working_modules.update([ - "_socket", "unicodedata", "mmap", "fcntl", "_locale", "pwd", "time" , + "_socket", "unicodedata", "mmap", "fcntl", "_locale", "pwd", "select", "zipimport", "_lsprof", "crypt", "signal", "_rawffi", "termios", "zlib", "bz2", "struct", "_hashlib", "_md5", "_sha", "_minimal_curses", "cStringIO", "thread", "itertools", "pyexpat", "_ssl", "cpyext", "array", diff --git a/pypy/goal/targetpypystandalone.py b/pypy/goal/targetpypystandalone.py --- a/pypy/goal/targetpypystandalone.py +++ b/pypy/goal/targetpypystandalone.py @@ -297,7 +297,12 @@ options = make_dict(config) wrapstr = 'space.wrap(%r)' % (options) pypy.module.sys.Module.interpleveldefs['pypy_translation_info'] = wrapstr + if config.objspace.usemodules._cffi_backend: + self.hack_for_cffi_modules(driver) + return self.get_entry_point(config) + + def hack_for_cffi_modules(self, driver): # HACKHACKHACK # ugly hack to modify target goal from compile_c to build_cffi_imports # this should probably get cleaned up and merged with driver.create_exe @@ -336,8 +341,6 @@ driver.default_goal = 'build_cffi_imports' # HACKHACKHACK end - return self.get_entry_point(config) - def jitpolicy(self, driver): from pypy.module.pypyjit.policy import PyPyJitPolicy from pypy.module.pypyjit.hooks import pypy_hooks diff --git a/pypy/module/_cffi_backend/ctypeobj.py b/pypy/module/_cffi_backend/ctypeobj.py --- a/pypy/module/_cffi_backend/ctypeobj.py +++ b/pypy/module/_cffi_backend/ctypeobj.py @@ -90,6 +90,16 @@ def _convert_error(self, expected, w_got): space = self.space if isinstance(w_got, cdataobj.W_CData): + if self.name == w_got.ctype.name: + # in case we'd give the error message "initializer for + # ctype 'A' must be a pointer to same type, not cdata + # 'B'", but with A=B, then give instead a different error + # message to try to clear up the confusion + return oefmt(space.w_TypeError, + "initializer for ctype '%s' appears indeed to " + "be '%s', but the types are different (check " + "that you are not e.g. mixing up different ffi " + "instances)", self.name, w_got.ctype.name) return oefmt(space.w_TypeError, "initializer for ctype '%s' must be a %s, not cdata " "'%s'", self.name, expected, w_got.ctype.name) diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py --- a/pypy/module/_cffi_backend/test/_backend_test_c.py +++ b/pypy/module/_cffi_backend/test/_backend_test_c.py @@ -3402,6 +3402,29 @@ py.test.raises(RuntimeError, "p[42]") py.test.raises(RuntimeError, "p[42] = -1") +def test_mixup(): + BStruct1 = new_struct_type("foo") + BStruct2 = new_struct_type("foo") # <= same name as BStruct1 + BStruct3 = new_struct_type("bar") + BStruct1Ptr = new_pointer_type(BStruct1) + BStruct2Ptr = new_pointer_type(BStruct2) + BStruct3Ptr = new_pointer_type(BStruct3) + BStruct1PtrPtr = new_pointer_type(BStruct1Ptr) + BStruct2PtrPtr = new_pointer_type(BStruct2Ptr) + BStruct3PtrPtr = new_pointer_type(BStruct3Ptr) + pp1 = newp(BStruct1PtrPtr) + pp2 = newp(BStruct2PtrPtr) + pp3 = newp(BStruct3PtrPtr) + pp1[0] = pp1[0] + e = py.test.raises(TypeError, "pp3[0] = pp1[0]") + assert str(e.value).startswith("initializer for ctype 'bar *' must be a ") + assert str(e.value).endswith(", not cdata 'foo *'") + e = py.test.raises(TypeError, "pp2[0] = pp1[0]") + assert str(e.value) == ("initializer for ctype 'foo *' appears indeed to " + "be 'foo *', but the types are different (check " + "that you are not e.g. mixing up different ffi " + "instances)") + def test_version(): # this test is here mostly for PyPy assert __version__ == "1.2.0" diff --git a/pypy/module/_vmprof/interp_vmprof.py b/pypy/module/_vmprof/interp_vmprof.py --- a/pypy/module/_vmprof/interp_vmprof.py +++ b/pypy/module/_vmprof/interp_vmprof.py @@ -23,11 +23,16 @@ # running make inside the src dir DYNAMIC_VMPROF = False +if sys.platform.startswith('linux'): + libs = ['dl'] +else: + libs = [] + eci_kwds = dict( include_dirs = [SRC], includes = ['vmprof.h', 'trampoline.h'], separate_module_files = [SRC.join('trampoline.vmprof.s')], - libraries = ['dl'], + libraries = libs, post_include_bits=[""" int pypy_vmprof_init(void); diff --git a/pypy/module/_vmprof/src/config.h b/pypy/module/_vmprof/src/config.h --- a/pypy/module/_vmprof/src/config.h +++ b/pypy/module/_vmprof/src/config.h @@ -1,2 +1,6 @@ #define HAVE_SYS_UCONTEXT_H +#if defined(__FreeBSD__) || defined(__APPLE__) +#define PC_FROM_UCONTEXT uc_mcontext.mc_rip +#else #define PC_FROM_UCONTEXT uc_mcontext.gregs[REG_RIP] +#endif diff --git a/pypy/module/_vmprof/src/vmprof.c b/pypy/module/_vmprof/src/vmprof.c --- a/pypy/module/_vmprof/src/vmprof.c +++ b/pypy/module/_vmprof/src/vmprof.c @@ -33,6 +33,9 @@ //#include <libunwind.h> #include "vmprof.h" +#if defined(__FreeBSD__) || defined(__APPLE__) +#define sighandler_t sig_t +#endif #define _unused(x) ((void)x) diff --git a/pypy/module/micronumpy/test/test_ufuncs.py b/pypy/module/micronumpy/test/test_ufuncs.py --- a/pypy/module/micronumpy/test/test_ufuncs.py +++ b/pypy/module/micronumpy/test/test_ufuncs.py @@ -540,6 +540,15 @@ for v in [float('inf'), float('-inf'), float('nan'), float('-nan')]: assert math.isnan(fmod(v, 2)) + def test_mod(self): + from numpy import mod + assert mod(5, 3) == 2 + assert mod(5, -3) == -1 + assert mod(-5, 3) == 1 + assert mod(-5, -3) == -2 + assert mod(2.5, 1) == 0.5 + assert mod(-1.5, 2) == 0.5 + def test_minimum(self): from numpy import array, minimum, nan, isnan diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py --- a/pypy/module/micronumpy/types.py +++ b/pypy/module/micronumpy/types.py @@ -759,7 +759,21 @@ @simple_binary_op def mod(self, v1, v2): - return math.fmod(v1, v2) + # partial copy of pypy.objspace.std.floatobject.W_FloatObject.descr_mod + if v2 == 0.0: + return rfloat.NAN + mod = math.fmod(v1, v2) + if mod: + # ensure the remainder has the same sign as the denominator + if (v2 < 0.0) != (mod < 0.0): + mod += v2 + else: + # the remainder is zero, and in the presence of signed zeroes + # fmod returns different results across platforms; ensure + # it has the same sign as the denominator; we'd like to do + # "mod = v2 * 0.0", but that may get optimized away + mod = rfloat.copysign(0.0, v2) + return mod @simple_binary_op def pow(self, v1, v2): diff --git a/pypy/module/pypyjit/test_pypy_c/test_string.py b/pypy/module/pypyjit/test_pypy_c/test_string.py --- a/pypy/module/pypyjit/test_pypy_c/test_string.py +++ b/pypy/module/pypyjit/test_pypy_c/test_string.py @@ -238,7 +238,7 @@ log = self.run(""" def main(n): for i in xrange(n): - unicode('abc') + unicode(str(i)) return i """, [1000]) loop, = log.loops_by_filename(self.filepath) @@ -248,10 +248,10 @@ i50 = int_add(i47, 1) setfield_gc(p15, i50, descr=<FieldS pypy.module.__builtin__.functional.W_XRangeIterator.inst_current 8>) guard_not_invalidated(descr=...) - p52 = call(ConstClass(str_decode_ascii__raise_unicode_exception_decode), ConstPtr(ptr38), 3, 1, descr=<Callr . rii EF=5>) + p80 = call(ConstClass(ll_str__IntegerR_SignedConst_Signed), i47, descr=<Callr . i EF=3>) guard_no_exception(descr=...) - p53 = getfield_gc_pure(p52, descr=<FieldP tuple2.item0 .>) - guard_nonnull(p53, descr=...) + p53 = call(ConstClass(fast_str_decode_ascii), p80, descr=<Callr . r EF=4>) + guard_no_exception(descr=...) --TICK-- jump(..., descr=...) """) diff --git a/pypy/objspace/std/unicodeobject.py b/pypy/objspace/std/unicodeobject.py --- a/pypy/objspace/std/unicodeobject.py +++ b/pypy/objspace/std/unicodeobject.py @@ -6,7 +6,7 @@ from rpython.rlib.rstring import StringBuilder, UnicodeBuilder from rpython.rlib.runicode import ( make_unicode_escape_function, str_decode_ascii, str_decode_utf_8, - unicode_encode_ascii, unicode_encode_utf_8) + unicode_encode_ascii, unicode_encode_utf_8, fast_str_decode_ascii) from pypy.interpreter import unicodehelper from pypy.interpreter.baseobjspace import W_Root @@ -481,9 +481,13 @@ if encoding == 'ascii': # XXX error handling s = space.charbuf_w(w_obj) - eh = unicodehelper.decode_error_handler(space) - return space.wrap(str_decode_ascii( - s, len(s), None, final=True, errorhandler=eh)[0]) + try: + u = fast_str_decode_ascii(s) + except ValueError: + eh = unicodehelper.decode_error_handler(space) + u = str_decode_ascii( # try again, to get the error right + s, len(s), None, final=True, errorhandler=eh)[0] + return space.wrap(u) if encoding == 'utf-8': s = space.charbuf_w(w_obj) eh = unicodehelper.decode_error_handler(space) diff --git a/rpython/rlib/runicode.py b/rpython/rlib/runicode.py --- a/rpython/rlib/runicode.py +++ b/rpython/rlib/runicode.py @@ -1009,6 +1009,16 @@ result.append(r) return result.build(), pos +# An elidable version, for a subset of the cases +@jit.elidable +def fast_str_decode_ascii(s): + result = UnicodeBuilder(len(s)) + for c in s: + if ord(c) >= 128: + raise ValueError + result.append(unichr(ord(c))) + return result.build() + # Specialize on the errorhandler when it's a constant @specialize.arg_or_var(3) diff --git a/rpython/rlib/test/test_runicode.py b/rpython/rlib/test/test_runicode.py --- a/rpython/rlib/test/test_runicode.py +++ b/rpython/rlib/test/test_runicode.py @@ -139,6 +139,12 @@ for encoding in "utf-8 latin-1 ascii".split(): self.checkdecode(chr(i), encoding) + def test_fast_str_decode_ascii(self): + u = runicode.fast_str_decode_ascii("abc\x00\x7F") + assert type(u) is unicode + assert u == u"abc\x00\x7F" + py.test.raises(ValueError, runicode.fast_str_decode_ascii, "ab\x80") + def test_all_first_256(self): for i in range(256): for encoding in ("utf-7 utf-8 latin-1 utf-16 utf-16-be utf-16-le " _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit