fix dirprot mode

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5874 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2004-04-11 12:20:04 +00:00
commit 553698d489
5 changed files with 34 additions and 31 deletions

View file

@ -364,7 +364,7 @@ void emit_action(Node *n, Wrapper *f) {
action = Getattr(n,"wrap:action");
assert(action != 0);
if (is_protected(n) && is_member_director(n)) {
if (!(is_public(n)) && is_member_director(n)) {
/* We need to add an extra dynamic_cast to
access the director class, where the virtual
methods are all public */
@ -375,6 +375,15 @@ void emit_action(Node *n, Wrapper *f) {
Wrapper_add_local(f, "darg", dirdecl);
Printf(f->code, "darg = dynamic_cast<%s *>(arg1);\n",dirname);
Replace(action, "arg1", "darg", DOH_REPLACE_FIRST);
if (Getattr(n,"qualifier")) {
/* fix constant casting introduced by a const method decl */
String* classtype = Getattr(parent, "classtype");
/*
String *ccast = NewStringf("((%s const *)darg)",classtype);
if (Strstr(action,ccast) != 0)
*/
Replace(action, classtype, dirname, DOH_REPLACE_FIRST);
}
Delete(dirname);
Delete(dirdecl);
}

View file

@ -1636,7 +1636,7 @@ class JAVA : public Language {
/* Start generating the proxy function */
const String *methodmods = Getattr(n,"feature:java:methodmodifiers");
methodmods = methodmods ? methodmods : (is_protected(n) ? protected_string : public_string);
methodmods = methodmods ? methodmods : (!is_public(n) ? protected_string : public_string);
Printf(function_code, " %s ", methodmods);
if (static_flag)
Printf(function_code, "static ");
@ -1760,7 +1760,7 @@ class JAVA : public Language {
String *imcall = NewString("");
const String *methodmods = Getattr(n,"feature:java:methodmodifiers");
methodmods = methodmods ? methodmods : (is_protected(n) ? protected_string : public_string);
methodmods = methodmods ? methodmods : (!is_public(n) ? protected_string : public_string);
Printf(proxy_class_code, " %s %s(", methodmods, proxy_class_name);
Printv(imcall, "this(", imclass_name, ".", mangled_overname, "(", NIL);
@ -2015,7 +2015,7 @@ class JAVA : public Language {
/* Start generating the function */
const String *methodmods = Getattr(n,"feature:java:methodmodifiers");
methodmods = methodmods ? methodmods : (is_protected(n) ? protected_string : public_string);
methodmods = methodmods ? methodmods : (!is_public(n) ? protected_string : public_string);
Printf(function_code, " %s static %s %s(", methodmods, return_type, func_name);
Printv(imcall, imclass_name, ".", overloaded_name, "(", NIL);

View file

@ -36,6 +36,11 @@ void Wrapper_template_extmode_set(int flag) {
}
extern "C" {
int Swig_director_mode()
{
return director_mode;
}
int Swig_need_protected()
{
return director_protected_mode;
@ -730,9 +735,9 @@ int Language::cDeclaration(Node *n) {
Node *over;
File *f_header = 0;
SwigType *ty, *fullty;
/* discarts nodes following the access control rules */
if (cplus_mode != CPLUS_PUBLIC) {
if (cplus_mode != CPLUS_PUBLIC || !is_public(n)) {
/* except for friends, they are not affected by access control */
int isfriend = storage && (Cmp(storage,"friend") == 0);
if (!isfriend ) {
@ -745,7 +750,7 @@ int Language::cDeclaration(Node *n) {
return SWIG_NOWRAP;
}
}
if (Cmp(storage,"typedef") == 0) {
Swig_save("cDeclaration",n,"type",NIL);
SwigType *t = Copy(type);
@ -1510,7 +1515,8 @@ int Language::unrollVirtualMethods(Node *n,
String *fqname = NewStringf("%s::%s", classname, name);
Hash *item = NewHash();
Setattr(item, "fqName", fqname);
Setattr(item, "methodNode", Copy(ni));
Node *m = Copy(ni);
Setattr(item, "methodNode", m);
Setattr(vm, method_id, item);
Delete(fqname);
Delete(item);
@ -1566,7 +1572,7 @@ int Language::unrollVirtualMethods(Node *n,
*/
Node *c = Copy(m);
Setattr(c, "parentNode", n);
int cdir = checkAttribute(c, "feature:director", "1");
int cdir = checkAttribute(c, "feature:director", "1") || director_mode;
int cndir = checkAttribute(c, "feature:nodirector", "1");
dir = (cdir || cndir) ? (cdir && !cndir) : dir;
Delete(c);
@ -1862,30 +1868,14 @@ int Language::classHandler(Node *n) {
cplus_mode = CPLUS_PROTECTED;
for (k = First(vtable); k.key; k = Next(k)) {
item = k.item;
String* director = Getattr(item,"director");
Node *method = Getattr(item, "methodNode");
Node* parentnode = Getattr(method, "parentNode");
String* methodname = Getattr(method,"sym:name");
String* wrapname = NewStringf("%s_%s", symname,methodname);
/* only pure virtual abstract private methods are needed */
int need_private = (is_private(method)
&& (Cmp(Getattr(method,"value"),"0") == 0));
if (!Getattr(symbols,wrapname)
&& !Cmp(director,"1")
&& (n != parentnode)
&& (is_protected(method) || need_private)) {
&& (!is_public(method))) {
Node* m = Copy(method);
String* mdecl = Getattr(m,"decl");
Setattr(m, "director", "1");
Setattr(m,"parentNode", n);
/* ugly trick, to avoid an uglier one later on emit. We
take the 'const' out from calling method to avoid the
ugly const casting latter. The casting from 'non-const'
to 'const' is not needed here, but it prevents the simple
replacement of arg1 by darg on emit.cxx.
*/
if (Strncmp(mdecl, "q(const).", 9)== 0)
Replace(mdecl,"q(const).","", DOH_REPLACE_FIRST);
cDeclaration(m);
Delete(m);
}

View file

@ -598,8 +598,8 @@ public:
case MEMBER_FUNC:
{
#ifdef SWIG_PROTECTED_TARGET_METHODS
const char* rb_define_method = is_protected(n) ?
"rb_define_protected_method" : "rb_define_method";
const char* rb_define_method = is_public(n) ?
"rb_define_method" : "rb_define_protected_method" ;
#else
const char* rb_define_method = "rb_define_method";
#endif

View file

@ -21,9 +21,13 @@ int is_protected(Node* n)
int is_member_director(Node* parentnode, Node* member)
{
int director_mode = Swig_director_mode();
if (checkAttribute(member,"director","1")) return 1;
if (parentnode && checkAttribute(member, "storage", "virtual")) {
int parent_director = checkAttribute(parentnode,"feature:director","1");
int parent_nodirector = checkAttribute(parentnode,"feature:nodirector","1");
if (parent_nodirector) return 0;
int parent_director = director_mode|| 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;
@ -32,7 +36,7 @@ int is_member_director(Node* parentnode, Node* member)
}
}
int is_member_director(Node* member)
int is_member_director(Node* member)
{
return is_member_director(Getattr(member, "parentNode"), member);
}