Broke dependence between the DataType class and the Language class.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@575 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-07-12 20:17:44 +00:00
commit 5b2c0ecc1c
5 changed files with 59 additions and 50 deletions

View file

@ -143,6 +143,41 @@ static DOHString *modinit = 0;
static DOHString *modextern = 0;
static DOHString *pragma_include = 0;
// Perl specific type mangler function
static char *
type_mangle(DataType *t) {
static char result[128];
int i;
char *r, *c;
if (blessed) {
// Check to see if we've blessed this datatype
if ((Getattr(classes,t->name)) && (t->is_pointer <= 1)) {
// This is a blessed class. Return just the type-name
strcpy(result, GetChar(classes,t->name));
return result;
}
}
r = result;
c = t->name;
for ( c = t->name; *c; c++,r++) {
*r = *c;
}
for (i = 0; i < (t->is_pointer-t->implicit_ptr); i++, r++) {
strcpy(r,"Ptr");
r+=2;
}
*r = 0;
return result;
}
// ---------------------------------------------------------------------
// PERL5::parse_args(int argc, char *argv[])
//
@ -258,6 +293,8 @@ PERL5::parse() {
modextern = NewString("");
pragma_include = NewString("");
DataType_set_mangle(type_mangle);
// Print out PERL5 specific headers
headers();
@ -648,45 +685,6 @@ void PERL5::close(void)
Delete(base);
}
// ----------------------------------------------------------------------
// char *PERL5::type_mangle(DataType *t)
//
// Mangles a datatype into a Perl5 name compatible with xsubpp type
// T_PTROBJ.
// ----------------------------------------------------------------------
char *
PERL5::type_mangle(DataType *t) {
static char result[128];
int i;
char *r, *c;
if (blessed) {
// Check to see if we've blessed this datatype
if ((Getattr(classes,t->name)) && (t->is_pointer <= 1)) {
// This is a blessed class. Return just the type-name
strcpy(result, GetChar(classes,t->name));
return result;
}
}
r = result;
c = t->name;
for ( c = t->name; *c; c++,r++) {
*r = *c;
}
for (i = 0; i < (t->is_pointer-t->implicit_ptr); i++, r++) {
strcpy(r,"Ptr");
r+=2;
}
*r = 0;
return result;
}
// ----------------------------------------------------------------------
// PERL5::get_pointer(char *iname, char *srcname, char *src, char *target,
// DataType *t, String &f, char *ret)

View file

@ -40,7 +40,6 @@ public :
virtual void set_init(char *);
virtual void add_native(char *, char *, DataType *, ParmList *);
virtual void create_command(char *, char *);
virtual char *type_mangle(DataType *);
// Support for blessed perl thingies....

View file

@ -909,6 +909,7 @@ statement : INCLUDE STRING LBRACE {
temp_type->implicit_ptr = 0;
sprintf(temp_type->name,"int");
DataType_typedef_add(temp_type,$3,1);
lang->add_typedef(temp_type,$3);
}
}
@ -922,6 +923,7 @@ statement : INCLUDE STRING LBRACE {
sprintf(temp_type->name,"int");
Active_typedef = CopyDataType(temp_type);
DataType_typedef_add(temp_type,$8,1);
lang->add_typedef(temp_type,$8);
} typedeflist { }
/* -----------------------------------------------------------------
@ -1143,6 +1145,7 @@ typedef_decl : TYPEDEF type declaration {
Active_typedef = CopyDataType($2);
$2->is_pointer += $3.is_pointer;
DataType_typedef_add($2, $3.id,0);
lang->add_typedef($2,$3.id);
/* If this is %typedef, add it to the header */
if ($1)
fprintf(f_header,"typedef %s %s;\n", DataType_print_full($2), $3.id);
@ -1163,6 +1166,7 @@ typedef_decl : TYPEDEF type declaration {
$2->type = T_USER;
$2->is_pointer = 1;
DataType_typedef_add($2,$5,1);
lang->add_typedef($2,$5);
cplus_register_type($5);
DelDataType($2);
delete $5;
@ -1185,6 +1189,7 @@ typedef_decl : TYPEDEF type declaration {
$2->type = T_USER;
$2->is_pointer = 1;
DataType_typedef_add($2,$6,1);
lang->add_typedef($2,$6);
cplus_register_type($6);
DelDataType($2);
delete $6;
@ -1204,6 +1209,7 @@ typedef_decl : TYPEDEF type declaration {
$2->is_pointer++;
$2->arraystr = copy_string(Char(ArrayString));
DataType_typedef_add($2,$3.id,0);
lang->add_typedef($2,$3.id);
fprintf(stderr,"%s : Line %d. Warning. Array type %s will be read-only without a typemap\n",input_file,line_number, $3.id);
cplus_register_type($3.id);
@ -1226,6 +1232,7 @@ typedeflist : COMMA declaration typedeflist {
t = CopyDataType(Active_typedef);
t->is_pointer += $2.is_pointer;
DataType_typedef_add(t,$2.id,0);
lang->add_typedef(t,$2.id);
cplus_register_type($2.id);
DelDataType(t);
}
@ -1237,6 +1244,7 @@ typedeflist : COMMA declaration typedeflist {
t->is_pointer += $2.is_pointer + 1;
t->arraystr = copy_string(Char(ArrayString));
DataType_typedef_add(t,$2.id,0);
lang->add_typedef(t,$2.id);
cplus_register_type($2.id);
DelDataType(t);
fprintf(stderr,"%s : Line %d. Warning. Array type %s will be read-only without a typemap.\n",input_file,line_number, $2.id);
@ -2119,12 +2127,14 @@ cpp_class :
cplus_class_close($9.id);
}
// Create a typedef in global scope
if ($9.is_pointer == 0)
if ($9.is_pointer == 0) {
DataType_typedef_add(Active_typedef,$9.id,0);
else {
lang->add_typedef(Active_typedef,$9.id);
} else {
DataType *t = CopyDataType(Active_typedef);
t->is_pointer += $9.is_pointer;
DataType_typedef_add(t,$9.id,0);
lang->add_typedef(t,$9.id);
cplus_register_type($9.id);
DelDataType(t);
}
@ -2507,6 +2517,7 @@ cpp_member : type declaration LPAREN parms RPAREN cpp_end {
temp_type->implicit_ptr = 0;
sprintf(temp_type->name,"int");
DataType_typedef_add(temp_type,$2,1);
lang->add_typedef(temp_type,$2);
}
}
}

View file

@ -135,7 +135,7 @@ extern char *DataType_print_mangle(DataType *);
extern char *DataType_print_real(DataType *, char *local);
extern char *DataType_print_arraycast(DataType *);
extern char *DataType_print_mangle_default(DataType *);
extern void DataType_set_mangle(char *(*m)(DataType *));
extern int DataType_array_dimensions(DataType *);
extern char *DataType_get_dimension(DataType *, int);
@ -294,8 +294,6 @@ struct Pragma {
* add_native(char *name, char *funcname);
* Adds a native wrapper function to the initialize process
*
* type_mangle(DataType *t);
* Mangles the name of a datatype.
* --- C++ Functions ---
*
* These functions are optional additions to any of the target
@ -338,9 +336,6 @@ public:
virtual void set_module(char *mod_name,char **mod_list) = 0;
virtual void set_init(char *init_name);
virtual void add_native(char *name, char *iname, DataType *t, ParmList *l);
virtual char *type_mangle(DataType *t) {
return DataType_print_mangle_default(t);
}
virtual void add_typedef(DataType *t, char *name);
virtual void create_command(char *cname, char *iname);

View file

@ -351,9 +351,15 @@ char *DataType_print_mangle_default(DataType *t) {
// This is kind of ugly but needed for each language to support a
// custom name mangling mechanism. (ie. Perl5).
static char *(*mangler)(DataType *t) = DataType_print_mangle_default;
char *DataType_print_mangle(DataType *t) {
// Call into target language for name mangling.
return lang->type_mangle(t);
return (*mangler)(t);
}
void DataType_set_mangle(char *(*m)(DataType *t)) {
mangler = m;
}
// --------------------------------------------------------------------
@ -485,7 +491,7 @@ void DataType_typedef_add(DataType *t,char *tname, int mode) {
}
}
// Call into the target language with this typedef
lang->add_typedef(t,tname);
/* lang->add_typedef(t,tname); */
}
// --------------------------------------------------------------------