Author: Armin Rigo <ar...@tunes.org> Branch: stm-gc Changeset: r52655:f43e80c81df4 Date: 2012-02-19 20:50 +0100 http://bitbucket.org/pypy/pypy/changeset/f43e80c81df4/
Log: hg merge default diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py --- a/pypy/jit/metainterp/optimizeopt/optimizer.py +++ b/pypy/jit/metainterp/optimizeopt/optimizer.py @@ -567,7 +567,7 @@ assert isinstance(descr, compile.ResumeGuardDescr) modifier = resume.ResumeDataVirtualAdder(descr, self.resumedata_memo) try: - newboxes = modifier.finish(self.values, self.pendingfields) + newboxes = modifier.finish(self, self.pendingfields) if len(newboxes) > self.metainterp_sd.options.failargs_limit: raise resume.TagOverflow except resume.TagOverflow: diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -7760,6 +7760,59 @@ """ self.optimize_loop(ops, expected) + def test_constant_failargs(self): + ops = """ + [p1, i2, i3] + setfield_gc(p1, ConstPtr(myptr), descr=nextdescr) + p16 = getfield_gc(p1, descr=nextdescr) + guard_true(i2) [p16, i3] + jump(p1, i3, i2) + """ + preamble = """ + [p1, i2, i3] + setfield_gc(p1, ConstPtr(myptr), descr=nextdescr) + guard_true(i2) [i3] + jump(p1, i3) + """ + expected = """ + [p1, i3] + guard_true(i3) [] + jump(p1, 1) + """ + self.optimize_loop(ops, expected, preamble) + + def test_issue1048(self): + ops = """ + [p1, i2, i3] + p16 = getfield_gc(p1, descr=nextdescr) + guard_true(i2) [p16] + setfield_gc(p1, ConstPtr(myptr), descr=nextdescr) + jump(p1, i3, i2) + """ + expected = """ + [p1, i3] + guard_true(i3) [] + jump(p1, 1) + """ + self.optimize_loop(ops, expected) + + def test_issue1048_ok(self): + ops = """ + [p1, i2, i3] + p16 = getfield_gc(p1, descr=nextdescr) + call(p16, descr=nonwritedescr) + guard_true(i2) [p16] + setfield_gc(p1, ConstPtr(myptr), descr=nextdescr) + jump(p1, i3, i2) + """ + expected = """ + [p1, i3] + call(ConstPtr(myptr), descr=nonwritedescr) + guard_true(i3) [] + jump(p1, 1) + """ + self.optimize_loop(ops, expected) + class TestLLtype(OptimizeOptTest, LLtypeMixin): pass diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py --- a/pypy/jit/metainterp/resume.py +++ b/pypy/jit/metainterp/resume.py @@ -182,23 +182,22 @@ # env numbering - def number(self, values, snapshot): + def number(self, optimizer, snapshot): if snapshot is None: return lltype.nullptr(NUMBERING), {}, 0 if snapshot in self.numberings: numb, liveboxes, v = self.numberings[snapshot] return numb, liveboxes.copy(), v - numb1, liveboxes, v = self.number(values, snapshot.prev) + numb1, liveboxes, v = self.number(optimizer, snapshot.prev) n = len(liveboxes)-v boxes = snapshot.boxes length = len(boxes) numb = lltype.malloc(NUMBERING, length) for i in range(length): box = boxes[i] - value = values.get(box, None) - if value is not None: - box = value.get_key_box() + value = optimizer.getvalue(box) + box = value.get_key_box() if isinstance(box, Const): tagged = self.getconst(box) @@ -318,14 +317,14 @@ _, tagbits = untag(tagged) return tagbits == TAGVIRTUAL - def finish(self, values, pending_setfields=[]): + def finish(self, optimizer, pending_setfields=[]): # compute the numbering storage = self.storage # make sure that nobody attached resume data to this guard yet assert not storage.rd_numb snapshot = storage.rd_snapshot assert snapshot is not None # is that true? - numb, liveboxes_from_env, v = self.memo.number(values, snapshot) + numb, liveboxes_from_env, v = self.memo.number(optimizer, snapshot) self.liveboxes_from_env = liveboxes_from_env self.liveboxes = {} storage.rd_numb = numb @@ -341,23 +340,23 @@ liveboxes[i] = box else: assert tagbits == TAGVIRTUAL - value = values[box] + value = optimizer.getvalue(box) value.get_args_for_fail(self) for _, box, fieldbox, _ in pending_setfields: self.register_box(box) self.register_box(fieldbox) - value = values[fieldbox] + value = optimizer.getvalue(fieldbox) value.get_args_for_fail(self) - self._number_virtuals(liveboxes, values, v) + self._number_virtuals(liveboxes, optimizer, v) self._add_pending_fields(pending_setfields) storage.rd_consts = self.memo.consts dump_storage(storage, liveboxes) return liveboxes[:] - def _number_virtuals(self, liveboxes, values, num_env_virtuals): + def _number_virtuals(self, liveboxes, optimizer, num_env_virtuals): # !! 'liveboxes' is a list that is extend()ed in-place !! memo = self.memo new_liveboxes = [None] * memo.num_cached_boxes() @@ -397,7 +396,7 @@ memo.nvholes += length - len(vfieldboxes) for virtualbox, fieldboxes in vfieldboxes.iteritems(): num, _ = untag(self.liveboxes[virtualbox]) - value = values[virtualbox] + value = optimizer.getvalue(virtualbox) fieldnums = [self._gettagged(box) for box in fieldboxes] vinfo = value.make_virtual_info(self, fieldnums) diff --git a/pypy/jit/metainterp/test/test_resume.py b/pypy/jit/metainterp/test/test_resume.py --- a/pypy/jit/metainterp/test/test_resume.py +++ b/pypy/jit/metainterp/test/test_resume.py @@ -18,6 +18,19 @@ rd_virtuals = None rd_pendingfields = None + +class FakeOptimizer(object): + def __init__(self, values): + self.values = values + + def getvalue(self, box): + try: + value = self.values[box] + except KeyError: + value = self.values[box] = OptValue(box) + return value + + def test_tag(): assert tag(3, 1) == rffi.r_short(3<<2|1) assert tag(-3, 2) == rffi.r_short(-3<<2|2) @@ -500,7 +513,7 @@ capture_resumedata(fs, None, [], storage) memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) modifier = ResumeDataVirtualAdder(storage, memo) - liveboxes = modifier.finish({}) + liveboxes = modifier.finish(FakeOptimizer({})) metainterp = MyMetaInterp() b1t, b2t, b3t = [BoxInt(), BoxPtr(), BoxInt()] @@ -524,7 +537,7 @@ capture_resumedata(fs, [b4], [], storage) memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) modifier = ResumeDataVirtualAdder(storage, memo) - liveboxes = modifier.finish({}) + liveboxes = modifier.finish(FakeOptimizer({})) metainterp = MyMetaInterp() b1t, b2t, b3t, b4t = [BoxInt(), BoxPtr(), BoxInt(), BoxPtr()] @@ -553,10 +566,10 @@ memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) modifier = ResumeDataVirtualAdder(storage, memo) - liveboxes = modifier.finish({}) + liveboxes = modifier.finish(FakeOptimizer({})) modifier = ResumeDataVirtualAdder(storage2, memo) - liveboxes2 = modifier.finish({}) + liveboxes2 = modifier.finish(FakeOptimizer({})) metainterp = MyMetaInterp() @@ -617,7 +630,7 @@ memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) values = {b2: virtual_value(b2, b5, c4)} modifier = ResumeDataVirtualAdder(storage, memo) - liveboxes = modifier.finish(values) + liveboxes = modifier.finish(FakeOptimizer(values)) assert len(storage.rd_virtuals) == 1 assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX), tag(0, TAGCONST)] @@ -628,7 +641,7 @@ values = {b2: virtual_value(b2, b4, v6), b6: v6} memo.clear_box_virtual_numbers() modifier = ResumeDataVirtualAdder(storage2, memo) - liveboxes2 = modifier.finish(values) + liveboxes2 = modifier.finish(FakeOptimizer(values)) assert len(storage2.rd_virtuals) == 2 assert storage2.rd_virtuals[0].fieldnums == [tag(len(liveboxes2)-1, TAGBOX), tag(-1, TAGVIRTUAL)] @@ -674,7 +687,7 @@ memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) values = {b2: virtual_value(b2, b5, c4)} modifier = ResumeDataVirtualAdder(storage, memo) - liveboxes = modifier.finish(values) + liveboxes = modifier.finish(FakeOptimizer(values)) assert len(storage.rd_virtuals) == 1 assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX), tag(0, TAGCONST)] @@ -684,7 +697,7 @@ capture_resumedata(fs, None, [], storage2) values[b4] = virtual_value(b4, b6, c4) modifier = ResumeDataVirtualAdder(storage2, memo) - liveboxes = modifier.finish(values) + liveboxes = modifier.finish(FakeOptimizer(values)) assert len(storage2.rd_virtuals) == 2 assert storage2.rd_virtuals[1].fieldnums == storage.rd_virtuals[0].fieldnums assert storage2.rd_virtuals[1] is storage.rd_virtuals[0] @@ -703,7 +716,7 @@ v1.setfield(LLtypeMixin.nextdescr, v2) values = {b1: v1, b2: v2} modifier = ResumeDataVirtualAdder(storage, memo) - liveboxes = modifier.finish(values) + liveboxes = modifier.finish(FakeOptimizer(values)) assert liveboxes == [b3] assert len(storage.rd_virtuals) == 2 assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX), @@ -776,7 +789,7 @@ memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) - numb, liveboxes, v = memo.number({}, snap1) + numb, liveboxes, v = memo.number(FakeOptimizer({}), snap1) assert v == 0 assert liveboxes == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), @@ -788,7 +801,7 @@ tag(0, TAGBOX), tag(2, TAGINT)] assert not numb.prev.prev - numb2, liveboxes2, v = memo.number({}, snap2) + numb2, liveboxes2, v = memo.number(FakeOptimizer({}), snap2) assert v == 0 assert liveboxes2 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), @@ -813,7 +826,8 @@ return self.virt # renamed - numb3, liveboxes3, v = memo.number({b3: FakeValue(False, c4)}, snap3) + numb3, liveboxes3, v = memo.number(FakeOptimizer({b3: FakeValue(False, c4)}), + snap3) assert v == 0 assert liveboxes3 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)} @@ -825,7 +839,8 @@ env4 = [c3, b4, b1, c3] snap4 = Snapshot(snap, env4) - numb4, liveboxes4, v = memo.number({b4: FakeValue(True, b4)}, snap4) + numb4, liveboxes4, v = memo.number(FakeOptimizer({b4: FakeValue(True, b4)}), + snap4) assert v == 1 assert liveboxes4 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), @@ -837,8 +852,9 @@ env5 = [b1, b4, b5] snap5 = Snapshot(snap4, env5) - numb5, liveboxes5, v = memo.number({b4: FakeValue(True, b4), - b5: FakeValue(True, b5)}, snap5) + numb5, liveboxes5, v = memo.number(FakeOptimizer({b4: FakeValue(True, b4), + b5: FakeValue(True, b5)}), + snap5) assert v == 2 assert liveboxes5 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), @@ -940,7 +956,7 @@ storage = make_storage(b1s, b2s, b3s) memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) modifier = ResumeDataVirtualAdder(storage, memo) - liveboxes = modifier.finish({}) + liveboxes = modifier.finish(FakeOptimizer({})) assert storage.rd_snapshot is None cpu = MyCPU([]) reader = ResumeDataDirectReader(MyMetaInterp(cpu), storage) @@ -954,14 +970,14 @@ storage = make_storage(b1s, b2s, b3s) memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) modifier = ResumeDataVirtualAdder(storage, memo) - modifier.finish({}) + modifier.finish(FakeOptimizer({})) assert len(memo.consts) == 2 assert storage.rd_consts is memo.consts b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**17), ConstInt(-65)] storage2 = make_storage(b1s, b2s, b3s) modifier2 = ResumeDataVirtualAdder(storage2, memo) - modifier2.finish({}) + modifier2.finish(FakeOptimizer({})) assert len(memo.consts) == 3 assert storage2.rd_consts is memo.consts @@ -1022,7 +1038,7 @@ val = FakeValue() values = {b1s: val, b2s: val} - liveboxes = modifier.finish(values) + liveboxes = modifier.finish(FakeOptimizer(values)) assert storage.rd_snapshot is None b1t, b3t = [BoxInt(11), BoxInt(33)] newboxes = _resume_remap(liveboxes, [b1_2, b3s], b1t, b3t) @@ -1043,7 +1059,7 @@ storage = make_storage(b1s, b2s, b3s) memo = ResumeDataLoopMemo(FakeMetaInterpStaticData()) modifier = ResumeDataVirtualAdder(storage, memo) - liveboxes = modifier.finish({}) + liveboxes = modifier.finish(FakeOptimizer({})) b2t, b3t = [BoxPtr(demo55o), BoxInt(33)] newboxes = _resume_remap(liveboxes, [b2s, b3s], b2t, b3t) metainterp = MyMetaInterp() @@ -1086,7 +1102,7 @@ values = {b2s: v2, b4s: v4} liveboxes = [] - modifier._number_virtuals(liveboxes, values, 0) + modifier._number_virtuals(liveboxes, FakeOptimizer(values), 0) storage.rd_consts = memo.consts[:] storage.rd_numb = None # resume @@ -1156,7 +1172,7 @@ modifier.register_virtual_fields(b2s, [b4s, c1s]) liveboxes = [] values = {b2s: v2} - modifier._number_virtuals(liveboxes, values, 0) + modifier._number_virtuals(liveboxes, FakeOptimizer(values), 0) dump_storage(storage, liveboxes) storage.rd_consts = memo.consts[:] storage.rd_numb = None @@ -1203,7 +1219,7 @@ v2.setfield(LLtypeMixin.bdescr, OptValue(b4s)) modifier.register_virtual_fields(b2s, [c1s, b4s]) liveboxes = [] - modifier._number_virtuals(liveboxes, {b2s: v2}, 0) + modifier._number_virtuals(liveboxes, FakeOptimizer({b2s: v2}), 0) dump_storage(storage, liveboxes) storage.rd_consts = memo.consts[:] storage.rd_numb = None @@ -1249,7 +1265,7 @@ values = {b4s: v4, b2s: v2} liveboxes = [] - modifier._number_virtuals(liveboxes, values, 0) + modifier._number_virtuals(liveboxes, FakeOptimizer(values), 0) assert liveboxes == [b2s, b4s] or liveboxes == [b4s, b2s] modifier._add_pending_fields([(LLtypeMixin.nextdescr, b2s, b4s, -1)]) storage.rd_consts = memo.consts[:] diff --git a/pypy/module/_demo/test/test_sieve.py b/pypy/module/_demo/test/test_sieve.py new file mode 100644 --- /dev/null +++ b/pypy/module/_demo/test/test_sieve.py @@ -0,0 +1,12 @@ +from pypy.conftest import gettestobjspace + + +class AppTestSieve: + def setup_class(cls): + cls.space = gettestobjspace(usemodules=('_demo',)) + + def test_sieve(self): + import _demo + lst = _demo.sieve(100) + assert lst == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, + 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] diff --git a/pypy/module/cpyext/dictobject.py b/pypy/module/cpyext/dictobject.py --- a/pypy/module/cpyext/dictobject.py +++ b/pypy/module/cpyext/dictobject.py @@ -184,8 +184,10 @@ w_item = space.call_method(w_iter, "next") w_key, w_value = space.fixedview(w_item, 2) state = space.fromcache(RefcountState) - pkey[0] = state.make_borrowed(w_dict, w_key) - pvalue[0] = state.make_borrowed(w_dict, w_value) + if pkey: + pkey[0] = state.make_borrowed(w_dict, w_key) + if pvalue: + pvalue[0] = state.make_borrowed(w_dict, w_value) ppos[0] += 1 except OperationError, e: if not e.match(space, space.w_StopIteration): diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py --- a/pypy/module/cpyext/slotdefs.py +++ b/pypy/module/cpyext/slotdefs.py @@ -185,6 +185,15 @@ space.fromcache(State).check_and_raise_exception(always=True) return space.wrap(res) +def wrap_delitem(space, w_self, w_args, func): + func_target = rffi.cast(objobjargproc, func) + check_num_args(space, w_args, 1) + w_key, = space.fixedview(w_args) + res = generic_cpy_call(space, func_target, w_self, w_key, None) + if rffi.cast(lltype.Signed, res) == -1: + space.fromcache(State).check_and_raise_exception(always=True) + return space.w_None + def wrap_ssizessizeargfunc(space, w_self, w_args, func): func_target = rffi.cast(ssizessizeargfunc, func) check_num_args(space, w_args, 2) @@ -291,6 +300,14 @@ def slot_nb_int(space, w_self): return space.int(w_self) +@cpython_api([PyObject], PyObject, external=False) +def slot_tp_iter(space, w_self): + return space.iter(w_self) + +@cpython_api([PyObject], PyObject, external=False) +def slot_tp_iternext(space, w_self): + return space.next(w_self) + from pypy.rlib.nonconst import NonConstant SLOTS = {} @@ -632,6 +649,19 @@ TPSLOT("__buffer__", "tp_as_buffer.c_bf_getreadbuffer", None, "wrap_getreadbuffer", ""), ) +# partial sort to solve some slot conflicts: +# Number slots before Mapping slots before Sequence slots. +# These are the only conflicts between __name__ methods +def slotdef_sort_key(slotdef): + if slotdef.slot_name.startswith('tp_as_number'): + return 1 + if slotdef.slot_name.startswith('tp_as_mapping'): + return 2 + if slotdef.slot_name.startswith('tp_as_sequence'): + return 3 + return 0 +slotdefs = sorted(slotdefs, key=slotdef_sort_key) + slotdefs_for_tp_slots = unrolling_iterable( [(x.method_name, x.slot_name, x.slot_names, x.slot_func) for x in slotdefs]) diff --git a/pypy/module/cpyext/test/test_arraymodule.py b/pypy/module/cpyext/test/test_arraymodule.py --- a/pypy/module/cpyext/test/test_arraymodule.py +++ b/pypy/module/cpyext/test/test_arraymodule.py @@ -43,6 +43,15 @@ assert arr[:2].tolist() == [1,2] assert arr[1:3].tolist() == [2,3] + def test_slice_object(self): + module = self.import_module(name='array') + arr = module.array('i', [1,2,3,4]) + assert arr[slice(1,3)].tolist() == [2,3] + arr[slice(1,3)] = module.array('i', [21, 22, 23]) + assert arr.tolist() == [1, 21, 22, 23, 4] + del arr[slice(1, 3)] + assert arr.tolist() == [1, 23, 4] + def test_buffer(self): module = self.import_module(name='array') arr = module.array('i', [1,2,3,4]) diff --git a/pypy/module/cpyext/test/test_dictobject.py b/pypy/module/cpyext/test/test_dictobject.py --- a/pypy/module/cpyext/test/test_dictobject.py +++ b/pypy/module/cpyext/test/test_dictobject.py @@ -112,6 +112,37 @@ assert space.eq_w(space.len(w_copy), space.len(w_dict)) assert space.eq_w(w_copy, w_dict) + def test_iterkeys(self, space, api): + w_dict = space.sys.getdict(space) + py_dict = make_ref(space, w_dict) + + ppos = lltype.malloc(Py_ssize_tP.TO, 1, flavor='raw') + pkey = lltype.malloc(PyObjectP.TO, 1, flavor='raw') + pvalue = lltype.malloc(PyObjectP.TO, 1, flavor='raw') + + keys_w = [] + values_w = [] + try: + ppos[0] = 0 + while api.PyDict_Next(w_dict, ppos, pkey, None): + w_key = from_ref(space, pkey[0]) + keys_w.append(w_key) + ppos[0] = 0 + while api.PyDict_Next(w_dict, ppos, None, pvalue): + w_value = from_ref(space, pvalue[0]) + values_w.append(w_value) + finally: + lltype.free(ppos, flavor='raw') + lltype.free(pkey, flavor='raw') + lltype.free(pvalue, flavor='raw') + + api.Py_DecRef(py_dict) # release borrowed references + + assert space.eq_w(space.newlist(keys_w), + space.call_method(w_dict, "keys")) + assert space.eq_w(space.newlist(values_w), + space.call_method(w_dict, "values")) + def test_dictproxy(self, space, api): w_dict = space.sys.get('modules') w_proxy = api.PyDictProxy_New(w_dict) diff --git a/pypy/module/cpyext/test/test_typeobject.py b/pypy/module/cpyext/test/test_typeobject.py --- a/pypy/module/cpyext/test/test_typeobject.py +++ b/pypy/module/cpyext/test/test_typeobject.py @@ -425,3 +425,32 @@ ''') obj = module.new_obj() raises(ZeroDivisionError, obj.__setitem__, 5, None) + + def test_tp_iter(self): + module = self.import_extension('foo', [ + ("tp_iter", "METH_O", + ''' + if (!args->ob_type->tp_iter) + { + PyErr_SetNone(PyExc_ValueError); + return NULL; + } + return args->ob_type->tp_iter(args); + ''' + ), + ("tp_iternext", "METH_O", + ''' + if (!args->ob_type->tp_iternext) + { + PyErr_SetNone(PyExc_ValueError); + return NULL; + } + return args->ob_type->tp_iternext(args); + ''' + ) + ]) + l = [1] + it = module.tp_iter(l) + assert type(it) is type(iter([])) + assert module.tp_iternext(it) == 1 + raises(StopIteration, module.tp_iternext, it) diff --git a/pypy/module/micronumpy/__init__.py b/pypy/module/micronumpy/__init__.py --- a/pypy/module/micronumpy/__init__.py +++ b/pypy/module/micronumpy/__init__.py @@ -67,10 +67,12 @@ ("arccos", "arccos"), ("arcsin", "arcsin"), ("arctan", "arctan"), + ("arccosh", "arccosh"), ("arcsinh", "arcsinh"), ("arctanh", "arctanh"), ("copysign", "copysign"), ("cos", "cos"), + ("cosh", "cosh"), ("divide", "divide"), ("true_divide", "true_divide"), ("equal", "equal"), @@ -90,9 +92,11 @@ ("reciprocal", "reciprocal"), ("sign", "sign"), ("sin", "sin"), + ("sinh", "sinh"), ("subtract", "subtract"), ('sqrt', 'sqrt'), ("tan", "tan"), + ("tanh", "tanh"), ('bitwise_and', 'bitwise_and'), ('bitwise_or', 'bitwise_or'), ('bitwise_xor', 'bitwise_xor'), 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 @@ -435,7 +435,11 @@ ("arcsin", "arcsin", 1, {"promote_to_float": True}), ("arccos", "arccos", 1, {"promote_to_float": True}), ("arctan", "arctan", 1, {"promote_to_float": True}), + ("sinh", "sinh", 1, {"promote_to_float": True}), + ("cosh", "cosh", 1, {"promote_to_float": True}), + ("tanh", "tanh", 1, {"promote_to_float": True}), ("arcsinh", "arcsinh", 1, {"promote_to_float": True}), + ("arccosh", "arccosh", 1, {"promote_to_float": True}), ("arctanh", "arctanh", 1, {"promote_to_float": True}), ]: self.add_ufunc(space, *ufunc_def) 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 @@ -310,6 +310,33 @@ b = arctan(a) assert math.isnan(b[0]) + def test_sinh(self): + import math + from _numpypy import array, sinh + + a = array([-1, 0, 1, float('inf'), float('-inf')]) + b = sinh(a) + for i in range(len(a)): + assert b[i] == math.sinh(a[i]) + + def test_cosh(self): + import math + from _numpypy import array, cosh + + a = array([-1, 0, 1, float('inf'), float('-inf')]) + b = cosh(a) + for i in range(len(a)): + assert b[i] == math.cosh(a[i]) + + def test_tanh(self): + import math + from _numpypy import array, tanh + + a = array([-1, 0, 1, float('inf'), float('-inf')]) + b = tanh(a) + for i in range(len(a)): + assert b[i] == math.tanh(a[i]) + def test_arcsinh(self): import math from _numpypy import arcsinh @@ -318,6 +345,15 @@ assert math.asinh(v) == arcsinh(v) assert math.isnan(arcsinh(float("nan"))) + def test_arccosh(self): + import math + from _numpypy import arccosh + + for v in [1.0, 1.1, 2]: + assert math.acosh(v) == arccosh(v) + for v in [-1.0, 0, .99]: + assert math.isnan(arccosh(v)) + def test_arctanh(self): import math from _numpypy import arctanh 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 @@ -489,10 +489,28 @@ return math.atan(v) @simple_unary_op + def sinh(self, v): + return math.sinh(v) + + @simple_unary_op + def cosh(self, v): + return math.cosh(v) + + @simple_unary_op + def tanh(self, v): + return math.tanh(v) + + @simple_unary_op def arcsinh(self, v): return math.asinh(v) @simple_unary_op + def arccosh(self, v): + if v < 1.0: + return rfloat.NAN + return math.acosh(v) + + @simple_unary_op def arctanh(self, v): if v == 1.0 or v == -1.0: return math.copysign(rfloat.INFINITY, v) diff --git a/pypy/module/test_lib_pypy/test_datetime.py b/pypy/module/test_lib_pypy/test_datetime.py --- a/pypy/module/test_lib_pypy/test_datetime.py +++ b/pypy/module/test_lib_pypy/test_datetime.py @@ -3,7 +3,7 @@ import py import time -import datetime +from lib_pypy import datetime import copy import os @@ -43,4 +43,4 @@ dt = datetime.datetime.utcnow() assert type(dt.microsecond) is int - copy.copy(dt) \ No newline at end of file + copy.copy(dt) diff --git a/pypy/translator/c/gcc/trackgcroot.py b/pypy/translator/c/gcc/trackgcroot.py --- a/pypy/translator/c/gcc/trackgcroot.py +++ b/pypy/translator/c/gcc/trackgcroot.py @@ -1697,6 +1697,8 @@ } """ elif self.format in ('elf64', 'darwin64'): + if self.format == 'elf64': # gentoo patch: hardened systems + print >> output, "\t.section .note.GNU-stack,\"\",%progbits" print >> output, "\t.text" print >> output, "\t.globl %s" % _globalname('pypy_asm_stackwalk') _variant(elf64='.type pypy_asm_stackwalk, @function', _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit