Author: Armin Rigo <ar...@tunes.org>
Branch: cffi-1.0
Changeset: r1720:c2879301170e
Date: 2015-04-15 20:37 +0200
http://bitbucket.org/cffi/cffi/changeset/c2879301170e/

Log:    Introduce the standard typedefs as "primitives" too, as cffi always
        did

diff --git a/new/parse_c_type.c b/new/parse_c_type.c
--- a/new/parse_c_type.c
+++ b/new/parse_c_type.c
@@ -377,6 +377,70 @@
 #undef MAKE_SEARCH_FUNC
 
 
+int search_standard_typename(const char *p, size_t size)
+{
+    if (size < 6 || p[size-2] != '_' || p[size-1] != 't')
+        return -1;
+
+    switch (p[4]) {
+
+    case '1':
+        if (size == 8 && !memcmp(p, "uint16", 6)) return _CFFI_PRIM_UINT16;
+        break;
+
+    case '2':
+        if (size == 7 && !memcmp(p, "int32", 5)) return _CFFI_PRIM_INT32;
+        break;
+
+    case '3':
+        if (size == 8 && !memcmp(p, "uint32", 6)) return _CFFI_PRIM_UINT32;
+        break;
+
+    case '4':
+        if (size == 7 && !memcmp(p, "int64", 5)) return _CFFI_PRIM_INT64;
+        break;
+
+    case '6':
+        if (size == 8 && !memcmp(p, "uint64", 6)) return _CFFI_PRIM_UINT64;
+        if (size == 7 && !memcmp(p, "int16", 5)) return _CFFI_PRIM_INT16;
+        break;
+
+    case '8':
+        if (size == 7 && !memcmp(p, "uint8", 5)) return _CFFI_PRIM_UINT8;
+        break;
+
+    case 'e':
+        if (size == 7 && !memcmp(p, "ssize", 5)) return _CFFI_PRIM_SSIZE;
+        break;
+
+    case 'i':
+        if (size == 9 && !memcmp(p, "ptrdiff", 7)) return _CFFI_PRIM_PTRDIFF;
+        break;
+
+    case 'p':
+        if (size == 9 && !memcmp(p, "uintptr", 7)) return _CFFI_PRIM_UINTPTR;
+        break;
+
+    case 'r':
+        if (size == 7 && !memcmp(p, "wchar", 5)) return _CFFI_PRIM_WCHAR;
+        break;
+
+    case 't':
+        if (size == 8 && !memcmp(p, "intptr", 6)) return _CFFI_PRIM_INTPTR;
+        break;
+
+    case '_':
+        if (size == 6 && !memcmp(p, "size", 4)) return _CFFI_PRIM_SIZE;
+        if (size == 6 && !memcmp(p, "int8", 4)) return _CFFI_PRIM_INT8;
+        break;
+
+    default:
+        break;
+    }
+    return -1;
+}
+
+
 static int parse_complete(token_t *tok)
 {
  qualifiers:
@@ -503,12 +567,17 @@
         case TOK_IDENTIFIER:
         {
             int n = search_in_typenames(tok->info->ctx, tok->p, tok->size);
-            if (n < 0)
-                return parse_error(tok, "undefined type name");
-
-            t1 = _CFFI_OP(_CFFI_OP_NOOP,
-                          tok->info->ctx->typenames[n].type_index);
-            break;
+            if (n >= 0) {
+                t1 = _CFFI_OP(_CFFI_OP_NOOP,
+                              tok->info->ctx->typenames[n].type_index);
+                break;
+            }
+            n = search_standard_typename(tok->p, tok->size);
+            if (n >= 0) {
+                t1 = _CFFI_OP(_CFFI_OP_PRIMITIVE, n);
+                break;
+            }
+            return parse_error(tok, "undefined type name");
         }
         case TOK_STRUCT:
         case TOK_UNION:
diff --git a/new/realize_c_type.c b/new/realize_c_type.c
--- a/new/realize_c_type.c
+++ b/new/realize_c_type.c
@@ -4,23 +4,50 @@
 
 PyObject *build_primitive_type(int num)
 {
+    /* XXX too many translations between here and new_primitive_type() */
+    static const char *primitive_name[] = {
+        NULL,
+        "_Bool",
+        "char",
+        "signed char",
+        "unsigned char",
+        "short",
+        "unsigned short",
+        "int",
+        "unsigned int",
+        "long",
+        "unsigned long",
+        "long long",
+        "unsigned long long",
+        "float",
+        "double",
+        "long double",
+        "wchar_t",
+        "int8_t",
+        "uint8_t",
+        "int16_t",
+        "uint16_t",
+        "int32_t",
+        "uint32_t",
+        "int64_t",
+        "uint64_t",
+        "intptr_t",
+        "uintptr_t",
+        "ptrdiff_t",
+        "size_t",
+        "ssize_t",
+    };
     PyObject *x;
 
-    switch (num) {
-
-    case _CFFI_PRIM_VOID:
+    if (num == _CFFI_PRIM_VOID) {
         x = new_void_type();
-        break;
-
-    case _CFFI_PRIM_INT:
-        x = new_primitive_type("int");
-        break;
-
-    case _CFFI_PRIM_LONG:
-        x = new_primitive_type("long");
-        break;
-
-    default:
+    }
+    else if (0 <= num &&
+             num < sizeof(primitive_name) / sizeof(*primitive_name) &&
+             primitive_name[num] != NULL) {
+        x = new_primitive_type(primitive_name[num]);
+    }
+    else {
         PyErr_Format(PyExc_NotImplementedError, "prim=%d", num);
         return NULL;
     }
diff --git a/new/test_realize_c_type.py b/new/test_realize_c_type.py
--- a/new/test_realize_c_type.py
+++ b/new/test_realize_c_type.py
@@ -41,3 +41,8 @@
     check("int(*)(int(int))", "int(*)(int(*)(int))")
     check("int(*)(long[])", "int(*)(long *)")
     check("int(*)(long[5])", "int(*)(long *)")
+
+def test_all_primitives():
+    import cffi_opcode
+    for name in cffi_opcode.PRIMITIVE_TO_INDEX:
+        check(name, name)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to