diff options
Diffstat (limited to 'Lib/mzscheme/mzrun.swg')
-rw-r--r-- | Lib/mzscheme/mzrun.swg | 68 |
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) { |