Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit