Applied Oleg's MzScheme patches
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@496 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
243ef9cfee
commit
7242c6daf7
5 changed files with 30 additions and 25 deletions
|
|
@ -5,10 +5,7 @@ typedef struct swig_proxy {
|
|||
void *object;
|
||||
} swig_proxy;
|
||||
|
||||
Scheme_Object *swig_make_c_pointer(void *, char*);
|
||||
void *swig_get_c_pointer(Scheme_Object *, char *);
|
||||
|
||||
Scheme_Object *swig_make_c_pointer(void *c_pointer, char *type_name) {
|
||||
static Scheme_Object *swig_make_c_pointer(void *c_pointer, char *type_name) {
|
||||
swig_proxy *new_proxy;
|
||||
new_proxy = (swig_proxy *) scheme_malloc(sizeof(swig_proxy));
|
||||
new_proxy->type = scheme_make_type(type_name);
|
||||
|
|
@ -17,11 +14,16 @@ Scheme_Object *swig_make_c_pointer(void *c_pointer, char *type_name) {
|
|||
return (Scheme_Object *) new_proxy;
|
||||
}
|
||||
|
||||
void *swig_get_c_pointer(Scheme_Object *so, char *c_type) {
|
||||
/* returns 1 on success, 0 otherwise */
|
||||
static int swig_get_c_pointer(Scheme_Object *so, char *c_type, void **c_ptr) {
|
||||
Scheme_Type st = SCHEME_TYPE(so);
|
||||
char *type_name = scheme_get_type_name(st);
|
||||
int err = 1;
|
||||
if(strcmp(type_name, c_type))
|
||||
scheme_signal_error("wrong type in foreign object %s", type_name);
|
||||
err = 0;
|
||||
else
|
||||
*c_ptr = ((swig_proxy *) so)->object;
|
||||
|
||||
return (void *) ((swig_proxy *) so)->object;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
unsigned char *M_OUTPUT
|
||||
{
|
||||
Scheme_Object *s;
|
||||
s = scheme_make_string(*$target);
|
||||
s = scheme_make_string_without_copying(*$target);
|
||||
m_output_helper(_values, s, &_lenv);
|
||||
}
|
||||
|
||||
|
|
@ -85,13 +85,13 @@ void m_output_helper(Scheme_Object **target, Scheme_Object *s, int *_lenv) {
|
|||
|
||||
%typemap(mzscheme, in) char * {
|
||||
if(!SCHEME_STRINGP($source))
|
||||
scheme_wrong_type("$name", "string ", $argnum, argc, argv);
|
||||
scheme_wrong_type("$name", "string", $argnum, argc, argv);
|
||||
$target = SCHEME_STR_VAL($source);
|
||||
}
|
||||
|
||||
%typemap(mzscheme, in) char [ANY] {
|
||||
if(!SCHEME_STRINGP($source))
|
||||
scheme_wrong_type("$name", "string ", $argnum, argc, argv);
|
||||
scheme_wrong_type("$name", "string", $argnum, argc, argv);
|
||||
$target = SCHEME_STR_VAL($source);
|
||||
}
|
||||
|
||||
|
|
@ -272,11 +272,11 @@ void m_output_helper(Scheme_Object **target, Scheme_Object *s, int *_lenv) {
|
|||
}
|
||||
|
||||
%typemap(mzscheme, out) char * {
|
||||
$target = scheme_make_string($source);
|
||||
$target = scheme_make_string_without_copying($source);
|
||||
}
|
||||
|
||||
%typemap(mzscheme, out) char [ANY] {
|
||||
$target = scheme_make_string($source);
|
||||
$target = scheme_make_string_without_copying($source);
|
||||
}
|
||||
|
||||
%typemap(mzscheme, out) int {
|
||||
|
|
@ -388,13 +388,13 @@ void m_output_helper(Scheme_Object **target, Scheme_Object *s, int *_lenv) {
|
|||
|
||||
%typemap(mzscheme, varin) char * {
|
||||
if(!SCHEME_STRINGP($source))
|
||||
scheme_wrong_type("$name", "string ", $argnum, argc, argv);
|
||||
scheme_wrong_type("$name", "string", $argnum, argc, argv);
|
||||
$target = SCHEME_STR_VAL($source);
|
||||
}
|
||||
|
||||
%typemap(mzscheme, varin) char [ANY] {
|
||||
if(!SCHEME_STRINGP($source))
|
||||
scheme_wrong_type("$name", "string ", $argnum, argc, argv);
|
||||
scheme_wrong_type("$name", "string", $argnum, argc, argv);
|
||||
$target = SCHEME_STR_VAL($source);
|
||||
}
|
||||
|
||||
|
|
@ -576,11 +576,11 @@ void m_output_helper(Scheme_Object **target, Scheme_Object *s, int *_lenv) {
|
|||
}
|
||||
|
||||
%typemap(mzscheme, varout) char * {
|
||||
$target = scheme_make_string($source);
|
||||
$target = scheme_make_string_without_copying($source);
|
||||
}
|
||||
|
||||
%typemap(mzscheme, varout) char [ANY] {
|
||||
$target = scheme_make_string($source);
|
||||
$target = scheme_make_string_without_copying($source);
|
||||
}
|
||||
|
||||
%typemap(mzscheme, varout) int {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/* SWIG version information */
|
||||
|
||||
#ifndef SWIG_VERSION
|
||||
#define SWIG_VERSION "1.3u-20000618-1136"
|
||||
#define SWIG_VERSION "1.3u-20000619-0141"
|
||||
#endif
|
||||
|
||||
#ifndef SWIG_SPIN
|
||||
|
|
|
|||
|
|
@ -250,12 +250,13 @@ MZSCHEME::close (void)
|
|||
// ----------------------------------------------------------------------
|
||||
|
||||
void
|
||||
MZSCHEME::get_pointer (char *iname, int parm, DataType *t,
|
||||
MZSCHEME::get_pointer (String &name, int parm, DataType *t,
|
||||
WrapperFunction &f)
|
||||
{
|
||||
f.code << tab4 << "_arg" << parm << " = (" << t->print_type()
|
||||
<< ") swig_get_c_pointer(argv["
|
||||
<< parm << "], \"" << t->print_mangle() << "\");\n";
|
||||
f.code << tab4 << "if (!swig_get_c_pointer(" << "argv[" << parm << "], \"" << t->print_mangle()
|
||||
<< "\", (void **) &_arg" << parm << "))\n";
|
||||
f.code << tab8 << "scheme_wrong_type(\"" << name.get()
|
||||
<< "\", \"" << t->print_mangle() << "\", " << parm << ", argc, argv);\n";
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
|
@ -371,7 +372,7 @@ MZSCHEME::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
|||
// no typemap found
|
||||
// assume it's a Scheme_Object containing the C pointer
|
||||
else if (p.t->is_pointer) {
|
||||
get_pointer (iname, i, p.t, f);
|
||||
get_pointer (proc_name, i, p.t, f);
|
||||
}
|
||||
// no typemap found and not a pointer
|
||||
else throw_unhandled_mzscheme_type_error (p.t);
|
||||
|
|
@ -558,8 +559,10 @@ MZSCHEME::link_variable (char *name, char *iname, DataType *t)
|
|||
fprintf (f_wrappers, "\t\t strncpy(%s,_temp,_len);\n", name);
|
||||
} else {
|
||||
// Set the value of a pointer
|
||||
fprintf(f_wrappers, "\t\t%s = swig_get_c_pointer(argv[0], \"%s\");\n",
|
||||
name, t->print_mangle());
|
||||
fprintf(f_wrappers, "\t\tif (!swig_get_c_pointer(argv[0], \"%s\", (void **) &_arg0))\n",
|
||||
t->print_mangle());
|
||||
fprintf(f_wrappers, "\t\t\tscheme_wrong_type(\"%s\", %s, 0, argc, argv", \
|
||||
var_name, t->print_mangle());
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ private:
|
|||
char *module;
|
||||
char *package;
|
||||
int linkage;
|
||||
void get_pointer(char *iname, int parm, DataType *t, WrapperFunction &f);
|
||||
void get_pointer(String &name, int parm, DataType *t, WrapperFunction &f);
|
||||
void usage_var(char *, DataType *, String &usage);
|
||||
void usage_func(char *, DataType *, ParmList *, String &usage);
|
||||
void usage_returns(char *, DataType *, ParmList *, String &usage);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue