Author: Manuel Jacob <m...@manueljacob.de> Branch: kill-multimethod Changeset: r74131:67da075acbca Date: 2014-10-23 16:19 +0200 http://bitbucket.org/pypy/pypy/changeset/67da075acbca/
Log: hg 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 @@ -22,3 +22,6 @@ .. branch: ClassRepr Refactor ClassRepr and make normalizecalls independent of the rtyper. + +.. branch: remove-remaining-smm +Remove all remaining multimethods. diff --git a/pypy/module/micronumpy/boxes.py b/pypy/module/micronumpy/boxes.py --- a/pypy/module/micronumpy/boxes.py +++ b/pypy/module/micronumpy/boxes.py @@ -16,6 +16,7 @@ from pypy.module.micronumpy.base import W_NDimArray, W_NumpyObject from pypy.module.micronumpy.concrete import VoidBoxStorage from pypy.module.micronumpy.flagsobj import W_FlagsObject +from pypy.module.micronumpy import support MIXIN_32 = (W_IntObject.typedef,) if LONG_BIT == 32 else () MIXIN_64 = (W_IntObject.typedef,) if LONG_BIT == 64 else () @@ -144,6 +145,34 @@ def item(self, space): return self.get_dtype(space).itemtype.to_builtin_type(space, self) + def descr_item(self, space, args_w): + if len(args_w) == 1 and space.isinstance_w(args_w[0], space.w_tuple): + args_w = space.fixedview(args_w[0]) + if len(args_w) > 1: + raise oefmt(space.w_ValueError, + "incorrect number of indices for array") + elif len(args_w) == 1: + try: + idx = support.index_w(space, args_w[0]) + except OperationError: + raise oefmt(space.w_TypeError, "an integer is required") + if idx != 0: + raise oefmt(space.w_IndexError, + "index %d is out of bounds for size 1", idx) + return self.item(space) + + def descr_transpose(self, space, args_w): + if len(args_w) == 1 and space.isinstance_w(args_w[0], space.w_tuple): + args_w = space.fixedview(args_w[0]) + if len(args_w) >= 1: + for w_arg in args_w: + try: + idx = support.index_w(space, w_arg) + except OperationError: + raise oefmt(space.w_TypeError, "an integer is required") + raise oefmt(space.w_ValueError, "axes don't match array") + return self + def descr_getitem(self, space, w_item): from pypy.module.micronumpy.base import convert_to_array if space.is_w(w_item, space.w_Ellipsis) or \ @@ -372,6 +401,13 @@ def descr_reshape(self, space, __args__): w_meth = space.getattr(self.descr_ravel(space), space.wrap('reshape')) + w_res = space.call_args(w_meth, __args__) + if isinstance(w_res, W_NDimArray) and len(w_res.get_shape()) == 0: + return w_res.get_scalar_value() + return w_res + + def descr_nd_nonzero(self, space, __args__): + w_meth = space.getattr(self.descr_ravel(space), space.wrap('nonzero')) return space.call_args(w_meth, __args__) def descr_get_real(self, space): @@ -387,6 +423,13 @@ self.w_flags = W_FlagsObject(self) return self.w_flags + @unwrap_spec(axis1=int, axis2=int) + def descr_swapaxes(self, space, axis1, axis2): + return self + + def descr_fill(self, space, w_value): + self.get_dtype(space).coerce(space, w_value) + class W_BoolBox(W_GenericBox, PrimitiveBox): descr__new__, _get_dtype, descr_reduce = new_dtype_getter(NPY.BOOL) @@ -619,6 +662,8 @@ __hash__ = interp2app(W_GenericBox.descr_hash), tolist = interp2app(W_GenericBox.item), + item = interp2app(W_GenericBox.descr_item), + transpose = interp2app(W_GenericBox.descr_transpose), min = interp2app(W_GenericBox.descr_self), max = interp2app(W_GenericBox.descr_self), argmin = interp2app(W_GenericBox.descr_zero), @@ -630,13 +675,18 @@ ravel = interp2app(W_GenericBox.descr_ravel), round = interp2app(W_GenericBox.descr_round), conjugate = interp2app(W_GenericBox.descr_conjugate), + conj = interp2app(W_GenericBox.descr_conjugate), astype = interp2app(W_GenericBox.descr_astype), view = interp2app(W_GenericBox.descr_view), squeeze = interp2app(W_GenericBox.descr_self), copy = interp2app(W_GenericBox.descr_copy), byteswap = interp2app(W_GenericBox.descr_byteswap), tostring = interp2app(W_GenericBox.descr_tostring), + tobytes = interp2app(W_GenericBox.descr_tostring), reshape = interp2app(W_GenericBox.descr_reshape), + swapaxes = interp2app(W_GenericBox.descr_swapaxes), + nonzero = interp2app(W_GenericBox.descr_nd_nonzero), + fill = interp2app(W_GenericBox.descr_fill), dtype = GetSetProperty(W_GenericBox.descr_get_dtype), size = GetSetProperty(W_GenericBox.descr_get_size), 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 @@ -483,8 +483,7 @@ from .flatiter import W_FlatIterator return space.wrap(W_FlatIterator(self)) - def descr_item(self, space, __args__): - args_w, kw_w = __args__.unpack() + def descr_item(self, space, args_w): if len(args_w) == 1 and space.isinstance_w(args_w[0], space.w_tuple): args_w = space.fixedview(args_w[0]) shape = self.get_shape() 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 @@ -3074,6 +3074,7 @@ assert a.item((1, 1, 1)) == 16 exc = raises(ValueError, a.item, 1, 1, 1, 1) assert str(exc.value) == "incorrect number of indices for array" + raises(TypeError, "array([1]).item(a=1)") def test_itemset(self): import numpy as np diff --git a/pypy/module/micronumpy/test/test_scalar.py b/pypy/module/micronumpy/test/test_scalar.py --- a/pypy/module/micronumpy/test/test_scalar.py +++ b/pypy/module/micronumpy/test/test_scalar.py @@ -254,6 +254,7 @@ assert np.int64(123).reshape((1,)).shape == (1,) exc = raises(ValueError, "np.int64(123).reshape((2,))") assert exc.value[0] == 'total size of new array must be unchanged' + assert type(np.int64(123).reshape(())) == np.int64 def test_complex_scalar_complex_cast(self): import numpy as np @@ -293,10 +294,123 @@ def test_scalar_iter(self): from numpypy import int8, int16, int32, int64, float32, float64 - for t in int8, int16, int32, int64, float32, float64: - try: - iter(t(17)) - except TypeError: - pass - else: - assert False, "%s object should not be iterable." % t + from numpypy import complex64, complex128 + for t in (int8, int16, int32, int64, float32, float64, + complex64, complex128): + raises(TypeError, iter, t(17)) + + def test_item_tolist(self): + from numpypy import int8, int16, int32, int64, float32, float64 + from numpypy import complex64, complex128, dtype + + def _do_test(np_type, py_type, orig_val, exp_val): + val = np_type(orig_val) + assert val == orig_val + assert val.item() == exp_val + assert val.tolist() == exp_val + assert type(val.item()) is py_type + assert type(val.tolist()) is py_type + val.item(0) + val.item(()) + val.item((0,)) + raises(ValueError, val.item, 0, 1) + raises(ValueError, val.item, 0, '') + raises(TypeError, val.item, '') + raises(IndexError, val.item, 2) + + for t in int8, int16, int32: + _do_test(t, int, 17, 17) + + py_type = int if dtype('int').itemsize == 8 else long + _do_test(int64, py_type, 17, 17) + + for t in float32, float64: + _do_test(t, float, 17, 17) + + for t in complex64, complex128: + _do_test(t, complex, 17j, 17j) + + def test_transpose(self): + from numpypy import int8, int16, int32, int64, float32, float64 + from numpypy import complex64, complex128 + + def _do_test(np_type, orig_val, exp_val): + val = np_type(orig_val) + assert val == orig_val + assert val.transpose() == exp_val + assert type(val.transpose()) is np_type + val.transpose(()) + raises(ValueError, val.transpose, 0, 1) + raises(TypeError, val.transpose, 0, '') + raises(ValueError, val.transpose, 0) + + for t in int8, int16, int32, int64: + _do_test(t, 17, 17) + + for t in float32, float64: + _do_test(t, 17, 17) + + for t in complex64, complex128: + _do_test(t, 17j, 17j) + + def test_swapaxes(self): + from numpypy import int8, int16, int32, int64, float32, float64 + from numpypy import complex64, complex128 + + def _do_test(np_type, orig_val, exp_val): + val = np_type(orig_val) + assert val == orig_val + assert val.swapaxes(10, 20) == exp_val + assert type(val.swapaxes(0, 1)) is np_type + raises(TypeError, val.swapaxes, 0, ()) + + for t in int8, int16, int32, int64: + _do_test(t, 17, 17) + + for t in float32, float64: + _do_test(t, 17, 17) + + for t in complex64, complex128: + _do_test(t, 17j, 17j) + + def test_nonzero(self): + from numpypy import int8, int16, int32, int64, float32, float64 + from numpypy import complex64, complex128 + + for t in (int8, int16, int32, int64, float32, float64, + complex64, complex128): + res, = t(17).nonzero() + assert len(res) == 1 + assert res[0] == 0 + res, = t(0).nonzero() + assert len(res) == 0 + + def test_fill(self): + import sys + from numpypy import int8, int16, int32, int64, float32, float64 + from numpypy import complex64, complex128 + + for t in (int8, int16, int32, int64, float32, float64, + complex64, complex128): + t(17).fill(2) + exc = (TypeError if t in (complex64, complex128) + and '__pypy__' not in sys.builtin_module_names + else ValueError) + raises(exc, t(17).fill, '') + + def test_conj(self): + from numpypy import int8, int16, int32, int64, float32, float64 + from numpypy import complex64, complex128 + + def _do_test(np_type, orig_val, exp_val): + val = np_type(orig_val) + assert val == orig_val + assert val.conj() == exp_val + assert val.conjugate() == exp_val + + for t in (int8, int16, int32, int64, float32, float64, + complex64, complex128): + _do_test(t, 17, 17) + + for t in complex64, complex128: + _do_test(t, 17j, -17j) diff --git a/pypy/module/pypyjit/policy.py b/pypy/module/pypyjit/policy.py --- a/pypy/module/pypyjit/policy.py +++ b/pypy/module/pypyjit/policy.py @@ -111,7 +111,7 @@ '__pypy__', 'cStringIO', '_collections', 'struct', 'mmap', 'marshal', '_codecs', 'rctime', 'cppyy', '_cffi_backend', 'pyexpat', '_continuation', '_io', - 'thread', 'select']: + 'thread', 'select', '_random']: if modname == 'pypyjit' and 'interp_resop' in rest: return False return True @@ -120,7 +120,7 @@ def look_inside_function(self, func): mod = func.__module__ or '?' - if mod == 'rpython.rlib.rbigint' or mod == 'rpython.rlib.rlocale' or mod == 'rpython.rlib.rsocket': + if mod == 'rpython.rlib.rlocale' or mod == 'rpython.rlib.rsocket': return False if mod.startswith('pypy.interpreter.astcompiler.'): return False diff --git a/pypy/module/pypyjit/test/test_policy.py b/pypy/module/pypyjit/test/test_policy.py --- a/pypy/module/pypyjit/test/test_policy.py +++ b/pypy/module/pypyjit/test/test_policy.py @@ -6,15 +6,6 @@ from pypy.objspace.std.intobject import W_IntObject assert pypypolicy.look_inside_function(W_IntObject.descr_add) -def test_bigint(): - from rpython.rlib.rbigint import rbigint - assert not pypypolicy.look_inside_function(rbigint.eq.im_func) - assert not pypypolicy.look_inside_function(rbigint.ne.im_func) - assert not pypypolicy.look_inside_function(rbigint.lt.im_func) - assert not pypypolicy.look_inside_function(rbigint.le.im_func) - assert not pypypolicy.look_inside_function(rbigint.gt.im_func) - assert not pypypolicy.look_inside_function(rbigint.ge.im_func) - def test_rlocale(): from rpython.rlib.rlocale import setlocale assert not pypypolicy.look_inside_function(setlocale) @@ -56,7 +47,7 @@ def test_pypy_module(): from pypy.module._collections.interp_deque import W_Deque from pypy.module._random.interp_random import W_Random - assert not pypypolicy.look_inside_function(W_Random.random) + assert pypypolicy.look_inside_function(W_Random.random) assert pypypolicy.look_inside_function(W_Deque.length) assert pypypolicy.look_inside_pypy_module('__builtin__.operation') assert pypypolicy.look_inside_pypy_module('__builtin__.abstractinst') 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 @@ -82,7 +82,10 @@ strsetitem(p25, 0, i23) p93 = call(ConstClass(fromstr), p25, 16, descr=<Callr . ri EF=3>) guard_no_exception(descr=...) - i94 = call(ConstClass(rbigint.toint), p93, descr=<Calli . r EF=3>) + i95 = getfield_gc_pure(p93, descr=<FieldS rpython.rlib.rbigint.rbigint.inst_size .*>) + i96 = int_gt(i95, .*) + guard_false(i96, descr=...) + i94 = call(ConstClass(rbigint._toint_helper), p93, descr=<Calli 8 r EF=3>) guard_no_exception(descr=...) i95 = int_add_ovf(i6, i94) guard_no_overflow(descr=...) diff --git a/pypy/module/pypyjit/test_pypy_c/test_thread.py b/pypy/module/pypyjit/test_pypy_c/test_thread.py --- a/pypy/module/pypyjit/test_pypy_c/test_thread.py +++ b/pypy/module/pypyjit/test_pypy_c/test_thread.py @@ -70,7 +70,6 @@ i59 = int_is_true(i58) guard_true(i59, descr=...) i60 = int_sub(i44, 1) - guard_not_invalidated(descr=...) p62 = force_token() setfield_gc(p0, p62, descr=<FieldP pypy.interpreter.pyframe.PyFrame.vable_token 8>) i63 = call_release_gil(..., i37, 0, descr=<Calli 4 ii EF=6>) diff --git a/pypy/tool/pytest/appsupport.py b/pypy/tool/pytest/appsupport.py --- a/pypy/tool/pytest/appsupport.py +++ b/pypy/tool/pytest/appsupport.py @@ -130,13 +130,9 @@ frame = None def __init__(self, space, tb): - self._frame = AppFrame(space, space.getattr(tb, space.wrap('tb_frame'))) + self.frame = AppFrame(space, space.getattr(tb, space.wrap('tb_frame'))) self.lineno = space.unwrap(space.getattr(tb, space.wrap('tb_lineno'))) - 1 - @property - def frame(self): - return self._frame - def reinterpret(self): # XXX we need to solve a general problem: how to prevent # reinterpretation from generating a different exception? diff --git a/rpython/jit/codewriter/assembler.py b/rpython/jit/codewriter/assembler.py --- a/rpython/jit/codewriter/assembler.py +++ b/rpython/jit/codewriter/assembler.py @@ -249,6 +249,8 @@ if isinstance(TYPE, lltype.FuncType): name = value._obj._name elif TYPE == rclass.OBJECT_VTABLE: + if not value.name: # this is really the "dummy" class + return # pointer from some dict name = ''.join(value.name.chars) else: return diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -1558,6 +1558,26 @@ """ self.optimize_loop(ops, expected) + def test_varray_clear_unroll_bug(self): + ops = """ + [p0] + i0 = getarrayitem_gc(p0, 0, descr=arraydescr) + i1 = getarrayitem_gc(p0, 1, descr=arraydescr) + i2 = getarrayitem_gc(p0, 2, descr=arraydescr) + i3 = int_add(i0, i1) + i4 = int_add(i3, i2) + p1 = new_array_clear(3, descr=arraydescr) + setarrayitem_gc(p1, 1, i4, descr=arraydescr) + setarrayitem_gc(p1, 0, 25, descr=arraydescr) + jump(p1) + """ + expected = """ + [i1] + i2 = int_add(i1, 25) + jump(i2) + """ + self.optimize_loop(ops, expected) + def test_varray_alloc_and_set(self): ops = """ [i1] diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py @@ -761,6 +761,24 @@ assert not vstate1.generalization_of(vstate2) + def test_crash_varay_clear(self): + innervalue1 = OptValue(self.nodebox) + constclassbox = self.cpu.ts.cls_of_box(self.nodebox) + innervalue1.make_constant_class(constclassbox, -1) + innerinfo1 = NotVirtualStateInfo(innervalue1) + innerinfo1.position = 1 + innerinfo1.position_in_notvirtuals = 0 + + descr = object() + + info1 = VArrayStateInfo(descr) + info1.fieldstate = [innerinfo1] + + constvalue = self.cpu.ts.CVAL_NULLREF + value1 = VArrayValue(descr, constvalue, 1, self.nodebox, clear=True) + value1._items[0] = constvalue + info1.enum_forced_boxes([None], value1, None) + class BaseTestBridges(BaseTest): enable_opts = "intbounds:rewrite:virtualize:string:pure:heap:unroll" diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py @@ -205,6 +205,8 @@ raise BadVirtualState for i in range(len(self.fieldstate)): v = value.get_item_value(i) + if v is None: + v = value.get_missing_null_value() s = self.fieldstate[i] if s.position > self.position: s.enum_forced_boxes(boxes, v, optimizer) diff --git a/rpython/jit/metainterp/test/test_dict.py b/rpython/jit/metainterp/test/test_dict.py --- a/rpython/jit/metainterp/test/test_dict.py +++ b/rpython/jit/metainterp/test/test_dict.py @@ -20,6 +20,21 @@ res = self.interp_operations(fn, [0]) assert not res + def test_dict_of_classes_as_values(self): + class A: + x = 5 + class B(A): + x = 8 + def fn(n): + A() + B() + d = self.newdict() + d[42] = A + d[43] = B + return d[n].x + res = self.interp_operations(fn, [43]) + assert res == 8 + def test_dict_keys_values_items(self): for name, extract, expected in [('keys', None, 'k'), ('values', None, 'v'), diff --git a/rpython/rlib/rbigint.py b/rpython/rlib/rbigint.py --- a/rpython/rlib/rbigint.py +++ b/rpython/rlib/rbigint.py @@ -427,7 +427,6 @@ def tolonglong(self): return _AsLongLong(self) - @jit.look_inside def tobool(self): return self.sign != 0 @@ -517,11 +516,9 @@ return (self.sign * self.digit(0)) == other - @jit.look_inside def ne(self, other): return not self.eq(other) - @jit.look_inside def int_ne(self, other): return not self.int_eq(other) @@ -592,11 +589,9 @@ return True return False - @jit.look_inside def le(self, other): return not other.lt(self) - @jit.look_inside def int_le(self, other): # Alternative that might be faster, reimplant this. as a check with other + 1. But we got to check for overflow # or reduce valid range. @@ -605,19 +600,15 @@ return True return self.int_lt(other) - @jit.look_inside def gt(self, other): return other.lt(self) - @jit.look_inside def int_gt(self, other): return not self.int_le(other) - @jit.look_inside def ge(self, other): return not self.lt(other) - @jit.look_inside def int_ge(self, other): return not self.int_lt(other) @@ -784,7 +775,6 @@ return div - @jit.look_inside def div(self, other): return self.floordiv(other) diff --git a/rpython/rlib/rzlib.py b/rpython/rlib/rzlib.py --- a/rpython/rlib/rzlib.py +++ b/rpython/rlib/rzlib.py @@ -37,7 +37,7 @@ Z_NO_FLUSH Z_FINISH Z_SYNC_FLUSH Z_FULL_FLUSH MAX_WBITS MAX_MEM_LEVEL Z_BEST_SPEED Z_BEST_COMPRESSION Z_DEFAULT_COMPRESSION - Z_FILTERED Z_HUFFMAN_ONLY Z_DEFAULT_STRATEGY + Z_FILTERED Z_HUFFMAN_ONLY Z_DEFAULT_STRATEGY Z_NEED_DICT '''.split() class SimpleCConfig: @@ -165,6 +165,9 @@ result = _inflateInit2_(stream, wbits, ZLIB_VERSION, size) return result +_deflateSetDictionary = zlib_external('deflateSetDictionary', [z_stream_p, Bytefp, uInt], rffi.INT) +_inflateSetDictionary = zlib_external('inflateSetDictionary', [z_stream_p, Bytefp, uInt], rffi.INT) + # ____________________________________________________________ CRC32_DEFAULT_START = 0 @@ -184,6 +187,23 @@ ADLER32_DEFAULT_START = 1 +def deflateSetDictionary(stream, string): + bytes = rffi.get_nonmovingbuffer(string) + err = _deflateSetDictionary(stream, rffi.cast(Bytefp, bytes), len(string)) + rffi.free_nonmovingbuffer(string, bytes) + if err == Z_STREAM_ERROR: + raise RZlibError("Parameter is invalid or the stream state is inconsistent") + +def inflateSetDictionary(stream, string): + bytes = rffi.get_nonmovingbuffer(string) + err = _inflateSetDictionary(stream, rffi.cast(Bytefp, bytes), len(string)) + rffi.free_nonmovingbuffer(string, bytes) + if err == Z_STREAM_ERROR: + raise RZlibError("Parameter is invalid or the stream state is inconsistent") + elif err == Z_DATA_ERROR: + raise RZlibError("The given dictionary doesn't match the expected one") + + def adler32(string, start=ADLER32_DEFAULT_START): """ Compute the Adler-32 checksum of the string, possibly with the given diff --git a/rpython/rlib/test/test_rbigint.py b/rpython/rlib/test/test_rbigint.py --- a/rpython/rlib/test/test_rbigint.py +++ b/rpython/rlib/test/test_rbigint.py @@ -582,6 +582,8 @@ def test_int_bitwise(self): for x in gen_signs([0, 1, 5, 11, 42, 43, 2 ** 30]): for y in gen_signs([0, 1, 5, 11, 42, 43, 3 ** 30, 2 ** 31]): + if y != intmask(y): + continue # skip 'y' too large for 32-bit lx = rbigint.fromlong(x) for mod in "xor and_ or_".split(): res1 = getattr(lx, 'int_' + mod)(y).tolong() @@ -666,9 +668,9 @@ for base in [0, 2, 4, 8, 16, 10, math.e]: l = rbigint.fromlong(op).log(base) if base: - assert ulps_check(l, math.log(op, base), 1) is None + assert ulps_check(l, math.log(op, base)) is None else: - assert ulps_check(l, math.log(op), 1) is None + assert ulps_check(l, math.log(op)) is None class TestInternalFunctions(object): def test__inplace_divrem1(self): diff --git a/rpython/rlib/test/test_rzlib.py b/rpython/rlib/test/test_rzlib.py --- a/rpython/rlib/test/test_rzlib.py +++ b/rpython/rlib/test/test_rzlib.py @@ -82,6 +82,39 @@ rzlib.deflateEnd(stream) +def test_deflate_set_dictionary(): + text = 'abcabc' + zdict = 'abc' + stream = rzlib.deflateInit() + rzlib.deflateSetDictionary(stream, zdict) + bytes = rzlib.compress(stream, text, rzlib.Z_FINISH) + rzlib.deflateEnd(stream) + + stream2 = rzlib.inflateInit() + + from rpython.rtyper.lltypesystem import lltype, rffi, rstr + from rpython.rtyper.annlowlevel import llstr + from rpython.rlib.rstring import StringBuilder + with lltype.scoped_alloc(rffi.CCHARP.TO, len(bytes)) as inbuf: + rstr.copy_string_to_raw(llstr(bytes), inbuf, 0, len(bytes)) + stream2.c_next_in = rffi.cast(rzlib.Bytefp, inbuf) + rffi.setintfield(stream2, 'c_avail_in', len(bytes)) + with lltype.scoped_alloc(rffi.CCHARP.TO, 100) as outbuf: + stream2.c_next_out = rffi.cast(rzlib.Bytefp, outbuf) + bufsize = 100 + rffi.setintfield(stream2, 'c_avail_out', bufsize) + err = rzlib._inflate(stream2, rzlib.Z_SYNC_FLUSH) + assert err == rzlib.Z_NEED_DICT + rzlib.inflateSetDictionary(stream2, zdict) + rzlib._inflate(stream2, rzlib.Z_SYNC_FLUSH) + avail_out = rffi.cast(lltype.Signed, stream2.c_avail_out) + result = StringBuilder() + result.append_charpsize(outbuf, bufsize - avail_out) + + rzlib.inflateEnd(stream2) + assert result.build() == text + + def test_compression(): """ Once we have got a deflate stream, rzlib.compress() diff --git a/rpython/rtyper/rbuiltin.py b/rpython/rtyper/rbuiltin.py --- a/rpython/rtyper/rbuiltin.py +++ b/rpython/rtyper/rbuiltin.py @@ -688,10 +688,10 @@ if hop.s_result.is_constant(): return hop.inputconst(lltype.Bool, hop.s_result.const) - if hop.args_s[1].is_constant() and hop.args_s[1].const in (str, list): - if hop.args_s[0].knowntype not in (str, list): - raise TyperError("isinstance(x, str/list) expects x to be known" - " statically to be a str/list or None") + if hop.args_s[1].is_constant() and hop.args_s[1].const in (str, list, unicode): + if hop.args_s[0].knowntype not in (str, list, unicode): + raise TyperError("isinstance(x, str/list/unicode) expects x to be known" + " statically to be a str/list/unicode or None") rstrlist = hop.args_r[0] vstrlist = hop.inputarg(rstrlist, arg=0) cnone = hop.inputconst(rstrlist, None) diff --git a/rpython/rtyper/test/test_rbuiltin.py b/rpython/rtyper/test/test_rbuiltin.py --- a/rpython/rtyper/test/test_rbuiltin.py +++ b/rpython/rtyper/test/test_rbuiltin.py @@ -393,6 +393,21 @@ res = self.interpret(f, [1]) assert res is False + def test_isinstance_unicode(self): + def g(): + pass + def f(i): + if i == 0: + l = u"foobar" + else: + l = None + g() + return isinstance(l, unicode) + res = self.interpret(f, [0]) + assert res is True + res = self.interpret(f, [1]) + assert res is False + def test_instantiate(self): class A: pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit