From cf139a90db852446269b0ce7b7ed5f2bf623eafb Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Fri, 29 Aug 2014 19:39:39 +0300 Subject: [PATCH 01/15] C++11 strongly-typed enums fix for Java only --- Source/Modules/java.cxx | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 9e16bb422..469dfbf53 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -837,8 +837,13 @@ public: String *nondir_args = NewString(""); bool is_destructor = (Cmp(Getattr(n, "nodeType"), "destructor") == 0); + // If enum is strongly-typed, generate fully-qualified symname + Node* parent = parentNode(n); + if (GetFlag(parent, "scopedenum")) + symname = Swig_name_member(0, Swig_scopename_last(Getattr(parent, "name")), symname); + if (!Getattr(n, "sym:overloaded")) { - if (!addSymbol(Getattr(n, "sym:name"), n, imclass_name)) + if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } @@ -1556,6 +1561,11 @@ public: } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the Java variable from C through a JNI call. + // If enum is strongly-typed, generate fully-qualified symname + Node* parent = parentNode(n); + if (GetFlag(parent, "scopedenum")) + symname = Swig_name_member(0, Swig_scopename_last(Getattr(parent, "name")), symname); + if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) @@ -2709,7 +2719,14 @@ public: * a Java long is used for all classes in the SWIG intermediary class. * The intermediary class methods are thus mangled when overloaded to give * a unique name. */ - String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); + + // If enum is strongly-typed, generate fully-qualified symname + String* symname = Getattr(n, "sym:name"); + Node* parent = parentNode(n); + if (GetFlag(parent, "scopedenum")) + symname = Swig_name_member(0, Swig_scopename_last(Getattr(parent, "name")), symname); + + String *overloaded_name = NewStringf("%s", symname); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); @@ -2961,6 +2978,10 @@ public: } else { // Get the enumvalue from a JNI call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { + // If enum is strongly-typed, generate fully-qualified symname + Node* parent = parentNode(n); + if (GetFlag(parent, "scopedenum")) + symname = Swig_name_member(0, Swig_scopename_last(Getattr(parent, "name")), symname); // 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); From d1b1925270e8b271983c81c89523259dbacdca67 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Sat, 30 Aug 2014 09:08:04 +0300 Subject: [PATCH 02/15] Additional test cases for C++11 strongly-typed enums --- .../cpp11_strongly_typed_enumerations.i | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Examples/test-suite/cpp11_strongly_typed_enumerations.i b/Examples/test-suite/cpp11_strongly_typed_enumerations.i index ed466369e..451688736 100644 --- a/Examples/test-suite/cpp11_strongly_typed_enumerations.i +++ b/Examples/test-suite/cpp11_strongly_typed_enumerations.i @@ -73,6 +73,45 @@ struct UseEnum11 { Enum11 myenum11; }; +class Class1 +{ +public: + enum class Enum12 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + enum Enum13 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + struct Struct1 + { + enum class Enum14 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + enum Enum15 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + }; +}; + /* TODO enum class MyClass {AAA, BBB, CCC}; From fd926cf284767dd83e4755b65d0dce364080d62a Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Sat, 30 Aug 2014 09:15:25 +0300 Subject: [PATCH 03/15] Revert "C++11 strongly-typed enums fix for Java only" This reverts commit cf139a90db852446269b0ce7b7ed5f2bf623eafb. --- Source/Modules/java.cxx | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 469dfbf53..9e16bb422 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -837,13 +837,8 @@ public: String *nondir_args = NewString(""); bool is_destructor = (Cmp(Getattr(n, "nodeType"), "destructor") == 0); - // If enum is strongly-typed, generate fully-qualified symname - Node* parent = parentNode(n); - if (GetFlag(parent, "scopedenum")) - symname = Swig_name_member(0, Swig_scopename_last(Getattr(parent, "name")), symname); - if (!Getattr(n, "sym:overloaded")) { - if (!addSymbol(symname, n, imclass_name)) + if (!addSymbol(Getattr(n, "sym:name"), n, imclass_name)) return SWIG_ERROR; } @@ -1561,11 +1556,6 @@ public: } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the Java variable from C through a JNI call. - // If enum is strongly-typed, generate fully-qualified symname - Node* parent = parentNode(n); - if (GetFlag(parent, "scopedenum")) - symname = Swig_name_member(0, Swig_scopename_last(Getattr(parent, "name")), symname); - if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) @@ -2719,14 +2709,7 @@ public: * a Java long is used for all classes in the SWIG intermediary class. * The intermediary class methods are thus mangled when overloaded to give * a unique name. */ - - // If enum is strongly-typed, generate fully-qualified symname - String* symname = Getattr(n, "sym:name"); - Node* parent = parentNode(n); - if (GetFlag(parent, "scopedenum")) - symname = Swig_name_member(0, Swig_scopename_last(Getattr(parent, "name")), symname); - - String *overloaded_name = NewStringf("%s", symname); + String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); @@ -2978,10 +2961,6 @@ public: } else { // Get the enumvalue from a JNI call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { - // If enum is strongly-typed, generate fully-qualified symname - Node* parent = parentNode(n); - if (GetFlag(parent, "scopedenum")) - symname = Swig_name_member(0, Swig_scopename_last(Getattr(parent, "name")), symname); // 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); From d318f03efe1980bbd9d899fc39bc1a7bfb604acb Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Sat, 30 Aug 2014 11:58:52 +0300 Subject: [PATCH 04/15] C++11 strongly-typed enums fix for Java only (proper) --- .../cpp11_strongly_typed_enumerations.i | 115 ++++++++++++++++++ Source/Modules/java.cxx | 50 +++++++- Source/Modules/lang.cxx | 60 +++++++++ 3 files changed, 223 insertions(+), 2 deletions(-) diff --git a/Examples/test-suite/cpp11_strongly_typed_enumerations.i b/Examples/test-suite/cpp11_strongly_typed_enumerations.i index 451688736..8846d6877 100644 --- a/Examples/test-suite/cpp11_strongly_typed_enumerations.i +++ b/Examples/test-suite/cpp11_strongly_typed_enumerations.i @@ -112,6 +112,121 @@ public: }; }; +class Class2 +{ +public: + enum class Enum12 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + enum Enum13 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + struct Struct1 + { + enum class Enum14 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + enum Enum15 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + }; +}; + +/* +enum class Enum12 +{ + Val1 = 300, + Val2 = 400, + Val3, + Val4 +}; + +enum Enum13 +{ + Val1 = 300, + Val2 = 400, + Val3, + Val4 +}; +*/ + +namespace NS1 +{ + enum class Enum12 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + enum Enum13 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + class Class3 + { + public: + enum class Enum12 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + enum Enum13 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + struct Struct1 + { + enum class Enum14 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + + enum Enum15 + { + Val1 = 300, + Val2 = 400, + Val3, + Val4 + }; + }; + }; +} + /* TODO enum class MyClass {AAA, BBB, CCC}; diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 9e16bb422..411f7ad31 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -838,7 +838,7 @@ public: bool is_destructor = (Cmp(Getattr(n, "nodeType"), "destructor") == 0); if (!Getattr(n, "sym:overloaded")) { - if (!addSymbol(Getattr(n, "sym:name"), n, imclass_name)) + if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } @@ -1556,6 +1556,22 @@ public: } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the Java variable from C through a JNI call. + String* pureSymname = NULL; + if (Equal(Getattr(n, "nodeType"), "enumitem")) { + // If enum is strongly-typed, generate fully-qualified symname + Node* parent = parentNode(n); + String* pureSymname = NULL; + if (GetFlag(parent, "scopedenum") && !GetFlag(n, "symname_has_enumscope")) { + pureSymname = symname; + + String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); + symname = Swig_name_member(0, enumClassName, pureSymname); + Delete(enumClassName); + + /* Printf(stdout, "Renamed strong enum value symname (java:1) '%s' -> '%s'\n", pureSymname, symname); */ + } + } + if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) @@ -1568,6 +1584,13 @@ public: Printf(constants_code, "%s.%s();\n", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } + // Delete temporary symname if it was created + if (pureSymname) { + Delete(symname); + symname = pureSymname; + pureSymname = NULL; + } + // Each constant and enum value is wrapped with a separate JNI function call SetFlag(n, "feature:immutable"); enum_constant_flag = true; @@ -2959,6 +2982,19 @@ public: // Use the C syntax to make a true Java constant and hope that it compiles as Java code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { + // If enum is strongly-typed, generate fully-qualified symname + Node* parent = parentNode(n); + String* pureSymname = NULL; + if (GetFlag(parent, "scopedenum") && !GetFlag(n, "symname_has_enumscope")) { + pureSymname = symname; + + String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); + symname = Swig_name_member(0, enumClassName, pureSymname); + Delete(enumClassName); + + /* Printf(stdout, "Renamed strong enum value symname (java:2) '%s' -> '%s'\n", pureSymname, symname); */ + } + // Get the enumvalue from a JNI call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { // Strange hack to change the name @@ -2967,7 +3003,17 @@ public: value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); - value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, proxy_class_name, symname))); + String* full_proxy_class_sym_name = NewString(full_proxy_class_name); + Replaceall(full_proxy_class_sym_name, ".", "_"); + value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, full_proxy_class_sym_name, symname))); + Delete(full_proxy_class_sym_name); + } + + // Delete temporary symname if it was created + if (pureSymname) { + Delete(symname); + symname = pureSymname; + pureSymname = NULL; } } } diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 5ea79f0ab..04eec8af3 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -1721,6 +1721,24 @@ int Language::memberconstantHandler(Node *n) { String *value = Getattr(n, "value"); String *mrename = Swig_name_member(0, ClassPrefix, symname); + if (Equal(Getattr(n, "nodeType"), "enumitem")) { + // If enum is strongly-typed, generate fully-qualified symname + Node* parent = parentNode(n); + if (GetFlag(parent, "scopedenum") && !GetFlag(n, "symname_has_enumscope")) + { + SetFlag(n, "symname_has_enumscope"); + Delete(mrename); + + String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); + String* scopedItemName = Swig_name_member(0, enumClassName, symname); + mrename = Swig_name_member(0, ClassPrefix, scopedItemName); + + /* Printf(stdout, "Renamed strong enum value symname (lang:1) '%s' -> '%s'\n", symname, mrename); */ + + Delete(enumClassName); + Delete(scopedItemName); + } + } Setattr(n, "sym:name", mrename); String *new_name = 0; @@ -1728,6 +1746,24 @@ int Language::memberconstantHandler(Node *n) { new_name = Copy(value); else new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName, name); + if (Equal(Getattr(n, "nodeType"), "enumitem")) { + // If enum is strongly-typed, generate fully-qualified symname + Node* parent = parentNode(n); + if (GetFlag(parent, "scopedenum") && !GetFlag(n, "name_has_enumscope")) + { + SetFlag(n, "name_has_enumscope"); + Delete(new_name); + + String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); + String* scopedItemName = NewStringf("%s::%s", enumClassName, name); + new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName, scopedItemName); + + /* Printf(stdout, "Renamed strong enum value name (lang:1) '%s' -> '%s'\n", name, new_name); */ + + Delete(enumClassName); + Delete(scopedItemName); + } + } Setattr(n, "name", new_name); constantWrapper(n); @@ -2962,6 +2998,22 @@ int Language::variableWrapper(Node *n) { Delattr(n,"varset"); Delattr(n,"varget"); + String* pureSymname = NULL; + if (Equal(Getattr(n, "nodeType"), "enumitem")) { + // If enum is strongly-typed, generate fully-qualified symname + Node* parent = parentNode(n); + if (GetFlag(parent, "scopedenum") && !GetFlag(n, "symname_has_enumscope")) + { + pureSymname = symname; + + String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); + symname = Swig_name_member(0, enumClassName, pureSymname); + Delete(enumClassName); + + /* Printf(stdout, "Renamed strong enum value symname (lang:2) '%s' -> '%s'\n", pureSymname, symname); */ + } + } + /* If no way to set variables. We simply create functions */ int assignable = is_assignable(n); int flags = use_naturalvar_mode(n); @@ -3019,6 +3071,14 @@ int Language::variableWrapper(Node *n) { functionWrapper(n); Delattr(n, "varget"); Swig_restore(n); + + // Delete temporary symname if it was created + if (pureSymname) { + Delete(symname); + symname = pureSymname; + pureSymname = NULL; + } + return SWIG_OK; } From abb888cfdde9a9a3efc9430ae8dc3a8164c42c2f Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Sun, 31 Aug 2014 12:14:29 +0300 Subject: [PATCH 05/15] Clean-up test suite and fix issue with nspace, as well as keep the fix for Class::Struct::EnumClass being JNI-referenced as Struct_EnumClass --- .../cpp11_strongly_typed_enumerations.i | 76 ------------------- Source/Modules/java.cxx | 13 +++- 2 files changed, 12 insertions(+), 77 deletions(-) diff --git a/Examples/test-suite/cpp11_strongly_typed_enumerations.i b/Examples/test-suite/cpp11_strongly_typed_enumerations.i index 8846d6877..feb7399a1 100644 --- a/Examples/test-suite/cpp11_strongly_typed_enumerations.i +++ b/Examples/test-suite/cpp11_strongly_typed_enumerations.i @@ -151,82 +151,6 @@ public: }; }; -/* -enum class Enum12 -{ - Val1 = 300, - Val2 = 400, - Val3, - Val4 -}; - -enum Enum13 -{ - Val1 = 300, - Val2 = 400, - Val3, - Val4 -}; -*/ - -namespace NS1 -{ - enum class Enum12 - { - Val1 = 300, - Val2 = 400, - Val3, - Val4 - }; - - enum Enum13 - { - Val1 = 300, - Val2 = 400, - Val3, - Val4 - }; - - class Class3 - { - public: - enum class Enum12 - { - Val1 = 300, - Val2 = 400, - Val3, - Val4 - }; - - enum Enum13 - { - Val1 = 300, - Val2 = 400, - Val3, - Val4 - }; - - struct Struct1 - { - enum class Enum14 - { - Val1 = 300, - Val2 = 400, - Val3, - Val4 - }; - - enum Enum15 - { - Val1 = 300, - Val2 = 400, - Val3, - Val4 - }; - }; - }; -} - /* TODO enum class MyClass {AAA, BBB, CCC}; diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 411f7ad31..1fbc9dee2 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -3003,10 +3003,21 @@ public: value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); - String* full_proxy_class_sym_name = NewString(full_proxy_class_name); + String* outerClassesPrefix = NULL; + if (Node *outer = Getattr(getCurrentClass(), "nested:outer")) { + outerClassesPrefix = Copy(Getattr(outer, "sym:name")); + for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { + Push(outerClassesPrefix, "."); + Push(outerClassesPrefix, Getattr(outer, "sym:name")); + } + } + String* full_proxy_class_sym_name = outerClassesPrefix ? NewStringf("%s.%s", outerClassesPrefix, proxy_class_name) : NewStringf("%s", proxy_class_name); Replaceall(full_proxy_class_sym_name, ".", "_"); + /* Printf(stdout, "Change proxy class symname '%s' -> '%s'\n", proxy_class_name, full_proxy_class_sym_name); */ value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, full_proxy_class_sym_name, symname))); Delete(full_proxy_class_sym_name); + if (outerClassesPrefix) + Delete(outerClassesPrefix); } // Delete temporary symname if it was created From 7b9027db89c3ce84bf7c349bcded3e7b701236ed Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Sun, 31 Aug 2014 19:26:31 +0300 Subject: [PATCH 06/15] Java: fix invalid director 'self' variable type name (wasn't fully qualified) --- Source/Modules/java.cxx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 1fbc9dee2..f3fe7c380 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -3761,9 +3761,19 @@ public: String *imcall_args = NewString(""); int classmeth_off = curr_class_dmethod - first_class_dmethod; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; - String *qualified_classname = Copy(classname); String *nspace = getNSpace(); + String *outerClassesPrefix = 0; + if (Node *outer = Getattr(parent, "nested:outer")) { + outerClassesPrefix = Copy(Getattr(outer, "sym:name")); + for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { + Push(outerClassesPrefix, "."); + Push(outerClassesPrefix, Getattr(outer, "sym:name")); + } + } + String* qualified_classname = outerClassesPrefix ? NewStringf("%s.%s", outerClassesPrefix, classname) : NewStringf("%s", classname); + /* Printf(stdout, "Director qualified_classname '%s' instead of '%s'\n", qualified_classname, classname); */ + if (nspace && package) Insert(qualified_classname, 0, NewStringf("%s.%s.", package, nspace)); else if(nspace) From e7db081d5e175024f1d5baa9ac028474958a2542 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 3 Sep 2014 09:37:25 +0300 Subject: [PATCH 07/15] Java: fix generation of ProxyName when JNI descriptor is requested - for inner classes '$' should be used as separator instead of '/' --- Source/Modules/java.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index f3fe7c380..2e00a05d7 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -209,7 +209,7 @@ public: String *symname = Copy(Getattr(n, "sym:name")); if (symname && !GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { - Push(symname, "."); + Push(symname, jnidescriptor ? "$" : "."); Push(symname, Getattr(outer_class, "sym:name")); } } From 8a69da7d826961a666ad54b5d6815c27e8daf775 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Thu, 4 Sep 2014 12:05:23 +0300 Subject: [PATCH 08/15] Java/Fix: swig_connect_director used not-fully-qualified classname --- Source/Modules/java.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 2e00a05d7..7a660e85b 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -4548,6 +4548,14 @@ public: Wrapper *w = NewWrapper(); + // Form full classname including outer classes + if (classname && !GetFlag(n, "feature:flatnested")) { + for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { + Push(classname, "$"); + Push(classname, Getattr(outer_class, "sym:name")); + } + } + if (Len(package_path) > 0 && Len(getNSpace()) > 0) internal_classname = NewStringf("%s/%s/%s", package_path, getNSpace(), classname); else if (Len(package_path) > 0) From afbb47dc8f19c7867253356ba7df5bd1c6828889 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Thu, 4 Sep 2014 12:22:56 +0300 Subject: [PATCH 09/15] Java/Fix: swig_connect_director used not-fully-qualified classname (proper) --- Source/Modules/java.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 7a660e85b..e67b03290 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -4542,7 +4542,7 @@ public: * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { - String *classname = Getattr(n, "sym:name"); + String *classname = Copy(Getattr(n, "sym:name")); String *director_classname = directorClassName(n); String *internal_classname; @@ -4564,6 +4564,7 @@ public: internal_classname = NewStringf("%s/%s", getNSpace(), classname); else internal_classname = NewStringf("%s", classname); + Delete(classname); // If the namespace is multiple levels, the result of getNSpace() will have inserted // .'s to delimit namespaces, so we need to replace those with /'s From 837d2bfd04929845c9f6d351bc141f5b8e01c903 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Mon, 3 Nov 2014 12:10:10 +0200 Subject: [PATCH 10/15] Removed useless code (it does not affect output, at least on our testcases) --- Source/Modules/java.cxx | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index e67b03290..e8c76854f 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -1556,22 +1556,6 @@ public: } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the Java variable from C through a JNI call. - String* pureSymname = NULL; - if (Equal(Getattr(n, "nodeType"), "enumitem")) { - // If enum is strongly-typed, generate fully-qualified symname - Node* parent = parentNode(n); - String* pureSymname = NULL; - if (GetFlag(parent, "scopedenum") && !GetFlag(n, "symname_has_enumscope")) { - pureSymname = symname; - - String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); - symname = Swig_name_member(0, enumClassName, pureSymname); - Delete(enumClassName); - - /* Printf(stdout, "Renamed strong enum value symname (java:1) '%s' -> '%s'\n", pureSymname, symname); */ - } - } - if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) @@ -1584,13 +1568,6 @@ public: Printf(constants_code, "%s.%s();\n", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } - // Delete temporary symname if it was created - if (pureSymname) { - Delete(symname); - symname = pureSymname; - pureSymname = NULL; - } - // Each constant and enum value is wrapped with a separate JNI function call SetFlag(n, "feature:immutable"); enum_constant_flag = true; From bca042a7dd3e0c3727f4dc201d2964aa3b160763 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Fri, 7 Nov 2014 19:45:20 +0000 Subject: [PATCH 11/15] Add director_nested_class testcase Java nested director class test for fix in e7db081d5e175024f1d5baa9ac028474958a2542 --- Examples/test-suite/director_nested_class.i | 16 ++++++++++ .../java/director_nested_class_runme.java | 30 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 Examples/test-suite/director_nested_class.i create mode 100644 Examples/test-suite/java/director_nested_class_runme.java diff --git a/Examples/test-suite/director_nested_class.i b/Examples/test-suite/director_nested_class.i new file mode 100644 index 000000000..99eecfcc8 --- /dev/null +++ b/Examples/test-suite/director_nested_class.i @@ -0,0 +1,16 @@ +%module(directors="1") director_nested_class + + +%feature("director") DirectorOuter::DirectorInner; + +%inline %{ +struct DirectorOuter { + struct DirectorInner { + virtual ~DirectorInner() {} + virtual int vmethod(int input) const = 0; + }; + static int callMethod(const DirectorInner &di, int value) { + return di.vmethod(value); + } +}; +%} diff --git a/Examples/test-suite/java/director_nested_class_runme.java b/Examples/test-suite/java/director_nested_class_runme.java new file mode 100644 index 000000000..5d330fb46 --- /dev/null +++ b/Examples/test-suite/java/director_nested_class_runme.java @@ -0,0 +1,30 @@ + +import director_nested_class.*; + +public class director_nested_class_runme { + + static { + try { + System.loadLibrary("director_nested_class"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + + director_nested_class_Derived d = new director_nested_class_Derived(); + + if (DirectorOuter.callMethod(d, 999) != 9990) { + throw new RuntimeException("callMethod(999) failed"); + } + } +} + +class director_nested_class_Derived extends DirectorOuter.DirectorInner { + public int vmethod(int input) { + return input * 10; + } +} + From 92d3146a0621d8da071eb8e07ac0e283f3f265b0 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Fri, 7 Nov 2014 20:38:09 +0000 Subject: [PATCH 12/15] Expand director_nested_class test to test more than one level of nesting --- Examples/test-suite/director_nested_class.i | 9 +++++++++ .../test-suite/java/director_nested_class_runme.java | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/Examples/test-suite/director_nested_class.i b/Examples/test-suite/director_nested_class.i index 99eecfcc8..f3d627f3c 100644 --- a/Examples/test-suite/director_nested_class.i +++ b/Examples/test-suite/director_nested_class.i @@ -2,15 +2,24 @@ %feature("director") DirectorOuter::DirectorInner; +%feature("director") DirectorOuter::DirectorInner::DirectorInnerInner; %inline %{ struct DirectorOuter { struct DirectorInner { virtual ~DirectorInner() {} virtual int vmethod(int input) const = 0; + struct DirectorInnerInner { + DirectorInnerInner(DirectorInner *din = 0) {} + virtual ~DirectorInnerInner() {} + virtual int innervmethod(int input) const = 0; + }; }; static int callMethod(const DirectorInner &di, int value) { return di.vmethod(value); } + static int callInnerInnerMethod(const DirectorInner::DirectorInnerInner &di, int value) { + return di.innervmethod(value); + } }; %} diff --git a/Examples/test-suite/java/director_nested_class_runme.java b/Examples/test-suite/java/director_nested_class_runme.java index 5d330fb46..5144413b7 100644 --- a/Examples/test-suite/java/director_nested_class_runme.java +++ b/Examples/test-suite/java/director_nested_class_runme.java @@ -19,6 +19,12 @@ public class director_nested_class_runme { if (DirectorOuter.callMethod(d, 999) != 9990) { throw new RuntimeException("callMethod(999) failed"); } + + director_nested_class_DerivedInnerInner dinner = new director_nested_class_DerivedInnerInner(); + + if (DirectorOuter.callInnerInnerMethod(dinner, 999) != 999000) { + throw new RuntimeException("callMethod(999) failed"); + } } } @@ -28,3 +34,8 @@ class director_nested_class_Derived extends DirectorOuter.DirectorInner { } } +class director_nested_class_DerivedInnerInner extends DirectorOuter.DirectorInner.DirectorInnerInner { + public int innervmethod(int input) { + return input * 1000; + } +} From 089865ba57e7303d702231792f9226bc80cb0c39 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Mon, 10 Nov 2014 19:57:07 +0000 Subject: [PATCH 13/15] Rewrite some Java director nested class support code for strongly typed enums --- Source/Modules/java.cxx | 39 ++++----------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index e8c76854f..bbf63c6dd 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -3704,7 +3704,6 @@ public: * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { - String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); @@ -3738,24 +3737,7 @@ public: String *imcall_args = NewString(""); int classmeth_off = curr_class_dmethod - first_class_dmethod; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; - String *nspace = getNSpace(); - - String *outerClassesPrefix = 0; - if (Node *outer = Getattr(parent, "nested:outer")) { - outerClassesPrefix = Copy(Getattr(outer, "sym:name")); - for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { - Push(outerClassesPrefix, "."); - Push(outerClassesPrefix, Getattr(outer, "sym:name")); - } - } - String* qualified_classname = outerClassesPrefix ? NewStringf("%s.%s", outerClassesPrefix, classname) : NewStringf("%s", classname); - /* Printf(stdout, "Director qualified_classname '%s' instead of '%s'\n", qualified_classname, classname); */ - - if (nspace && package) - Insert(qualified_classname, 0, NewStringf("%s.%s.", package, nspace)); - else if(nspace) - Insert(qualified_classname, 0, NewStringf("%s.", nspace)); - + String *qualified_classname = getProxyName(getClassName()); // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least @@ -3878,7 +3860,6 @@ public: } Delete(adjustedreturntypeparm); - Delete(qualified_classname); Swig_director_parms_fixup(l); @@ -4519,29 +4500,17 @@ public: * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { - String *classname = Copy(Getattr(n, "sym:name")); + String *full_classname = Getattr(n, "name"); + String *classname = getProxyName(full_classname, true); String *director_classname = directorClassName(n); String *internal_classname; Wrapper *w = NewWrapper(); - // Form full classname including outer classes - if (classname && !GetFlag(n, "feature:flatnested")) { - for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { - Push(classname, "$"); - Push(classname, Getattr(outer_class, "sym:name")); - } - } - - if (Len(package_path) > 0 && Len(getNSpace()) > 0) - internal_classname = NewStringf("%s/%s/%s", package_path, getNSpace(), classname); - else if (Len(package_path) > 0) + if (Len(package_path) > 0) internal_classname = NewStringf("%s/%s", package_path, classname); - else if (Len(getNSpace()) > 0) - internal_classname = NewStringf("%s/%s", getNSpace(), classname); else internal_classname = NewStringf("%s", classname); - Delete(classname); // If the namespace is multiple levels, the result of getNSpace() will have inserted // .'s to delimit namespaces, so we need to replace those with /'s From 77b338151ef25b9ce1ffd88bbab931379ddea3b3 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Tue, 18 Nov 2014 20:04:01 +0000 Subject: [PATCH 14/15] Simplify/improve strongly typed enum implementation for Java --- Source/Modules/java.cxx | 43 +++++------------- Source/Modules/lang.cxx | 95 +++++++++++++++------------------------- Source/Modules/swigmod.h | 3 ++ 3 files changed, 49 insertions(+), 92 deletions(-) diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index bbf63c6dd..682f5b61b 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -2959,17 +2959,14 @@ public: // Use the C syntax to make a true Java constant and hope that it compiles as Java code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { - // If enum is strongly-typed, generate fully-qualified symname - Node* parent = parentNode(n); - String* pureSymname = NULL; - if (GetFlag(parent, "scopedenum") && !GetFlag(n, "symname_has_enumscope")) { - pureSymname = symname; - - String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); - symname = Swig_name_member(0, enumClassName, pureSymname); - Delete(enumClassName); - - /* Printf(stdout, "Renamed strong enum value symname (java:2) '%s' -> '%s'\n", pureSymname, symname); */ + String *newsymname = 0; + if (!getCurrentClass() || !proxy_flag) { + String *enumClassPrefix = getEnumClassPrefix(); + if (enumClassPrefix) { + // A global scoped enum + newsymname = Swig_name_member(0, enumClassPrefix, symname); + symname = newsymname; + } } // Get the enumvalue from a JNI call @@ -2980,29 +2977,9 @@ public: value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); - String* outerClassesPrefix = NULL; - if (Node *outer = Getattr(getCurrentClass(), "nested:outer")) { - outerClassesPrefix = Copy(Getattr(outer, "sym:name")); - for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { - Push(outerClassesPrefix, "."); - Push(outerClassesPrefix, Getattr(outer, "sym:name")); - } - } - String* full_proxy_class_sym_name = outerClassesPrefix ? NewStringf("%s.%s", outerClassesPrefix, proxy_class_name) : NewStringf("%s", proxy_class_name); - Replaceall(full_proxy_class_sym_name, ".", "_"); - /* Printf(stdout, "Change proxy class symname '%s' -> '%s'\n", proxy_class_name, full_proxy_class_sym_name); */ - value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, full_proxy_class_sym_name, symname))); - Delete(full_proxy_class_sym_name); - if (outerClassesPrefix) - Delete(outerClassesPrefix); - } - - // Delete temporary symname if it was created - if (pureSymname) { - Delete(symname); - symname = pureSymname; - pureSymname = NULL; + value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname))); } + Delete(newsymname); } } return value; diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 04eec8af3..454d74eb5 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -57,7 +57,9 @@ extern "C" { /* Some status variables used during parsing */ static int InClass = 0; /* Parsing C++ or not */ static String *ClassName = 0; /* This is the real name of the current class */ +static String *EnumClassName = 0; /* Enum class name */ static String *ClassPrefix = 0; /* Class prefix */ +static String *EnumClassPrefix = 0; /* Prefix for strongly typed enums (including ClassPrefix) */ static String *NSpace = 0; /* Namespace for the nspace feature */ static String *ClassType = 0; /* Fully qualified type name to use */ static String *DirectorClassName = 0; /* Director name of the current class */ @@ -1650,10 +1652,24 @@ int Language::enumDeclaration(Node *n) { String *oldNSpace = NSpace; NSpace = Getattr(n, "sym:nspace"); + String *oldEnumClassPrefix = EnumClassPrefix; + if (GetFlag(n, "scopedenum")) { + assert(Getattr(n, "sym:name")); + assert(Getattr(n, "name")); + EnumClassPrefix = ClassPrefix ? NewStringf("%s_", ClassPrefix) : NewString(""); + Printv(EnumClassPrefix, Getattr(n, "sym:name"), NIL); + EnumClassName = Copy(Getattr(n, "name")); + } if (!ImportMode) { emit_children(n); } + if (GetFlag(n, "scopedenum")) { + Delete(EnumClassName); + EnumClassName = 0; + Delete(EnumClassPrefix); + EnumClassPrefix = oldEnumClassPrefix; + } NSpace = oldNSpace; return SWIG_OK; @@ -1720,50 +1736,16 @@ int Language::memberconstantHandler(Node *n) { String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); - String *mrename = Swig_name_member(0, ClassPrefix, symname); - if (Equal(Getattr(n, "nodeType"), "enumitem")) { - // If enum is strongly-typed, generate fully-qualified symname - Node* parent = parentNode(n); - if (GetFlag(parent, "scopedenum") && !GetFlag(n, "symname_has_enumscope")) - { - SetFlag(n, "symname_has_enumscope"); - Delete(mrename); - - String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); - String* scopedItemName = Swig_name_member(0, enumClassName, symname); - mrename = Swig_name_member(0, ClassPrefix, scopedItemName); - - /* Printf(stdout, "Renamed strong enum value symname (lang:1) '%s' -> '%s'\n", symname, mrename); */ - - Delete(enumClassName); - Delete(scopedItemName); - } - } + String *mrename = Swig_name_member(0, EnumClassPrefix, symname); Setattr(n, "sym:name", mrename); String *new_name = 0; if (Extend) new_name = Copy(value); + else if (EnumClassName) + new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : EnumClassName, name); else new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName, name); - if (Equal(Getattr(n, "nodeType"), "enumitem")) { - // If enum is strongly-typed, generate fully-qualified symname - Node* parent = parentNode(n); - if (GetFlag(parent, "scopedenum") && !GetFlag(n, "name_has_enumscope")) - { - SetFlag(n, "name_has_enumscope"); - Delete(new_name); - - String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); - String* scopedItemName = NewStringf("%s::%s", enumClassName, name); - new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName, scopedItemName); - - /* Printf(stdout, "Renamed strong enum value name (lang:1) '%s' -> '%s'\n", name, new_name); */ - - Delete(enumClassName); - Delete(scopedItemName); - } - } Setattr(n, "name", new_name); constantWrapper(n); @@ -2405,6 +2387,7 @@ int Language::classDeclaration(Node *n) { int oldInClass = InClass; String *oldClassType = ClassType; String *oldClassPrefix = ClassPrefix; + String *oldEnumClassPrefix = EnumClassPrefix; String *oldClassName = ClassName; String *oldDirectorClassName = DirectorClassName; String *oldNSpace = NSpace; @@ -2446,6 +2429,7 @@ int Language::classDeclaration(Node *n) { Push(ClassPrefix, "_"); Push(ClassPrefix, Getattr(outerClass, "sym:name")); } + EnumClassPrefix = Copy(ClassPrefix); if (strip) { ClassType = Copy(name); } else { @@ -2513,6 +2497,8 @@ int Language::classDeclaration(Node *n) { CurrentClass = oldCurrentClass; Delete(ClassType); ClassType = oldClassType; + Delete(EnumClassPrefix); + EnumClassPrefix = oldEnumClassPrefix; Delete(ClassPrefix); ClassPrefix = oldClassPrefix; Delete(ClassName); @@ -2998,20 +2984,10 @@ int Language::variableWrapper(Node *n) { Delattr(n,"varset"); Delattr(n,"varget"); - String* pureSymname = NULL; - if (Equal(Getattr(n, "nodeType"), "enumitem")) { - // If enum is strongly-typed, generate fully-qualified symname - Node* parent = parentNode(n); - if (GetFlag(parent, "scopedenum") && !GetFlag(n, "symname_has_enumscope")) - { - pureSymname = symname; - - String* enumClassName = Swig_scopename_last(Getattr(parent, "name")); - symname = Swig_name_member(0, enumClassName, pureSymname); - Delete(enumClassName); - - /* Printf(stdout, "Renamed strong enum value symname (lang:2) '%s' -> '%s'\n", pureSymname, symname); */ - } + String *newsymname = 0; + if (!CurrentClass && EnumClassPrefix) { + newsymname = Swig_name_member(0, EnumClassPrefix, symname); + symname = newsymname; } /* If no way to set variables. We simply create functions */ @@ -3071,14 +3047,7 @@ int Language::variableWrapper(Node *n) { functionWrapper(n); Delattr(n, "varget"); Swig_restore(n); - - // Delete temporary symname if it was created - if (pureSymname) { - Delete(symname); - symname = pureSymname; - pureSymname = NULL; - } - + Delete(newsymname); return SWIG_OK; } @@ -3620,6 +3589,14 @@ String *Language::getClassPrefix() const { return ClassPrefix; } +/* ----------------------------------------------------------------------------- + * Language::getEnumClassPrefix() + * ----------------------------------------------------------------------------- */ + +String *Language::getEnumClassPrefix() const { + return EnumClassPrefix; +} + /* ----------------------------------------------------------------------------- * Language::getClassType() * ----------------------------------------------------------------------------- */ diff --git a/Source/Modules/swigmod.h b/Source/Modules/swigmod.h index 63b91bae5..c2ba384e3 100644 --- a/Source/Modules/swigmod.h +++ b/Source/Modules/swigmod.h @@ -291,6 +291,9 @@ protected: /* Return the current class prefix */ String *getClassPrefix() const; + /* Return the current enum class prefix */ + String *getEnumClassPrefix() const; + /* Fully qualified type name to use */ String *getClassType() const; From f72b9f99a4d46a7b39d11cfd97f4184911d5e18e Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 20 Nov 2014 20:11:41 +0000 Subject: [PATCH 15/15] Enhance cpp11_strongly_typed_enumerations testcase and turn it on --- Examples/test-suite/common.mk | 2 +- .../cpp11_strongly_typed_enumerations.i | 94 ++++++++++++------- 2 files changed, 62 insertions(+), 34 deletions(-) diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index 485453b5a..09eb2b742 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -525,6 +525,7 @@ CPP11_TEST_CASES = \ cpp11_rvalue_reference3 \ cpp11_sizeof_object \ cpp11_static_assert \ + cpp11_strongly_typed_enumerations \ cpp11_thread_local \ cpp11_template_double_brackets \ cpp11_template_explicit \ @@ -537,7 +538,6 @@ CPP11_TEST_CASES = \ # Broken C++11 test cases. CPP11_TEST_BROKEN = \ # cpp11_hash_tables \ # not fully implemented yet -# cpp11_strongly_typed_enumerations \ # SWIG not quite getting this right yet in all langs # cpp11_variadic_templates \ # Broken for some languages (such as Java) # cpp11_reference_wrapper \ # No typemaps diff --git a/Examples/test-suite/cpp11_strongly_typed_enumerations.i b/Examples/test-suite/cpp11_strongly_typed_enumerations.i index feb7399a1..0c5f12e1f 100644 --- a/Examples/test-suite/cpp11_strongly_typed_enumerations.i +++ b/Examples/test-suite/cpp11_strongly_typed_enumerations.i @@ -2,10 +2,6 @@ strongly typed enums. Enums with the same type are comparable. Enum classes require support for nested classes. */ %module cpp11_strongly_typed_enumerations -%warnfilter(302) Val1; -%warnfilter(302) Val2; -%warnfilter(302) Val3; -%warnfilter(302) Val4; /* Forward declarations (illegally accepted by SWIG - oh well!) */ enum Enum1 : short; @@ -17,14 +13,14 @@ enum : unsigned short; enum class Enum1 { Val1, Val2, - Val3 = 100, - Val4 /* = 101 */ + Val3 = 13, + Val4 }; enum class Enum2 : short { Val1, Val2, - Val3 = 100, + Val3 = 23, Val4 }; %} @@ -39,24 +35,24 @@ enum class Enum5; // Legal in C++11, because enum class declarati enum class Enum6 : unsigned int; // Legal C++11. enum Enum4 : unsigned int { - Val1, Val2, Val3 = 100, Val4 + Val1, Val2, Val3 = 43, Val4 }; enum class Enum5 { - Val1, Val2, Val3 = 100, Val4 + Val1, Val2, Val3 = 53, Val4 }; enum class Enum6 : unsigned int { - Val1, Val2, Val3 = 300, Val4 + Val1, Val2, Val3 = 63, Val4 }; typedef enum class Enum7 : unsigned int { - Val1, Val2, Val3 = 300, Val4 + Val1, Val2, Val3 = 73, Val4 } Enum7td; // enum inherits from non-primitive type enum class Enum8 : size_t { - Val1, Val2, Val3 = 300, Val4 + Val1, Val2, Val3 = 83, Val4 }; template struct TType { @@ -64,7 +60,7 @@ template struct TType { }; enum class Enum10 : TType::type_name { - Val1, Val2, Val3 = 300, Val4 + Val1, Val2, Val3 = 103, Val4 }; // forward declaration, no definition of enum @@ -78,34 +74,50 @@ class Class1 public: enum class Enum12 { - Val1 = 300, - Val2 = 400, + Val1 = 1121, + Val2 = 1122, Val3, Val4 }; enum Enum13 { - Val1 = 300, - Val2 = 400, + Val1 = 1131, + Val2 = 1132, + Val3, + Val4 + }; + + enum class Enum14 + { + Val1 = 1141, + Val2 = 1142, Val3, Val4 }; struct Struct1 { - enum class Enum14 + enum class Enum12 { - Val1 = 300, - Val2 = 400, + Val1 = 3121, + Val2 = 3122, Val3, Val4 }; - enum Enum15 + enum Enum13 { - Val1 = 300, - Val2 = 400, + Val1 = 3131, + Val2 = 3132, + Val3, + Val4 + }; + + enum class Enum14 + { + Val1 = 3141, + Val2 = 3142, Val3, Val4 }; @@ -117,34 +129,50 @@ class Class2 public: enum class Enum12 { - Val1 = 300, - Val2 = 400, + Val1 = 2121, + Val2 = 2122, Val3, Val4 }; enum Enum13 { - Val1 = 300, - Val2 = 400, + Val1 = 2131, + Val2 = 2132, + Val3, + Val4 + }; + + enum class Enum14 + { + Val1 = 2141, + Val2 = 2142, Val3, Val4 }; struct Struct1 { - enum class Enum14 + enum class Enum12 { - Val1 = 300, - Val2 = 400, + Val1 = 4121, + Val2 = 4122, Val3, Val4 }; - enum Enum15 + enum Enum13 { - Val1 = 300, - Val2 = 400, + Val1 = 4131, + Val2 = 4132, + Val3, + Val4 + }; + + enum class Enum14 + { + Val1 = 4141, + Val2 = 4142, Val3, Val4 };