aboutsummaryrefslogtreecommitdiff
path: root/Lib/mzscheme/mzrun.swg
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/mzscheme/mzrun.swg')
-rw-r--r--Lib/mzscheme/mzrun.swg68
1 files changed, 46 insertions, 22 deletions
diff --git a/Lib/mzscheme/mzrun.swg b/Lib/mzscheme/mzrun.swg
index c438c9ce8..8adae46b3 100644
--- a/Lib/mzscheme/mzrun.swg
+++ b/Lib/mzscheme/mzrun.swg
@@ -23,12 +23,15 @@ extern "C" {
SWIG_MzScheme_MustGetPtr(s, type, argnum, flags, FUNC_NAME, argc, argv)
#define SWIG_contract_assert(expr,msg) \
- if (!(expr)) { \
- char *m=(char *) scheme_malloc(strlen(msg)+1000); \
- sprintf(m,"SWIG contract, assertion failed: function=%s, message=%s", \
- (char *) FUNC_NAME,(char *) msg); \
- scheme_signal_error(m); \
- }
+ do { \
+ if (!(expr)) { \
+ size_t len=strlen(msg)+1000; \
+ char *m=(char *) scheme_malloc(len); \
+ SWIG_snprintf2(m, len, "SWIG contract, assertion failed: function=%s, message=%s", \
+ (char *) FUNC_NAME,(char *) msg); \
+ scheme_signal_error(m); \
+ } \
+ } while (0)
/* Runtime API */
#define SWIG_GetModule(clientdata) SWIG_MzScheme_GetModule((Scheme_Env *)(clientdata))
@@ -123,6 +126,7 @@ struct swig_mz_proxy {
Scheme_Type mztype;
swig_type_info *type;
void *object;
+ int own;
};
static Scheme_Type swig_type;
@@ -133,7 +137,7 @@ mz_free_swig(void *p, void *data) {
if (SCHEME_NULLP((Scheme_Object*)p) || SCHEME_TYPE((Scheme_Object*)p) != swig_type)
return;
if (proxy->type) {
- if (proxy->type->clientdata) {
+ if (proxy->type->clientdata && proxy->own) {
((Scheme_Prim *)proxy->type->clientdata)(1, (Scheme_Object **)&proxy);
}
}
@@ -141,42 +145,61 @@ mz_free_swig(void *p, void *data) {
static Scheme_Object *
SWIG_MzScheme_NewPointerObj(void *ptr, swig_type_info *type, int owner) {
- struct swig_mz_proxy *new_proxy;
- new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy));
- new_proxy->mztype = swig_type;
- new_proxy->type = type;
- new_proxy->object = ptr;
- if (owner) {
- scheme_add_finalizer(new_proxy, mz_free_swig, NULL);
+ if (ptr) {
+ struct swig_mz_proxy *new_proxy;
+ new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy));
+ new_proxy->mztype = swig_type;
+ new_proxy->type = type;
+ new_proxy->object = ptr;
+ new_proxy->own = owner & SWIG_POINTER_OWN;
+ if (new_proxy->own) {
+ scheme_add_finalizer(new_proxy, mz_free_swig, NULL);
+ }
+ return (Scheme_Object *) new_proxy;
+ } else {
+ return scheme_make_null();
}
- return (Scheme_Object *) new_proxy;
}
static int
SWIG_MzScheme_ConvertPtr(Scheme_Object *s, void **result, swig_type_info *type, int flags) {
swig_cast_info *cast;
+ int ret = SWIG_ERROR;
if (SCHEME_NULLP(s)) {
*result = NULL;
return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK;
} else if (SCHEME_TYPE(s) == swig_type) {
struct swig_mz_proxy *proxy = (struct swig_mz_proxy *) s;
+
+ if ((flags & SWIG_POINTER_RELEASE) == SWIG_POINTER_RELEASE && !proxy->own) {
+ return SWIG_ERROR_RELEASE_NOT_OWNED;
+ }
+
if (type) {
cast = SWIG_TypeCheckStruct(proxy->type, type);
if (cast) {
int newmemory = 0;
*result = SWIG_TypeCast(cast, proxy->object, &newmemory);
assert(!newmemory); /* newmemory handling not yet implemented */
- return 0;
+ ret = SWIG_OK;
} else {
- return 1;
+ return SWIG_ERROR;
}
} else {
*result = proxy->object;
- return 0;
+ ret = SWIG_OK;
+ }
+
+ if (flags & SWIG_POINTER_DISOWN) {
+ scheme_subtract_finalizer(proxy, mz_free_swig, NULL);
+ proxy->own = 0;
+ }
+ if (flags & SWIG_POINTER_CLEAR) {
+ proxy->object = 0;
}
}
- return 1;
+ return ret;
}
static SWIGINLINE void *
@@ -195,7 +218,8 @@ SWIG_MzScheme_Malloc(size_t size, const char *func_name) {
void *p = malloc(size);
if (p == NULL) {
scheme_signal_error("swig-memory-error");
- } else return p;
+ }
+ return p;
}
static Scheme_Object *
@@ -398,10 +422,10 @@ SWIG_MzScheme_new_scheme_struct (Scheme_Env* env, const char* basename,
int L=strlen(mz_dynload_libpaths[k])+strlen("\\")+strlen(mz_dlopen_libraries[i])+1;
libp=(char *) malloc(L*sizeof(char));
#ifdef __OS_WIN32
- sprintf(libp,"%s\\%s",mz_dynload_libpaths[k],mz_dlopen_libraries[i]);
+ SWIG_snprintf2(libp,L,"%s\\%s",mz_dynload_libpaths[k],mz_dlopen_libraries[i]);
mz_libraries[i]=(void *) LoadLibrary(libp);
#else
- sprintf(libp,"%s/%s",mz_dynload_libpaths[k],mz_dlopen_libraries[i]);
+ SWIG_snprintf2(libp,L,"%s/%s",mz_dynload_libpaths[k],mz_dlopen_libraries[i]);
mz_libraries[i]=(void *) dlopen(libp,RTLD_LAZY);
#endif
if (mz_dynload_debug) {