fix java reg. tests and add -directors flag
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@5867 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
1244cec434
commit
1eba66b31b
7 changed files with 96 additions and 29 deletions
|
|
@ -52,6 +52,7 @@ static int inherit_list = 0;
|
|||
static Parm *template_parameters = 0;
|
||||
static int extendmode = 0;
|
||||
static int dirprot_mode = 0;
|
||||
static int tempext_mode = 0;
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Assist Functions
|
||||
|
|
@ -307,6 +308,12 @@ static void add_symbols(Node *n) {
|
|||
only_csymbol = !need_protected(n, dirprot_mode);
|
||||
} else {
|
||||
Setattr(n,"access", "private");
|
||||
if ((Cmp(Getattr(n,"storage"),"virtual") == 0)
|
||||
&& (Cmp(Getattr(n,"value"),"0") == 0)) {
|
||||
only_csymbol = !need_protected(n, dirprot_mode);
|
||||
} else {
|
||||
Setattr(n,"feature:ignore","1");
|
||||
}
|
||||
}
|
||||
if (only_csymbol) {
|
||||
/* Only add to C symbol table and continue */
|
||||
|
|
@ -2062,9 +2069,12 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
|
|||
String *nname = NewStringf("__dummy_%d__", cnt++);
|
||||
Swig_cparse_template_expand($$,nname,temparms);
|
||||
Setattr($$,"sym:name",nname);
|
||||
/* Setattr($$,"feature:ignore","1"); */
|
||||
Setattr($$,"feature:onlychildren",
|
||||
"typemap,typemapitem,typemapcopy,typedef,types,fragment");
|
||||
if (!Swig_template_extmode()) {
|
||||
Setattr($$,"feature:ignore","1");
|
||||
} else {
|
||||
Setattr($$,"feature:onlychildren",
|
||||
"typemap,typemapitem,typemapcopy,typedef,types,fragment");
|
||||
}
|
||||
}
|
||||
Delattr($$,"templatetype");
|
||||
Setattr($$,"template",n);
|
||||
|
|
|
|||
|
|
@ -18,18 +18,33 @@ char cvsroot_lang_cxx[] = "$Header$";
|
|||
#include "cparse.h"
|
||||
#include <ctype.h>
|
||||
|
||||
static int director_mode = 0; /* set to 0 on default */
|
||||
static int director_protected_mode = 0; /* set to 0 on default */
|
||||
static int template_extmode = 0; /* set to 0 on default */
|
||||
|
||||
/* Set director_protected_mode */
|
||||
void Wrapper_director_mode_set(int flag) {
|
||||
director_mode = flag;
|
||||
}
|
||||
|
||||
void Wrapper_director_protected_mode_set(int flag) {
|
||||
director_protected_mode = flag;
|
||||
}
|
||||
|
||||
void Wrapper_template_extmode_set(int flag) {
|
||||
template_extmode = flag;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
int Swig_need_protected()
|
||||
{
|
||||
return director_protected_mode;
|
||||
}
|
||||
|
||||
int Swig_template_extmode()
|
||||
{
|
||||
return template_extmode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -721,13 +736,10 @@ int Language::cDeclaration(Node *n) {
|
|||
/* except for friends, they are not affected by access control */
|
||||
int isfriend = storage && (Cmp(storage,"friend") == 0);
|
||||
if (!isfriend) {
|
||||
if (cplus_mode == CPLUS_PRIVATE) {
|
||||
/* and for protected/private members, we check what director needs */
|
||||
if ((cplus_mode == CPLUS_PRIVATE) && (IsVirtual != PURE_VIRTUAL)) return SWIG_NOWRAP;
|
||||
if (!(dirprot_mode() && is_member_director(CurrentClass,n)))
|
||||
return SWIG_NOWRAP;
|
||||
} else {
|
||||
/* and for protected members, we check what director needs */
|
||||
if (!(dirprot_mode() && is_member_director(CurrentClass,n)))
|
||||
return SWIG_NOWRAP;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1473,8 +1485,12 @@ int Language::unrollVirtualMethods(Node *n,
|
|||
if ((Cmp(nodeType, "cdecl") == 0)) {
|
||||
decl = Getattr(ni, "decl");
|
||||
/* extra check for function type and proper access */
|
||||
int need_nopublic = dirprot_mode() &&
|
||||
(is_protected(ni) || (is_private(ni)
|
||||
&& (Cmp(Getattr(ni,"value"),"0") == 0)));
|
||||
|
||||
if (SwigType_isfunction(decl) &&
|
||||
(is_public(ni) || (dirprot_mode() && is_protected(ni)))) {
|
||||
(is_public(ni) || need_nopublic)) {
|
||||
String *name = Getattr(ni, "name");
|
||||
String *local_decl = SwigType_typedef_resolve_all(decl);
|
||||
Node *method_id = NewStringf("%s|%s", name, local_decl);
|
||||
|
|
@ -1515,7 +1531,7 @@ int Language::unrollVirtualMethods(Node *n,
|
|||
for (k = First(vm); k.key; k = Next(k)) {
|
||||
Node *m = Getattr(k.item, "methodNode");
|
||||
/* retrieve the director features */
|
||||
int mdir = checkAttribute(m, "feature:director", "1");
|
||||
int mdir = checkAttribute(m, "feature:director", "1") || director_mode;
|
||||
int mndir = checkAttribute(m, "feature:nodirector", "1");
|
||||
/* 'nodirector' has precedence over 'director' */
|
||||
int dir = (mdir || mndir) ? (mdir && !mndir) : 1;
|
||||
|
|
@ -1769,7 +1785,11 @@ int Language::classDeclaration(Node *n) {
|
|||
|
||||
/* Call classHandler() here */
|
||||
if (!ImportMode) {
|
||||
if (directorsEnabled() && Getattr(n, "feature:director")) {
|
||||
int ndir = checkAttribute(n, "feature:director", "1") || director_mode;
|
||||
int nndir = checkAttribute(n, "feature:nodirector", "1");
|
||||
/* 'nodirector' has precedence over 'director' */
|
||||
int dir = (ndir || nndir) ? (ndir && !nndir) : 1;
|
||||
if (directorsEnabled() && dir) {
|
||||
classDirector(n);
|
||||
}
|
||||
classHandler(n);
|
||||
|
|
@ -1844,10 +1864,13 @@ int Language::classHandler(Node *n) {
|
|||
Node* parentnode = Getattr(method, "parentNode");
|
||||
String* methodname = Getattr(method,"sym:name");
|
||||
String* wrapname = NewStringf("%s_%s", symname,methodname);
|
||||
int need_private = (is_private(method)
|
||||
&& (Cmp(Getattr(method,"storage"),"virtual") == 0)
|
||||
&& (Cmp(Getattr(method,"value"),"0") == 0));
|
||||
if (!Getattr(symbols,wrapname)
|
||||
&& !Cmp(director,"1")
|
||||
&& (n != parentnode)
|
||||
&& is_protected(method)) {
|
||||
&& (is_protected(method) || need_private)) {
|
||||
Node* m = Copy(method);
|
||||
String* mdecl = Getattr(m,"decl");
|
||||
Setattr(m,"parentNode", n);
|
||||
|
|
@ -2375,7 +2398,7 @@ void Language::allow_directors(int val) {
|
|||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
int Language::directorsEnabled() const {
|
||||
return directors && CPlusPlus;
|
||||
return (directors || director_mode) && CPlusPlus;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ static const char *usage1 = (const char*)"\
|
|||
\nGeneral Options\n\
|
||||
-c++ - Enable C++ processing\n\
|
||||
-co - Check a file out of the SWIG library\n\
|
||||
-directors - Turn on director mode for all the classes, mainly for testing \n\
|
||||
-dirprot - Turn on wrapping of protected members for director classes\n\
|
||||
-D<symbol> - Define a symbol <symbol> (for conditional compilation)\n\
|
||||
-E - Preprocess only, does not generate wrapper code\n\
|
||||
|
|
@ -278,9 +279,13 @@ int SWIG_main(int argc, char *argv[], Language *l) {
|
|||
Swig_contract_mode_set(1);
|
||||
Preprocessor_define(vers,0);
|
||||
|
||||
/* Turn on director protected mode */
|
||||
/* Turn off directors mode */
|
||||
Wrapper_director_mode_set(0);
|
||||
Wrapper_director_protected_mode_set(0);
|
||||
|
||||
/* Turn off template extmode */
|
||||
Wrapper_template_extmode_set(0);
|
||||
|
||||
|
||||
// Check for SWIG_LIB environment variable
|
||||
|
||||
|
|
@ -324,10 +329,13 @@ int SWIG_main(int argc, char *argv[], Language *l) {
|
|||
Wrapper_compact_print_mode_set(1);
|
||||
} else if (strcmp(temp, "-fvirtual") == 0) {
|
||||
Wrapper_virtual_elimination_mode_set(1);
|
||||
} else if (strcmp(temp,"-directors") == 0) {
|
||||
Wrapper_director_mode_set(1);
|
||||
Wrapper_director_protected_mode_set(1);
|
||||
} else if (strcmp(temp,"-dirprot") == 0) {
|
||||
Wrapper_director_protected_mode_set(1);
|
||||
Wrapper_director_protected_mode_set(1);
|
||||
} else if (strcmp(temp,"-nodirprot") == 0) {
|
||||
Wrapper_director_protected_mode_set(0);
|
||||
Wrapper_director_protected_mode_set(0);
|
||||
} else if (strcmp(temp, "-small") == 0) {
|
||||
Wrapper_compact_print_mode_set(1);
|
||||
Wrapper_virtual_elimination_mode_set(1);
|
||||
|
|
@ -366,6 +374,10 @@ int SWIG_main(int argc, char *argv[], Language *l) {
|
|||
} else if (strcmp(argv[i],"-fvirtual") == 0) {
|
||||
Wrapper_virtual_elimination_mode_set(1);
|
||||
Swig_mark_arg(i);
|
||||
} else if (strcmp(argv[i],"-directors") == 0) {
|
||||
Wrapper_director_mode_set(1);
|
||||
Wrapper_director_protected_mode_set(1);
|
||||
Swig_mark_arg(i);
|
||||
} else if (strcmp(argv[i],"-dirprot") == 0) {
|
||||
Wrapper_director_protected_mode_set(1);
|
||||
Swig_mark_arg(i);
|
||||
|
|
|
|||
|
|
@ -75,6 +75,9 @@ public:
|
|||
|
||||
SWIG_library_directory("python");
|
||||
|
||||
/* Turn on template extmode */
|
||||
Wrapper_template_extmode_set(1);
|
||||
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if (argv[i]) {
|
||||
if(strcmp(argv[i],"-interface") == 0) {
|
||||
|
|
@ -748,7 +751,7 @@ public:
|
|||
if (/*directorbase &&*/ !constructor && !destructor && isVirtual) {
|
||||
Wrapper_add_local(f, "director", "Swig::Director *director = 0");
|
||||
Printf(f->code, "director = dynamic_cast<Swig::Director *>(arg1);\n");
|
||||
if (dirprot_mode() && is_protected(n)) {
|
||||
if (dirprot_mode() && !is_public(n)) {
|
||||
Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name);
|
||||
Printf(f->code, "PyErr_SetString(PyExc_RuntimeError,\"accessing protected member %s\");\n", name);
|
||||
Printf(f->code, "SWIG_fail;\n");
|
||||
|
|
@ -1394,7 +1397,7 @@ public:
|
|||
String *pyname = Getattr(n,"sym:name");
|
||||
|
||||
/* pass the method call on to the Python object */
|
||||
if (dirprot_mode() && is_protected(n))
|
||||
if (dirprot_mode() && !is_public(n))
|
||||
Printf(w->code, "swig_set_inner(\"%s\", true);\n", name);
|
||||
|
||||
if (Len(parse_args) > 0) {
|
||||
|
|
@ -1403,7 +1406,7 @@ public:
|
|||
Printf(w->code, "result = PyObject_CallMethod(swig_get_self(), \"%s\", NULL);\n", pyname);
|
||||
}
|
||||
Printv(xdecref, "Py_XDECREF(result);\n", NULL);
|
||||
if (dirprot_mode() && is_protected(n))
|
||||
if (dirprot_mode() && !is_public(n))
|
||||
Printf(w->code, "swig_set_inner(\"%s\", false);\n", name);
|
||||
|
||||
/* exception handling */
|
||||
|
|
|
|||
|
|
@ -322,7 +322,9 @@ int is_protected(Node* n);
|
|||
int is_member_director(Node* parentnode, Node* member);
|
||||
int is_member_director(Node* member);
|
||||
void Wrapper_virtual_elimination_mode_set(int);
|
||||
void Wrapper_director_mode_set(int);
|
||||
void Wrapper_director_protected_mode_set(int);
|
||||
void Wrapper_template_extmode_set(int);
|
||||
|
||||
|
||||
/* Contracts */
|
||||
|
|
|
|||
|
|
@ -757,9 +757,11 @@ String *SwigType_lcaststr(SwigType *s, const String_or_char *name) {
|
|||
return result;
|
||||
}
|
||||
|
||||
/* keep old mangling since Java codes need it */
|
||||
String *SwigType_manglestr_default(SwigType *s) {
|
||||
String *result,*base,*mbase;
|
||||
SwigType *lt, *ltp;
|
||||
char *c;
|
||||
String *result,*base;
|
||||
SwigType *lt;
|
||||
SwigType *ss = 0;
|
||||
|
||||
if (SwigType_istemplate(s)) {
|
||||
|
|
@ -767,11 +769,14 @@ String *SwigType_manglestr_default(SwigType *s) {
|
|||
s = ss;
|
||||
}
|
||||
lt = SwigType_ltype(s);
|
||||
ltp = SwigType_prefix(lt);
|
||||
result = SwigType_prefix(lt);
|
||||
base = SwigType_base(lt);
|
||||
|
||||
result = Swig_string_mangle(ltp);
|
||||
|
||||
c = Char(result);
|
||||
while (*c) {
|
||||
if (!isalnum((int)*c)) *c = '_';
|
||||
c++;
|
||||
}
|
||||
if (SwigType_istemplate(base)) {
|
||||
String *b = SwigType_namestr(base);
|
||||
Delete(base);
|
||||
|
|
@ -782,13 +787,23 @@ String *SwigType_manglestr_default(SwigType *s) {
|
|||
Replace(base,"class ","", DOH_REPLACE_ANY);
|
||||
Replace(base,"union ","", DOH_REPLACE_ANY);
|
||||
|
||||
mbase = Swig_string_mangle(base);
|
||||
Append(result,mbase);
|
||||
c = Char(base);
|
||||
while (*c) {
|
||||
if (*c == '<') *c = 'T';
|
||||
else if (*c == '>') *c = 't';
|
||||
else if (*c == '*') *c = 'p';
|
||||
else if (*c == '[') *c = 'a';
|
||||
else if (*c == ']') *c = 'A';
|
||||
else if (*c == '&') *c = 'R';
|
||||
else if (*c == '(') *c = 'f';
|
||||
else if (*c == ')') *c = 'F';
|
||||
else if (!isalnum((int)*c)) *c = '_';
|
||||
c++;
|
||||
}
|
||||
Append(result,base);
|
||||
Insert(result,0,"_");
|
||||
Delete(lt);
|
||||
Delete(ltp);
|
||||
Delete(base);
|
||||
Delete(mbase);
|
||||
if (ss) Delete(ss);
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -501,6 +501,8 @@ extern void Swig_fragment_emit(String *name);
|
|||
|
||||
/* hacks defined in C++ ! */
|
||||
extern int Swig_need_protected();
|
||||
extern int Swig_director_mode();
|
||||
extern int Swig_template_extmode();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue