Add support for thread_local when specified with other legitimate storage class specifiers - extern and static
This commit is contained in:
parent
c6bc7b881f
commit
b725625e6f
15 changed files with 145 additions and 24 deletions
|
|
@ -771,7 +771,7 @@ Allocate():
|
|||
/* Check to see if this is a static member or not. If so, we add an attribute
|
||||
cplus:staticbase that saves the current class */
|
||||
|
||||
if (checkAttribute(n, "storage", "static")) {
|
||||
if (Swig_storage_isstatic(n)) {
|
||||
Setattr(n, "cplus:staticbase", inclass);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -307,7 +307,7 @@ int Contracts::cDeclaration(Node *n) {
|
|||
return SWIG_OK;
|
||||
|
||||
if (Getattr(n, "feature:contract"))
|
||||
ret = emit_contract(n, (InClass && !checkAttribute(n, "storage", "static")));
|
||||
ret = emit_contract(n, InClass && !Swig_storage_isstatic(n));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -275,8 +275,8 @@ String *Swig_method_decl(SwigType *rettype, SwigType *decl, const_String_or_char
|
|||
void Swig_director_emit_dynamic_cast(Node *n, Wrapper *f) {
|
||||
// TODO: why is the storage element removed in staticmemberfunctionHandler ??
|
||||
if ((!is_public(n) && (is_member_director(n) || GetFlag(n, "explicitcall"))) ||
|
||||
(is_non_virtual_protected_access(n) && !(checkAttribute(n, "staticmemberfunctionHandler:storage", "static") ||
|
||||
checkAttribute(n, "storage", "static"))
|
||||
(is_non_virtual_protected_access(n) && !(Swig_storage_isstatic_custom(n, "staticmemberfunctionHandler:storage") ||
|
||||
Swig_storage_isstatic(n))
|
||||
&& !Equal(nodeType(n), "constructor"))) {
|
||||
Node *parent = Getattr(n, "parentNode");
|
||||
String *dirname;
|
||||
|
|
|
|||
|
|
@ -1611,7 +1611,7 @@ private:
|
|||
return goComplexConstant(n, type);
|
||||
}
|
||||
|
||||
if (Getattr(n, "storage") && Strcmp(Getattr(n, "storage"), "static") == 0) {
|
||||
if (Swig_storage_isstatic(n)) {
|
||||
return goComplexConstant(n, type);
|
||||
}
|
||||
|
||||
|
|
@ -4860,7 +4860,7 @@ private:
|
|||
|
||||
bool isStatic(Node *n) {
|
||||
String *storage = Getattr(n, "storage");
|
||||
return (storage && (Strcmp(storage, "static") == 0 || Strcmp(storage, "friend") == 0) && (!SmartPointer || !Getattr(n, "allocate:smartpointeraccess")));
|
||||
return (storage && (Swig_storage_isstatic(n) || Strcmp(storage, "friend") == 0) && (!SmartPointer || !Getattr(n, "allocate:smartpointeraccess")));
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -1058,7 +1058,7 @@ int Language::cDeclaration(Node *n) {
|
|||
int Language::functionHandler(Node *n) {
|
||||
String *storage = Getattr(n, "storage");
|
||||
int isfriend = CurrentClass && Cmp(storage, "friend") == 0;
|
||||
int isstatic = CurrentClass && Cmp(storage, "static") == 0 && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"));
|
||||
int isstatic = CurrentClass && Swig_storage_isstatic(n) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"));
|
||||
Parm *p = Getattr(n, "parms");
|
||||
if (GetFlag(n, "feature:del")) {
|
||||
/* the method acts like a delete operator, ie, we need to disown the parameter */
|
||||
|
|
@ -1366,7 +1366,6 @@ int Language::variableHandler(Node *n) {
|
|||
if (!CurrentClass) {
|
||||
globalvariableHandler(n);
|
||||
} else {
|
||||
String *storage = Getattr(n, "storage");
|
||||
Swig_save("variableHandler", n, "feature:immutable", NIL);
|
||||
if (SmartPointer) {
|
||||
/* If a smart-pointer and it's a constant access, we have to set immutable */
|
||||
|
|
@ -1374,7 +1373,7 @@ int Language::variableHandler(Node *n) {
|
|||
SetFlag(n, "feature:immutable");
|
||||
}
|
||||
}
|
||||
if ((Cmp(storage, "static") == 0) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"))) {
|
||||
if (Swig_storage_isstatic(n) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"))) {
|
||||
staticmembervariableHandler(n);
|
||||
} else {
|
||||
membervariableHandler(n);
|
||||
|
|
@ -1428,7 +1427,7 @@ int Language::membervariableHandler(Node *n) {
|
|||
String *target = 0;
|
||||
if (!Extend) {
|
||||
if (SmartPointer) {
|
||||
if (checkAttribute(n, "storage", "static")) {
|
||||
if (Swig_storage_isstatic(n)) {
|
||||
Node *sn = Getattr(n, "cplus:staticbase");
|
||||
String *base = Getattr(sn, "name");
|
||||
target = NewStringf("%s::%s", base, name);
|
||||
|
|
|
|||
|
|
@ -995,7 +995,7 @@ class TypePass:private Dispatcher {
|
|||
String *symname = Getattr(n, "sym:name");
|
||||
while (c) {
|
||||
if (Strcmp(nodeType(c), "cdecl") == 0) {
|
||||
if (!(checkAttribute(c, "storage", "static")
|
||||
if (!(Swig_storage_isstatic(c)
|
||||
|| checkAttribute(c, "storage", "typedef")
|
||||
|| checkAttribute(c, "storage", "friend")
|
||||
|| (Getattr(c, "feature:extend") && !Getattr(c, "code"))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue