From 61b4c1cbcd386ef7854f9b32494f2a804d7ddc17 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Tue, 13 Nov 2012 22:21:51 +0000 Subject: [PATCH] Fix 'name' attribute for explicitly defined constructors and destructors if the associated class was in a namespace, eg a correct fully qualified name might be Space::Klass::~Klass, but it was Space::~Klass, now it is simply ~Klass (names are now consistent with implicitly added constructors/destructors). git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@13884 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Source/Modules/lang.cxx | 20 +++++++++++--------- Source/Modules/typepass.cxx | 10 ---------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 47dbdeb2b..0a8415120 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -2613,11 +2613,14 @@ int Language::constructorDeclaration(Node *n) { } } else { String *expected_name = ClassName; - if (name && (!Equal(Swig_scopename_last(name), Swig_scopename_last(expected_name))) && !(Getattr(n, "template"))) { + String *scope = Swig_scopename_check(ClassName) ? Swig_scopename_prefix(ClassName) : 0; + String *actual_name = scope ? NewStringf("%s::%s", scope, name) : NewString(name); + Delete(scope); + if (!Equal(actual_name, expected_name) && !(Getattr(n, "template"))) { bool illegal_name = true; if (Extend) { - // SWIG extension - allow typedef names as constructor name in %extend - an unnamed struct declared with a typedef can thus be given a 'constructor'. - SwigType *name_resolved = SwigType_typedef_resolve_all(name); + // SWIG extension - allow typedef names as destructor name in %extend - an unnamed struct declared with a typedef can thus be given a 'destructor'. + SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name); SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name); illegal_name = !Equal(name_resolved, expected_name_resolved); Delete(name_resolved); @@ -2747,11 +2750,12 @@ int Language::destructorDeclaration(Node *n) { Setattr(n, "sym:name", ClassPrefix); } - String *expected_name = NewString(ClassName); - Replace(expected_name, "~", "", DOH_REPLACE_FIRST); - String *actual_name = NewString(name); + String *expected_name = ClassName; + String *scope = Swig_scopename_check(ClassName) ? Swig_scopename_prefix(ClassName) : 0; + String *actual_name = scope ? NewStringf("%s::%s", scope, name) : NewString(name); + Delete(scope); Replace(actual_name, "~", "", DOH_REPLACE_FIRST); - if (name && (!Equal(Swig_scopename_last(actual_name), Swig_scopename_last(expected_name))) && !(Getattr(n, "template"))) { + if (!Equal(actual_name, expected_name) && !(Getattr(n, "template"))) { bool illegal_name = true; if (Extend) { // SWIG extension - allow typedef names as destructor name in %extend - an unnamed struct declared with a typedef can thus be given a 'destructor'. @@ -2765,7 +2769,6 @@ int Language::destructorDeclaration(Node *n) { if (illegal_name) { Swig_warning(WARN_LANG_ILLEGAL_DESTRUCTOR, input_file, line_number, "Illegal destructor name %s. Ignored.\n", Swig_name_decl(n)); Swig_restore(n); - Delete(expected_name); return SWIG_NOWRAP; } } @@ -2773,7 +2776,6 @@ int Language::destructorDeclaration(Node *n) { Setattr(CurrentClass, "has_destructor", "1"); Swig_restore(n); - Delete(expected_name); return SWIG_OK; } diff --git a/Source/Modules/typepass.cxx b/Source/Modules/typepass.cxx index a134e0ac6..a6012c0bf 100644 --- a/Source/Modules/typepass.cxx +++ b/Source/Modules/typepass.cxx @@ -702,11 +702,6 @@ class TypePass:private Dispatcher { normalize_parms(Getattr(n, "parms")); normalize_parms(Getattr(n, "throws")); - /* If in a namespace, patch the class name */ - if (nsname) { - String *nname = NewStringf("%s::%s", nsname, Getattr(n, "name")); - Setattr(n, "name", nname); - } clean_overloaded(n); return SWIG_OK; } @@ -716,11 +711,6 @@ class TypePass:private Dispatcher { * ------------------------------------------------------------ */ virtual int destructorDeclaration(Node *n) { - /* If in a namespace, patch the class name */ - if (nsname) { - String *nname = NewStringf("%s::%s", nsname, Getattr(n, "name")); - Setattr(n, "name", nname); - } return SWIG_OK; }