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:
parent
f671901138
commit
5c7d202825
15 changed files with 1152 additions and 1233 deletions
|
|
@ -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 ");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 *));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue