reformatting, moving some undefs, etc -- preparing for a new preprocessor version

svn: r14067
This commit is contained in:
Eli Barzilay 2009-03-12 05:51:42 +00:00
parent ca30b05114
commit 60a421e9ab

View File

@ -4,11 +4,8 @@
** to make changes, edit that file and
** run it to generate an updated version
** of this file.
** NOTE: This is no longer true, foreign.ssc needs to be updated to work with
** the scribble/text preprocessor instead.
********************************************/
#include "schpriv.h"
#ifndef WINDOWS_DYNAMIC_LOAD
@ -52,7 +49,7 @@
# error "configuration error, please contact PLT (int64)"
# endif
#else
#else /* WINDOWS_DYNAMIC_LOAD defined */
# include <windows.h>
# ifndef __CYGWIN32__
@ -67,7 +64,7 @@
typedef unsigned _int64 Tuint64;
# endif
#endif
#endif /* WINDOWS_DYNAMIC_LOAD */
#include "ffi.h"
@ -146,11 +143,10 @@ BOOL mzEnumProcessModules(HANDLE hProcess, HMODULE* lphModule,
}
}
#ifdef MZ_PRECISE_GC
END_XFORM_SKIP;
#endif
#endif
#endif /* WINDOWS_DYNAMIC_LOAD */
/*****************************************************************************/
/* Library objects */
@ -164,13 +160,16 @@ typedef struct ffi_lib_struct {
Scheme_Hash_Table* objects;
} ffi_lib_struct;
#define SCHEME_FFILIBP(x) (SCHEME_TYPE(x)==ffi_lib_tag)
#undef MYNAME
#define MYNAME "ffi-lib?"
static Scheme_Object *foreign_ffi_lib_p(int argc, Scheme_Object *argv[])
{ return SCHEME_FFILIBP(argv[0]) ? scheme_true : scheme_false; }
{
return SCHEME_FFILIBP(argv[0]) ? scheme_true : scheme_false;
}
#undef MYNAME
/* 3m stuff for ffi_lib */
#ifdef MZ_PRECISE_GC
START_XFORM_SKIP;int ffi_lib_SIZE(void *p) {
START_XFORM_SKIP;
int ffi_lib_SIZE(void *p) {
return gcBYTES_TO_WORDS(sizeof(ffi_lib_struct));
}
int ffi_lib_MARK(void *p) {
@ -193,7 +192,6 @@ END_XFORM_SKIP;
static Scheme_Hash_Table *opened_libs;
/* (ffi-lib filename no-error?) -> ffi-lib */
#undef MYNAME
#define MYNAME "ffi-lib"
static Scheme_Object *foreign_ffi_lib(int argc, Scheme_Object *argv[])
{
@ -212,28 +210,28 @@ static Scheme_Object *foreign_ffi_lib(int argc, Scheme_Object *argv[])
lib = (ffi_lib_struct*)scheme_hash_get(opened_libs, hashname);
if (!lib) {
Scheme_Hash_Table *ht;
#ifdef WINDOWS_DYNAMIC_LOAD
# ifdef WINDOWS_DYNAMIC_LOAD
if (name==NULL) {
/* openning the executable is marked by a NULL handle */
handle = NULL;
null_ok = 1;
} else
handle = LoadLibrary(name);
#else
# else /* WINDOWS_DYNAMIC_LOAD undefined */
handle = dlopen(name, RTLD_NOW | RTLD_GLOBAL);
#endif
# endif /* WINDOWS_DYNAMIC_LOAD */
if (handle == NULL && !null_ok) {
if (argc > 1 && SCHEME_TRUEP(argv[1])) return scheme_false;
else {
#ifdef WINDOWS_DYNAMIC_LOAD
# ifdef WINDOWS_DYNAMIC_LOAD
long err;
err = GetLastError();
scheme_raise_exn(MZEXN_FAIL_FILESYSTEM,
MYNAME": couldn't open %V (%E)", argv[0], err);
#else
# else /* WINDOWS_DYNAMIC_LOAD undefined */
scheme_raise_exn(MZEXN_FAIL_FILESYSTEM,
MYNAME": couldn't open %V (%s)", argv[0], dlerror());
#endif
# endif /* WINDOWS_DYNAMIC_LOAD */
}
}
ht = scheme_make_hash_table(SCHEME_hash_string);
@ -248,9 +246,9 @@ static Scheme_Object *foreign_ffi_lib(int argc, Scheme_Object *argv[])
}
return (Scheme_Object*)lib;
}
#undef MYNAME
/* (ffi-lib-name ffi-lib) -> string */
#undef MYNAME
#define MYNAME "ffi-lib-name"
static Scheme_Object *foreign_ffi_lib_name(int argc, Scheme_Object *argv[])
{
@ -258,6 +256,7 @@ static Scheme_Object *foreign_ffi_lib_name(int argc, Scheme_Object *argv[])
scheme_wrong_type(MYNAME, "ffi-lib", 0, argc, argv);
return ((ffi_lib_struct*)argv[0])->name;
}
#undef MYNAME
/*****************************************************************************/
/* Pull pointers (mostly functions) out of ffi-lib objects */
@ -271,13 +270,16 @@ typedef struct ffi_obj_struct {
ffi_lib_struct* lib;
} ffi_obj_struct;
#define SCHEME_FFIOBJP(x) (SCHEME_TYPE(x)==ffi_obj_tag)
#undef MYNAME
#define MYNAME "ffi-obj?"
static Scheme_Object *foreign_ffi_obj_p(int argc, Scheme_Object *argv[])
{ return SCHEME_FFIOBJP(argv[0]) ? scheme_true : scheme_false; }
{
return SCHEME_FFIOBJP(argv[0]) ? scheme_true : scheme_false;
}
#undef MYNAME
/* 3m stuff for ffi_obj */
#ifdef MZ_PRECISE_GC
START_XFORM_SKIP;int ffi_obj_SIZE(void *p) {
START_XFORM_SKIP;
int ffi_obj_SIZE(void *p) {
return gcBYTES_TO_WORDS(sizeof(ffi_obj_struct));
}
int ffi_obj_MARK(void *p) {
@ -298,7 +300,6 @@ END_XFORM_SKIP;
#endif
/* (ffi-obj objname ffi-lib-or-libname) -> ffi-obj */
#undef MYNAME
#define MYNAME "ffi-obj"
static Scheme_Object *foreign_ffi_obj(int argc, Scheme_Object *argv[])
{
@ -317,7 +318,7 @@ static Scheme_Object *foreign_ffi_obj(int argc, Scheme_Object *argv[])
dlname = SCHEME_BYTE_STR_VAL(argv[0]);
obj = (ffi_obj_struct*)scheme_hash_get(lib->objects, (Scheme_Object*)dlname);
if (!obj) {
#ifdef WINDOWS_DYNAMIC_LOAD
# ifdef WINDOWS_DYNAMIC_LOAD
if (lib->handle) {
dlobj = GetProcAddress(lib->handle, dlname);
} else {
@ -330,22 +331,22 @@ static Scheme_Object *foreign_ffi_obj(int argc, Scheme_Object *argv[])
mods = quick_mods;
if (mzEnumProcessModules(me, mods, cnt, &actual_cnt)) {
if (actual_cnt > cnt) {
cnt = actual_cnt;
mods = (HMODULE *)scheme_malloc_atomic(cnt);
if (!mzEnumProcessModules(me, mods, cnt, &actual_cnt))
mods = NULL;
} else
cnt = actual_cnt;
cnt = actual_cnt;
mods = (HMODULE *)scheme_malloc_atomic(cnt);
if (!mzEnumProcessModules(me, mods, cnt, &actual_cnt))
mods = NULL;
} else
cnt = actual_cnt;
} else
mods = NULL;
mods = NULL;
if (mods) {
cnt /= sizeof(HMODULE);
for (i = 0; i < cnt; i++) {
dlobj = GetProcAddress(mods[i], dlname);
if (dlobj) break;
}
cnt /= sizeof(HMODULE);
for (i = 0; i < cnt; i++) {
dlobj = GetProcAddress(mods[i], dlname);
if (dlobj) break;
}
} else
dlobj = NULL;
dlobj = NULL;
}
if (!dlobj) {
long err;
@ -354,7 +355,7 @@ static Scheme_Object *foreign_ffi_obj(int argc, Scheme_Object *argv[])
MYNAME": couldn't get \"%s\" from %V (%E)",
dlname, lib->name, err);
}
#else
# else /* WINDOWS_DYNAMIC_LOAD undefined */
dlobj = dlsym(lib->handle, dlname);
if (!dlobj) {
const char *err;
@ -364,7 +365,7 @@ static Scheme_Object *foreign_ffi_obj(int argc, Scheme_Object *argv[])
MYNAME": couldn't get \"%s\" from %V (%s)",
dlname, lib->name, err);
}
#endif
# endif /* WINDOWS_DYNAMIC_LOAD */
obj = (ffi_obj_struct*)scheme_malloc_tagged(sizeof(ffi_obj_struct));
obj->so.type = ffi_obj_tag;
obj->obj = (dlobj);
@ -374,9 +375,9 @@ static Scheme_Object *foreign_ffi_obj(int argc, Scheme_Object *argv[])
}
return (obj == NULL) ? scheme_false : (Scheme_Object*)obj;
}
#undef MYNAME
/* (ffi-obj-lib ffi-obj) -> ffi-lib */
#undef MYNAME
#define MYNAME "ffi-obj-lib"
static Scheme_Object *foreign_ffi_obj_lib(int argc, Scheme_Object *argv[])
{
@ -384,9 +385,9 @@ static Scheme_Object *foreign_ffi_obj_lib(int argc, Scheme_Object *argv[])
scheme_wrong_type(MYNAME, "ffi-obj", 0, argc, argv);
return (Scheme_Object*)(((ffi_obj_struct*)argv[0])->lib);
}
#undef MYNAME
/* (ffi-obj-name ffi-obj) -> string */
#undef MYNAME
#define MYNAME "ffi-obj-name"
static Scheme_Object *foreign_ffi_obj_name(int argc, Scheme_Object *argv[])
{
@ -394,6 +395,7 @@ static Scheme_Object *foreign_ffi_obj_name(int argc, Scheme_Object *argv[])
scheme_wrong_type(MYNAME, "ffi-obj", 0, argc, argv);
return scheme_make_byte_string(((ffi_obj_struct*)argv[0])->name);
}
#undef MYNAME
/*****************************************************************************/
/* Type helpers */
@ -628,10 +630,10 @@ Scheme_Object *utf16_pointer_to_ucs4_string(unsigned short *utf)
#ifndef SIXTY_FOUR_BIT_INTEGERS
#define ffi_type_smzlong ffi_type_sint32
#define ffi_type_umzlong ffi_type_uint32
#else
#else /* SIXTY_FOUR_BIT_INTEGERS defined */
#define ffi_type_smzlong ffi_type_sint64
#define ffi_type_umzlong ffi_type_uint64
#endif
#endif /* SIXTY_FOUR_BIT_INTEGERS */
/* This is what mzscheme defines as long, assuming fixnums: */
#define FOREIGN_fixnum (12)
@ -845,13 +847,16 @@ typedef struct ctype_struct {
Scheme_Object* c_to_scheme;
} ctype_struct;
#define SCHEME_CTYPEP(x) (SCHEME_TYPE(x)==ctype_tag)
#undef MYNAME
#define MYNAME "ctype?"
static Scheme_Object *foreign_ctype_p(int argc, Scheme_Object *argv[])
{ return SCHEME_CTYPEP(argv[0]) ? scheme_true : scheme_false; }
{
return SCHEME_CTYPEP(argv[0]) ? scheme_true : scheme_false;
}
#undef MYNAME
/* 3m stuff for ctype */
#ifdef MZ_PRECISE_GC
START_XFORM_SKIP;int ctype_SIZE(void *p) {
START_XFORM_SKIP;
int ctype_SIZE(void *p) {
return gcBYTES_TO_WORDS(sizeof(ctype_struct));
}
int ctype_MARK(void *p) {
@ -880,7 +885,6 @@ END_XFORM_SKIP;
#define CTYPE_USER_C2S(x) (((ctype_struct*)(x))->c_to_scheme)
/* Returns #f for primitive types. */
#undef MYNAME
#define MYNAME "ctype-basetype"
static Scheme_Object *foreign_ctype_basetype(int argc, Scheme_Object *argv[])
{
@ -888,8 +892,8 @@ static Scheme_Object *foreign_ctype_basetype(int argc, Scheme_Object *argv[])
scheme_wrong_type(MYNAME, "ctype", 0, argc, argv);
return CTYPE_BASETYPE(argv[0]);
}
#undef MYNAME
#define MYNAME "ctype-scheme->c"
static Scheme_Object *foreign_ctype_scheme_to_c(int argc, Scheme_Object *argv[])
{
@ -898,8 +902,8 @@ static Scheme_Object *foreign_ctype_scheme_to_c(int argc, Scheme_Object *argv[])
return (CTYPE_PRIMP(argv[0])) ? scheme_false :
((ctype_struct*)(argv[0]))->scheme_to_c;
}
#undef MYNAME
#define MYNAME "ctype-c->scheme"
static Scheme_Object *foreign_ctype_c_to_scheme(int argc, Scheme_Object *argv[])
{
@ -908,6 +912,7 @@ static Scheme_Object *foreign_ctype_c_to_scheme(int argc, Scheme_Object *argv[])
return (CTYPE_PRIMP(argv[0])) ? scheme_false :
((ctype_struct*)(argv[0]))->c_to_scheme;
}
#undef MYNAME
/* Returns a primitive type, or NULL if not a type */
static Scheme_Object *get_ctype_base(Scheme_Object *type)
@ -957,7 +962,6 @@ static int ctype_sizeof(Scheme_Object *type)
/* The scheme->c can throw type errors to check for valid arguments */
/* a #f means no conversion function, if both are #f -- then just return the */
/* basetype. */
#undef MYNAME
#define MYNAME "make-ctype"
static Scheme_Object *foreign_make_ctype(int argc, Scheme_Object *argv[])
{
@ -980,6 +984,7 @@ static Scheme_Object *foreign_make_ctype(int argc, Scheme_Object *argv[])
}
return NULL; /* hush the compiler */
}
#undef MYNAME
/* see below */
void free_libffi_type(void *ignored, void *p)
@ -1028,7 +1033,6 @@ ffi_abi sym_to_abi(char *who, Scheme_Object *sym)
/* This creates a new primitive type that is a struct. This type can be used
* with cpointer objects, except that the contents is used rather than the
* pointer value. Marshaling to lists or whatever should be done in Scheme. */
#undef MYNAME
#define MYNAME "make-cstruct-type"
static Scheme_Object *foreign_make_cstruct_type(int argc, Scheme_Object *argv[])
{
@ -1072,6 +1076,7 @@ static Scheme_Object *foreign_make_cstruct_type(int argc, Scheme_Object *argv[])
scheme_register_finalizer(type, free_libffi_type, libffi_type, NULL, NULL);
return (Scheme_Object*)type;
}
#undef MYNAME
/*****************************************************************************/
/* Callback type */
@ -1087,13 +1092,16 @@ typedef struct ffi_callback_struct {
int call_in_scheduler;
} ffi_callback_struct;
#define SCHEME_FFICALLBACKP(x) (SCHEME_TYPE(x)==ffi_callback_tag)
#undef MYNAME
#define MYNAME "ffi-callback?"
static Scheme_Object *foreign_ffi_callback_p(int argc, Scheme_Object *argv[])
{ return SCHEME_FFICALLBACKP(argv[0]) ? scheme_true : scheme_false; }
{
return SCHEME_FFICALLBACKP(argv[0]) ? scheme_true : scheme_false;
}
#undef MYNAME
/* 3m stuff for ffi_callback */
#ifdef MZ_PRECISE_GC
START_XFORM_SKIP;int ffi_callback_SIZE(void *p) {
START_XFORM_SKIP;
int ffi_callback_SIZE(void *p) {
return gcBYTES_TO_WORDS(sizeof(ffi_callback_struct));
}
int ffi_callback_MARK(void *p) {
@ -1140,14 +1148,13 @@ END_XFORM_SKIP;
#define scheme_make_foreign_cpointer(x) \
((x==NULL)?scheme_false:scheme_make_cptr(x,NULL))
#undef MYNAME
#define MYNAME "cpointer?"
static Scheme_Object *foreign_cpointer_p(int argc, Scheme_Object *argv[])
{
return SCHEME_FFIANYPTRP(argv[0]) ? scheme_true : scheme_false;
}
#undef MYNAME
#define MYNAME "cpointer-tag"
static Scheme_Object *foreign_cpointer_tag(int argc, Scheme_Object *argv[])
{
@ -1157,8 +1164,8 @@ static Scheme_Object *foreign_cpointer_tag(int argc, Scheme_Object *argv[])
if (SCHEME_CPTRP(argv[0])) tag = SCHEME_CPTR_TYPE(argv[0]);
return (tag == NULL) ? scheme_false : tag;
}
#undef MYNAME
#define MYNAME "set-cpointer-tag!"
static Scheme_Object *foreign_set_cpointer_tag_bang(int argc, Scheme_Object *argv[])
{
@ -1167,6 +1174,7 @@ static Scheme_Object *foreign_set_cpointer_tag_bang(int argc, Scheme_Object *arg
SCHEME_CPTR_TYPE(argv[0]) = argv[1];
return scheme_void;
}
#undef MYNAME
/*****************************************************************************/
/* Scheme<-->C conversions */
@ -1647,7 +1655,6 @@ static void* SCHEME2C(Scheme_Object *type, void *dst, long delta,
/* C type information */
/* (ctype-sizeof type) -> int, returns 0 for void, error if not a C type */
#undef MYNAME
#define MYNAME "ctype-sizeof"
static Scheme_Object *foreign_ctype_sizeof(int argc, Scheme_Object *argv[])
{
@ -1657,9 +1664,9 @@ static Scheme_Object *foreign_ctype_sizeof(int argc, Scheme_Object *argv[])
else scheme_wrong_type(MYNAME, "C-type", 0, argc, argv);
return NULL; /* hush the compiler */
}
#undef MYNAME
/* (ctype-alignof type) -> int, returns 0 for void, error if not a C type */
#undef MYNAME
#define MYNAME "ctype-alignof"
static Scheme_Object *foreign_ctype_alignof(int argc, Scheme_Object *argv[])
{
@ -1669,12 +1676,12 @@ static Scheme_Object *foreign_ctype_alignof(int argc, Scheme_Object *argv[])
else return scheme_make_integer(CTYPE_PRIMTYPE(type)->alignment);
return NULL; /* hush the compiler */
}
#undef MYNAME
/* (compiler-sizeof symbols) -> int, where symbols name some C type.
* The symbols are in 'int 'char 'void 'short 'long '*, order does not matter,
* when a single symbol is used, a list is not needed.
* (This is about actual C types, not C type objects.) */
#undef MYNAME
#define MYNAME "compiler-sizeof"
static Scheme_Object *foreign_compiler_sizeof(int argc, Scheme_Object *argv[])
{
@ -1764,6 +1771,7 @@ static Scheme_Object *foreign_compiler_sizeof(int argc, Scheme_Object *argv[])
#undef RETSIZE
return scheme_make_integer(res);
}
#undef MYNAME
/*****************************************************************************/
/* Pointer type user functions */
@ -1792,7 +1800,6 @@ static Scheme_Object *fail_ok_sym;
* different types, the only requirement is for a size, either a number of
* bytes or a type. If no mode is specified, then scheme_malloc will be used
* when the type is any pointer, otherwise scheme_malloc_atomic is used. */
#undef MYNAME
#define MYNAME "malloc"
static Scheme_Object *foreign_malloc(int argc, Scheme_Object *argv[])
{
@ -1855,9 +1862,9 @@ static Scheme_Object *foreign_malloc(int argc, Scheme_Object *argv[])
memcpy(res, W_OFFSET(from, foff), size);
return scheme_make_foreign_cpointer(res);
}
#undef MYNAME
/* (end-stubborn-change ptr) */
#undef MYNAME
#define MYNAME "end-stubborn-change"
static Scheme_Object *foreign_end_stubborn_change(int argc, Scheme_Object *argv[])
{
@ -1872,11 +1879,11 @@ static Scheme_Object *foreign_end_stubborn_change(int argc, Scheme_Object *argv[
scheme_end_stubborn_change(W_OFFSET(ptr, poff));
return scheme_void;
}
#undef MYNAME
/* (free ptr) */
/* This is useful for raw-malloced objects, including objects from C libraries
* that the library is mallocing itself. */
#undef MYNAME
#define MYNAME "free"
static Scheme_Object *foreign_free(int argc, Scheme_Object *argv[])
{
@ -1891,17 +1898,17 @@ static Scheme_Object *foreign_free(int argc, Scheme_Object *argv[])
free(W_OFFSET(ptr, poff));
return scheme_void;
}
#undef MYNAME
/* (malloc-immobile-cell v) */
#undef MYNAME
#define MYNAME "malloc-immobile-cell"
static Scheme_Object *foreign_malloc_immobile_cell(int argc, Scheme_Object *argv[])
{
return scheme_make_foreign_cpointer(scheme_malloc_immobile_box(argv[0]));
}
#undef MYNAME
/* (free-immobile-cell b) */
#undef MYNAME
#define MYNAME "free-immobile-cell"
static Scheme_Object *foreign_free_immobile_cell(int argc, Scheme_Object *argv[])
{
@ -1916,6 +1923,7 @@ static Scheme_Object *foreign_free_immobile_cell(int argc, Scheme_Object *argv[]
scheme_free_immobile_box((void **)W_OFFSET(ptr, poff));
return scheme_void;
}
#undef MYNAME
#define C_LONG_TYPE_STR "exact integer that fits a C long"
@ -1959,28 +1967,31 @@ static Scheme_Object *do_ptr_add(const char *who, int is_bang,
}
/* (ptr-add cptr offset-k [type]) */
#undef MYNAME
#define MYNAME "ptr-add"
static Scheme_Object *foreign_ptr_add(int argc, Scheme_Object *argv[])
{ return do_ptr_add(MYNAME, 0, argc, argv); }
/* (ptr-add! cptr offset-k [type]) */
{
return do_ptr_add(MYNAME, 0, argc, argv);
}
#undef MYNAME
/* (ptr-add! cptr offset-k [type]) */
#define MYNAME "ptr-add!"
static Scheme_Object *foreign_ptr_add_bang(int argc, Scheme_Object *argv[])
{ return do_ptr_add(MYNAME, 1, argc, argv); }
{
return do_ptr_add(MYNAME, 1, argc, argv);
}
#undef MYNAME
/* (offset-ptr? x) */
/* Returns #t if the argument is a cpointer with an offset */
#undef MYNAME
#define MYNAME "offset-ptr?"
static Scheme_Object *foreign_offset_ptr_p(int argc, Scheme_Object *argv[])
{
return (SCHEME_CPOINTER_W_OFFSET_P(argv[0])) ? scheme_true : scheme_false;
}
#undef MYNAME
/* (ptr-offset ptr) */
/* Returns the offset of a cpointer (0 if it's not an offset pointer) */
#undef MYNAME
#define MYNAME "ptr-offset"
static Scheme_Object *foreign_ptr_offset(int argc, Scheme_Object *argv[])
{
@ -1988,11 +1999,11 @@ static Scheme_Object *foreign_ptr_offset(int argc, Scheme_Object *argv[])
scheme_wrong_type(MYNAME, "cpointer", 0, argc, argv);
return scheme_make_integer_value(SCHEME_FFIANYPTR_OFFSET(argv[0]));
}
#undef MYNAME
/* (set-ptr-offset! ptr offset [type]) */
/* Sets the offset of an offset-cpointer (possibly multiplied by the size of
* the given ctype) */
#undef MYNAME
#define MYNAME "set-ptr-offset!"
static Scheme_Object *foreign_set_ptr_offset_bang(int argc, Scheme_Object *argv[])
{
@ -2017,6 +2028,7 @@ static Scheme_Object *foreign_set_ptr_offset_bang(int argc, Scheme_Object *argv[
((Scheme_Offset_Cptr*)(argv[0]))->offset = noff;
return scheme_void;
}
#undef MYNAME
/* (mem{move,cpy} dest-ptr [dest-offset] src-ptr [src-offset] count [ctype])
* Copies count * sizeof(ctype) bytes
@ -2103,18 +2115,24 @@ static Scheme_Object *do_memop(const char *who, int mode,
return scheme_void;
}
#undef MYNAME
#define MYNAME "memset"
static Scheme_Object *foreign_memset(int argc, Scheme_Object *argv[])
{ return do_memop(MYNAME, 0, argc, argv); }
{
return do_memop(MYNAME, 0, argc, argv);
}
#undef MYNAME
#define MYNAME "memmove"
static Scheme_Object *foreign_memmove(int argc, Scheme_Object *argv[])
{ return do_memop(MYNAME, 1, argc, argv); }
{
return do_memop(MYNAME, 1, argc, argv);
}
#undef MYNAME
#define MYNAME "memcpy"
static Scheme_Object *foreign_memcpy(int argc, Scheme_Object *argv[])
{ return do_memop(MYNAME, 2, argc, argv); }
{
return do_memop(MYNAME, 2, argc, argv);
}
#undef MYNAME
static Scheme_Object *abs_sym;
@ -2123,7 +2141,6 @@ static Scheme_Object *abs_sym;
/* if n is given, an 'abs flag can precede it to make n be a byte offset rather
* than some multiple of sizeof(type). */
/* WARNING: there are *NO* checks at all, this is raw C level code. */
#undef MYNAME
#define MYNAME "ptr-ref"
static Scheme_Object *foreign_ptr_ref(int argc, Scheme_Object *argv[])
{
@ -2170,13 +2187,13 @@ static Scheme_Object *foreign_ptr_ref(int argc, Scheme_Object *argv[])
}
return C2SCHEME(argv[1], ptr, delta, 0);
}
#undef MYNAME
/* (ptr-set! cpointer type [['abs] n] value) -> void */
/* n defaults to 0 which is the only value that should be used with ffi_objs */
/* if n is given, an 'abs flag can precede it to make n be a byte offset rather
* than some multiple of sizeof(type). */
/* WARNING: there are *NO* checks at all, this is raw C level code. */
#undef MYNAME
#define MYNAME "ptr-set!"
static Scheme_Object *foreign_ptr_set_bang(int argc, Scheme_Object *argv[])
{
@ -2216,9 +2233,9 @@ static Scheme_Object *foreign_ptr_set_bang(int argc, Scheme_Object *argv[])
SCHEME2C(argv[1], ptr, delta, val, NULL, NULL, 0);
return scheme_void;
}
#undef MYNAME
/* (ptr-equal? cpointer cpointer) -> boolean */
#undef MYNAME
#define MYNAME "ptr-equal?"
static Scheme_Object *foreign_ptr_equal_p(int argc, Scheme_Object *argv[])
{
@ -2231,9 +2248,9 @@ static Scheme_Object *foreign_ptr_equal_p(int argc, Scheme_Object *argv[])
== SCHEME_FFIANYPTR_OFFSETVAL(argv[1])))
? scheme_true : scheme_false;
}
#undef MYNAME
/* (make-sized-byte-string cpointer len) */
#undef MYNAME
#define MYNAME "make-sized-byte-string"
static Scheme_Object *foreign_make_sized_byte_string(int argc, Scheme_Object *argv[])
/* Warning: no copying is done so it is possible to share string contents. */
@ -2251,6 +2268,7 @@ static Scheme_Object *foreign_make_sized_byte_string(int argc, Scheme_Object *ar
scheme_make_sized_byte_string(SCHEME_FFIANYPTR_OFFSETVAL(argv[0]),
len, 0);
}
#undef MYNAME
/* *** Calling Scheme code while the GC is working leads to subtle bugs, so
*** this is implemented now in Scheme using will executors. */
@ -2432,7 +2450,6 @@ void free_fficall_data(void *ignored, void *p)
/* (ffi-call ffi-obj in-types out-type [abi]) -> (in-types -> out-value) */
/* the real work is done by ffi_do_call above */
#undef MYNAME
#define MYNAME "ffi-call"
static Scheme_Object *foreign_ffi_call(int argc, Scheme_Object *argv[])
{
@ -2489,6 +2506,7 @@ static Scheme_Object *foreign_ffi_call(int argc, Scheme_Object *argv[])
(ffi_do_call, (void*)data, SCHEME_BYTE_STR_VAL(p),
nargs, nargs);
}
#undef MYNAME
/*****************************************************************************/
/* Scheme callbacks */
@ -2553,7 +2571,6 @@ void free_cl_cif_args(void *ignored, void *p)
/* (ffi-callback scheme-proc in-types out-type [abi]) -> ffi-callback */
/* the treatment of in-types and out-types is similar to that in ffi-call */
/* the real work is done by ffi_do_callback above */
#undef MYNAME
#define MYNAME "ffi-callback"
static Scheme_Object *foreign_ffi_callback(int argc, Scheme_Object *argv[])
{
@ -2643,6 +2660,7 @@ static Scheme_Object *foreign_ffi_callback(int argc, Scheme_Object *argv[])
scheme_register_finalizer(data, free_cl_cif_args, cl_cif_args, NULL, NULL);
return (Scheme_Object*)data;
}
#undef MYNAME
/*****************************************************************************/