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:
William S Fulton 2023-09-09 12:31:33 +01:00
parent c96c04c5ae
commit d4abe14f7e
5 changed files with 61 additions and 24 deletions

View File

@ -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 {

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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);