Fix %extend on typedef classes in a namespace using the typedef name

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12800 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2011-09-08 18:18:33 +00:00
parent 282ab494ab
commit 2fd6b5367d
5 changed files with 164 additions and 3 deletions

View File

@ -4,6 +4,15 @@ See the RELEASENOTES file for a summary of changes in each release.
Version 2.0.5 (in progress)
===========================
2011-09-08: wsfulton
Fix %extend on typedef classes in a namespace using the typedef name, for example:
namespace Space {
%extend CStruct {
...
}
typedef struct tagCStruct { ... } CStruct;
}
2011-08-31: xavier98
[octave] patches from Karl Wette: improvements to module loading behavior;
added example of friend operator to operator example; fixed octave panic/crash in 3.0.5;

View File

@ -199,6 +199,7 @@ CPP_TEST_CASES += \
extend_placement \
extend_template \
extend_template_ns \
extend_typedef_class \
extern_c \
extern_namespace \
extern_throws \

View File

@ -0,0 +1,81 @@
%module extend_typedef_class
// classes in global namespace
%inline %{
typedef struct tagAClass {
int membervar;
} AClass;
struct BClass {
int membervar;
};
typedef struct tagCClass {
int membervar;
} CClass;
// Unnamed struct
typedef struct {
int membervar;
} DClass;
%}
%extend tagAClass {
int getvar() { return $self->membervar; }
}
%extend BClass {
int getvar() { return $self->membervar; }
}
%extend CClass {
int getvar() { return $self->membervar; }
}
%extend DClass {
int getvar() { return $self->membervar; }
}
// classes in a namespace
%inline %{
namespace Space {
typedef struct tagAStruct {
int membervar;
} AStruct;
struct BStruct {
int membervar;
};
typedef struct tagCStruct {
int membervar;
} CStruct;
// Unnamed struct
typedef struct {
int membervar;
} DStruct;
}
%}
namespace Space {
%extend tagAStruct {
int getvar() { return $self->membervar; }
}
%extend BStruct {
int getvar() { return $self->membervar; }
}
%extend CStruct {
int getvar() { return $self->membervar; }
}
%extend DStruct {
int getvar() { return $self->membervar; }
}
}

View File

@ -0,0 +1,65 @@
import extend_typedef_class.*;
public class extend_typedef_class_runme {
static {
try {
System.loadLibrary("extend_typedef_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[]) {
// No namespace
{
AClass s = new AClass();
s.setMembervar(10);
checkMatch(s.getvar(), 10);
}
{
BClass s = new BClass();
s.setMembervar(20);
checkMatch(s.getvar(), 20);
}
{
CClass s = new CClass();
s.setMembervar(30);
checkMatch(s.getvar(), 30);
}
{
DClass s = new DClass();
s.setMembervar(40);
checkMatch(s.getvar(), 40);
}
// In namespace
{
AStruct s = new AStruct();
s.setMembervar(10);
checkMatch(s.getvar(), 10);
}
{
BStruct s = new BStruct();
s.setMembervar(20);
checkMatch(s.getvar(), 20);
}
{
CStruct s = new CStruct();
s.setMembervar(30);
checkMatch(s.getvar(), 30);
}
{
DStruct s = new DStruct();
s.setMembervar(40);
checkMatch(s.getvar(), 40);
}
}
public static void checkMatch(int expected, int got) {
if (expected != got)
throw new RuntimeException("Value incorrect. Expected: " + expected + " got: " + got);
}
}

View File

@ -3560,20 +3560,25 @@ cpp_class_decl : storage_class cpptype idcolon inherit LBRACE {
if (Cmp($1,"typedef") == 0) {
if (!decltype || !Len(decltype)) {
String *cname;
String *tdscopename;
String *class_scope = Swig_symbol_qualifiedscopename(cscope);
name = Getattr($9,"name");
cname = Copy(name);
Setattr($$,"tdname",cname);
Delete(cname);
tdscopename = class_scope ? NewStringf("%s::%s", class_scope, name) : Copy(name);
/* Use typedef name as class name */
if (class_rename && (Strcmp(class_rename,$3) == 0)) {
Delete(class_rename);
class_rename = NewString(name);
}
if (!Getattr(classes,name)) {
Setattr(classes,name,$$);
if (!Getattr(classes,tdscopename)) {
Setattr(classes,tdscopename,$$);
}
Setattr($$,"decl",decltype);
Delete(class_scope);
Delete(cname);
Delete(tdscopename);
}
}
}