From: William F. <wsf...@us...> - 2004-06-27 20:57:03
|
Update of /cvsroot/swig/SWIG/Source/Modules In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5523 Modified Files: csharp.cxx Log Message: Support for %csconstvalue added (better compile time constants) Index: csharp.cxx =================================================================== RCS file: /cvsroot/swig/SWIG/Source/Modules/csharp.cxx,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** csharp.cxx 3 Jun 2004 22:39:16 -0000 1.42 --- csharp.cxx 27 Jun 2004 20:56:54 -0000 1.43 *************** *** 946,952 **** Printf(enum_code, ",\n"); Printf(enum_code, " %s", symname); ! if (Getattr(n,"enumvalue")) { ! // Note that the enum value must be a true constant and cannot be set from a PINVOKE call, thus no support for %csconst(0) ! String *value = Getattr(n,"enumvalue"); Printf(enum_code, " = %s", value); } --- 946,956 ---- Printf(enum_code, ",\n"); Printf(enum_code, " %s", symname); ! ! // Check for the %csconstvalue feature ! String *value = Getattr(n,"feature:cs:constvalue"); ! ! // Note that the enum value must be a true constant and cannot be set from a PINVOKE call, thus no support for %csconst(0) ! value = value ? value : Getattr(n,"enumvalue"); ! if (value) { Printf(enum_code, " = %s", value); } *************** *** 1002,1006 **** * C# static const variables are generated for these. * If the %csconst(1) feature is used then the C constant value is used to initialise the C# const variable. ! * If not, a PINVOKE method is generated to get the C constant value for intialisation of the C# const variable. * Also note that this method might be called for wrapping enum items (when the enum is using %csconst(0)). * ------------------------------------------------------------------------ */ --- 1006,1011 ---- * C# static const variables are generated for these. * If the %csconst(1) feature is used then the C constant value is used to initialise the C# const variable. ! * If not, a PINVOKE method is generated to get the C constant value for initialisation of the C# const variable. ! * However, if the %csconstvalue feature is used, it overrides all other ways to generate the initialisation. * Also note that this method might be called for wrapping enum items (when the enum is using %csconst(0)). * ------------------------------------------------------------------------ */ *************** *** 1056,1063 **** } ! const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; ! Printf(constants_code, " public %s %s %s = ", (const_feature_flag ? "const" : "static readonly"), return_type, itemname); ! if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the C# variable from C through a PINVOKE call. --- 1061,1073 ---- } ! const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; ! Printf(constants_code, " public %s %s %s = ", (const_feature_flag ? "const" : "static readonly"), return_type, itemname); ! // Check for the %csconstvalue feature ! String *value = Getattr(n,"feature:cs:constvalue"); ! ! if (value) { ! Printf(constants_code, "%s;\n", value); ! } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the C# variable from C through a PINVOKE call. *************** *** 2063,2066 **** --- 2073,2077 ---- * the enum value will be generated. Otherwise the C/C++ enum value will be used if there * is one and hopefully it will compile as C# code - e.g. 20 as in: enum E{e=20}; + * The %csconstvalue feature overrides all other ways to generate the constant value. * The caller must delete memory allocated for the returned string. * ------------------------------------------------------------------------ */ *************** *** 2068,2090 **** String *enumValue(Node *n) { String *symname = Getattr(n,"sym:name"); - String *value = NULL; ! // The %csconst feature determines how the constant value is obtained ! String *const_feature = Getattr(n,"feature:cs:const"); ! bool const_feature_flag = const_feature && Cmp(const_feature, "0") != 0; ! if (const_feature_flag) { ! // Use the C syntax to make a true C# constant and hope that it compiles as C# code ! value = Getattr(n,"enumvalue") ? Copy(Getattr(n,"enumvalue")) : Copy(Getattr(n,"enumvalueex")); ! } else { ! // Get the enumvalue from a PINVOKE call ! if (!getCurrentClass()) { ! // Strange hack to change the name ! Setattr(n,"name",Getattr(n,"value")); /* for wrapping of enums in a namespace when emit_action is used */ ! constantWrapper(n); ! value = NewStringf("%s.%s()", imclass_name, Swig_name_get(symname)); } else { ! memberconstantHandler(n); ! value = NewStringf("%s.%s()", imclass_name, Swig_name_get(Swig_name_member(proxy_class_name, symname))); } } --- 2079,2105 ---- String *enumValue(Node *n) { String *symname = Getattr(n,"sym:name"); ! // Check for the %csconstvalue feature ! String *value = Getattr(n,"feature:cs:constvalue"); ! if (!value) { ! // The %csconst feature determines how the constant value is obtained ! String *const_feature = Getattr(n,"feature:cs:const"); ! bool const_feature_flag = const_feature && Cmp(const_feature, "0") != 0; ! ! if (const_feature_flag) { ! // Use the C syntax to make a true C# constant and hope that it compiles as C# code ! value = Getattr(n,"enumvalue") ? Copy(Getattr(n,"enumvalue")) : Copy(Getattr(n,"enumvalueex")); } else { ! // Get the enumvalue from a PINVOKE call ! if (!getCurrentClass()) { ! // Strange hack to change the name ! Setattr(n,"name",Getattr(n,"value")); /* for wrapping of enums in a namespace when emit_action is used */ ! constantWrapper(n); ! value = NewStringf("%s.%s()", imclass_name, Swig_name_get(symname)); ! } else { ! memberconstantHandler(n); ! value = NewStringf("%s.%s()", imclass_name, Swig_name_get(Swig_name_member(proxy_class_name, symname))); ! } } } |