%rename(x) Foo::y();
%inline %{
class Foo {
protected:
void x();
public:
void y();
};
%}
will work in plain or plain director mode, but it will complain the
same as before with director protected support.
The reason is that the parser emmits the warning, and at that stage it
is not possible to decide if the protected Foo::x() could or not
conflict with the renamed Foo::y(), since Foo::x() could be virtual,
even when no "virtual" attribute is used.
Core:
parser.y: Detect the dirprot mode and prevents the generation of
protected symbols at the parsing stage.
lang.cxx: Export the director_protected_mode for parser.y and the
director protected member detection is much cleaner.
main.cxx: Fix the -dirprot flag, it was working in SWIG_FEATURE but
not in the command line.(minor thing not relate to the error).
swigmod.h: added Lang::dirprot_mode() for cleaner detection.
utils.cxx: is_member_director() centralizes and improve the test.
Test suite:
protected_rename.i: added %inline, so it can compile now.
director_protected.i: more cases, checking using %rename.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5530 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
b3b75149de
commit
c41374becc
7 changed files with 89 additions and 28 deletions
|
|
@ -23,6 +23,14 @@ static int director_protected_mode = 0; /* set to 0 on default */
|
|||
void Wrapper_director_protected_mode_set(int flag) {
|
||||
director_protected_mode = flag;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
int Swig_need_protected()
|
||||
{
|
||||
return director_protected_mode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Some status variables used during parsing */
|
||||
|
|
@ -699,10 +707,7 @@ int Language::cDeclaration(Node *n) {
|
|||
|
||||
if (CurrentClass && (cplus_mode == CPLUS_PRIVATE)) return SWIG_NOWRAP;
|
||||
if (CurrentClass && (cplus_mode == CPLUS_PROTECTED) &&
|
||||
(!directors ||
|
||||
!director_protected_mode ||
|
||||
Cmp(storage,"virtual") ||
|
||||
!is_member_director(CurrentClass,n))) return SWIG_NOWRAP;
|
||||
(!dirprot_mode() || !is_member_director(CurrentClass,n))) return SWIG_NOWRAP;
|
||||
|
||||
if (Cmp(storage,"typedef") == 0) {
|
||||
Swig_save("cDeclaration",n,"type",NIL);
|
||||
|
|
@ -1442,7 +1447,7 @@ int Language::unrollVirtualMethods(Node *n,
|
|||
if (!Cmp(nodeType, "cdecl") && SwigType_isfunction(decl)) {
|
||||
int is_virtual = storage && !Cmp(storage, "virtual");
|
||||
if (is_virtual &&
|
||||
(is_public(ni) || (is_protected(ni) && director_protected_mode))) {
|
||||
(is_public(ni) || (dirprot_mode() && is_protected(ni)))) {
|
||||
Setattr(ni, "feature:director", "1");
|
||||
String *method_id;
|
||||
String *name = Getattr(ni, "name");
|
||||
|
|
@ -1720,7 +1725,7 @@ int Language::classHandler(Node *n) {
|
|||
classDirectorDisown(n);
|
||||
|
||||
/* emit all the protected virtual members as needed */
|
||||
if (director_protected_mode) {
|
||||
if (dirprot_mode()) {
|
||||
Node *vtable = Getattr(n, "vtable");
|
||||
String* symname = Getattr(n, "sym:name");
|
||||
Node *item;
|
||||
|
|
@ -2196,6 +2201,14 @@ void Language::allow_directors(int val) {
|
|||
directors = val;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Language::directorsEnabled()
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
int Language::directorsEnabled() const {
|
||||
return directors && CPlusPlus;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Language::allow_dirprot()
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
|
@ -2205,11 +2218,11 @@ void Language::allow_dirprot(int val) {
|
|||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Language::directorsEnabled()
|
||||
* Language::dirprot_mode()
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
int Language::directorsEnabled() const {
|
||||
return directors && CPlusPlus;
|
||||
int Language::dirprot_mode() const {
|
||||
return directorsEnabled() ? director_protected_mode : 0;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -372,8 +372,10 @@ int SWIG_main(int argc, char *argv[], Language *l) {
|
|||
Swig_mark_arg(i);
|
||||
} else if (strcmp(argv[i],"-dirprot") == 0) {
|
||||
Wrapper_director_protected_mode_set(1);
|
||||
Swig_mark_arg(i);
|
||||
} else if (strcmp(argv[i],"-nodirprot") == 0) {
|
||||
Wrapper_director_protected_mode_set(0);
|
||||
Swig_mark_arg(i);
|
||||
} else if (strcmp(argv[i],"-small") == 0) {
|
||||
Wrapper_compact_print_mode_set(1);
|
||||
Wrapper_virtual_elimination_mode_set(1);
|
||||
|
|
|
|||
|
|
@ -214,12 +214,15 @@ public:
|
|||
/* Allow director related code generation */
|
||||
void allow_directors(int val = 1);
|
||||
|
||||
/* Allow director protected members related code generation */
|
||||
void allow_dirprot(int val = 1);
|
||||
|
||||
/* Return true if directors are enabled */
|
||||
int directorsEnabled() const;
|
||||
|
||||
/* Allow director protected members related code generation */
|
||||
void allow_dirprot(int val = 1);
|
||||
|
||||
/* Returns the dirprot mode */
|
||||
int dirprot_mode() const;
|
||||
|
||||
/* Set none comparison string */
|
||||
void setSubclassInstanceCheck(String *s);
|
||||
|
||||
|
|
|
|||
|
|
@ -21,9 +21,15 @@ int is_protected(Node* n)
|
|||
|
||||
int is_member_director(Node* parentnode, Node* member)
|
||||
{
|
||||
int parent_director = parentnode && checkAttribute(parentnode,"feature:director","1");
|
||||
int cdecl_nodirector = checkAttribute(member,"feature:nodirector","1");
|
||||
return parent_director && !cdecl_nodirector;
|
||||
if (checkAttribute(member,"director","1")) return 1;
|
||||
if (parentnode && checkAttribute(member, "storage", "virtual")) {
|
||||
int parent_director = checkAttribute(parentnode,"feature:director","1");
|
||||
int cdecl_director = parent_director || checkAttribute(member,"feature:director","1");
|
||||
int cdecl_nodirector = checkAttribute(member,"feature:nodirector","1");
|
||||
return cdecl_director && !cdecl_nodirector;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int is_member_director(Node* member)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue