Revert 12776, 12777 - %shared_ptr fixes with typedef. It breaks li_boost_shared_ptr testcase in Python. To resolve at a later date.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12953 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2012-03-25 19:10:33 +00:00
commit 36ab437443
3 changed files with 38 additions and 60 deletions

View file

@ -310,12 +310,6 @@ Version 2.0.5 (in progress)
the module table into the global namespace. Require call also returns the module table instead the module table into the global namespace. Require call also returns the module table instead
of a string. of a string.
2011-08-12: wsfulton
SF bug # 3333549 - %shared_ptr fixes when the type is a template using template parameters
that are typedef'd to another type.
Also fixed %shared_ptr when template parameters have default values.
2011-08-09: xavier98 2011-08-09: xavier98
Fix bug 3387394; Octave patches for 3.4.0 compatibility, etc. (from Karl Wette) Fix bug 3387394; Octave patches for 3.4.0 compatibility, etc. (from Karl Wette)

View file

@ -83,6 +83,7 @@ CPP_TEST_BROKEN += \
exception_partial_info \ exception_partial_info \
extend_variable \ extend_variable \
li_std_vector_ptr \ li_std_vector_ptr \
li_boost_shared_ptr_template \
overload_complicated \ overload_complicated \
template_default_pointer \ template_default_pointer \
template_expr template_expr

View file

@ -227,64 +227,51 @@ class TypePass:private Dispatcher {
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
Node *n = Getitem(ilist, i); Node *n = Getitem(ilist, i);
String *bname = Getattr(n, "name"); String *bname = Getattr(n, "name");
Node *bclass = n; Node *bclass = n; /* Getattr(n,"class"); */
Hash *scopes = Getattr(bclass, "typescope"); Hash *scopes = Getattr(bclass, "typescope");
SwigType_inherit(clsname, bname, cast, 0); SwigType_inherit(clsname, bname, cast, 0);
String *smartptr = Getattr(first, "feature:smartptr");
if (smartptr) {
SwigType *smart = 0;
SwigType *spt = Swig_cparse_type(smartptr);
if (spt) {
smart = SwigType_typedef_resolve_all(spt);
Delete(spt);
/* Record a (fake) inheritance relationship between smart pointer
and smart pointer to base class, so that smart pointer upcasts
are automatically generated. */
SwigType *bsmart = Copy(smart);
SwigType *rclsname = SwigType_typedef_resolve_all(clsname);
SwigType *rbname = SwigType_typedef_resolve_all(bname);
Replaceall(bsmart, rclsname, rbname);
Delete(rclsname);
Delete(rbname);
String *smartnamestr = SwigType_namestr(smart);
String *bsmartnamestr = SwigType_namestr(bsmart);
/* construct casting code */
String *convcode = NewStringf("\n *newmemory = SWIG_CAST_NEW_MEMORY;\n return (void *) new %s(*(%s *)$from);\n", bsmartnamestr, smartnamestr);
Delete(bsmartnamestr);
Delete(smartnamestr);
/* setup inheritance relationship between smart pointer templates */
SwigType_inherit(smart, bsmart, 0, convcode);
if (!GetFlag(bclass, "feature:smartptr"))
Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Base class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(bclass, "name")), SwigType_namestr(Getattr(first, "name")));
Delete(convcode);
Delete(bsmart);
Delete(smart);
} else {
Swig_error(Getfile(first), Getline(first), "Invalid type (%s) in 'smartptr' feature for class %s.\n", SwigType_namestr(smartptr), SwigType_namestr(clsname));
}
} else {
if (GetFlag(bclass, "feature:smartptr"))
Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Derived class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(first, "name")), SwigType_namestr(Getattr(bclass, "name")));
}
if (!importmode) { if (!importmode) {
String *btype = Copy(bname); String *btype = Copy(bname);
SwigType_add_pointer(btype); SwigType_add_pointer(btype);
SwigType_remember(btype); SwigType_remember(btype);
Delete(btype); Delete(btype);
} }
String *smartptr = Getattr(first, "feature:smartptr");
String *base_smartptr = Getattr(bclass, "feature:smartptr");
if (smartptr) {
SwigType *spt = Swig_cparse_type(smartptr);
if (spt) {
if (base_smartptr) {
SwigType *base_spt = Swig_cparse_type(base_smartptr);
if (base_spt) {
/* Record a (fake) inheritance relationship between smart pointer
and smart pointer to base class, so that smart pointer upcasts
are automatically generated. */
SwigType *smart = SwigType_typedef_resolve_all(spt);
SwigType *bsmart = SwigType_typedef_resolve_all(base_spt);
String *smartnamestr = SwigType_namestr(smart);
String *bsmartnamestr = SwigType_namestr(bsmart);
/* Construct casting code */
String *convcode = NewStringf("\n *newmemory = SWIG_CAST_NEW_MEMORY;\n return (void *) new %s(*(%s *)$from);\n", bsmartnamestr, smartnamestr);
/* Setup inheritance relationship between smart pointers */
SwigType_inherit(smart, bsmart, 0, convcode);
if (!importmode) {
String *btype = Copy(bsmart);
SwigType_add_pointer(btype);
SwigType_remember(btype);
Delete(btype);
}
Delete(convcode);
Delete(bsmartnamestr);
Delete(smartnamestr);
Delete(bsmart);
Delete(smart);
Delete(base_spt);
} else {
Swig_error(Getfile(first), Getline(first), "Invalid type (%s) in 'smartptr' feature for class %s.\n", SwigType_namestr(base_smartptr), SwigType_namestr(bname));
}
Delete(spt);
} else {
Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Base class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(bclass, "name")), SwigType_namestr(Getattr(first, "name")));
}
} else {
Swig_error(Getfile(first), Getline(first), "Invalid type (%s) in 'smartptr' feature for class %s.\n", SwigType_namestr(smartptr), SwigType_namestr(clsname));
}
} else {
if (base_smartptr)
Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Derived class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(first, "name")), SwigType_namestr(Getattr(bclass, "name")));
}
if (scopes) { if (scopes) {
SwigType_inherit_scope(scopes); SwigType_inherit_scope(scopes);
} }
@ -442,10 +429,6 @@ class TypePass:private Dispatcher {
} }
} else { } else {
Swig_symbol_cadd(fname, n); Swig_symbol_cadd(fname, n);
/* needed?
if (template_default_expanded)
Swig_symbol_cadd(template_default_expanded, n);
*/
SwigType_typedef_class(fname); SwigType_typedef_class(fname);
scopename = Copy(fname); scopename = Copy(fname);
} }