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