implement the naturalvar feature for global vars in java and csharp, implement the 'allowexcept' feature for global variables

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@8578 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2006-01-28 02:39:24 +00:00
commit 79dc4cb64a
2 changed files with 57 additions and 31 deletions

View file

@ -59,6 +59,7 @@ static Node *CurrentClass = 0;
int line_number = 0;
char *input_file = 0;
int SmartPointer = 0;
static Hash *classhash;
extern int GenerateDefault;
extern int ForceExtern;
@ -373,6 +374,31 @@ void swig_pragma(char *lang, char *name, char *value) {
}
}
/* --------------------------------------------------------------------------
* swig_pragma()
*
* Handle swig pragma directives.
* -------------------------------------------------------------------------- */
int use_naturalvar_mode(Node *n) {
if (Getattr(n,"unnamed")) return 0;
int nvar = naturalvar_mode || GetFlag(n, "feature:naturalvar");
if (!nvar) {
/* look for feature in the class */
SwigType *ty = Getattr(n,"type");
if (SwigType_isclass(ty)) {
SwigType *rty = SwigType_typedef_resolve_all(ty);
SwigType *qty = SwigType_typedef_qualified(rty);
Node *cn = classhash ? Getattr(classhash,qty) : 0;
if (cn) {
nvar = GetFlag(cn,"feature:naturalvar");
}
Delete(rty);
Delete(qty);
}
}
return nvar ? CWRAP_NATURAL_VAR : 0;
}
/* ----------------------------------------------------------------------
* Language::top() - Top of parsing tree
* ---------------------------------------------------------------------- */
@ -389,7 +415,8 @@ int Language::top(Node *n) {
naturalvar_mode = 0;
}
}
}
}
classhash = Getattr(n,"classes");
return emit_children(n);
}
@ -1168,6 +1195,25 @@ Language::staticmemberfunctionHandler(Node *n) {
int
Language::variableHandler(Node *n) {
/* If not a smart-pointer access or added method. We clear
feature:except. There is no way C++ or C would throw
an exception merely for accessing a member data.
Caveat: Some compilers seem to route attribute access through
methods which can generate exceptions. The feature:allowexcept
allows this. Also, the feature:exceptvar can be used to match
only variables.
*/
if (!(Extend | SmartPointer)) {
if (GetFlag(n,"feature:allowexcept")) {
UnsetFlag(n,"feature:except");
}
if (Getattr(n,"feature:exceptvar")) {
Setattr(n,"feature:except",Getattr(n,"feature:exceptvar"));
}
}
if (!CurrentClass) {
globalvariableHandler(n);
} else {
@ -1216,19 +1262,6 @@ Language::membervariableHandler(Node *n) {
String *symname = Getattr(n,"sym:name");
SwigType *type = Getattr(n,"type");
/* If not a smart-pointer access or added method. We clear
feature:except. There is no way C++ or C would throw
an exception merely for accessing a member data.
Caveat: Some compilers seem to route attribute access through
methods which can generate exceptions. The feature:allowexcept
allows this.
*/
if (!(Extend | SmartPointer) && (!GetFlag(n,"feature:allowexcept"))) {
UnsetFlag(n,"feature:except");
}
if (!AttributeFunctionGet) {
String *mname = Swig_name_member(ClassPrefix, symname);
String *mrename_get = Swig_name_get(mname);
@ -1267,11 +1300,7 @@ Language::membervariableHandler(Node *n) {
}
tm = Swig_typemap_lookup_new("memberin",n,target,0);
}
int flags = Extend | SmartPointer;
if ((naturalvar_mode || GetFlag(n,"feature:naturalvar")) && !Getattr(n,"unnamed")) {
flags |= CWRAP_NATURAL_VAR;
}
int flags = Extend | SmartPointer | use_naturalvar_mode(n);
Swig_MembersetToFunction(n,ClassType, flags);
Setattr(n,"memberset", "1");
@ -1318,11 +1347,7 @@ Language::membervariableHandler(Node *n) {
}
/* Emit get function */
{
int flags = Extend | SmartPointer;
if ((naturalvar_mode || GetFlag(n,"feature:naturalvar")) && !Getattr(n,"unnamed")) {
flags |= CWRAP_NATURAL_VAR;
}
int flags = Extend | SmartPointer | use_naturalvar_mode(n);
Swig_MembergetToFunction(n,ClassType, flags);
Setattr(n,"sym:name", mrename_get);
Setattr(n,"memberget", "1");
@ -1383,10 +1408,8 @@ Language::staticmembervariableHandler(Node *n)
{
Swig_require("staticmembervariableHandler",n,"*name","*sym:name","*type", "?value", NIL);
String *value = Getattr(n,"value");
SwigType *type = SwigType_typedef_resolve_all(Getattr(n,"type"));
String *classname = !SmartPointer ? ClassName : Getattr(CurrentClass,"allocate:smartpointerbase");
if (!value || !(SwigType_isconst(type))) {
if (!value || !Getattr(n,"hasconsttype")) {
String *name = Getattr(n,"name");
String *symname = Getattr(n,"sym:name");
String *cname, *mrename;
@ -1427,7 +1450,7 @@ Language::staticmembervariableHandler(Node *n)
in which there's no actual Foo::x variable to refer to. In this case,
the best we can do is to wrap the given value verbatim.
*/
*/
String *name = Getattr(n,"name");
@ -1451,7 +1474,6 @@ Language::staticmembervariableHandler(Node *n)
Delete(cname);
}
Delete(type);
Swig_restore(n);
return SWIG_OK;
}
@ -2626,11 +2648,12 @@ int Language::variableWrapper(Node *n) {
/* If no way to set variables. We simply create functions */
int assignable = is_assignable(n);
int flags = use_naturalvar_mode(n);
if (assignable) {
int make_set_wrapper = 1;
String *tm = Swig_typemap_lookup_new("globalin", n, name, 0);
Swig_VarsetToFunction(n);
Swig_VarsetToFunction(n, flags);
String *sname = Swig_name_set(symname);
Setattr(n,"sym:name", sname);
Delete(sname);
@ -2667,7 +2690,7 @@ int Language::variableWrapper(Node *n) {
Delattr(n, ki.key);
}
}
Swig_VargetToFunction(n);
Swig_VargetToFunction(n, flags);
String *gname = Swig_name_get(symname);
Setattr(n,"sym:name", gname);
Delete(gname);

View file

@ -319,6 +319,7 @@ int emit_isvarargs(ParmList *);
void emit_attach_parmmaps(ParmList *, Wrapper *f);
void emit_mark_varargs(ParmList *l);
void emit_action(Node *n, Wrapper *f);
int emit_action_code(Node *n, Wrapper *f, String *action);
void Swig_overload_check(Node *n);
String *Swig_overload_dispatch(Node *n, const String_or_char *fmt, int *);
String *Swig_overload_dispatch_cast(Node *n, const String_or_char *fmt, int *);
@ -349,6 +350,8 @@ int is_private(Node* n);
int is_protected(Node* n);
int is_member_director(Node* parentnode, Node* member);
int is_member_director(Node* member);
int use_naturalvar_mode(Node *n);
void Wrapper_virtual_elimination_mode_set(int);
void Wrapper_director_mode_set(int);
void Wrapper_director_protected_mode_set(int);