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