Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: reflex-support Changeset: r55841:782ac49bb966 Date: 2012-06-25 17:47 -0700 http://bitbucket.org/pypy/pypy/changeset/782ac49bb966/
Log: merge default into branch diff --git a/pypy/doc/cppyy.rst b/pypy/doc/cppyy.rst --- a/pypy/doc/cppyy.rst +++ b/pypy/doc/cppyy.rst @@ -87,14 +87,19 @@ $ cd pypy $ hg up reflex-support # optional $ cd pypy/translator/goal + + # This example shows python, but using pypy-c is faster and uses less memory $ python translate.py -O jit --gcrootfinder=shadowstack targetpypystandalone.py --withmod-cppyy This will build a ``pypy-c`` that includes the cppyy module, and through that, Reflex support. Of course, if you already have a pre-built version of the ``pypy`` interpreter, you can use that for the translation rather than ``python``. +If not, you may want `to obtain a binary distribution`_ to speed up the +translation step. .. _`PyPy sources`: https://bitbucket.org/pypy/pypy/overview +.. _`to obtain a binary distribution`: http://doc.pypy.org/en/latest/getting-started.html#download-a-pre-built-pypy Basic example 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,7 +11,8 @@ .. branch: reflex-support Provides cppyy module (disabled by default) for access to C++ through Reflex. See doc/cppyy.rst for full details and functionality. - +.. branch: nupypy-axis-arg-check +Check that axis arg is valid in _numpypy .. "uninteresting" branches that we should just ignore for the whatsnew: .. branch: slightly-shorter-c diff --git a/pypy/module/_ssl/test/test_ztranslation.py b/pypy/module/_ssl/test/test_ztranslation.py new file mode 100644 --- /dev/null +++ b/pypy/module/_ssl/test/test_ztranslation.py @@ -0,0 +1,4 @@ +from pypy.objspace.fake.checkmodule import checkmodule + +def test__ffi_translates(): + checkmodule('_ssl') diff --git a/pypy/module/_ssl/thread_lock.py b/pypy/module/_ssl/thread_lock.py --- a/pypy/module/_ssl/thread_lock.py +++ b/pypy/module/_ssl/thread_lock.py @@ -65,6 +65,8 @@ eci = ExternalCompilationInfo( separate_module_sources=[separate_module_source], + post_include_bits=[ + "int _PyPy_SSL_SetupThreads(void);"], export_symbols=['_PyPy_SSL_SetupThreads'], ) diff --git a/pypy/module/array/interp_array.py b/pypy/module/array/interp_array.py --- a/pypy/module/array/interp_array.py +++ b/pypy/module/array/interp_array.py @@ -167,7 +167,6 @@ def get_raw_address(self): return self.array._charbuf_start() - def make_array(mytype): W_ArrayBase = globals()['W_ArrayBase'] diff --git a/pypy/module/cppyy/test/conftest.py b/pypy/module/cppyy/test/conftest.py new file mode 100644 --- /dev/null +++ b/pypy/module/cppyy/test/conftest.py @@ -0,0 +1,5 @@ +import py + +def pytest_runtest_setup(item): + if py.path.local.sysfind('genreflex') is None: + py.test.skip("genreflex is not installed") diff --git a/pypy/module/cppyy/test/test_cppyy.py b/pypy/module/cppyy/test/test_cppyy.py --- a/pypy/module/cppyy/test/test_cppyy.py +++ b/pypy/module/cppyy/test/test_cppyy.py @@ -145,7 +145,7 @@ e1 = None gc.collect() assert t.get_overload("getCount").call(None) == 1 - e2.destruct() + e2.destruct() assert t.get_overload("getCount").call(None) == 0 e2 = None gc.collect() diff --git a/pypy/module/cppyy/test/test_operators.py b/pypy/module/cppyy/test/test_operators.py --- a/pypy/module/cppyy/test/test_operators.py +++ b/pypy/module/cppyy/test/test_operators.py @@ -133,7 +133,7 @@ o = gbl.operator_unsigned_long(); o.m_ulong = sys.maxint + 128 - assert o.m_ulong == sys.maxint + 128 + assert o.m_ulong == sys.maxint + 128 assert long(o) == sys.maxint + 128 o = gbl.operator_float(); o.m_float = 3.14 diff --git a/pypy/module/cpyext/include/pycapsule.h b/pypy/module/cpyext/include/pycapsule.h --- a/pypy/module/cpyext/include/pycapsule.h +++ b/pypy/module/cpyext/include/pycapsule.h @@ -50,6 +50,8 @@ PyAPI_FUNC(void *) PyCapsule_Import(const char *name, int no_block); +void init_capsule(void); + #ifdef __cplusplus } #endif diff --git a/pypy/module/cpyext/include/pycobject.h b/pypy/module/cpyext/include/pycobject.h --- a/pypy/module/cpyext/include/pycobject.h +++ b/pypy/module/cpyext/include/pycobject.h @@ -47,6 +47,8 @@ void (*destructor)(void *); } PyCObject; #endif + +void init_pycobject(void); #ifdef __cplusplus } diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py --- a/pypy/module/micronumpy/interp_numarray.py +++ b/pypy/module/micronumpy/interp_numarray.py @@ -15,6 +15,7 @@ from pypy.rlib.rstring import StringBuilder from pypy.rpython.lltypesystem import lltype, rffi from pypy.tool.sourcetools import func_with_new_name +from pypy.module.micronumpy.interp_support import unwrap_axis_arg count_driver = jit.JitDriver( @@ -156,10 +157,6 @@ def _reduce_ufunc_impl(ufunc_name, promote_to_largest=False): def impl(self, space, w_axis=None, w_out=None): - if space.is_w(w_axis, space.w_None): - axis = -1 - else: - axis = space.int_w(w_axis) if space.is_w(w_out, space.w_None) or not w_out: out = None elif not isinstance(w_out, BaseArray): @@ -168,7 +165,7 @@ else: out = w_out return getattr(interp_ufuncs.get(space), ufunc_name).reduce(space, - self, True, promote_to_largest, axis, + self, True, promote_to_largest, w_axis, False, out) return func_with_new_name(impl, "reduce_%s_impl" % ufunc_name) @@ -570,11 +567,10 @@ def descr_mean(self, space, w_axis=None, w_out=None): if space.is_w(w_axis, space.w_None): - w_axis = space.wrap(-1) w_denom = space.wrap(support.product(self.shape)) else: - dim = space.int_w(w_axis) - w_denom = space.wrap(self.shape[dim]) + axis = unwrap_axis_arg(space, len(self.shape), w_axis) + w_denom = space.wrap(self.shape[axis]) return space.div(self.descr_sum_promote(space, w_axis, w_out), w_denom) def descr_var(self, space, w_axis=None): @@ -1310,12 +1306,24 @@ raise OperationError(space.w_NotImplementedError, space.wrap("unsupported")) if space.is_w(w_axis, space.w_None): return space.wrap(support.product(arr.shape)) + shapelen = len(arr.shape) if space.isinstance_w(w_axis, space.w_int): - return space.wrap(arr.shape[space.int_w(w_axis)]) + axis = space.int_w(w_axis) + if axis < -shapelen or axis>= shapelen: + raise operationerrfmt(space.w_ValueError, + "axis entry %d is out of bounds [%d, %d)", axis, + -shapelen, shapelen) + return space.wrap(arr.shape[axis]) + # numpy as of June 2012 does not implement this s = 1 elems = space.fixedview(w_axis) for w_elem in elems: - s *= arr.shape[space.int_w(w_elem)] + axis = space.int_w(w_elem) + if axis < -shapelen or axis>= shapelen: + raise operationerrfmt(space.w_ValueError, + "axis entry %d is out of bounds [%d, %d)", axis, + -shapelen, shapelen) + s *= arr.shape[axis] return space.wrap(s) def dot(space, w_obj, w_obj2): diff --git a/pypy/module/micronumpy/interp_support.py b/pypy/module/micronumpy/interp_support.py --- a/pypy/module/micronumpy/interp_support.py +++ b/pypy/module/micronumpy/interp_support.py @@ -4,6 +4,7 @@ from pypy.module.micronumpy import interp_dtype from pypy.objspace.std.strutil import strip_spaces from pypy.rlib import jit +from pypy.rlib.rarithmetic import maxint FLOAT_SIZE = rffi.sizeof(lltype.Float) @@ -103,3 +104,16 @@ return _fromstring_bin(space, s, count, length, dtype) else: return _fromstring_text(space, s, count, sep, length, dtype) + +def unwrap_axis_arg(space, shapelen, w_axis): + if space.is_w(w_axis, space.w_None) or not w_axis: + axis = maxint + else: + axis = space.int_w(w_axis) + if axis < -shapelen or axis>= shapelen: + raise operationerrfmt(space.w_ValueError, + "axis entry %d is out of bounds [%d, %d)", axis, + -shapelen, shapelen) + if axis < 0: + axis += shapelen + return axis diff --git a/pypy/module/micronumpy/interp_ufuncs.py b/pypy/module/micronumpy/interp_ufuncs.py --- a/pypy/module/micronumpy/interp_ufuncs.py +++ b/pypy/module/micronumpy/interp_ufuncs.py @@ -2,11 +2,11 @@ from pypy.interpreter.error import OperationError, operationerrfmt from pypy.interpreter.gateway import interp2app, unwrap_spec, NoneNotWrapped from pypy.interpreter.typedef import TypeDef, GetSetProperty, interp_attrproperty -from pypy.module.micronumpy import interp_boxes, interp_dtype, support, loop +from pypy.module.micronumpy import interp_boxes, interp_dtype, loop from pypy.rlib import jit from pypy.rlib.rarithmetic import LONG_BIT from pypy.tool.sourcetools import func_with_new_name - +from pypy.module.micronumpy.interp_support import unwrap_axis_arg class W_Ufunc(Wrappable): _attrs_ = ["name", "promote_to_float", "promote_bools", "identity"] @@ -121,11 +121,7 @@ """ from pypy.module.micronumpy.interp_numarray import BaseArray if w_axis is None: - axis = 0 - elif space.is_w(w_axis, space.w_None): - axis = -1 - else: - axis = space.int_w(w_axis) + w_axis = space.wrap(0) if space.is_w(w_out, space.w_None): out = None elif not isinstance(w_out, BaseArray): @@ -133,9 +129,9 @@ 'output must be an array')) else: out = w_out - return self.reduce(space, w_obj, False, False, axis, keepdims, out) + return self.reduce(space, w_obj, False, False, w_axis, keepdims, out) - def reduce(self, space, w_obj, multidim, promote_to_largest, axis, + def reduce(self, space, w_obj, multidim, promote_to_largest, w_axis, keepdims=False, out=None): from pypy.module.micronumpy.interp_numarray import convert_to_array, \ Scalar, ReduceArray, W_NDimArray @@ -144,11 +140,11 @@ "supported for binary functions")) assert isinstance(self, W_Ufunc2) obj = convert_to_array(space, w_obj) - if axis >= len(obj.shape): - raise OperationError(space.w_ValueError, space.wrap("axis(=%d) out of bounds" % axis)) if isinstance(obj, Scalar): raise OperationError(space.w_TypeError, space.wrap("cannot reduce " "on a scalar")) + axis = unwrap_axis_arg(space, len(obj.shape), w_axis) + assert axis>=0 size = obj.size if self.comparison_func: dtype = interp_dtype.get_dtype_cache(space).w_booldtype @@ -163,7 +159,7 @@ if self.identity is None and size == 0: raise operationerrfmt(space.w_ValueError, "zero-size array to " "%s.reduce without identity", self.name) - if shapelen > 1 and axis >= 0: + if shapelen > 1 and axis < shapelen: if keepdims: shape = obj.shape[:axis] + [1] + obj.shape[axis + 1:] else: diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py --- a/pypy/module/micronumpy/test/test_numarray.py +++ b/pypy/module/micronumpy/test/test_numarray.py @@ -1086,6 +1086,9 @@ assert (b == array(range(35, 70), dtype=float).reshape(5, 7)).all() assert (a.mean(2) == array(range(0, 15), dtype=float).reshape(3, 5) * 7 + 3).all() assert (arange(10).reshape(5, 2).mean(axis=1) == [0.5, 2.5, 4.5, 6.5, 8.5]).all() + assert (a.mean(axis=-1) == a.mean(axis=2)).all() + raises(ValueError, a.mean, -4) + raises(ValueError, a.mean, 3) def test_sum(self): from _numpypy import array @@ -1096,7 +1099,8 @@ a = array([True] * 5, bool) assert a.sum() == 5 - raises(TypeError, 'a.sum(2, 3)') + raises(TypeError, 'a.sum(axis=0, out=3)') + raises(ValueError, 'a.sum(axis=2)') d = array(0.) b = a.sum(out=d) assert b == d @@ -1112,6 +1116,10 @@ assert (a.sum(0) == [30, 35, 40]).all() assert (a.sum(axis=0) == [30, 35, 40]).all() assert (a.sum(1) == [3, 12, 21, 30, 39]).all() + assert (a.sum(-1) == a.sum(-1)).all() + assert (a.sum(-2) == a.sum(-2)).all() + raises(ValueError, a.sum, -3) + raises(ValueError, a.sum, 2) assert (a.max(0) == [12, 13, 14]).all() assert (a.max(1) == [2, 5, 8, 11, 14]).all() assert ((a + a).max() == 28) 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 @@ -573,6 +573,7 @@ a = arange(12).reshape(3, 4) assert (add.reduce(a, 0) == [12, 15, 18, 21]).all() assert (add.reduce(a, 1) == [6.0, 22.0, 38.0]).all() + raises(ValueError, add.reduce, a, 2) def test_reduce_keepdims(self): from _numpypy import add, arange @@ -636,6 +637,8 @@ assert count_reduce_items(a) == 24 assert count_reduce_items(a, 1) == 3 assert count_reduce_items(a, (1, 2)) == 3 * 4 + raises(ValueError, count_reduce_items, a, -4) + raises(ValueError, count_reduce_items, a, (0, 2, -4)) def test_true_divide(self): from _numpypy import arange, array, true_divide diff --git a/pypy/objspace/std/boolobject.py b/pypy/objspace/std/boolobject.py --- a/pypy/objspace/std/boolobject.py +++ b/pypy/objspace/std/boolobject.py @@ -1,6 +1,7 @@ from pypy.rlib.rbigint import rbigint from pypy.rlib.rarithmetic import r_uint from pypy.interpreter.error import OperationError +from pypy.objspace.std import newformat from pypy.objspace.std.model import registerimplementation, W_Object from pypy.objspace.std.register_all import register_all from pypy.objspace.std.intobject import W_IntObject @@ -68,4 +69,9 @@ str__Bool = repr__Bool +def format__Bool_ANY(space, w_bool, w_format_spec): + return newformat.run_formatter( + space, w_format_spec, "format_int_or_long", w_bool, + newformat.INT_KIND) + register_all(vars()) diff --git a/pypy/objspace/std/test/test_newformat.py b/pypy/objspace/std/test/test_newformat.py --- a/pypy/objspace/std/test/test_newformat.py +++ b/pypy/objspace/std/test/test_newformat.py @@ -209,6 +209,23 @@ assert self.s("{!r}").format(x()) == self.s("32") +class AppTestBoolFormat: + + def test_str_format(self): + assert format(False) == "False" + assert format(True) == "True" + assert "{0}".format(True) == "True" + assert "{0}".format(False) == "False" + assert "{0} or {1}".format(True, False) == "True or False" + assert "{} or {}".format(True, False) == "True or False" + + def test_int_delegation_format(self): + assert "{:f}".format(True) == "1.000000" + assert "{:05d}".format(False) == "00000" + assert "{:g}".format(True) == "1" + + + class BaseIntegralFormattingTest: def test_simple(self): diff --git a/pypy/objspace/std/test/test_setobject.py b/pypy/objspace/std/test/test_setobject.py --- a/pypy/objspace/std/test/test_setobject.py +++ b/pypy/objspace/std/test/test_setobject.py @@ -425,6 +425,8 @@ s1 = set() s1.update(set('abcd')) assert s1 == set('abcd') + s1 = set([1, 2.0, "3"]) + s1.update(set(["3", 4, 5.0])) def test_recursive_repr(self): class A(object): diff --git a/pypy/rlib/parsing/parsing.py b/pypy/rlib/parsing/parsing.py --- a/pypy/rlib/parsing/parsing.py +++ b/pypy/rlib/parsing/parsing.py @@ -107,14 +107,12 @@ error = None # for the annotator if self.parser.is_nonterminal(symbol): rule = self.parser.get_rule(symbol) - lastexpansion = len(rule.expansions) - 1 subsymbol = None error = None for expansion in rule.expansions: curr = i children = [] - for j in range(len(expansion)): - subsymbol = expansion[j] + for subsymbol in expansion: node, next, error2 = self.match_symbol(curr, subsymbol) if node is None: error = combine_errors(error, error2) diff --git a/pypy/rlib/rerased.py b/pypy/rlib/rerased.py --- a/pypy/rlib/rerased.py +++ b/pypy/rlib/rerased.py @@ -48,6 +48,9 @@ def __repr__(self): return 'ErasingPairIdentity(%r)' % self.name + def __deepcopy__(self, memo): + return self + def _getdict(self, bk): try: dict = bk._erasing_pairs_tunnel diff --git a/pypy/rlib/rlocale.py b/pypy/rlib/rlocale.py --- a/pypy/rlib/rlocale.py +++ b/pypy/rlib/rlocale.py @@ -29,7 +29,7 @@ HAVE_LIBINTL = False class CConfig: - includes = ['locale.h', 'limits.h', 'ctype.h'] + includes = ['locale.h', 'limits.h', 'ctype.h', 'wchar.h'] libraries = libraries if HAVE_LANGINFO: diff --git a/pypy/rlib/test/test_rerased.py b/pypy/rlib/test/test_rerased.py --- a/pypy/rlib/test/test_rerased.py +++ b/pypy/rlib/test/test_rerased.py @@ -1,5 +1,7 @@ import py import sys +import copy + from pypy.rlib.rerased import * from pypy.annotation import model as annmodel from pypy.annotation.annrpython import RPythonAnnotator @@ -59,6 +61,13 @@ #assert is_integer(e) is False assert unerase_list_X(e) is l +def test_deepcopy(): + x = "hello" + e = eraseX(x) + e2 = copy.deepcopy(e) + assert uneraseX(e) is x + assert uneraseX(e2) is x + def test_annotate_1(): def f(): return eraseX(X()) diff --git a/pypy/tool/sourcetools.py b/pypy/tool/sourcetools.py --- a/pypy/tool/sourcetools.py +++ b/pypy/tool/sourcetools.py @@ -224,6 +224,7 @@ if func.func_dict: f.func_dict = {} f.func_dict.update(func.func_dict) + f.func_doc = func.func_doc return f def func_renamer(newname): diff --git a/pypy/tool/test/test_sourcetools.py b/pypy/tool/test/test_sourcetools.py --- a/pypy/tool/test/test_sourcetools.py +++ b/pypy/tool/test/test_sourcetools.py @@ -22,3 +22,15 @@ assert f.func_name == "g" assert f.func_defaults == (5,) assert f.prop is int + +def test_func_rename_decorator(): + def bar(): + 'doc' + + bar2 = func_with_new_name(bar, 'bar2') + assert bar.func_doc == bar2.func_doc == 'doc' + + bar.func_doc = 'new doc' + bar3 = func_with_new_name(bar, 'bar3') + assert bar3.func_doc == 'new doc' + assert bar2.func_doc != bar3.func_doc diff --git a/pypy/translator/c/src/signals.h b/pypy/translator/c/src/signals.h --- a/pypy/translator/c/src/signals.h +++ b/pypy/translator/c/src/signals.h @@ -46,6 +46,7 @@ void pypysig_default(int signum); /* signal will do default action (SIG_DFL) */ void pypysig_setflag(int signum); /* signal will set a flag which can be queried with pypysig_poll() */ +void pypysig_reinstall(int signum); int pypysig_set_wakeup_fd(int fd); /* utility to poll for signals that arrived */ _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit