[pypy-commit] cffi default: reintroduce a fast case for ffi.unpack(arrays of _Bool)

arigo pypy.commits at gmail.com
Tue Jan 24 07:57:01 EST 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r2872:19591d33fdb2
Date: 2017-01-24 13:56 +0100
http://bitbucket.org/cffi/cffi/changeset/19591d33fdb2/

Log:	reintroduce a fast case for ffi.unpack(arrays of _Bool)

diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -5944,12 +5944,12 @@
             else if (itemsize == sizeof(short))       casenum = 1;
             else if (itemsize == sizeof(signed char)) casenum = 0;
         }
-        else if ((ctitem->ct_flags & (CT_PRIMITIVE_UNSIGNED | CT_IS_BOOL))
-                 == CT_PRIMITIVE_UNSIGNED) {
+        else if (ctitem->ct_flags & CT_PRIMITIVE_UNSIGNED) {
             /* Note: we never pick case 6 if sizeof(int) == sizeof(long),
                so that case 6 below can assume that the 'unsigned int' result
                would always fit in a 'signed long'. */
-            if      (itemsize == sizeof(unsigned long))  casenum = 7;
+            if (ctitem->ct_flags & CT_IS_BOOL)           casenum = 11;
+            else if (itemsize == sizeof(unsigned long))  casenum = 7;
             else if (itemsize == sizeof(unsigned int))   casenum = 6;
             else if (itemsize == sizeof(unsigned short)) casenum = 5;
             else if (itemsize == sizeof(unsigned char))  casenum = 4;
@@ -5982,6 +5982,13 @@
         case 8: x = PyFloat_FromDouble(*(float *)src); break;
         case 9: x = PyFloat_FromDouble(*(double *)src); break;
         case 10: x = new_simple_cdata(*(char **)src, ctitem); break;
+        case 11:
+            switch (*(unsigned char *)src) {
+            case 0: x = Py_False; Py_INCREF(x); break;
+            case 1: x = Py_True;  Py_INCREF(x); break;
+            default: x = convert_to_object(src, ctitem); /* error */
+            }
+            break;
         }
         if (x == NULL) {
             Py_DECREF(result);


More information about the pypy-commit mailing list