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; int line_number = 0;
char *input_file = 0; char *input_file = 0;
int SmartPointer = 0; int SmartPointer = 0;
static Hash *classhash;
extern int GenerateDefault; extern int GenerateDefault;
extern int ForceExtern; 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 * Language::top() - Top of parsing tree
* ---------------------------------------------------------------------- */ * ---------------------------------------------------------------------- */
@ -390,6 +416,7 @@ int Language::top(Node *n) {
} }
} }
} }
classhash = Getattr(n,"classes");
return emit_children(n); return emit_children(n);
} }
@ -1168,6 +1195,25 @@ Language::staticmemberfunctionHandler(Node *n) {
int int
Language::variableHandler(Node *n) { 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) { if (!CurrentClass) {
globalvariableHandler(n); globalvariableHandler(n);
} else { } else {
@ -1216,19 +1262,6 @@ Language::membervariableHandler(Node *n) {
String *symname = Getattr(n,"sym:name"); String *symname = Getattr(n,"sym:name");
SwigType *type = Getattr(n,"type"); 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) { if (!AttributeFunctionGet) {
String *mname = Swig_name_member(ClassPrefix, symname); String *mname = Swig_name_member(ClassPrefix, symname);
String *mrename_get = Swig_name_get(mname); String *mrename_get = Swig_name_get(mname);
@ -1267,11 +1300,7 @@ Language::membervariableHandler(Node *n) {
} }
tm = Swig_typemap_lookup_new("memberin",n,target,0); tm = Swig_typemap_lookup_new("memberin",n,target,0);
} }
int flags = Extend | SmartPointer; int flags = Extend | SmartPointer | use_naturalvar_mode(n);
if ((naturalvar_mode || GetFlag(n,"feature:naturalvar")) && !Getattr(n,"unnamed")) {
flags |= CWRAP_NATURAL_VAR;
}
Swig_MembersetToFunction(n,ClassType, flags); Swig_MembersetToFunction(n,ClassType, flags);
Setattr(n,"memberset", "1"); Setattr(n,"memberset", "1");
@ -1318,11 +1347,7 @@ Language::membervariableHandler(Node *n) {
} }
/* Emit get function */ /* Emit get function */
{ {
int flags = Extend | SmartPointer; int flags = Extend | SmartPointer | use_naturalvar_mode(n);
if ((naturalvar_mode || GetFlag(n,"feature:naturalvar")) && !Getattr(n,"unnamed")) {
flags |= CWRAP_NATURAL_VAR;
}
Swig_MembergetToFunction(n,ClassType, flags); Swig_MembergetToFunction(n,ClassType, flags);
Setattr(n,"sym:name", mrename_get); Setattr(n,"sym:name", mrename_get);
Setattr(n,"memberget", "1"); Setattr(n,"memberget", "1");
@ -1383,10 +1408,8 @@ Language::staticmembervariableHandler(Node *n)
{ {
Swig_require("staticmembervariableHandler",n,"*name","*sym:name","*type", "?value", NIL); Swig_require("staticmembervariableHandler",n,"*name","*sym:name","*type", "?value", NIL);
String *value = Getattr(n,"value"); String *value = Getattr(n,"value");
SwigType *type = SwigType_typedef_resolve_all(Getattr(n,"type"));
String *classname = !SmartPointer ? ClassName : Getattr(CurrentClass,"allocate:smartpointerbase"); String *classname = !SmartPointer ? ClassName : Getattr(CurrentClass,"allocate:smartpointerbase");
if (!value || !(SwigType_isconst(type))) { if (!value || !Getattr(n,"hasconsttype")) {
String *name = Getattr(n,"name"); String *name = Getattr(n,"name");
String *symname = Getattr(n,"sym:name"); String *symname = Getattr(n,"sym:name");
String *cname, *mrename; 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, 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. the best we can do is to wrap the given value verbatim.
*/ */
String *name = Getattr(n,"name"); String *name = Getattr(n,"name");
@ -1451,7 +1474,6 @@ Language::staticmembervariableHandler(Node *n)
Delete(cname); Delete(cname);
} }
Delete(type);
Swig_restore(n); Swig_restore(n);
return SWIG_OK; return SWIG_OK;
} }
@ -2626,11 +2648,12 @@ int Language::variableWrapper(Node *n) {
/* If no way to set variables. We simply create functions */ /* If no way to set variables. We simply create functions */
int assignable = is_assignable(n); int assignable = is_assignable(n);
int flags = use_naturalvar_mode(n);
if (assignable) { if (assignable) {
int make_set_wrapper = 1; int make_set_wrapper = 1;
String *tm = Swig_typemap_lookup_new("globalin", n, name, 0); String *tm = Swig_typemap_lookup_new("globalin", n, name, 0);
Swig_VarsetToFunction(n); Swig_VarsetToFunction(n, flags);
String *sname = Swig_name_set(symname); String *sname = Swig_name_set(symname);
Setattr(n,"sym:name", sname); Setattr(n,"sym:name", sname);
Delete(sname); Delete(sname);
@ -2667,7 +2690,7 @@ int Language::variableWrapper(Node *n) {
Delattr(n, ki.key); Delattr(n, ki.key);
} }
} }
Swig_VargetToFunction(n); Swig_VargetToFunction(n, flags);
String *gname = Swig_name_get(symname); String *gname = Swig_name_get(symname);
Setattr(n,"sym:name", gname); Setattr(n,"sym:name", gname);
Delete(gname); Delete(gname);

View file

@ -319,6 +319,7 @@ int emit_isvarargs(ParmList *);
void emit_attach_parmmaps(ParmList *, Wrapper *f); void emit_attach_parmmaps(ParmList *, Wrapper *f);
void emit_mark_varargs(ParmList *l); void emit_mark_varargs(ParmList *l);
void emit_action(Node *n, Wrapper *f); void emit_action(Node *n, Wrapper *f);
int emit_action_code(Node *n, Wrapper *f, String *action);
void Swig_overload_check(Node *n); void Swig_overload_check(Node *n);
String *Swig_overload_dispatch(Node *n, const String_or_char *fmt, int *); 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 *); 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_protected(Node* n);
int is_member_director(Node* parentnode, Node* member); int is_member_director(Node* parentnode, Node* member);
int is_member_director(Node* member); int is_member_director(Node* member);
int use_naturalvar_mode(Node *n);
void Wrapper_virtual_elimination_mode_set(int); void Wrapper_virtual_elimination_mode_set(int);
void Wrapper_director_mode_set(int); void Wrapper_director_mode_set(int);
void Wrapper_director_protected_mode_set(int); void Wrapper_director_protected_mode_set(int);