Author: Alex Gaynor <alex.gay...@gmail.com> Branch: Changeset: r44716:572f0d8242f6 Date: 2011-06-05 14:40 +0200 http://bitbucket.org/pypy/pypy/changeset/572f0d8242f6/
Log: merged upstream. diff --git a/pypy/doc/cpython_differences.rst b/pypy/doc/cpython_differences.rst --- a/pypy/doc/cpython_differences.rst +++ b/pypy/doc/cpython_differences.rst @@ -173,6 +173,11 @@ >>>> A.__del__ = lambda self: None __main__:1: RuntimeWarning: a __del__ method added to an existing type will not be called +Even more obscure: the same is true, for old-style classes, if you attach +the ``__del__`` to an instance (even in CPython this does not work with +new-style classes). You get a RuntimeWarning in PyPy. To fix these cases +just make sure there is a ``__del__`` method in the class to start with. + Subclasses of built-in types ---------------------------- diff --git a/pypy/doc/project-ideas.rst b/pypy/doc/project-ideas.rst --- a/pypy/doc/project-ideas.rst +++ b/pypy/doc/project-ideas.rst @@ -11,8 +11,11 @@ `mailing list`_. This is simply for the reason that small possible projects tend to change very rapidly. -XXX: write a paragraph that this is a loose collection and where to go -from here +This list is mostly for having on overview on potential projects. This list is +by definition not exhaustive and we're pleased if people come up with their +own improvement ideas. In any case, if you feel like working on some of those +projects, or anything else in PyPy, pop up on IRC or write to us on the +`mailing list`_. Numpy improvements ------------------ diff --git a/pypy/jit/metainterp/test/test_compile.py b/pypy/jit/metainterp/test/test_compile.py --- a/pypy/jit/metainterp/test/test_compile.py +++ b/pypy/jit/metainterp/test/test_compile.py @@ -63,6 +63,8 @@ call_pure_results = {} class jitdriver_sd: warmstate = FakeState() + on_compile = staticmethod(lambda *args: None) + on_compile_bridge = staticmethod(lambda *args: None) def test_compile_new_loop(): cpu = FakeCPU() diff --git a/pypy/jit/metainterp/test/test_warmstate.py b/pypy/jit/metainterp/test/test_warmstate.py --- a/pypy/jit/metainterp/test/test_warmstate.py +++ b/pypy/jit/metainterp/test/test_warmstate.py @@ -181,6 +181,7 @@ cpu = None memory_manager = None class FakeJitDriverSD: + jitdriver = None _green_args_spec = [lltype.Signed, lltype.Float] _get_printable_location_ptr = None _confirm_enter_jit_ptr = None @@ -207,6 +208,7 @@ cpu = None memory_manager = None class FakeJitDriverSD: + jitdriver = None _green_args_spec = [lltype.Signed, lltype.Float] _get_printable_location_ptr = llhelper(GET_LOCATION, get_location) _confirm_enter_jit_ptr = None @@ -230,6 +232,7 @@ cpu = None memory_manager = None class FakeJitDriverSD: + jitdriver = None _green_args_spec = [lltype.Signed, lltype.Float] _get_printable_location_ptr = None _confirm_enter_jit_ptr = llhelper(ENTER_JIT, confirm_enter_jit) @@ -253,6 +256,7 @@ cpu = None memory_manager = None class FakeJitDriverSD: + jitdriver = None _green_args_spec = [lltype.Signed, lltype.Float] _get_printable_location_ptr = None _confirm_enter_jit_ptr = None diff --git a/pypy/module/_multibytecodec/c_codecs.py b/pypy/module/_multibytecodec/c_codecs.py --- a/pypy/module/_multibytecodec/c_codecs.py +++ b/pypy/module/_multibytecodec/c_codecs.py @@ -103,8 +103,11 @@ [DECODEBUF_P], rffi.SSIZE_T) pypy_cjk_dec_inbuf_consumed = llexternal('pypy_cjk_dec_inbuf_consumed', [DECODEBUF_P], rffi.SSIZE_T) +pypy_cjk_dec_inbuf_add = llexternal('pypy_cjk_dec_inbuf_add', + [DECODEBUF_P, rffi.SSIZE_T, rffi.INT], + rffi.INT) -def decode(codec, stringdata): +def decode(codec, stringdata, errors="strict"): inleft = len(stringdata) inbuf = rffi.get_nonmovingbuffer(stringdata) try: @@ -112,10 +115,11 @@ if not decodebuf: raise MemoryError try: - r = pypy_cjk_dec_chunk(decodebuf) - if r != 0: - multibytecodec_decerror(decodebuf, r) - assert False + while True: + r = pypy_cjk_dec_chunk(decodebuf) + if r == 0: + break + multibytecodec_decerror(decodebuf, r, errors) src = pypy_cjk_dec_outbuf(decodebuf) length = pypy_cjk_dec_outlen(decodebuf) return rffi.wcharpsize2unicode(src, length) @@ -126,7 +130,7 @@ finally: rffi.free_nonmovingbuffer(stringdata, inbuf) -def multibytecodec_decerror(decodebuf, e): +def multibytecodec_decerror(decodebuf, e, errors): if e > 0: reason = "illegal multibyte sequence" esize = e @@ -138,12 +142,19 @@ else: raise RuntimeError # - # if errors == ERROR_REPLACE:... - # if errors == ERROR_IGNORE or errors == ERROR_REPLACE:... + if errors == "ignore": + pypy_cjk_dec_inbuf_add(decodebuf, esize, 0) + return # continue decoding + if errors == "replace": + e = pypy_cjk_dec_inbuf_add(decodebuf, esize, 1) + if rffi.cast(lltype.Signed, e) == MBERR_NOMEMORY: + raise MemoryError + return # continue decoding start = pypy_cjk_dec_inbuf_consumed(decodebuf) end = start + esize - if 1: # errors == ERROR_STRICT: - raise EncodeDecodeError(start, end, reason) + if errors != "strict": + reason = "not implemented: custom error handlers" # XXX implement me + raise EncodeDecodeError(start, end, reason) # ____________________________________________________________ # Encoding @@ -165,8 +176,11 @@ [ENCODEBUF_P], rffi.SSIZE_T) pypy_cjk_enc_inbuf_consumed = llexternal('pypy_cjk_enc_inbuf_consumed', [ENCODEBUF_P], rffi.SSIZE_T) +pypy_cjk_enc_inbuf_add = llexternal('pypy_cjk_enc_inbuf_add', + [ENCODEBUF_P, rffi.SSIZE_T, rffi.INT], + rffi.INT) -def encode(codec, unicodedata): +def encode(codec, unicodedata, errors="strict"): inleft = len(unicodedata) inbuf = rffi.get_nonmoving_unicodebuffer(unicodedata) try: @@ -174,14 +188,16 @@ if not encodebuf: raise MemoryError try: - r = pypy_cjk_enc_chunk(encodebuf) - if r != 0: - multibytecodec_encerror(encodebuf, r) - assert False - r = pypy_cjk_enc_reset(encodebuf) - if r != 0: - multibytecodec_encerror(encodebuf, r) - assert False + while True: + r = pypy_cjk_enc_chunk(encodebuf) + if r == 0: + break + multibytecodec_encerror(encodebuf, r, errors) + while True: + r = pypy_cjk_enc_reset(encodebuf) + if r == 0: + break + multibytecodec_encerror(encodebuf, r, errors) src = pypy_cjk_enc_outbuf(encodebuf) length = pypy_cjk_enc_outlen(encodebuf) return rffi.charpsize2str(src, length) @@ -192,7 +208,7 @@ finally: rffi.free_nonmoving_unicodebuffer(unicodedata, inbuf) -def multibytecodec_encerror(encodebuf, e): +def multibytecodec_encerror(encodebuf, e, errors): if e > 0: reason = "illegal multibyte sequence" esize = e @@ -204,9 +220,16 @@ else: raise RuntimeError # - # if errors == ERROR_REPLACE:... - # if errors == ERROR_IGNORE or errors == ERROR_REPLACE:... + if errors == 'ignore': + pypy_cjk_enc_inbuf_add(encodebuf, esize, 0) + return # continue encoding + if errors == "replace": + e = pypy_cjk_enc_inbuf_add(encodebuf, esize, 1) + if rffi.cast(lltype.Signed, e) == MBERR_NOMEMORY: + raise MemoryError + return # continue decoding start = pypy_cjk_enc_inbuf_consumed(encodebuf) end = start + esize - if 1: # errors == ERROR_STRICT: - raise EncodeDecodeError(start, end, reason) + if errors != "strict": + reason = "not implemented: custom error handlers" # XXX implement me + raise EncodeDecodeError(start, end, reason) diff --git a/pypy/module/_multibytecodec/interp_multibytecodec.py b/pypy/module/_multibytecodec/interp_multibytecodec.py --- a/pypy/module/_multibytecodec/interp_multibytecodec.py +++ b/pypy/module/_multibytecodec/interp_multibytecodec.py @@ -13,13 +13,11 @@ @unwrap_spec(input=str, errors="str_or_None") def decode(self, space, input, errors=None): - if errors is not None and errors != 'strict': - raise OperationError(space.w_NotImplementedError, # XXX - space.wrap("errors='%s' in _multibytecodec" - % errors)) + if errors is None: + errors = 'strict' # try: - output = c_codecs.decode(self.codec, input) + output = c_codecs.decode(self.codec, input, errors) except c_codecs.EncodeDecodeError, e: raise OperationError( space.w_UnicodeDecodeError, @@ -37,13 +35,11 @@ @unwrap_spec(input=unicode, errors="str_or_None") def encode(self, space, input, errors=None): - if errors is not None and errors != 'strict': - raise OperationError(space.w_NotImplementedError, # XXX - space.wrap("errors='%s' in _multibytecodec" - % errors)) + if errors is None: + errors = 'strict' # try: - output = c_codecs.encode(self.codec, input) + output = c_codecs.encode(self.codec, input, errors) except c_codecs.EncodeDecodeError, e: raise OperationError( space.w_UnicodeEncodeError, diff --git a/pypy/module/_multibytecodec/test/test_app_codecs.py b/pypy/module/_multibytecodec/test/test_app_codecs.py --- a/pypy/module/_multibytecodec/test/test_app_codecs.py +++ b/pypy/module/_multibytecodec/test/test_app_codecs.py @@ -36,6 +36,22 @@ e = raises(UnicodeDecodeError, codec.decode, "~{xyz}").value assert e.args == ('hz', '~{xyz}', 2, 4, 'illegal multibyte sequence') + def test_decode_hz_ignore(self): + import _codecs_cn + codec = _codecs_cn.getcodec("hz") + r = codec.decode("def~{}abc", errors='ignore') + assert r == (u'def\u5fcf', 9) + r = codec.decode("def~{}abc", 'ignore') + assert r == (u'def\u5fcf', 9) + + def test_decode_hz_replace(self): + import _codecs_cn + codec = _codecs_cn.getcodec("hz") + r = codec.decode("def~{}abc", errors='replace') + assert r == (u'def\ufffd\u5fcf', 9) + r = codec.decode("def~{}abc", 'replace') + assert r == (u'def\ufffd\u5fcf', 9) + def test_encode_hz(self): import _codecs_cn codec = _codecs_cn.getcodec("hz") @@ -54,3 +70,17 @@ assert e.start == 3 assert e.end == 4 assert e.reason == 'illegal multibyte sequence' + + def test_encode_hz_ignore(self): + import _codecs_cn + codec = _codecs_cn.getcodec("hz") + r = codec.encode(u'abc\u1234def', 'ignore') + assert r == ('abcdef', 7) + assert type(r[0]) is str + + def test_encode_hz_replace(self): + import _codecs_cn + codec = _codecs_cn.getcodec("hz") + r = codec.encode(u'abc\u1234def', 'replace') + assert r == ('abc?def', 7) + assert type(r[0]) is str diff --git a/pypy/module/_multibytecodec/test/test_c_codecs.py b/pypy/module/_multibytecodec/test/test_c_codecs.py --- a/pypy/module/_multibytecodec/test/test_c_codecs.py +++ b/pypy/module/_multibytecodec/test/test_c_codecs.py @@ -36,6 +36,24 @@ assert e.end == 4 assert e.reason == "illegal multibyte sequence" +def test_decode_hz_ignore(): + c = getcodec("hz") + u = decode(c, 'def~{}abc', 'ignore') + assert u == u'def\u5fcf' + +def test_decode_hz_replace(): + c = getcodec("hz") + u = decode(c, 'def~{}abc', 'replace') + assert u == u'def\ufffd\u5fcf' + +def test_decode_hz_foobar(): + # not implemented yet: custom error handlers + c = getcodec("hz") + e = py.test.raises(EncodeDecodeError, decode, c, "~{xyz}", "foobar").value + assert e.start == 2 + assert e.end == 4 + assert e.reason == "not implemented: custom error handlers" + def test_encode_hz(): c = getcodec("hz") s = encode(c, u'foobar') @@ -51,6 +69,25 @@ assert e.end == 4 assert e.reason == "illegal multibyte sequence" +def test_encode_hz_ignore(): + c = getcodec("hz") + s = encode(c, u'abc\u1234def', 'ignore') + assert s == 'abcdef' + +def test_encode_hz_replace(): + c = getcodec("hz") + s = encode(c, u'abc\u1234def', 'replace') + assert s == 'abc?def' + +def test_encode_hz_foobar(): + # not implemented yet: custom error handlers + c = getcodec("hz") + e = py.test.raises(EncodeDecodeError, encode, + c, u'abc\u1234def', 'foobar').value + assert e.start == 3 + assert e.end == 4 + assert e.reason == "not implemented: custom error handlers" + def test_encode_jisx0208(): c = getcodec('iso2022_jp') s = encode(c, u'\u83ca\u5730\u6642\u592b') diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -348,6 +348,7 @@ '_Py_TrueStruct#': ('PyObject*', 'space.w_True'), '_Py_ZeroStruct#': ('PyObject*', 'space.w_False'), '_Py_NotImplementedStruct#': ('PyObject*', 'space.w_NotImplemented'), + '_Py_EllipsisObject#': ('PyObject*', 'space.w_Ellipsis'), 'PyDateTimeAPI': ('PyDateTime_CAPI*', 'None'), } FORWARD_DECLS = [] diff --git a/pypy/module/cpyext/test/test_sliceobject.py b/pypy/module/cpyext/test/test_sliceobject.py --- a/pypy/module/cpyext/test/test_sliceobject.py +++ b/pypy/module/cpyext/test/test_sliceobject.py @@ -67,3 +67,14 @@ """), ]) assert module.nullslice() == slice(None, None, None) + + def test_ellipsis(self): + module = self.import_extension('foo', [ + ("get_ellipsis", "METH_NOARGS", + """ + PyObject *ret = Py_Ellipsis; + Py_INCREF(ret); + return ret; + """), + ]) + assert module.get_ellipsis() is Ellipsis diff --git a/pypy/translator/c/src/cjkcodecs/multibytecodec.c b/pypy/translator/c/src/cjkcodecs/multibytecodec.c --- a/pypy/translator/c/src/cjkcodecs/multibytecodec.c +++ b/pypy/translator/c/src/cjkcodecs/multibytecodec.c @@ -1,6 +1,8 @@ #include <stdlib.h> #include "src/cjkcodecs/multibytecodec.h" +#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UNICODE) 0xFFFD) + struct pypy_cjk_dec_s *pypy_cjk_dec_init(const MultibyteCodec *codec, char *inbuf, Py_ssize_t inlen) @@ -93,6 +95,20 @@ return d->inbuf - d->inbuf_start; } +int pypy_cjk_dec_inbuf_add(struct pypy_cjk_dec_s* d, Py_ssize_t skip, + int add_replacement_character) +{ + if (add_replacement_character) + { + if (d->outbuf >= d->outbuf_end) + if (expand_decodebuffer(d, 1) == -1) + return MBERR_NOMEMORY; + *d->outbuf++ = Py_UNICODE_REPLACEMENT_CHARACTER; + } + d->inbuf += skip; + return 0; +} + /************************************************************/ struct pypy_cjk_enc_s *pypy_cjk_enc_init(const MultibyteCodec *codec, @@ -209,3 +225,34 @@ { return d->inbuf - d->inbuf_start; } + +int pypy_cjk_enc_inbuf_add(struct pypy_cjk_enc_s* d, Py_ssize_t skip, + int add_replacement_character) +{ + if (add_replacement_character) + { + const Py_UNICODE replchar = '?', *inbuf = &replchar; + Py_ssize_t r; + + while (1) + { + Py_ssize_t outleft = (Py_ssize_t)(d->outbuf_end - d->outbuf); + r = d->codec->encode(&d->state, d->codec->config, + &inbuf, 1, &d->outbuf, outleft, 0); + if (r != MBERR_TOOSMALL) + break; + /* output buffer too small; grow it and continue. */ + if (expand_encodebuffer(d, -1) == -1) + return MBERR_NOMEMORY; + } + if (r != 0) + { + if (d->outbuf >= d->outbuf_end) + if (expand_encodebuffer(d, 1) == -1) + return MBERR_NOMEMORY; + *d->outbuf++ = '?'; + } + } + d->inbuf += skip; + return 0; +} diff --git a/pypy/translator/c/src/cjkcodecs/multibytecodec.h b/pypy/translator/c/src/cjkcodecs/multibytecodec.h --- a/pypy/translator/c/src/cjkcodecs/multibytecodec.h +++ b/pypy/translator/c/src/cjkcodecs/multibytecodec.h @@ -102,6 +102,7 @@ Py_ssize_t pypy_cjk_dec_outlen(struct pypy_cjk_dec_s *); Py_ssize_t pypy_cjk_dec_inbuf_remaining(struct pypy_cjk_dec_s *d); Py_ssize_t pypy_cjk_dec_inbuf_consumed(struct pypy_cjk_dec_s* d); +int pypy_cjk_dec_inbuf_add(struct pypy_cjk_dec_s*, Py_ssize_t, int); struct pypy_cjk_enc_s { const MultibyteCodec *codec; @@ -119,6 +120,7 @@ Py_ssize_t pypy_cjk_enc_outlen(struct pypy_cjk_enc_s *); Py_ssize_t pypy_cjk_enc_inbuf_remaining(struct pypy_cjk_enc_s *d); Py_ssize_t pypy_cjk_enc_inbuf_consumed(struct pypy_cjk_enc_s* d); +int pypy_cjk_enc_inbuf_add(struct pypy_cjk_enc_s*, Py_ssize_t, int); /* list of codecs defined in the .c files */ _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit