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:
parent
282ab494ab
commit
2fd6b5367d
5 changed files with 164 additions and 3 deletions
|
|
@ -4,6 +4,15 @@ See the RELEASENOTES file for a summary of changes in each release.
|
||||||
|
|
||||||
Version 2.0.5 (in progress)
|
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
|
2011-08-31: xavier98
|
||||||
[octave] patches from Karl Wette: improvements to module loading behavior;
|
[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;
|
added example of friend operator to operator example; fixed octave panic/crash in 3.0.5;
|
||||||
|
|
|
||||||
|
|
@ -199,6 +199,7 @@ CPP_TEST_CASES += \
|
||||||
extend_placement \
|
extend_placement \
|
||||||
extend_template \
|
extend_template \
|
||||||
extend_template_ns \
|
extend_template_ns \
|
||||||
|
extend_typedef_class \
|
||||||
extern_c \
|
extern_c \
|
||||||
extern_namespace \
|
extern_namespace \
|
||||||
extern_throws \
|
extern_throws \
|
||||||
|
|
|
||||||
81
Examples/test-suite/extend_typedef_class.i
Normal file
81
Examples/test-suite/extend_typedef_class.i
Normal 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; }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
65
Examples/test-suite/java/extend_typedef_class_runme.java
Normal file
65
Examples/test-suite/java/extend_typedef_class_runme.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -3560,20 +3560,25 @@ cpp_class_decl : storage_class cpptype idcolon inherit LBRACE {
|
||||||
if (Cmp($1,"typedef") == 0) {
|
if (Cmp($1,"typedef") == 0) {
|
||||||
if (!decltype || !Len(decltype)) {
|
if (!decltype || !Len(decltype)) {
|
||||||
String *cname;
|
String *cname;
|
||||||
|
String *tdscopename;
|
||||||
|
String *class_scope = Swig_symbol_qualifiedscopename(cscope);
|
||||||
name = Getattr($9,"name");
|
name = Getattr($9,"name");
|
||||||
cname = Copy(name);
|
cname = Copy(name);
|
||||||
Setattr($$,"tdname",cname);
|
Setattr($$,"tdname",cname);
|
||||||
Delete(cname);
|
tdscopename = class_scope ? NewStringf("%s::%s", class_scope, name) : Copy(name);
|
||||||
|
|
||||||
/* Use typedef name as class name */
|
/* Use typedef name as class name */
|
||||||
if (class_rename && (Strcmp(class_rename,$3) == 0)) {
|
if (class_rename && (Strcmp(class_rename,$3) == 0)) {
|
||||||
Delete(class_rename);
|
Delete(class_rename);
|
||||||
class_rename = NewString(name);
|
class_rename = NewString(name);
|
||||||
}
|
}
|
||||||
if (!Getattr(classes,name)) {
|
if (!Getattr(classes,tdscopename)) {
|
||||||
Setattr(classes,name,$$);
|
Setattr(classes,tdscopename,$$);
|
||||||
}
|
}
|
||||||
Setattr($$,"decl",decltype);
|
Setattr($$,"decl",decltype);
|
||||||
|
Delete(class_scope);
|
||||||
|
Delete(cname);
|
||||||
|
Delete(tdscopename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue