mirror of https://github.com/swig/swig
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
|
@ -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;
|
||||
|
|
|
@ -199,6 +199,7 @@ CPP_TEST_CASES += \
|
|||
extend_placement \
|
||||
extend_template \
|
||||
extend_template_ns \
|
||||
extend_typedef_class \
|
||||
extern_c \
|
||||
extern_namespace \
|
||||
extern_throws \
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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 (!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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue