mirror of https://github.com/swig/swig
Non-assignable detection fixes when wrapping const 2D arrays
Const member variables such as the following are non-assignable by by default: const int x[2][2]; Variable setters are not generated when wrapping these non-assignable variables and classes containing such non-assignable variables.
This commit is contained in:
parent
c96c04c5ae
commit
d4abe14f7e
|
@ -21,17 +21,24 @@ struct AssignPtr {
|
|||
int *const PtrMember;
|
||||
};
|
||||
|
||||
struct AssignMatrix {
|
||||
AssignMatrix() : MatrixMember() {}
|
||||
const int MatrixMember[2][2];
|
||||
};
|
||||
|
||||
struct MemberVars {
|
||||
// These will only have getters
|
||||
AssignValue MemberValue;
|
||||
AssignArray MemberArray;
|
||||
AssignPtr MemberPtr;
|
||||
AssignMatrix MemberMatrix;
|
||||
};
|
||||
|
||||
// (2) Test indirectly non-assignable member variables via inheritance
|
||||
struct AssignValueDerived : AssignValue {};
|
||||
struct AssignArrayDerived : AssignArray {};
|
||||
struct AssignPtrDerived : AssignPtr {};
|
||||
struct AssignMatrixDerived : AssignMatrix {};
|
||||
struct AssignValueDerivedSettable : AssignValue {
|
||||
AssignValueDerivedSettable& operator=(const AssignValueDerivedSettable &) { return *this; }
|
||||
};
|
||||
|
@ -41,44 +48,55 @@ struct AssignArrayDerivedSettable : AssignArray {
|
|||
struct AssignPtrDerivedSettable : AssignPtr {
|
||||
AssignPtrDerivedSettable& operator=(const AssignPtrDerivedSettable &) { return *this; }
|
||||
};
|
||||
struct AssignMatrixDerivedSettable : AssignMatrix {
|
||||
AssignMatrixDerivedSettable& operator=(const AssignMatrixDerivedSettable &) { return *this; }
|
||||
};
|
||||
|
||||
struct InheritedMemberVars {
|
||||
// These will only have getters
|
||||
AssignValueDerived MemberValueDerived;
|
||||
AssignArrayDerived MemberArrayDerived;
|
||||
AssignPtrDerived MemberPtrDerived;
|
||||
AssignMatrixDerived MemberMatrixDerived;
|
||||
|
||||
static AssignValueDerived StaticMemberValueDerived;
|
||||
static AssignArrayDerived StaticMemberArrayDerived;
|
||||
static AssignPtrDerived StaticMemberPtrDerived;
|
||||
static AssignMatrixDerived StaticMemberMatrixDerived;
|
||||
|
||||
// These will have getters and setters
|
||||
AssignValueDerivedSettable MemberValueDerivedSettable;
|
||||
AssignArrayDerivedSettable MemberArrayDerivedSettable;
|
||||
AssignPtrDerivedSettable MemberPtrDerivedSettable;
|
||||
AssignMatrixDerivedSettable MemberMatrixDerivedSettable;
|
||||
|
||||
static AssignValueDerivedSettable StaticMemberValueDerivedSettable;
|
||||
static AssignArrayDerivedSettable StaticMemberArrayDerivedSettable;
|
||||
static AssignPtrDerivedSettable StaticMemberPtrDerivedSettable;
|
||||
static AssignMatrixDerivedSettable StaticMemberMatrixDerivedSettable;
|
||||
};
|
||||
|
||||
AssignValueDerived InheritedMemberVars::StaticMemberValueDerived;
|
||||
AssignArrayDerived InheritedMemberVars::StaticMemberArrayDerived;
|
||||
AssignPtrDerived InheritedMemberVars::StaticMemberPtrDerived;
|
||||
AssignMatrixDerived InheritedMemberVars::StaticMemberMatrixDerived;
|
||||
|
||||
AssignValueDerivedSettable InheritedMemberVars::StaticMemberValueDerivedSettable;
|
||||
AssignArrayDerivedSettable InheritedMemberVars::StaticMemberArrayDerivedSettable;
|
||||
AssignPtrDerivedSettable InheritedMemberVars::StaticMemberPtrDerivedSettable;
|
||||
AssignMatrixDerivedSettable InheritedMemberVars::StaticMemberMatrixDerivedSettable;
|
||||
|
||||
// These will only have getters
|
||||
AssignValueDerived GlobalValueDerived;
|
||||
AssignArrayDerived GlobalArrayDerived;
|
||||
AssignPtrDerived GlobalPtrDerived;
|
||||
AssignMatrixDerived GlobalMatrixDerived;
|
||||
|
||||
// These will have getters and setters
|
||||
AssignValueDerivedSettable GlobalValueDerivedSettable;
|
||||
AssignArrayDerivedSettable GlobalArrayDerivedSettable;
|
||||
AssignPtrDerivedSettable GlobalPtrDerivedSettable;
|
||||
AssignMatrixDerivedSettable GlobalMatrixDerivedSettable;
|
||||
%}
|
||||
|
||||
// (3) Test indirectly non-assignable member variables via classes that themselves have non-assignable member variables
|
||||
|
@ -95,25 +113,33 @@ struct MemberPtrVar {
|
|||
AssignPtr MemberPtr;
|
||||
};
|
||||
|
||||
struct MemberMatrixVar {
|
||||
AssignMatrix MemberMatrix;
|
||||
};
|
||||
|
||||
struct MembersMemberVars {
|
||||
// These will only have getters
|
||||
MemberValueVar MemberValue;
|
||||
MemberArrayVar MemberArray;
|
||||
MemberPtrVar MemberPtr;
|
||||
MemberMatrixVar MemberMatrix;
|
||||
};
|
||||
|
||||
struct StaticMembersMemberVars {
|
||||
static MemberValueVar StaticMemberValue;
|
||||
static MemberArrayVar StaticMemberArray;
|
||||
static MemberPtrVar StaticMemberPtr;
|
||||
static MemberMatrixVar StaticMemberMatrix;
|
||||
};
|
||||
MemberValueVar StaticMembersMemberVars::StaticMemberValue;
|
||||
MemberArrayVar StaticMembersMemberVars::StaticMemberArray;
|
||||
MemberPtrVar StaticMembersMemberVars::StaticMemberPtr;
|
||||
MemberMatrixVar StaticMembersMemberVars::StaticMemberMatrix;
|
||||
|
||||
MemberValueVar GlobalMemberValue;
|
||||
MemberArrayVar GlobalMemberArray;
|
||||
MemberPtrVar GlobalMemberPtr;
|
||||
MemberMatrixVar GlobalMemberMatrix;
|
||||
|
||||
// Setters and getters available
|
||||
struct StaticMembersMemberVarsHolder {
|
||||
|
|
|
@ -20,21 +20,25 @@ public class assign_const_runme {
|
|||
AssignValue a1 = mv.getMemberValue();
|
||||
AssignArray a2 = mv.getMemberArray();
|
||||
AssignPtr a3 = mv.getMemberPtr();
|
||||
AssignMatrix a4 = mv.getMemberMatrix();
|
||||
|
||||
// (2) Test indirectly non-assignable member variables via inheritance
|
||||
InheritedMemberVars imv = new InheritedMemberVars();
|
||||
// These will only have getters
|
||||
AssignValueDerived a4 = imv.getMemberValueDerived();
|
||||
AssignArrayDerived a5 = imv.getMemberArrayDerived();
|
||||
AssignPtrDerived a6 = imv.getMemberPtrDerived();
|
||||
AssignValueDerived aa4 = imv.getMemberValueDerived();
|
||||
AssignArrayDerived aa5 = imv.getMemberArrayDerived();
|
||||
AssignPtrDerived aa6 = imv.getMemberPtrDerived();
|
||||
AssignMatrixDerived aa7 = imv.getMemberMatrixDerived();
|
||||
|
||||
AssignValueDerived sa4 = InheritedMemberVars.getStaticMemberValueDerived();
|
||||
AssignArrayDerived sa5 = InheritedMemberVars.getStaticMemberArrayDerived();
|
||||
AssignPtrDerived sa6 = InheritedMemberVars.getStaticMemberPtrDerived();
|
||||
AssignMatrixDerived sa7 = InheritedMemberVars.getStaticMemberMatrixDerived();
|
||||
|
||||
AssignValueDerived ga4 = assign_const.getGlobalValueDerived();
|
||||
AssignArrayDerived ga5 = assign_const.getGlobalArrayDerived();
|
||||
AssignPtrDerived ga6 = assign_const.getGlobalPtrDerived();
|
||||
AssignMatrixDerived ga7 = assign_const.getGlobalMatrixDerived();
|
||||
|
||||
// These will have getters and setters
|
||||
AssignValueDerivedSettable a7 = imv.getMemberValueDerivedSettable();
|
||||
|
@ -43,20 +47,26 @@ public class assign_const_runme {
|
|||
imv.setMemberArrayDerivedSettable(a8);
|
||||
AssignPtrDerivedSettable a9 = imv.getMemberPtrDerivedSettable();
|
||||
imv.setMemberPtrDerivedSettable(a9);
|
||||
AssignMatrixDerivedSettable a10 = imv.getMemberMatrixDerivedSettable();
|
||||
imv.setMemberMatrixDerivedSettable(a10);
|
||||
|
||||
AssignValueDerivedSettable sa7 = InheritedMemberVars.getStaticMemberValueDerivedSettable();
|
||||
InheritedMemberVars.setStaticMemberValueDerivedSettable(sa7);
|
||||
AssignArrayDerivedSettable sa8 = InheritedMemberVars.getStaticMemberArrayDerivedSettable();
|
||||
InheritedMemberVars.setStaticMemberArrayDerivedSettable(sa8);
|
||||
AssignPtrDerivedSettable sa9 = InheritedMemberVars.getStaticMemberPtrDerivedSettable();
|
||||
InheritedMemberVars.setStaticMemberPtrDerivedSettable(sa9);
|
||||
AssignValueDerivedSettable saa7 = InheritedMemberVars.getStaticMemberValueDerivedSettable();
|
||||
InheritedMemberVars.setStaticMemberValueDerivedSettable(saa7);
|
||||
AssignArrayDerivedSettable saa8 = InheritedMemberVars.getStaticMemberArrayDerivedSettable();
|
||||
InheritedMemberVars.setStaticMemberArrayDerivedSettable(saa8);
|
||||
AssignPtrDerivedSettable saa9 = InheritedMemberVars.getStaticMemberPtrDerivedSettable();
|
||||
InheritedMemberVars.setStaticMemberPtrDerivedSettable(saa9);
|
||||
AssignMatrixDerivedSettable saa10 = InheritedMemberVars.getStaticMemberMatrixDerivedSettable();
|
||||
InheritedMemberVars.setStaticMemberMatrixDerivedSettable(saa10);
|
||||
|
||||
AssignValueDerivedSettable ga7 = assign_const.getGlobalValueDerivedSettable();
|
||||
assign_const.setGlobalValueDerivedSettable(ga7);
|
||||
AssignArrayDerivedSettable ga8 = assign_const.getGlobalArrayDerivedSettable();
|
||||
assign_const.setGlobalArrayDerivedSettable(ga8);
|
||||
AssignPtrDerivedSettable ga9 = assign_const.getGlobalPtrDerivedSettable();
|
||||
assign_const.setGlobalPtrDerivedSettable(ga9);
|
||||
AssignValueDerivedSettable gaa7 = assign_const.getGlobalValueDerivedSettable();
|
||||
assign_const.setGlobalValueDerivedSettable(gaa7);
|
||||
AssignArrayDerivedSettable gaa8 = assign_const.getGlobalArrayDerivedSettable();
|
||||
assign_const.setGlobalArrayDerivedSettable(gaa8);
|
||||
AssignPtrDerivedSettable gaa9 = assign_const.getGlobalPtrDerivedSettable();
|
||||
assign_const.setGlobalPtrDerivedSettable(gaa9);
|
||||
AssignMatrixDerivedSettable gaa10 = assign_const.getGlobalMatrixDerivedSettable();
|
||||
assign_const.setGlobalMatrixDerivedSettable(gaa10);
|
||||
|
||||
// (3) Test indirectly non-assignable member variables via classes that themselves have non-assignable member variables
|
||||
MembersMemberVars m = new MembersMemberVars();
|
||||
|
@ -65,14 +75,17 @@ public class assign_const_runme {
|
|||
MemberValueVar mpv1 = m.getMemberValue();
|
||||
MemberArrayVar mpv2 = m.getMemberArray();
|
||||
MemberPtrVar mpv3 = m.getMemberPtr();
|
||||
MemberMatrixVar mpv4 = m.getMemberMatrix();
|
||||
|
||||
MemberValueVar smpv1 = StaticMembersMemberVars.getStaticMemberValue();
|
||||
MemberArrayVar smpv2 = StaticMembersMemberVars.getStaticMemberArray();
|
||||
MemberPtrVar smpv3 = StaticMembersMemberVars.getStaticMemberPtr();
|
||||
MemberMatrixVar smpv4 = StaticMembersMemberVars.getStaticMemberMatrix();
|
||||
|
||||
MemberValueVar gmpv1 = assign_const.getGlobalMemberValue();
|
||||
MemberArrayVar gmpv2 = assign_const.getGlobalMemberArray();
|
||||
MemberPtrVar gmpv3 = assign_const.getGlobalMemberPtr();
|
||||
MemberMatrixVar gmpv4 = assign_const.getGlobalMemberMatrix();
|
||||
|
||||
// Setters and getters available
|
||||
StaticMembersMemberVarsHolder smmvh = new StaticMembersMemberVarsHolder();
|
||||
|
|
|
@ -673,6 +673,7 @@ class Allocate:public Dispatcher {
|
|||
SwigType_push(ty, Getattr(n, "decl"));
|
||||
SwigType *ftd = SwigType_typedef_resolve_all(ty);
|
||||
SwigType *td = SwigType_strip_qualifiers(ftd);
|
||||
|
||||
if (SwigType_type(td) == T_USER) {
|
||||
Node *cn = Swig_symbol_clookup(td, 0);
|
||||
if (cn) {
|
||||
|
@ -687,6 +688,7 @@ class Allocate:public Dispatcher {
|
|||
is_const = !SwigType_ismutable(ftd);
|
||||
if (GetFlag(n, "hasconsttype"))
|
||||
is_const = true;
|
||||
|
||||
Delete(ty);
|
||||
Delete(ftd);
|
||||
Delete(td);
|
||||
|
|
|
@ -1064,14 +1064,6 @@ int Language::cDeclaration(Node *n) {
|
|||
}
|
||||
}
|
||||
}
|
||||
/* If an array and elements are const, then read-only */
|
||||
if (SwigType_isarray(ty)) {
|
||||
SwigType *tya = SwigType_array_type(ty);
|
||||
if (SwigType_isconst(tya)) {
|
||||
SetFlag(n, "feature:immutable");
|
||||
}
|
||||
Delete(tya);
|
||||
}
|
||||
DohIncref(type);
|
||||
Setattr(n, "type", ty);
|
||||
variableHandler(n);
|
||||
|
|
|
@ -243,8 +243,12 @@ int SwigType_isconst(const SwigType *t) {
|
|||
int SwigType_ismutable(const SwigType *t) {
|
||||
int r;
|
||||
SwigType *qt = SwigType_typedef_resolve_all(t);
|
||||
if (SwigType_isreference(qt) || SwigType_isrvalue_reference(qt) || SwigType_isarray(qt)) {
|
||||
if (SwigType_isreference(qt) || SwigType_isrvalue_reference(qt)) {
|
||||
Delete(SwigType_pop(qt));
|
||||
} else {
|
||||
while (SwigType_isarray(qt)) {
|
||||
Delete(SwigType_pop(qt));
|
||||
}
|
||||
}
|
||||
r = SwigType_isconst(qt);
|
||||
Delete(qt);
|
||||
|
|
Loading…
Reference in New Issue