Started the (most painful) process of dropping type attributes behind a function call interface.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@609 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-07-25 04:02:31 +00:00
commit 5c7d202825
15 changed files with 1152 additions and 1233 deletions

View file

@ -48,25 +48,28 @@ Swig_clocal(DataType *t, DOHString_or_char *name, DOHString_or_char *value) {
if (!decl) decl = NewString("");
Clear(decl);
if ((t->type != T_VOID) || (t->is_pointer)) {
if ((t->type == T_USER) && (!t->is_pointer)) {
t->is_pointer++;
if (value)
Printf(decl,"%s = &%s", DataType_lstr(t,name), value);
else
Printf(decl,"%s", DataType_lstr(t,name));
t->is_pointer--;
} else if (t->is_reference) {
if (value)
Printf(decl,"%s = &%s", DataType_lstr(t,name), value);
else
Printf(decl,"%s", DataType_lstr(t,name));
} else {
if (value)
Printf(decl,"%s = %s", DataType_lstr(t,name), value);
else
Printf(decl,"%s", DataType_lstr(t,name));
}
switch(DataType_type(t)) {
case T_USER:
t->is_pointer++;
if (value)
Printf(decl,"%s = &%s", DataType_lstr(t,name), value);
else
Printf(decl,"%s", DataType_lstr(t,name));
t->is_pointer--;
break;
case T_REFERENCE:
if (value)
Printf(decl,"%s = &%s", DataType_lstr(t,name), value);
else
Printf(decl,"%s", DataType_lstr(t,name));
break;
case T_VOID:
break;
default:
if (value)
Printf(decl,"%s = %s", DataType_lstr(t,name), value);
else
Printf(decl,"%s", DataType_lstr(t,name));
}
return Char(decl);
}
@ -81,16 +84,15 @@ Swig_clocal(DataType *t, DOHString_or_char *name, DOHString_or_char *value) {
DataType *
Swig_clocal_type(DataType *t) {
DataType *ty;
if ((t->type != T_VOID) || (t->is_pointer)) {
if ((t->type == T_USER) && (!t->is_pointer)) {
t->is_pointer++;
ty = DataType_ltype(t);
t->is_pointer--;
} else {
ty = DataType_ltype(t);
}
} else {
switch(DataType_type(t)) {
case T_USER:
t->is_pointer++;
ty = DataType_ltype(t);
t->is_pointer--;
break;
default:
ty = DataType_ltype(t);
break;
}
return ty;
}
@ -106,14 +108,17 @@ Swig_clocal_type(DataType *t) {
char *
Swig_clocal_deref(DataType *t, DOHString_or_char *name) {
static char temp[256];
if ((t->type != T_VOID) || (t->is_pointer)) {
if ((t->type == T_USER) && (!t->is_pointer)) {
sprintf(temp,"*%s",Char(name));
} else {
sprintf(temp,DataType_rcaststr(t,name));
}
} else {
switch(DataType_type(t)) {
case T_USER:
sprintf(temp,"*%s",Char(name));
break;
case T_VOID:
strcpy(temp,"");
break;
default:
sprintf(temp,DataType_rcaststr(t,name));
break;
}
return temp;
}
@ -127,14 +132,16 @@ Swig_clocal_deref(DataType *t, DOHString_or_char *name) {
char *
Swig_clocal_assign(DataType *t, DOHString_or_char *name) {
static char temp[256];
if ((t->type != T_VOID) || (t->is_pointer)) {
if ((t->type == T_USER) && (!t->is_pointer)) {
sprintf(temp,"&%s",Char(name));
} else {
sprintf(temp,DataType_lcaststr(t,name));
}
} else {
switch(DataType_type(t)) {
case T_VOID:
strcpy(temp,"");
break;
case T_USER:
sprintf(temp,"&%s",Char(name));
break;
default:
sprintf(temp,DataType_lcaststr(t,name));
break;
}
return temp;
}
@ -179,35 +186,39 @@ int Swig_cargs(Wrapper *w, ParmList *l) {
void Swig_cresult(Wrapper *w, DataType *t, DOHString_or_char *name, DOHString_or_char *decl) {
DOHString *fcall;
fcall = NewString("");
if ((t->type != T_VOID) || (t->is_pointer)) {
Wrapper_add_localv(w,name, Swig_clocal(t,name,0), 0);
if ((t->type == T_USER) && (!t->is_pointer)) {
t->is_pointer++;
Printv(fcall, name, " = (", DataType_lstr(t,0), ") malloc(sizeof(", 0);
t->is_pointer--;
Printv(fcall, DataType_str(t,0), "));\n", 0);
Printv(fcall, "*(", name, ") = ", 0);
if (DataType_type(t) != T_VOID)
Wrapper_add_localv(w,name, Swig_clocal(t,name,0), 0);
switch(DataType_type(t)) {
case T_VOID:
break;
case T_USER:
t->is_pointer++;
Printv(fcall, name, " = (", DataType_lstr(t,0), ") malloc(sizeof(", 0);
t->is_pointer--;
Printv(fcall, DataType_str(t,0), "));\n", 0);
Printv(fcall, "*(", name, ") = ", 0);
break;
case T_REFERENCE:
Printv(fcall, DataType_str(t,"_result_ref")," = ", 0);
break;
default:
/* Normal return value */
if (DataType_qualifier(t)) {
Printv(fcall, name, " = (", DataType_lstr(t,0), ")", 0);
} else {
/* Is this a reference? */
if (t->is_reference) {
Printv(fcall, DataType_str(t,"_result_ref")," = ", 0);
} else {
/* Normal return value */
if (DataType_qualifier(t)) {
Printv(fcall, name, " = (", DataType_lstr(t,0), ")", 0);
} else {
Printv(fcall, name, " = ", 0);
}
}
Printv(fcall, name, " = ", 0);
}
break;
}
/* Now print out function call */
Printv(fcall, decl, ";\n", 0);
if (t->is_reference) {
if (DataType_type(t) == T_REFERENCE) {
Printv(fcall, name, " = (", DataType_lstr(t,0), ") &_result_ref;\n", 0);
}
@ -228,31 +239,37 @@ void Swig_cppresult(Wrapper *w, DataType *t, DOHString_or_char *name, DOHString_
DOHString *fcall;
fcall = NewString("");
if ((t->type != T_VOID) || (t->is_pointer)) {
Wrapper_add_localv(w,name, Swig_clocal(t,name,0), 0);
if ((t->type == T_USER) && (!t->is_pointer)) {
Printv(fcall, name, " = new ", DataType_str(t,0), "(", 0);
} else {
/* Is this a reference? */
if (t->is_reference) {
Printv(fcall, DataType_str(t,"_result_ref")," = ", 0);
} else {
/* Normal return value */
Printv(fcall, name, " = ", DataType_lcaststr(t,""), 0);
}
}
if (DataType_type(t) != T_VOID)
Wrapper_add_localv(w,name, Swig_clocal(t,name,0), 0);
switch(DataType_type(t)) {
case T_VOID:
break;
case T_USER:
Printv(fcall, name, " = new ", DataType_str(t,0), "(", 0);
break;
case T_REFERENCE:
Printv(fcall, DataType_str(t,"_result_ref")," = ", 0);
break;
default:
Printv(fcall, name, " = ", DataType_lcaststr(t,""), 0);
break;
}
/* Now print out function call */
Printv(fcall, decl, 0);
if ((t->type == T_USER) && (!t->is_pointer)) {
Printf(fcall,")");
}
Printf(fcall,";\n");
if (t->is_reference) {
Printv(fcall, name, " = (", DataType_lstr(t,0), ") &_result_ref;\n", 0);
switch(DataType_type(t)) {
case T_USER:
Printf(fcall,");");
break;
case T_REFERENCE:
Printf(fcall,";\n");
Printv(fcall, name, " = (", DataType_lstr(t,0), ") &_result_ref;\n", 0);
break;
default:
Printf(fcall,";\n");
break;
}
if (Replace(w->code,"$function",fcall, DOH_REPLACE_ANY) == 0) {
@ -442,7 +459,7 @@ Swig_cmemberset_call(DOHString_or_char *name, DataType *type) {
if (!func) func = NewString("");
Clear(func);
if ((type->type == T_USER) && (type->is_pointer == 0)) {
if (DataType_type(type) == T_USER) {
Printf(func,"%s %s->%s; ", Swig_clocal_assign(type,""), Swig_cparm_name(0,0), name);
} else {
Printf(func,"%s ", Swig_clocal_assign(type,""));
@ -566,7 +583,7 @@ Swig_cmethod_wrapper(DOHString_or_char *classname,
if (!code) {
/* No code supplied. Write a function manually */
if ((rtype->type != T_VOID) || (rtype->is_pointer)) {
if (DataType_type(rtype) != T_VOID) {
Printf(w->code,"return ");
}

View file

@ -68,7 +68,7 @@ DataType *NewDataType(int t) {
strcpy(ty->name,"");
break;
}
ty->type = t;
ty->_type = t;
ty->is_pointer = 0;
ty->implicit_ptr = 0;
ty->_qualifier = 0;
@ -81,7 +81,7 @@ DataType *NewDataType(int t) {
DataType *CopyDataType(DataType *t) {
DataType *ty = (DataType *) malloc(sizeof(DataType));
ty->type = t->type;
ty->_type = t->_type;
strcpy(ty->name,t->name);
ty->is_pointer = t->is_pointer;
ty->implicit_ptr = t->implicit_ptr;
@ -99,6 +99,22 @@ void DelDataType(DataType *t) {
free(t);
}
int DataType_type(DataType *t) {
if ((t->_type == T_CHAR) && (t->is_pointer == 1)) return T_STRING;
if (t->_arraystr) return T_ARRAY;
if (t->is_reference) return T_REFERENCE;
if (t->is_pointer) return T_POINTER;
return t->_type;
}
int DataType_Gettypecode(DataType *t) {
return t->_type;
}
void DataType_Settypecode(DataType *t, int ty) {
t->_type = ty;
}
char *DataType_qualifier(DataType *t) {
return t->_qualifier;
}
@ -126,7 +142,7 @@ void DataType_set_arraystr(DataType *t, char *a) {
* -------------------------------------------------------------------- */
void DataType_primitive(DataType *t) {
switch(t->type) {
switch(t->_type) {
case T_BOOL:
strcpy(t->name,"bool");
break;
@ -554,7 +570,7 @@ int DataType_typedef_add(DataType *t,char *tname, int mode) {
/* Now add this type mapping to our type-equivalence table */
if (mode == 0) {
if ((t->type != T_VOID) && (strcmp(t->name,tname) != 0)) {
if ((t->_type != T_VOID) && (strcmp(t->name,tname) != 0)) {
t1 = NewDataType(0);
strcpy(t1->name,tname);
name2 = DataType_manglestr(t1);
@ -601,7 +617,7 @@ void DataType_typedef_resolve(DataType *t, int level) {
while (s >= 0) {
if ((td = (DataType *) GetVoid(typedef_hash[s],t->name))) {
t->type = td->type;
t->_type = td->_type;
t->is_pointer += td->is_pointer;
t->implicit_ptr += td->implicit_ptr;
t->status = t->status | td->status;
@ -637,7 +653,7 @@ void DataType_typedef_replace (DataType *t) {
temp[0] = 0;
if ((td = (DataType *) GetVoid(typedef_hash[scope],t->name))) {
t->type = td->type;
t->_type = td->_type;
t->is_pointer = td->is_pointer;
t->implicit_ptr -= td->implicit_ptr;
strcpy(t->name, td->name);
@ -979,8 +995,8 @@ void typeeq_derived(char *n1, char *n2, char *cast) {
t1 = NewDataType(0);
if (!te_init) typeeq_init();
t->type = T_USER;
t1->type = T_USER;
t->_type = T_USER;
t1->_type = T_USER;
strcpy(t->name,n1);
strcpy(t1->name,n2);
name = DataType_manglestr(t);

View file

@ -102,7 +102,7 @@ int ParmList_numarg(ParmList *l) {
p = Firstitem(l);
while (p) {
if (Getignore(p)) n++;
if (!Getignore(p)) n++;
p = Nextitem(l);
}
return n;

View file

@ -24,27 +24,32 @@
/* --- Legacy DataType interface. This is being replaced --- */
#define T_INT 1
#define T_SHORT 2
#define T_LONG 3
#define T_UINT 4
#define T_USHORT 5
#define T_ULONG 6
#define T_UCHAR 7
#define T_SCHAR 8
#define T_BOOL 9
#define T_DOUBLE 10
#define T_FLOAT 11
#define T_CHAR 12
#define T_USER 13
#define T_VOID 14
#define T_INT 1
#define T_SHORT 2
#define T_LONG 3
#define T_UINT 4
#define T_USHORT 5
#define T_ULONG 6
#define T_UCHAR 7
#define T_SCHAR 8
#define T_BOOL 9
#define T_DOUBLE 10
#define T_FLOAT 11
#define T_CHAR 12
#define T_USER 13
#define T_VOID 14
#define T_STRING 20
#define T_POINTER 21
#define T_REFERENCE 22
#define T_ARRAY 23
#define T_SYMBOL 98
#define T_ERROR 99
#define MAX_NAME 96
typedef struct DataType {
int type; /* SWIG Type code */
int _type; /* SWIG Type code */
char name[MAX_NAME]; /* Name of type */
int is_pointer; /* Is this a pointer */
int implicit_ptr; /* Implicit ptr */
@ -59,6 +64,10 @@ extern DataType *NewDataType(int type);
extern DataType *CopyDataType(DataType *type);
extern void DelDataType(DataType *type);
int DataType_type(DataType *t);
int DataType_Gettypecode(DataType *t);
void DataType_Settypecode(DataType *t, int type);
/* -- New type interface -- */
extern char *DataType_str(DataType *, DOHString_or_char *name); /* Exact datatype */
@ -68,12 +77,13 @@ extern char *DataType_lcaststr(DataType *, DOHString_or_char *name); /* C
extern char *DataType_manglestr(DataType *t); /* Mangled type name */
extern DataType *DataType_ltype(DataType *); /* Create local type object */
/* -- Old type interface -- */
/* -- Old type interface. This is going away -- */
extern char *DataType_qualifier(DataType *);
extern void DataType_set_qualifier(DataType *, char *q);
extern char *DataType_arraystr(DataType *);
extern void DataType_set_arraystr(DataType *, char *a);
extern char *DataType_mangle_default(DataType *t); /* Default name mangler */
extern void DataType_primitive(DataType *);
extern void DataType_set_mangle(char *(*m)(DataType *));