diff --git a/src/foreign/foreign.c b/src/foreign/foreign.c index 0cc4a55..0c31b14 100644 --- a/src/foreign/foreign.c +++ b/src/foreign/foreign.c @@ -1018,11 +1018,11 @@ static Scheme_Object *get_ctype_base(Scheme_Object *type) return type; } -/* Returns the size, 0 for void, -1 if no such type */ -static int ctype_sizeof(Scheme_Object *type) +/* Returns the size, 0 for void or if no such type */ +static size_t ctype_sizeof(Scheme_Object *type) { type = get_ctype_base(type); - if (type == NULL) return -1; + if (type == NULL) return 0; switch (CTYPE_PRIMLABEL(type)) { case FOREIGN_void: return 0; case FOREIGN_int8: return sizeof(Tsint8); @@ -1223,11 +1223,11 @@ static Scheme_Object *foreign_make_array_type(int argc, Scheme_Object *argv[]) Scheme_Object *base, *basetype; GC_CAN_IGNORE ffi_type *libffi_type, **elements; ctype_struct *type; - intptr_t len; + uintptr_t len; if (NULL == (base = get_ctype_base(argv[0]))) scheme_wrong_type(MYNAME, "C-type", 0, argc, argv); - if (!scheme_get_int_val(argv[1], &len) || (len < 0)) + if (!scheme_get_unsigned_int_val(argv[1], &len) || (len == 0)) scheme_wrong_type(MYNAME, "pointer-sized nonnegative exact integer", 1, argc, argv); /* libffi doesn't seem to support array types, but we try to make @@ -2034,11 +2034,11 @@ static void* SCHEME2C(Scheme_Object *type, void *dst, intptr_t delta, #define MYNAME "ctype-sizeof" static Scheme_Object *foreign_ctype_sizeof(int argc, Scheme_Object *argv[]) { - int size; + size_t size; + if (!SCHEME_CTYPEP(argv[0])) + scheme_wrong_type(MYNAME, "C-type", 0, argc, argv); size = ctype_sizeof(argv[0]); - if (size >= 0) return scheme_make_integer(size); - else scheme_wrong_type(MYNAME, "C-type", 0, argc, argv); - return NULL; /* hush the compiler */ + return scheme_make_integer_value_from_unsigned(size); } #undef MYNAME @@ -2184,7 +2184,8 @@ static Scheme_Object *fail_ok_sym; static Scheme_Object *foreign_malloc(int argc, Scheme_Object *argv[]) { int i, failok=0; - intptr_t size=0, num=-1; + size_t size=0; + intptr_t num=-1; void *from = NULL, *res = NULL; intptr_t foff = 0; Scheme_Object *mode = NULL, *a, *base = NULL; @@ -2204,7 +2205,7 @@ static Scheme_Object *foreign_malloc(int argc, Scheme_Object *argv[]) if (NULL == (base = get_ctype_base(a))) scheme_wrong_type(MYNAME, "C-type", i, argc, argv); size = ctype_sizeof(a); - if (size <= 0) + if (size == 0) scheme_wrong_type(MYNAME, "non-void-C-type", i, argc, argv); } else if (SAME_OBJ(a, fail_ok_sym)) { failok = 1; @@ -2345,9 +2346,9 @@ static Scheme_Object *do_ptr_add(const char *who, int is_bang, scheme_wrong_type(who, C_INTPTR_T_TYPE_STR, 1, argc, argv); if (argc > 2) { if (SCHEME_CTYPEP(argv[2])) { - intptr_t size; + size_t size; size = ctype_sizeof(argv[2]); - if (size <= 0) scheme_wrong_type(who, "non-void-C-type", 2, argc, argv); + if (size == 0) scheme_wrong_type(who, "non-void-C-type", 2, argc, argv); noff = noff * size; } else scheme_wrong_type(who, "C-type", 2, argc, argv); @@ -2424,11 +2425,11 @@ static Scheme_Object *foreign_set_ptr_offset_bang(int argc, Scheme_Object *argv[ } if (argc > 2) { if (SCHEME_CTYPEP(argv[2])) { - intptr_t size; + size_t size; if (NULL == get_ctype_base(argv[2])) scheme_wrong_type(MYNAME, "C-type", 2, argc, argv); size = ctype_sizeof(argv[2]); - if (size <= 0) + if (size == 0) scheme_wrong_type(MYNAME, "non-void-C-type", 2, argc, argv); noff = noff * size; } else @@ -2452,7 +2453,8 @@ static Scheme_Object *do_memop(const char *who, int mode, /* mode 0=>memset, 1=>memmove, 2=>memcpy */ { void *src = NULL, *dest = NULL; - intptr_t soff = 0, doff = 0, count, v, mult = 0; + intptr_t soff = 0, doff = 0, count, v; + size_t mult = 0; int i, j, ch = 0, argc1 = argc; Scheme_Object *cp; @@ -2463,7 +2465,7 @@ static Scheme_Object *do_memop(const char *who, int mode, if (SCHEME_CTYPEP(argv[argc1-1])) { argc1--; mult = ctype_sizeof(argv[argc1]); - if (mult <= 0) + if (mult == 0) scheme_wrong_type(who, "non-void-C-type", argc1, argc, argv); } @@ -2573,7 +2575,8 @@ static Scheme_Object *abs_sym; #define MYNAME "ptr-ref" static Scheme_Object *foreign_ptr_ref(int argc, Scheme_Object *argv[]) { - int size=0; void *ptr; Scheme_Object *base; + size_t size=0; + void *ptr; Scheme_Object *base; intptr_t delta; int gcsrc=1; Scheme_Object *cp; cp = unwrap_cpointer_property(argv[0]); @@ -2597,10 +2600,7 @@ static Scheme_Object *foreign_ptr_ref(int argc, Scheme_Object *argv[]) } } - if (size < 0) { - /* should not happen */ - scheme_wrong_type(MYNAME, "C-type", 1, argc, argv); - } else if (size == 0) { + if (size == 0) { scheme_wrong_type(MYNAME, "non-void-C-type", 1, argc, argv); } @@ -2629,7 +2629,7 @@ static Scheme_Object *foreign_ptr_ref(int argc, Scheme_Object *argv[]) #define MYNAME "ptr-set!" static Scheme_Object *foreign_ptr_set_bang(int argc, Scheme_Object *argv[]) { - int size=0; void *ptr; + size_t size=0; void *ptr; intptr_t delta; Scheme_Object *val = argv[argc-1], *base; Scheme_Object *cp; @@ -2642,12 +2642,13 @@ static Scheme_Object *foreign_ptr_set_bang(int argc, Scheme_Object *argv[]) scheme_wrong_type(MYNAME, "non-null-cpointer", 0, argc, argv); if (NULL == (base = get_ctype_base(argv[1]))) scheme_wrong_type(MYNAME, "C-type", 1, argc, argv); - size = ctype_sizeof(base); - - if (size < 0) { + + if (!SCHEME_CTYPEP(base)) { /* should not happen */ scheme_wrong_type(MYNAME, "C-type", 1, argc, argv); - } else if (size == 0) { + } + size = ctype_sizeof(base); + if (size == 0) { scheme_wrong_type(MYNAME, "non-void-C-type", 1, argc, argv); }