Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r67888:20b038f7ded3 Date: 2013-11-09 09:45 +0100 http://bitbucket.org/pypy/pypy/changeset/20b038f7ded3/
Log: Add the same fast path as in CPython diff --git a/pypy/module/_cffi_backend/cdataobj.py b/pypy/module/_cffi_backend/cdataobj.py --- a/pypy/module/_cffi_backend/cdataobj.py +++ b/pypy/module/_cffi_backend/cdataobj.py @@ -19,9 +19,9 @@ _cdata = lltype.nullptr(rffi.CCHARP.TO) def __init__(self, space, cdata, ctype): - from pypy.module._cffi_backend import ctypeprim + from pypy.module._cffi_backend import ctypeobj assert lltype.typeOf(cdata) == rffi.CCHARP - assert isinstance(ctype, ctypeprim.W_CType) + assert isinstance(ctype, ctypeobj.W_CType) self.space = space self._cdata = cdata # don't forget keepalive_until_here! self.ctype = ctype @@ -211,7 +211,21 @@ keepalive_until_here(w_value) return # + # A fast path for <char[]>[0:N] = "somestring". + from pypy.module._cffi_backend import ctypeprim space = self.space + if (space.isinstance_w(w_value, space.w_str) and + isinstance(ctitem, ctypeprim.W_CTypePrimitiveChar)): + from rpython.rtyper.annlowlevel import llstr + from rpython.rtyper.lltypesystem.rstr import copy_string_to_raw + value = space.str_w(w_value) + if len(value) != length: + raise operationerrfmt(space.w_ValueError, + "need a string of length %d, got %d", + length, len(value)) + copy_string_to_raw(llstr(value), cdata, 0, length) + return + # w_iter = space.iter(w_value) for i in range(length): try: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit