director protected support cleanup

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5505 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2003-12-08 21:56:14 +00:00
commit 7b69dddba0
2 changed files with 15 additions and 11 deletions

View file

@ -374,15 +374,11 @@ void emit_action(Node *n, Wrapper *f) {
String* symname = Getattr(parent, "sym:name");
String* classtype = Getattr(parent,"classtype");
String* dirname = NewStringf("SwigDirector_%s", symname);
String* dirdecl = NewStringf("%s *darg1 = 0", dirname);
Wrapper_add_local(f, "darg1", dirdecl);
Printf(f->code, "darg1 = dynamic_cast<%s *>(arg1);\n",dirname);
/* Maybe here a more detailed diagnostic can de added,
such as trying to access a protected member, but it seems
it is not easy to do it for all the languages at once*/
Printf(f->code, "if (!darg1) return NULL;\n");
Replaceall(action,"arg1","darg1");
Replaceall(action,classtype,dirname);
String* dirdecl = NewStringf("%s *darg = 0", dirname);
Wrapper_add_local(f, "darg", dirdecl);
Printf(f->code, "darg = dynamic_cast<%s *>(arg1);\n",dirname);
Printf(f->code, "if (!darg) SWIG_exception(SWIG_RuntimeError,\"accesing protected member %s\");\n",Getattr(n,"name"));
Replace(action, "arg1", "darg", DOH_REPLACE_FIRST);
Delete(dirname);
Delete(dirdecl);
}

View file

@ -1735,9 +1735,17 @@ int Language::classHandler(Node *n) {
&& (n != parentnode)
&& is_protected(method)) {
Node* m = Copy(method);
String* mdecl = Getattr(m,"decl");
Setattr(m,"parentNode", n);
/* ugly trick, to avoid an uglier one later on emit.*/
Replace(Getattr(m,"decl"),"q(const).","",1);
/* 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);
}