Author: Alex Gaynor <alex.gay...@gmail.com> Branch: Changeset: r65361:4f246f62b2ef Date: 2013-07-12 09:19 +1000 http://bitbucket.org/pypy/pypy/changeset/4f246f62b2ef/
Log: merged upstream 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 @@ -12,3 +12,7 @@ .. branch: improve-str2charp Improve the performance of I/O writing up to 15% by using memcpy instead of copying char-by-char in str2charp and get_nonmovingbuffer + +.. branch: flowoperators +Simplify rpython/flowspace/ code by using more metaprogramming. Create +SpaceOperator class to gather static information about flow graph operations. diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py --- a/pypy/interpreter/pyframe.py +++ b/pypy/interpreter/pyframe.py @@ -371,7 +371,7 @@ from pypy.module._pickle_support import maker # helper fns from pypy.interpreter.pycode import PyCode from pypy.interpreter.module import Module - args_w = space.unpackiterable(w_args) + args_w = space.unpackiterable(w_args, 18) w_f_back, w_builtin, w_pycode, w_valuestack, w_blockstack, w_exc_value, w_tb,\ w_globals, w_last_instr, w_finished, w_f_lineno, w_fastlocals, w_f_locals, \ w_f_trace, w_instr_lb, w_instr_ub, w_instr_prev_plus_one, w_cells = args_w diff --git a/pypy/interpreter/test/test_zzpickle_and_slow.py b/pypy/interpreter/test/test_zzpickle_and_slow.py --- a/pypy/interpreter/test/test_zzpickle_and_slow.py +++ b/pypy/interpreter/test/test_zzpickle_and_slow.py @@ -226,6 +226,10 @@ restore_top_frame(f1, saved) f2 = pickle.loads(pckl) + def test_frame_setstate_crash(self): + import sys + raises(ValueError, sys._getframe().__setstate__, []) + def test_pickle_traceback(self): def f(): try: diff --git a/pypy/module/_rawffi/test/test__rawffi.py b/pypy/module/_rawffi/test/test__rawffi.py --- a/pypy/module/_rawffi/test/test__rawffi.py +++ b/pypy/module/_rawffi/test/test__rawffi.py @@ -1107,6 +1107,14 @@ S2E = _rawffi.Structure([('bah', (EMPTY, 1))]) S2E.get_ffi_type() # does not hang + def test_overflow_error(self): + import _rawffi + A = _rawffi.Array('d') + arg1 = A(1) + raises(OverflowError, "arg1[0] = 10**900") + arg1.free() + + class AppTestAutoFree: spaceconfig = dict(usemodules=['_rawffi', 'struct']) diff --git a/pypy/module/_socket/interp_socket.py b/pypy/module/_socket/interp_socket.py --- a/pypy/module/_socket/interp_socket.py +++ b/pypy/module/_socket/interp_socket.py @@ -473,7 +473,7 @@ option_ptr = rffi.cast(rffi.INTP, value_ptr) option_ptr[0] = space.int_w(w_option) elif cmd == _c.SIO_KEEPALIVE_VALS: - w_onoff, w_time, w_interval = space.unpackiterable(w_option) + w_onoff, w_time, w_interval = space.unpackiterable(w_option, 3) option_ptr = rffi.cast(lltype.Ptr(_c.tcp_keepalive), value_ptr) option_ptr.c_onoff = space.uint_w(w_onoff) option_ptr.c_keepalivetime = space.uint_w(w_time) diff --git a/pypy/module/imp/interp_imp.py b/pypy/module/imp/interp_imp.py --- a/pypy/module/imp/interp_imp.py +++ b/pypy/module/imp/interp_imp.py @@ -74,7 +74,7 @@ return space.newtuple([w_fileobj, w_filename, w_import_info]) def load_module(space, w_name, w_file, w_filename, w_info): - w_suffix, w_filemode, w_modtype = space.unpackiterable(w_info) + w_suffix, w_filemode, w_modtype = space.unpackiterable(w_info, 3) filename = space.str0_w(w_filename) filemode = space.str_w(w_filemode) diff --git a/pypy/module/imp/test/test_import.py b/pypy/module/imp/test/test_import.py --- a/pypy/module/imp/test/test_import.py +++ b/pypy/module/imp/test/test_import.py @@ -679,6 +679,10 @@ assert module.__name__ == 'a' assert module.__file__ == 'invalid_path_name' + def test_crash_load_module(self): + import imp + raises(ValueError, imp.load_module, "", "", "", [1, 2, 3, 4]) + class TestAbi: def test_abi_tag(self): diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py --- a/pypy/module/micronumpy/interp_dtype.py +++ b/pypy/module/micronumpy/interp_dtype.py @@ -318,7 +318,7 @@ if not base.issequence_w(space, w_shape): w_shape = space.newtuple([w_shape,]) else: - w_fldname, w_flddesc = space.fixedview(w_elem) + w_fldname, w_flddesc = space.fixedview(w_elem, 2) subdtype = descr__new__(space, space.gettypefor(W_Dtype), w_flddesc, w_shape=w_shape) fldname = space.str_w(w_fldname) if fldname in fields: diff --git a/pypy/module/rctime/test/test_rctime.py b/pypy/module/rctime/test/test_rctime.py --- a/pypy/module/rctime/test/test_rctime.py +++ b/pypy/module/rctime/test/test_rctime.py @@ -43,6 +43,7 @@ assert isinstance(res, str) rctime.ctime(rctime.time()) raises(ValueError, rctime.ctime, 1E200) + raises(OverflowError, rctime.ctime, 10**900) def test_gmtime(self): import time as rctime diff --git a/pypy/objspace/std/complexobject.py b/pypy/objspace/std/complexobject.py --- a/pypy/objspace/std/complexobject.py +++ b/pypy/objspace/std/complexobject.py @@ -126,10 +126,7 @@ return W_ComplexObject(w_int.intval, 0.0) def delegate_Long2Complex(space, w_long): - try: - dval = w_long.tofloat() - except OverflowError, e: - raise OperationError(space.w_OverflowError, space.wrap(str(e))) + dval = w_long.tofloat(space) return W_ComplexObject(dval, 0.0) def delegate_Float2Complex(space, w_float): diff --git a/pypy/objspace/std/dictmultiobject.py b/pypy/objspace/std/dictmultiobject.py --- a/pypy/objspace/std/dictmultiobject.py +++ b/pypy/objspace/std/dictmultiobject.py @@ -1039,15 +1039,18 @@ def update1(space, w_dict, w_data): - if space.findattr(w_data, space.wrap("keys")) is None: + if isinstance(w_data, W_DictMultiObject): # optimization case only + update1_dict_dict(space, w_dict, w_data) + return + w_method = space.findattr(w_data, space.wrap("keys")) + if w_method is None: # no 'keys' method, so we assume it is a sequence of pairs - update1_pairs(space, w_dict, w_data) + data_w = space.listview(w_data) + update1_pairs(space, w_dict, data_w) else: - if isinstance(w_data, W_DictMultiObject): # optimization case only - update1_dict_dict(space, w_dict, w_data) - else: - # general case -- "for k in o.keys(): dict.__setitem__(d, k, o[k])" - update1_keys(space, w_dict, w_data) + # general case -- "for k in o.keys(): dict.__setitem__(d, k, o[k])" + data_w = space.listview(space.call_function(w_method)) + update1_keys(space, w_dict, w_data, data_w) @jit.look_inside_iff(lambda space, w_dict, w_data: @@ -1061,8 +1064,8 @@ w_dict.setitem(w_key, w_value) -def update1_pairs(space, w_dict, w_data): - for w_pair in space.listview(w_data): +def update1_pairs(space, w_dict, data_w): + for w_pair in data_w: pair = space.fixedview(w_pair) if len(pair) != 2: raise OperationError(space.w_ValueError, @@ -1071,9 +1074,8 @@ w_dict.setitem(w_key, w_value) -def update1_keys(space, w_dict, w_data): - w_keys = space.call_method(w_data, "keys") - for w_key in space.listview(w_keys): +def update1_keys(space, w_dict, w_data, data_w): + for w_key in data_w: w_value = space.getitem(w_data, w_key) w_dict.setitem(w_key, w_value) diff --git a/pypy/objspace/std/floatobject.py b/pypy/objspace/std/floatobject.py --- a/pypy/objspace/std/floatobject.py +++ b/pypy/objspace/std/floatobject.py @@ -62,11 +62,7 @@ # long-to-float delegation def delegate_Long2Float(space, w_longobj): - try: - return W_FloatObject(w_longobj.tofloat()) - except OverflowError: - raise OperationError(space.w_OverflowError, - space.wrap("long int too large to convert to float")) + return W_FloatObject(w_longobj.tofloat(space)) # float__Float is supposed to do nothing, unless it has diff --git a/pypy/objspace/std/longobject.py b/pypy/objspace/std/longobject.py --- a/pypy/objspace/std/longobject.py +++ b/pypy/objspace/std/longobject.py @@ -26,8 +26,12 @@ def longval(self): return self.num.tolong() - def tofloat(self): - return self.num.tofloat() + def tofloat(self, space): + try: + return self.num.tofloat() + except OverflowError: + raise OperationError(space.w_OverflowError, + space.wrap("long int too large to convert to float")) def toint(self): return self.num.toint() @@ -66,7 +70,7 @@ return w_self.num def float_w(self, space): - return self.num.tofloat() + return self.tofloat(space) def int(self, space): if (type(self) is not W_LongObject and @@ -124,11 +128,7 @@ return long__Long(space, w_value) def float__Long(space, w_longobj): - try: - return space.newfloat(w_longobj.num.tofloat()) - except OverflowError: - raise OperationError(space.w_OverflowError, - space.wrap("long int too large to convert to float")) + return space.newfloat(w_longobj.tofloat(space)) def repr__Long(space, w_long): return space.wrap(w_long.num.repr()) diff --git a/pypy/objspace/std/setobject.py b/pypy/objspace/std/setobject.py --- a/pypy/objspace/std/setobject.py +++ b/pypy/objspace/std/setobject.py @@ -180,8 +180,7 @@ if not space.isinstance_w(w_other, space.w_set): return space.w_False - # XXX there is no test_buildinshortcut.py - # tested in test_buildinshortcut.py + # tested in test_builtinshortcut.py # XXX do not make new setobject here w_other_as_set = self._newobj(space, w_other) return space.wrap(self.equals(w_other_as_set)) diff --git a/pypy/objspace/std/test/test_dictmultiobject.py b/pypy/objspace/std/test/test_dictmultiobject.py --- a/pypy/objspace/std/test/test_dictmultiobject.py +++ b/pypy/objspace/std/test/test_dictmultiobject.py @@ -367,6 +367,16 @@ d.update({'foo': 'bar'}, baz=1) assert d == {'foo': 'bar', 'baz': 1} + def test_update_keys_method(self): + class Foo(object): + def keys(self): + return [4, 1] + def __getitem__(self, key): + return key * 10 + d = {} + d.update(Foo()) + assert d == {1: 10, 4: 40} + def test_values(self): d = {1: 2, 3: 4} vals = d.values() diff --git a/pypy/objspace/std/test/test_longobject.py b/pypy/objspace/std/test/test_longobject.py --- a/pypy/objspace/std/test/test_longobject.py +++ b/pypy/objspace/std/test/test_longobject.py @@ -18,6 +18,12 @@ w_obj = fromlong(42) assert space.unwrap(w_obj) == 42 + def test_overflow_error(self): + space = self.space + fromlong = lobj.W_LongObject.fromlong + w_big = fromlong(10**900) + space.raises_w(space.w_OverflowError, space.float_w, w_big) + def test_rint_variants(self): py.test.skip("XXX broken!") from rpython.rtyper.tool.rfficache import platform _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit