From: William F. <wsf...@us...> - 2004-11-28 19:04:39
|
Update of /cvsroot/swig/SWIG/Source/Modules In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1071/Source/Modules Modified Files: csharp.cxx Log Message: Fixes for enums no longer being handled as integers in the core. New special variable $*csclassname to compliment $&csclassname and $csclassname. Index: csharp.cxx =================================================================== RCS file: /cvsroot/swig/SWIG/Source/Modules/csharp.cxx,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** csharp.cxx 1 Nov 2004 21:10:05 -0000 1.47 --- csharp.cxx 28 Nov 2004 19:04:28 -0000 1.48 *************** *** 1041,1048 **** /* Adjust the enum type for the Swig_typemap_lookup. ! * We want the same cstype typemap for all the enum items so we use the enum type (parent node). ! * The type of each enum item depends on what value it is assigned, but is usually a C int. */ if (is_enum_item) { ! t = NewStringf("enum %s", Getattr(parentNode(n), "sym:name")); Setattr(n,"type", t); } --- 1041,1047 ---- /* Adjust the enum type for the Swig_typemap_lookup. ! * We want the same jstype typemap for all the enum items so we use the enum type (parent node). */ if (is_enum_item) { ! t = Getattr(parentNode(n),"enumtype"); Setattr(n,"type", t); } *************** *** 2174,2216 **** bool substituteClassname(SwigType *pt, String *tm) { bool substitution_performed = false; ! if (Strstr(tm, "$csclassname") || Strstr(tm,"$&csclassname")) { ! SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); ! SwigType *strippedtype = SwigType_strip_qualifiers(type); ! if (SwigType_isenum(strippedtype)) { ! String *enumname = getEnumName(pt); ! if (enumname) ! Replaceall(tm, "$csclassname", enumname); ! else ! Replaceall(tm, "$csclassname", NewStringf("int")); ! } else { ! String *classname = getProxyName(pt); ! if (classname) { ! Replaceall(tm,"$&csclassname", classname); // getProxyName() works for pointers to classes too ! Replaceall(tm,"$csclassname", classname); ! } ! else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. ! String *descriptor = NULL; ! if (Strstr(tm, "$&csclassname")) { ! SwigType_add_pointer(type); ! descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); ! Replaceall(tm, "$&csclassname", descriptor); ! } ! else { // $csclassname ! descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); ! Replaceall(tm, "$csclassname", descriptor); ! } ! // Add to hash table so that the type wrapper classes can be created later ! Setattr(swig_types_hash, descriptor, type); ! Delete(descriptor); ! } } - substitution_performed = true; - Delete(type); - Delete(strippedtype); } - return substitution_performed; } --- 2173,2231 ---- bool substituteClassname(SwigType *pt, String *tm) { bool substitution_performed = false; ! SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); ! SwigType *strippedtype = SwigType_strip_qualifiers(type); ! if (Strstr(tm, "$csclassname")) { ! SwigType *classnametype = Copy(strippedtype); ! substituteClassnameSpecialVariable(classnametype, tm, "$csclassname"); ! substitution_performed = true; ! Delete(classnametype); ! } ! if (Strstr(tm, "$*csclassname")) { ! SwigType *classnametype = Copy(strippedtype); ! Delete(SwigType_pop(classnametype)); ! substituteClassnameSpecialVariable(classnametype, tm, "$*csclassname"); ! substitution_performed = true; ! Delete(classnametype); ! } ! if (Strstr(tm, "$&csclassname")) { ! SwigType *classnametype = Copy(strippedtype); ! SwigType_add_pointer(classnametype); ! substituteClassnameSpecialVariable(classnametype, tm, "$&csclassname"); ! substitution_performed = true; ! Delete(classnametype); ! } ! Delete(strippedtype); ! Delete(type); ! return substitution_performed; ! } ! ! /* ----------------------------------------------------------------------------- ! * substituteClassnameSpecialVariable() ! * ----------------------------------------------------------------------------- */ ! ! void substituteClassnameSpecialVariable(SwigType *classnametype, String *tm, const char *classnamespecialvariable) { ! if (SwigType_isenum(classnametype)) { ! String *enumname = getEnumName(classnametype); ! if (enumname) ! Replaceall(tm, classnamespecialvariable, enumname); ! else ! Replaceall(tm, classnamespecialvariable, NewStringf("int")); ! } else { ! String *classname = getProxyName(classnametype); ! if (classname) { ! Replaceall(tm, classnamespecialvariable, classname); // getProxyName() works for pointers to classes too ! } ! else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. ! String *descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); ! Replaceall(tm, classnamespecialvariable, descriptor); ! ! // Add to hash table so that the type wrapper classes can be created later ! Setattr(swig_types_hash, descriptor, classnametype); ! Delete(descriptor); } } } |