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:
parent
d9bd8fff41
commit
79dc4cb64a
2 changed files with 57 additions and 31 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue