From b32a0b8401e6258eb2bb7b57fc77fce67150adf4 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 15 Aug 2010 10:24:30 -0600 Subject: [PATCH] fix ffi extraction of substruct from GC-managed struct --- src/foreign/foreign.c | 5 ++++- src/foreign/foreign.rktc | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/foreign/foreign.c b/src/foreign/foreign.c index 830ce35e92..3a9f185c60 100644 --- a/src/foreign/foreign.c +++ b/src/foreign/foreign.c @@ -1176,6 +1176,9 @@ END_XFORM_SKIP; #define scheme_make_foreign_cpointer(x) \ ((x==NULL)?scheme_false:scheme_make_cptr(x,NULL)) +#define scheme_make_foreign_offset_cpointer(x, delta) \ + ((delta == 0) ? scheme_make_foreign_cpointer(x) : scheme_make_offset_cptr(x,delta,NULL)) + #define scheme_make_foreign_external_cpointer(x) \ ((x==NULL)?scheme_false:scheme_make_external_cptr(x,NULL)) @@ -1266,7 +1269,7 @@ static Scheme_Object *C2SCHEME(Scheme_Object *type, void *src, case FOREIGN_scheme: return REF_CTYPE(Scheme_Object*); case FOREIGN_fpointer: return (REF_CTYPE(void*)); case FOREIGN_struct: - return scheme_make_foreign_cpointer(W_OFFSET(src, delta)); + return scheme_make_foreign_offset_cpointer(src, delta); default: scheme_signal_error("corrupt foreign type: %V", type); } return NULL; /* hush the compiler */ diff --git a/src/foreign/foreign.rktc b/src/foreign/foreign.rktc index 1984a59f23..aa48295471 100755 --- a/src/foreign/foreign.rktc +++ b/src/foreign/foreign.rktc @@ -972,6 +972,9 @@ ffi_abi sym_to_abi(char *who, Scheme_Object *sym) #define scheme_make_foreign_cpointer(x) \ ((x==NULL)?scheme_false:scheme_make_cptr(x,NULL)) +#define scheme_make_foreign_offset_cpointer(x, delta) \ + ((delta == 0) ? scheme_make_foreign_cpointer(x) : scheme_make_offset_cptr(x,delta,NULL)) + #define scheme_make_foreign_external_cpointer(x) \ ((x==NULL)?scheme_false:scheme_make_external_cptr(x,NULL)) @@ -1033,7 +1036,7 @@ static Scheme_Object *C2SCHEME(Scheme_Object *type, void *src, (if (procedure? c->s) (c->s x) (list c->s"("x")"))) "scheme_void")}) case FOREIGN_struct: - return scheme_make_foreign_cpointer(W_OFFSET(src, delta)); + return scheme_make_foreign_offset_cpointer(src, delta); default: scheme_signal_error("corrupt foreign type: %V", type); } @hush