From 1ebde53db77b7b221060da49444ae870f564862e Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 28 Nov 2011 14:54:01 -0700 Subject: [PATCH] fix `compiler-sizeof' docs and error message --- collects/scribblings/foreign/types.scrbl | 7 ++++--- src/foreign/Makefile.in | 1 + src/foreign/foreign.c | 8 +++++--- src/foreign/foreign.rktc | 8 +++++--- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/collects/scribblings/foreign/types.scrbl b/collects/scribblings/foreign/types.scrbl index 1a343e893f..3b4397c158 100644 --- a/collects/scribblings/foreign/types.scrbl +++ b/collects/scribblings/foreign/types.scrbl @@ -67,11 +67,12 @@ list. Finally, the result can be a vector of size 2 containing an element representation followed by an exact-integer count.} -@defproc[(compiler-sizeof [sym symbol?]) exact-nonnegative-integer?]{ +@defproc[(compiler-sizeof [sym (or/c symbol? (listof symbol?))]) exact-nonnegative-integer?]{ -Possible values for @racket[symbol] are @racket['int], @racket['char], +Possible values for @racket[sym] are @racket['int], @racket['char], @racket['short], @racket['long], @racket['*], @racket['void], -@racket['float], @racket['double]. The result is the size of the +@racket['float], @racket['double], or lists of symbols, such as +@racket['(long long)]. The result is the size of the corresponding type according to the C @cpp{sizeof} operator for the current platform. The @racket[compiler-sizeof] operation should be used to gather information about the current platform, such as diff --git a/src/foreign/Makefile.in b/src/foreign/Makefile.in index 12ec718c03..7d50a079f7 100644 --- a/src/foreign/Makefile.in +++ b/src/foreign/Makefile.in @@ -37,6 +37,7 @@ foreign.@LTO@: $(srcdir)/foreign.c \ $(srcdir)/../racket/include/scheme.h \ $(srcdir)/../racket/include/schthread.h \ $(srcdir)/../racket/src/schemef.h \ + $(srcdir)/../racket/src/stypes.h \ $(srcdir)/../racket/src/schpriv.h $(CC) $(CFLAGS) -c $(srcdir)/foreign.c -o foreign.@LTO@ diff --git a/src/foreign/foreign.c b/src/foreign/foreign.c index 04b37c225b..b95488e234 100644 --- a/src/foreign/foreign.c +++ b/src/foreign/foreign.c @@ -1944,12 +1944,14 @@ static Scheme_Object *foreign_compiler_sizeof(int argc, Scheme_Object *argv[]) int basetype = 0; /* 1=int, 2=char, 3=void, 4=float, 5=double */ int intsize = 0; /* "short" => decrement, "long" => increment */ int stars = 0; /* number of "*"s */ + int must_list = 0; Scheme_Object *l = argv[0], *p; while (!SAME_OBJ(l, scheme_null)) { - if (SCHEME_PAIRP(l)) { p = SCHEME_CAR(l); l = SCHEME_CDR(l); } + if (SCHEME_PAIRP(l)) { p = SCHEME_CAR(l); l = SCHEME_CDR(l); must_list = 1;} + else if (must_list) { p = scheme_false; l = scheme_null; } else { p = l; l = scheme_null; } if (!SCHEME_SYMBOLP(p)) { - scheme_wrong_type(MYNAME, "list of symbols", 0, argc, argv); + scheme_wrong_type(MYNAME, "symbol or list of symbols", 0, argc, argv); } else if (!strcmp(SCHEME_SYM_VAL(p),"int")) { if (basetype==0) basetype=1; else scheme_signal_error(MYNAME": extraneous type: %V", p); @@ -1976,7 +1978,7 @@ static Scheme_Object *foreign_compiler_sizeof(int argc, Scheme_Object *argv[]) } else if (!strcmp(SCHEME_SYM_VAL(p),"*")) { stars++; } else { - scheme_wrong_type(MYNAME, "list of C type symbols", 0, argc, argv); + scheme_wrong_type(MYNAME, "C type symbol or list of C type symbols", 0, argc, argv); } } if (stars > 1) diff --git a/src/foreign/foreign.rktc b/src/foreign/foreign.rktc index 8de10dab1e..cb5f359854 100755 --- a/src/foreign/foreign.rktc +++ b/src/foreign/foreign.rktc @@ -1373,12 +1373,14 @@ static void* SCHEME2C(Scheme_Object *type, void *dst, intptr_t delta, int basetype = 0; /* 1=int, 2=char, 3=void, 4=float, 5=double */ int intsize = 0; /* "short" => decrement, "long" => increment */ int stars = 0; /* number of "*"s */ + int must_list = 0; Scheme_Object *l = argv[0], *p; while (!SAME_OBJ(l, scheme_null)) { - if (SCHEME_PAIRP(l)) { p = SCHEME_CAR(l); l = SCHEME_CDR(l); } + if (SCHEME_PAIRP(l)) { p = SCHEME_CAR(l); l = SCHEME_CDR(l); must_list = 1;} + else if (must_list) { p = scheme_false; l = scheme_null; } else { p = l; l = scheme_null; } if (!SCHEME_SYMBOLP(p)) { - scheme_wrong_type(MYNAME, "list of symbols", 0, argc, argv); + scheme_wrong_type(MYNAME, "symbol or list of symbols", 0, argc, argv); } else if (!strcmp(SCHEME_SYM_VAL(p),"int")) { if (basetype==0) basetype=1; else scheme_signal_error(MYNAME": extraneous type: %V", p); @@ -1405,7 +1407,7 @@ static void* SCHEME2C(Scheme_Object *type, void *dst, intptr_t delta, } else if (!strcmp(SCHEME_SYM_VAL(p),"*")) { stars++; } else { - scheme_wrong_type(MYNAME, "list of C type symbols", 0, argc, argv); + scheme_wrong_type(MYNAME, "C type symbol or list of C type symbols", 0, argc, argv); } } if (stars > 1)