Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: guard-compatible
Changeset: r83198:1fa01a98cde5
Date: 2016-03-20 19:19 +0100
http://bitbucket.org/pypy/pypy/changeset/1fa01a98cde5/

Log:    merge default

diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -11,3 +11,15 @@
 The backend manages 64-bit values in the literal pool of the assembly instead 
of loading them as immediates.
 It includes a simplification for the operation 'zero_array'. Start and length 
parameters are bytes instead of size.
 
+.. branch: remove-py-log
+
+Replace py.log with something simpler, which should speed up logging
+
+.. branch: where_1_arg
+
+Implemented numpy.where for 1 argument (thanks sergem)
+
+.. branch: fix_indexing_by_numpy_int
+
+Implement yet another strange numpy indexing compatibility; indexing by a 
scalar 
+returns a scalar
diff --git a/pypy/module/micronumpy/arrayops.py 
b/pypy/module/micronumpy/arrayops.py
--- a/pypy/module/micronumpy/arrayops.py
+++ b/pypy/module/micronumpy/arrayops.py
@@ -71,8 +71,8 @@
     """
     if space.is_none(w_y):
         if space.is_none(w_x):
-            raise OperationError(space.w_NotImplementedError, space.wrap(
-                "1-arg where unsupported right now"))
+            arr = convert_to_array(space, w_arr)
+            return arr.descr_nonzero(space)
         raise OperationError(space.w_ValueError, space.wrap(
             "Where should be called with either 1 or 3 arguments"))
     if space.is_none(w_x):
diff --git a/pypy/module/micronumpy/ndarray.py 
b/pypy/module/micronumpy/ndarray.py
--- a/pypy/module/micronumpy/ndarray.py
+++ b/pypy/module/micronumpy/ndarray.py
@@ -267,6 +267,11 @@
                         "interpreted as a valid boolean index")
         elif isinstance(w_idx, boxes.W_GenericBox):
             w_ret = self.getitem_array_int(space, w_idx)
+
+            if isinstance(w_idx, boxes.W_IntegerBox):
+                # if w_idx is integer then getitem_array_int must contain a 
single value and we must return it.
+                # Get 0-th element of the w_ret.
+                w_ret = w_ret.implementation.descr_getitem(space, self, 
space.wrap(0))
         else:
             try:
                 w_ret = self.implementation.descr_getitem(space, self, w_idx)
diff --git a/pypy/module/micronumpy/test/test_arrayops.py 
b/pypy/module/micronumpy/test/test_arrayops.py
--- a/pypy/module/micronumpy/test/test_arrayops.py
+++ b/pypy/module/micronumpy/test/test_arrayops.py
@@ -54,8 +54,24 @@
         assert (where(False, 1, [1, 2, 3]) == [1, 2, 3]).all()
         assert (where([1, 2, 3], True, False) == [True, True, True]).all()
 
-    #def test_where_1_arg(self):
-    #    xxx
+    def test_where_1_arg(self):
+        from numpy import where, array
+
+        result = where([1,0,1])
+
+        assert isinstance(result, tuple)
+        assert len(result) == 1
+        assert (result[0] == array([0, 2])).all()
+
+    def test_where_1_arg_2d(self):
+        from numpy import where, array
+
+        result = where([[1,0,1],[2,-1,-1]])
+
+        assert isinstance(result, tuple)
+        assert len(result) == 2
+        assert (result[0] == array([0, 0, 1, 1, 1])).all()
+        assert (result[1] == array([0, 2, 0, 1, 2])).all()
 
     def test_where_invalidates(self):
         from numpy import where, ones, zeros, array
diff --git a/pypy/module/micronumpy/test/test_ndarray.py 
b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -3437,6 +3437,21 @@
         a.itemset(1, 2, 100)
         assert a[1, 2] == 100
 
+    def test_index_int(self):
+        import numpy as np
+        a = np.array([10, 20, 30], dtype='int64')
+        res = a[np.int64(1)]
+        assert isinstance(res, np.int64)
+        assert res == 20
+        res = a[np.int32(0)]
+        assert isinstance(res, np.int64)
+        assert res == 10
+
+        b = a.astype(float)
+        res = b[np.int64(1)]
+        assert res == 20.0
+        assert isinstance(res, np.float64)
+
     def test_index(self):
         import numpy as np
         a = np.array([1], np.uint16)
@@ -3448,6 +3463,7 @@
             assert exc.value.message == 'only integer arrays with one element 
' \
                                         'can be converted to an index'
 
+
     def test_int_array_index(self):
         from numpy import array
         assert (array([])[[]] == []).all()
diff --git a/pypy/module/thread/test/test_lock.py 
b/pypy/module/thread/test/test_lock.py
--- a/pypy/module/thread/test/test_lock.py
+++ b/pypy/module/thread/test/test_lock.py
@@ -3,6 +3,7 @@
 import sys, os
 from pypy.module.thread.test.support import GenericTestThread
 from rpython.translator.c.test.test_genc import compile
+import platform
 
 
 class AppTestLock(GenericTestThread):
@@ -63,6 +64,8 @@
         else:
             assert self.runappdirect, "missing lock._py3k_acquire()"
 
+    @py.test.mark.xfail(platform.machine() == 's390x',
+                        reason='may fail this test under heavy load')
     def test_ping_pong(self):
         # The purpose of this test is that doing a large number of ping-pongs
         # between two threads, using locks, should complete in a reasonable
diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py
--- a/rpython/memory/gc/incminimark.py
+++ b/rpython/memory/gc/incminimark.py
@@ -1654,15 +1654,15 @@
             else:
                 self.nursery_objects_shadows.clear()
         #
+        # visit the P and O lists from rawrefcount, if enabled.
+        if self.rrc_enabled:
+            self.rrc_minor_collection_free()
+        #
         # Walk the list of young raw-malloced objects, and either free
         # them or make them old.
         if self.young_rawmalloced_objects:
             self.free_young_rawmalloced_objects()
         #
-        # visit the P and O lists from rawrefcount, if enabled.
-        if self.rrc_enabled:
-            self.rrc_minor_collection_free()
-        #
         # All live nursery objects are out of the nursery or pinned inside
         # the nursery.  Create nursery barriers to protect the pinned objects,
         # fill the rest of the nursery with zeros and reset the current nursery
diff --git a/rpython/memory/gc/test/test_rawrefcount.py 
b/rpython/memory/gc/test/test_rawrefcount.py
--- a/rpython/memory/gc/test/test_rawrefcount.py
+++ b/rpython/memory/gc/test/test_rawrefcount.py
@@ -29,7 +29,8 @@
         assert count2 - count1 == expected_trigger
 
     def _rawrefcount_pair(self, intval, is_light=False, is_pyobj=False,
-                          create_old=False, create_immortal=False):
+                          create_old=False, create_immortal=False,
+                          force_external=False):
         if is_light:
             rc = REFCNT_FROM_PYPY_LIGHT
         else:
@@ -40,7 +41,13 @@
         if create_immortal:
             p1 = lltype.malloc(S, immortal=True)
         else:
-            p1 = self.malloc(S)
+            saved = self.gc.nonlarge_max
+            try:
+                if force_external:
+                    self.gc.nonlarge_max = 1
+                p1 = self.malloc(S)
+            finally:
+                self.gc.nonlarge_max = saved
         p1.x = intval
         if create_immortal:
             self.consider_constant(p1)
@@ -220,9 +227,10 @@
     def test_pypy_nonlight_dies_quickly_old(self):
         self.test_pypy_nonlight_dies_quickly(old=True)
 
-    def test_pyobject_pypy_link_dies_on_minor_collection(self):
+    @py.test.mark.parametrize('external', [False, True])
+    def test_pyobject_pypy_link_dies_on_minor_collection(self, external):
         p1, p1ref, r1, r1addr, check_alive = (
-            self._rawrefcount_pair(42, is_pyobj=True))
+            self._rawrefcount_pair(42, is_pyobj=True, force_external=external))
         check_alive(0)
         r1.ob_refcnt += 1            # the pyobject is kept alive
         self._collect(major=False)
@@ -231,9 +239,12 @@
         self.gc.check_no_more_rawrefcount_state()
         lltype.free(r1, flavor='raw')
 
-    def test_pyobject_dies(self, old=False):
+    @py.test.mark.parametrize('old,external', [
+        (False, False), (True, False), (False, True)])
+    def test_pyobject_dies(self, old, external):
         p1, p1ref, r1, r1addr, check_alive = (
-            self._rawrefcount_pair(42, is_pyobj=True, create_old=old))
+            self._rawrefcount_pair(42, is_pyobj=True, create_old=old,
+                                   force_external=external))
         check_alive(0)
         if old:
             self._collect(major=False)
@@ -247,9 +258,12 @@
         self.gc.check_no_more_rawrefcount_state()
         lltype.free(r1, flavor='raw')
 
-    def test_pyobject_survives_from_obj(self, old=False):
+    @py.test.mark.parametrize('old,external', [
+        (False, False), (True, False), (False, True)])
+    def test_pyobject_survives_from_obj(self, old, external):
         p1, p1ref, r1, r1addr, check_alive = (
-            self._rawrefcount_pair(42, is_pyobj=True, create_old=old))
+            self._rawrefcount_pair(42, is_pyobj=True, create_old=old,
+                                   force_external=external))
         check_alive(0)
         self.stackroots.append(p1)
         self._collect(major=False)
@@ -269,11 +283,6 @@
         self.gc.check_no_more_rawrefcount_state()
         lltype.free(r1, flavor='raw')
 
-    def test_pyobject_dies_old(self):
-        self.test_pyobject_dies(old=True)
-    def test_pyobject_survives_from_obj_old(self):
-        self.test_pyobject_survives_from_obj(old=True)
-
     def test_pyobject_attached_to_prebuilt_obj(self):
         p1, p1ref, r1, r1addr, check_alive = (
             self._rawrefcount_pair(42, create_immortal=True))
diff --git a/rpython/rlib/rvmprof/src/vmprof_config.h 
b/rpython/rlib/rvmprof/src/vmprof_config.h
--- a/rpython/rlib/rvmprof/src/vmprof_config.h
+++ b/rpython/rlib/rvmprof/src/vmprof_config.h
@@ -1,6 +1,17 @@
 #define HAVE_SYS_UCONTEXT_H
-#if defined(__FreeBSD__) || defined(__APPLE__)
+#if defined(__FreeBSD__)
 #define PC_FROM_UCONTEXT uc_mcontext.mc_rip
+#elif defined( __APPLE__)
+  #if ((ULONG_MAX) == (UINT_MAX))
+    #define PC_FROM_UCONTEXT uc_mcontext->__ss.__eip
+  #else
+    #define PC_FROM_UCONTEXT uc_mcontext->__ss.__rip
+  #endif
+#elif defined(__arm__)
+#define PC_FROM_UCONTEXT uc_mcontext.arm_ip
+#elif defined(__linux) && defined(__i386) && defined(__GNUC__)
+#define PC_FROM_UCONTEXT uc_mcontext.gregs[REG_EIP]
 #else
+/* linux, gnuc */
 #define PC_FROM_UCONTEXT uc_mcontext.gregs[REG_RIP]
 #endif
diff --git a/rpython/rlib/rvmprof/src/vmprof_getpc.h 
b/rpython/rlib/rvmprof/src/vmprof_getpc.h
--- a/rpython/rlib/rvmprof/src/vmprof_getpc.h
+++ b/rpython/rlib/rvmprof/src/vmprof_getpc.h
@@ -43,9 +43,6 @@
 
 #ifndef BASE_GETPC_H_
 #define BASE_GETPC_H_
-
-#include "vmprof_config.h"
-
 // On many linux systems, we may need _GNU_SOURCE to get access to
 // the defined constants that define the register we want to see (eg
 // REG_EIP).  Note this #define must come first!
@@ -58,6 +55,8 @@
 #define _XOPEN_SOURCE 500
 #endif
 
+#include "vmprof_config.h"
+
 #include <string.h>         // for memcmp
 #if defined(HAVE_SYS_UCONTEXT_H)
 #include <sys/ucontext.h>
@@ -112,13 +111,8 @@
 // PC_FROM_UCONTEXT in config.h.  The only thing we need to do here,
 // then, is to do the magic call-unrolling for systems that support it.
 
-#if defined(__linux) && defined(__i386) && defined(__GNUC__)
-intptr_t GetPC(ucontext_t *signal_ucontext) {
-  return signal_ucontext->uc_mcontext.gregs[REG_EIP];
-}
-
-// Special case #2: Windows, which has to do something totally different.
-#elif defined(_WIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__) || 
defined(__MINGW32__)
+// Special case Windows, which has to do something totally different.
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__) || 
defined(__MINGW32__)
 // If this is ever implemented, probably the way to do it is to have
 // profiler.cc use a high-precision timer via timeSetEvent:
 //    http://msdn2.microsoft.com/en-us/library/ms712713.aspx
@@ -141,18 +135,10 @@
 // Normal cases.  If this doesn't compile, it's probably because
 // PC_FROM_UCONTEXT is the empty string.  You need to figure out
 // the right value for your system, and add it to the list in
-// configure.ac (or set it manually in your config.h).
+// vmrpof_config.h
 #else
 intptr_t GetPC(ucontext_t *signal_ucontext) {
-#ifdef __APPLE__
-#if ((ULONG_MAX) == (UINT_MAX))
-  return (signal_ucontext->uc_mcontext->__ss.__eip);
-#else
-  return (signal_ucontext->uc_mcontext->__ss.__rip);
-#endif
-#else
   return signal_ucontext->PC_FROM_UCONTEXT;   // defined in config.h
-#endif
 }
 
 #endif
diff --git a/rpython/rlib/test/test_rthread.py 
b/rpython/rlib/test/test_rthread.py
--- a/rpython/rlib/test/test_rthread.py
+++ b/rpython/rlib/test/test_rthread.py
@@ -5,6 +5,7 @@
 from rpython.translator.c.test.test_boehm import AbstractGCTestClass
 from rpython.rtyper.lltypesystem import lltype, rffi
 import py
+import platform
 
 def test_lock():
     l = allocate_lock()
@@ -92,6 +93,8 @@
         res = fn()
         assert res == 42
 
+    @py.test.mark.xfail(platform.machine() == 's390x',
+                        reason='may fail this test under heavy load')
     def test_gc_locking(self):
         import time
         from rpython.rlib.debug import ll_assert
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
@@ -4,6 +4,8 @@
 import sys, random
 from rpython.rlib import runicode
 
+from hypothesis import given, settings, strategies
+
 
 def test_unichr():
     assert runicode.UNICHR(0xffff) == u'\uffff'
@@ -172,6 +174,17 @@
                              "utf-32 utf-32-be utf-32-le").split():
                 self.checkdecode(uni, encoding)
 
+    # Same as above, but uses Hypothesis to generate non-surrogate unicode
+    # characters.
+    @settings(max_examples=10000)
+    @given(strategies.characters(blacklist_categories=["Cs"]))
+    def test_random_hypothesis(self, uni):
+        if sys.version >= "2.7":
+            self.checkdecode(uni, "utf-7")
+        for encoding in ("utf-8 utf-16 utf-16-be utf-16-le "
+                         "utf-32 utf-32-be utf-32-le").split():
+            self.checkdecode(uni, encoding)
+
     def test_maxunicode(self):
         uni = unichr(sys.maxunicode)
         if sys.version >= "2.7":
diff --git a/rpython/tool/ansi_print.py b/rpython/tool/ansi_print.py
--- a/rpython/tool/ansi_print.py
+++ b/rpython/tool/ansi_print.py
@@ -50,9 +50,9 @@
     # some more methods used by sandlib
     call      = _make_method(':call', (34,))
     result    = _make_method(':result', (34,))
-    exception = _make_method(':exception', (34,)),
-    vpath     = _make_method(':vpath', (35,)),
-    timeout   = _make_method('', (1, 31)),
+    exception = _make_method(':exception', (34,))
+    vpath     = _make_method(':vpath', (35,))
+    timeout   = _make_method('', (1, 31))
 
     # directly calling the logger writes "[name] text" with no particular color
     __call__ = _make_method('', ())
diff --git a/rpython/translator/sandbox/sandlib.py 
b/rpython/translator/sandbox/sandlib.py
--- a/rpython/translator/sandbox/sandlib.py
+++ b/rpython/translator/sandbox/sandlib.py
@@ -527,6 +527,9 @@
         node = self.get_node(vpathname)
         return node.keys()
 
+    def do_ll_os__ll_os_unlink(self, vpathname):
+        raise OSError(errno.EPERM, "write access denied")
+
     def do_ll_os__ll_os_getuid(self):
         return UID
     do_ll_os__ll_os_geteuid = do_ll_os__ll_os_getuid
diff --git a/testrunner/runner.py b/testrunner/runner.py
--- a/testrunner/runner.py
+++ b/testrunner/runner.py
@@ -240,8 +240,8 @@
         s = 'setting'
         if os.environ.get('MAKEFLAGS'):
             s = 'overriding'
-        out.write("%s MAKEFLAGS to '-j1'\n" % s)
-        os.environ['MAKEFLAGS'] = '-j1'
+        out.write("%s MAKEFLAGS to ' ' (space)\n" % s)
+        os.environ['MAKEFLAGS'] = ' '
     failure = False
 
     for testname in testdirs:
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to