diff --git a/Source/DOH/base.c b/Source/DOH/base.c index a5063389d..6fddeaee0 100644 --- a/Source/DOH/base.c +++ b/Source/DOH/base.c @@ -214,7 +214,8 @@ DohGetattr(DOH *obj, const DOH *name) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_hash && objinfo->doh_hash->doh_getattr) { - return (objinfo->doh_hash->doh_getattr)(b,(DOH *) name); + DOH *r = (objinfo->doh_hash->doh_getattr)(b,(DOH *) name); + return (r == DohNone) ? 0 : r; } return 0; } diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index ae9d887eb..5a4b8d66e 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -433,11 +433,11 @@ class CSHARP : public Language { if (!addSymbol(wrapname,n)) return SWIG_ERROR; if (Getattr(n,"type")) { - Swig_save(&n,"name",NIL); + Swig_save("nativeWrapper",n,"name",NIL); Setattr(n,"name", wrapname); native_function_flag = true; functionWrapper(n); - Swig_restore(&n); + Swig_restore(n); native_function_flag = false; } else { Printf(stderr,"%s : Line %d. No return type for %%native method %s.\n", input_file, line_number, Getattr(n,"wrap:name")); @@ -668,7 +668,7 @@ class CSHARP : public Language { if (Cmp(nodeType(n), "constant") == 0) { // Wrapping a constant hack - Swig_save(&n,"wrap:action",NIL); + Swig_save("functionWrapper",n,"wrap:action",NIL); // below based on Swig_VargetToFunction() SwigType *ty = Swig_wrapped_var_type(Getattr(n,"type")); @@ -680,7 +680,7 @@ class CSHARP : public Language { emit_action(n,f); if (Cmp(nodeType(n), "constant") == 0) - Swig_restore(&n); + Swig_restore(n); /* Return value if necessary */ if(!native_function_flag) { @@ -818,7 +818,7 @@ class CSHARP : public Language { // Add the stripped quotes back in String *new_value = NewString(""); - Swig_save(&n,"value",NIL); + Swig_save("constantWrapper",n,"value",NIL); if(SwigType_type(t) == T_STRING) { Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); @@ -856,7 +856,7 @@ class CSHARP : public Language { else Printv(module_constants_code, constants_code, NIL); - Swig_restore(&n); + Swig_restore(n); Delete(new_value); Delete(shadowrettype); Delete(constants_code); diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 0b67d08e7..33e607969 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -436,11 +436,11 @@ class JAVA : public Language { if (!addSymbol(wrapname,n)) return SWIG_ERROR; if (Getattr(n,"type")) { - Swig_save(&n,"name",NIL); + Swig_save("nativeWrapper",n,"name",NIL); Setattr(n,"name", wrapname); native_function_flag = true; functionWrapper(n); - Swig_restore(&n); + Swig_restore(n); native_function_flag = false; } else { Printf(stderr,"%s : Line %d. No return type for %%native method %s.\n", input_file, line_number, Getattr(n,"wrap:name")); @@ -673,7 +673,7 @@ class JAVA : public Language { if (Cmp(nodeType(n), "constant") == 0) { // Wrapping a constant hack - Swig_save(&n,"wrap:action",NIL); + Swig_save("functionWrapper",n,"wrap:action",NIL); // below based on Swig_VargetToFunction() SwigType *ty = Swig_wrapped_var_type(Getattr(n,"type")); @@ -685,7 +685,7 @@ class JAVA : public Language { emit_action(n,f); if (Cmp(nodeType(n), "constant") == 0) - Swig_restore(&n); + Swig_restore(n); /* Return value if necessary */ if(!native_function_flag) { @@ -834,7 +834,7 @@ class JAVA : public Language { // Add the stripped quotes back in String *new_value = NewString(""); - Swig_save(&n,"value",NIL); + Swig_save("constantWrapper",n,"value",NIL); if(SwigType_type(t) == T_STRING) { Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); @@ -876,7 +876,7 @@ class JAVA : public Language { else Printv(module_constants_code, constants_code, NIL); - Swig_restore(&n); + Swig_restore(n); if (is_enum_item) { Delete(Getattr(n,"type")); Setattr(n,"type", original_type); diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index be0a24d7f..cf8666e21 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -397,7 +397,7 @@ int Language::constantDirective(Node *n) { if (CurrentClass && (cplus_mode != CPLUS_PUBLIC)) return SWIG_NOWRAP; if (!ImportMode) { - Swig_require(&n,"name", "?value",NIL); + Swig_require("constantDirective",n,"name", "?value",NIL); String *name = Getattr(n,"name"); String *value = Getattr(n,"value"); if (!value) { @@ -411,7 +411,7 @@ int Language::constantDirective(Node *n) { } Setattr(n,"value", value); this->constantWrapper(n); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } return SWIG_NOWRAP; @@ -671,14 +671,14 @@ int Language::cDeclaration(Node *n) { if (CurrentClass && (cplus_mode != CPLUS_PUBLIC)) return SWIG_NOWRAP; if (Cmp(storage,"typedef") == 0) { - Swig_save(&n,"type",NIL); + Swig_save("cDeclaration",n,"type",NIL); SwigType *t = Copy(type); if (t) { SwigType_push(t,decl); Setattr(n,"type",t); typedefHandler(n); } - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } else if (Cmp(storage,"friend") == 0) { Swig_warning(WARN_LANG_FRIEND_IGNORE, Getfile(n), Getline(n), @@ -830,7 +830,7 @@ Language::functionHandler(Node *n) { int Language::globalfunctionHandler(Node *n) { - Swig_require(&n,"name","sym:name","type","?parms",NIL); + Swig_require("globalfunctionHandler",n,"name","sym:name","type","?parms",NIL); String *name = Getattr(n,"name"); String *symname = Getattr(n,"sym:name"); @@ -839,7 +839,7 @@ Language::globalfunctionHandler(Node *n) { ParmList *parms = Getattr(n,"parms"); if (0 && (Cmp(storage,"static") == 0)) { - Swig_restore(&n); + Swig_restore(n); return SWIG_NOWRAP; /* Can't wrap static functions */ } else { /* Check for callback mode */ @@ -849,7 +849,7 @@ Language::globalfunctionHandler(Node *n) { callbackfunctionHandler(n); if (Cmp(cbname, symname) == 0) { Delete(cbname); - Swig_restore(&n); + Swig_restore(n); return SWIG_NOWRAP; } Delete(cbname); @@ -858,7 +858,7 @@ Language::globalfunctionHandler(Node *n) { Setattr(n,"wrap:action", Swig_cresult(type,"result", Swig_cfunction_call(name,parms))); functionWrapper(n); } - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -868,7 +868,7 @@ Language::globalfunctionHandler(Node *n) { int Language::callbackfunctionHandler(Node *n) { - Swig_require(&n,"name","*sym:name","*type","?value",NIL); + Swig_require("callbackfunctionHandler",n,"name","*sym:name","*type","?value",NIL); String *symname = Getattr(n,"sym:name"); String *type = Getattr(n,"type"); String *name = Getattr(n,"name"); @@ -887,7 +887,7 @@ Language::callbackfunctionHandler(Node *n) { Delete(cbname); Delete(cbty); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -898,7 +898,7 @@ Language::callbackfunctionHandler(Node *n) { int Language::memberfunctionHandler(Node *n) { - Swig_require(&n,"*name","*sym:name","*type","?parms","?value",NIL); + Swig_require("memberfunctionHandler",n,"*name","*sym:name","*type","?parms","?value",NIL); String *storage = Getattr(n,"storage"); String *name = Getattr(n,"name"); @@ -938,7 +938,7 @@ Language::memberfunctionHandler(Node *n) { Delete(cbty); Delete(cbname); if (Cmp(cbname,symname) == 0) { - Swig_restore(&n); + Swig_restore(n); return SWIG_NOWRAP; } } @@ -951,7 +951,7 @@ Language::memberfunctionHandler(Node *n) { /* DelWrapper(w);*/ Delete(fname); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -962,8 +962,8 @@ Language::memberfunctionHandler(Node *n) { int Language::staticmemberfunctionHandler(Node *n) { - Swig_require(&n,"*name","*sym:name","*type",NIL); - Swig_save(&n,"storage",NIL); + Swig_require("staticmemberfunctionHandler",n,"*name","*sym:name","*type",NIL); + Swig_save("staticmemberfunctionHandler",n,"storage",NIL); String *name = Getattr(n,"name"); String *symname = Getattr(n,"sym:name"); SwigType *type = Getattr(n,"type"); @@ -995,7 +995,7 @@ Language::staticmemberfunctionHandler(Node *n) { Delete(cname); Delete(mrename); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1039,8 +1039,8 @@ Language::globalvariableHandler(Node *n) { int Language::membervariableHandler(Node *n) { - Swig_require(&n,"*name","*sym:name","*type",NIL); - Swig_save(&n,"parms",NIL); + Swig_require("membervariableHandler",n,"*name","*sym:name","*type",NIL); + Swig_save("membervariableHandler",n,"parms",NIL); String *name = Getattr(n,"name"); String *symname = Getattr(n,"sym:name"); @@ -1151,7 +1151,7 @@ Language::membervariableHandler(Node *n) { ActionFunc = 0; #endif } - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1162,7 +1162,7 @@ Language::membervariableHandler(Node *n) { int Language::staticmembervariableHandler(Node *n) { - Swig_require(&n,"*name","*sym:name","*type", "?value", NIL); + Swig_require("staticmembervariableHandler",n,"*name","*sym:name","*type", "?value", NIL); String *value = Getattr(n,"value"); if (!value) { String *name = Getattr(n,"name"); @@ -1197,7 +1197,7 @@ Language::staticmembervariableHandler(Node *n) Delete(cname); } - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1228,7 +1228,7 @@ int Language::enumDeclaration(Node *n) { int Language::enumvalueDeclaration(Node *n) { if (CurrentClass && (cplus_mode != CPLUS_PUBLIC)) return SWIG_NOWRAP; - Swig_require(&n,"*name", "?value",NIL); + Swig_require("enumvalueDeclaratuon",n,"*name", "?value",NIL); String *value = Getattr(n,"value"); String *name = Getattr(n,"name"); String *tmpValue; @@ -1247,7 +1247,7 @@ int Language::enumvalueDeclaration(Node *n) { } Delete(tmpValue); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1257,7 +1257,7 @@ int Language::enumvalueDeclaration(Node *n) { int Language::memberconstantHandler(Node *n) { - Swig_require(&n,"*name","*sym:name","*value",NIL); + Swig_require("memberconstantHandler",n,"*name","*sym:name","*value",NIL); String *name = Getattr(n,"name"); String *symname = Getattr(n,"sym:name"); @@ -1281,7 +1281,7 @@ int Language::memberconstantHandler(Node *n) { constantWrapper(n); Delete(mrename); Delete(new_value); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1581,7 +1581,7 @@ int Language::classDeclaration(Node *n) { return SWIG_NOWRAP; } - Swig_save(&n,"name",NIL); + Swig_save("classDeclaration",n,"name",NIL); Setattr(n,"name",classname); if (Cmp(kind,"class") == 0) { @@ -1629,7 +1629,7 @@ int Language::classDeclaration(Node *n) { Delete(ClassType); ClassType = 0; Delete(ClassPrefix); ClassPrefix = 0; Delete(ClassName); ClassName = 0; - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1699,7 +1699,7 @@ int Language::constructorDeclaration(Node *n) { if (ImportMode) return SWIG_NOWRAP; /* Name adjustment for %name */ - Swig_save(&n,"sym:name",NIL); + Swig_save("constructorDeclaration",n,"sym:name",NIL); { String *base = Swig_scopename_last(name); @@ -1741,14 +1741,14 @@ int Language::constructorDeclaration(Node *n) { Printf(stdout,"name = '%s', ClassName='%s'\n", name, ClassName); Swig_warning(WARN_LANG_RETURN_TYPE, input_file,line_number,"Function %s must have a return type.\n", name); - Swig_restore(&n); + Swig_restore(n); return SWIG_NOWRAP; } constructorHandler(n); } } Setattr(CurrentClass,"has_constructor","1"); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1758,7 +1758,7 @@ int Language::constructorDeclaration(Node *n) { int Language::constructorHandler(Node *n) { - Swig_require(&n,"?name","*sym:name","?type","?parms",NIL); + Swig_require("constructorHandler",n,"?name","*sym:name","?type","?parms",NIL); String *symname = Getattr(n,"sym:name"); String *mrename; Parm *parms = Getattr(n,"parms"); @@ -1769,7 +1769,7 @@ Language::constructorHandler(Node *n) { Setattr(n,"sym:name", mrename); functionWrapper(n); Delete(mrename); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1779,7 +1779,7 @@ Language::constructorHandler(Node *n) { int Language::copyconstructorHandler(Node *n) { - Swig_require(&n,"?name","*sym:name","?type","?parms", NIL); + Swig_require("copyconstructorHandler",n,"?name","*sym:name","?type","?parms", NIL); String *symname = Getattr(n,"sym:name"); String *mrename; Parm *parms = Getattr(n,"parms"); @@ -1789,7 +1789,7 @@ Language::copyconstructorHandler(Node *n) { Setattr(n,"sym:name", mrename); functionWrapper(n); Delete(mrename); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1803,7 +1803,7 @@ int Language::destructorDeclaration(Node *n) { if (cplus_mode != CPLUS_PUBLIC) return SWIG_NOWRAP; if (ImportMode) return SWIG_NOWRAP; - Swig_save(&n,"name", "sym:name",NIL); + Swig_save("destructorDeclaration",n,"name", "sym:name",NIL); char *c = GetChar(n,"name"); if (c && (*c == '~')) Setattr(n,"name",c+1); @@ -1823,7 +1823,7 @@ int Language::destructorDeclaration(Node *n) { destructorHandler(n); Setattr(CurrentClass,"has_destructor","1"); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1832,8 +1832,8 @@ int Language::destructorDeclaration(Node *n) { * ---------------------------------------------------------------------- */ int Language::destructorHandler(Node *n) { - Swig_require(&n,"?name","*sym:name",NIL); - Swig_save(&n,"type","parms",NIL); + Swig_require("destructorHandler",n,"?name","*sym:name",NIL); + Swig_save("destructorHandler",n,"type","parms",NIL); String *symname = Getattr(n,"sym:name"); String *mrename; @@ -1846,7 +1846,7 @@ int Language::destructorHandler(Node *n) { Setattr(n,"sym:name", mrename); functionWrapper(n); Delete(mrename); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } @@ -1915,7 +1915,7 @@ int Language::constantWrapper(Node *n) { * Language::variableWrapper() * ---------------------------------------------------------------------- */ int Language::variableWrapper(Node *n) { - Swig_require(&n,"*name","*sym:name","*type","?parms",NIL); + Swig_require("variableWrapper",n,"*name","*sym:name","*type","?parms",NIL); String *symname = Getattr(n,"sym:name"); SwigType *type = Getattr(n,"type"); String *name = Getattr(n,"name"); @@ -1952,7 +1952,7 @@ int Language::variableWrapper(Node *n) { Swig_VargetToFunction(n); Setattr(n,"sym:name", Swig_name_get(symname)); functionWrapper(n); - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } diff --git a/Source/Modules/pike.cxx b/Source/Modules/pike.cxx index 5fa11a793..ddc4e83c4 100644 --- a/Source/Modules/pike.cxx +++ b/Source/Modules/pike.cxx @@ -583,7 +583,7 @@ public: virtual int constantWrapper(Node *n) { - Swig_require(&n, "*sym:name", "type", "value", NIL); + Swig_require("constantWrapper",n, "*sym:name", "type", "value", NIL); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); @@ -609,7 +609,7 @@ public: "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); } - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index ec7cbd9d9..66a78c5cb 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -19,7 +19,6 @@ char cvsroot_python_cxx[] = "$Header$"; #include - /********************************************************************************** * * TYPE UTILITY FUNCTIONS @@ -636,7 +635,7 @@ public: int constructor = (!Cmp(nodeType, "constructor")); String *storage = Getattr(n,"storage"); int isVirtual = (Cmp(storage,"virtual") == 0); - + if (Getattr(n,"sym:overloaded")) { overname = Getattr(n,"sym:overname"); } else { @@ -1897,7 +1896,7 @@ public: * to receive the scripting language object (e.g. 'self') * */ - Swig_save(&n,"parms",NIL); + Swig_save("python:constructorHandler",n,"parms",NIL); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; @@ -1919,7 +1918,7 @@ public: shadow = oldshadow; Delattr(n, "wrap:self"); - Swig_restore(&n); + Swig_restore(n); if (!Getattr(n,"sym:nextSibling")) { if (shadow) { diff --git a/Source/Modules/ruby.cxx b/Source/Modules/ruby.cxx index b17d48b53..aeac47044 100644 --- a/Source/Modules/ruby.cxx +++ b/Source/Modules/ruby.cxx @@ -1097,7 +1097,7 @@ public: * --------------------------------------------------------------------- */ virtual int constantWrapper(Node *n) { - Swig_require(&n, "*sym:name", "type", "value", NIL); + Swig_require("constantWrapper",n, "*sym:name", "type", "value", NIL); char *iname = GetChar(n,"sym:name"); SwigType *type = Getattr(n,"type"); @@ -1132,7 +1132,7 @@ public: Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); } - Swig_restore(&n); + Swig_restore(n); return SWIG_OK; } diff --git a/Source/Swig/swig.h b/Source/Swig/swig.h index ba87eb259..58a58a92b 100644 --- a/Source/Swig/swig.h +++ b/Source/Swig/swig.h @@ -337,9 +337,9 @@ extern Node *copyNode(Node *node); extern void Swig_tag_nodes(Node *node, const String_or_char *attrname, DOH *value); -extern int Swig_require(Node **node, ...); -extern int Swig_save(Node **node,...); -extern void Swig_restore(Node **node); +extern int Swig_require(const char *ns, Node *node, ...); +extern int Swig_save(const char *ns, Node *node,...); +extern void Swig_restore(Node *node); /* Debugging of parse trees */ extern void Swig_debug_emit(int); diff --git a/Source/Swig/tree.c b/Source/Swig/tree.c index 7df80420c..3107e4dcf 100644 --- a/Source/Swig/tree.c +++ b/Source/Swig/tree.c @@ -230,33 +230,14 @@ checkAttribute(Node *n, const String_or_char *name, const String_or_char *value) * Swig_require() * ----------------------------------------------------------------------------- */ -#define MAX_SWIG_STACK 256 -static Hash *attr_stack[MAX_SWIG_STACK]; -static Node **nodeptr_stack[MAX_SWIG_STACK]; -static Node *node_stack[MAX_SWIG_STACK]; -static int stackp = 0; -static int stack_direction = 0; - -static void set_direction(int n, int *x) { - if (n == 1) { - set_direction(0,&n); - } else { - if (&n < x) { - stack_direction = -1; /* Stack grows down */ - } else { - stack_direction = 1; /* Stack grows up */ - } - } -} - int -Swig_require(Node **nptr, ...) { +Swig_require(const char *ns, Node *n, ...) { va_list ap; char *name; DOH *obj; - DOH *frame = 0; - Node *n = *nptr; - va_start(ap, nptr); + char temp[512]; + + va_start(ap, n); name = va_arg(ap, char *); while (name) { int newref = 0; @@ -277,80 +258,43 @@ Swig_require(Node **nptr, ...) { } if (!obj) obj = DohNone; if (newref) { - if (!attr_stack[stackp]) { - attr_stack[stackp]= NewHash(); - } - frame = attr_stack[stackp]; - if (Setattr(frame,name,obj)) { - Printf(stderr,"Swig_require('%s'): Warning, attribute '%s' was already saved.\n", nodeType(n), name); - } + /* Save a copy of the attribute */ + strcpy(temp,ns); + strcat(temp,":"); + strcat(temp,name); + Setattr(n,temp,obj); } name = va_arg(ap, char *); } va_end(ap); - if (frame) { - /* This is a sanity check to make sure no one is saving data, but not restoring it */ - if (stackp > 0) { - int e = 0; - if (!stack_direction) set_direction(1,0); - - if (stack_direction < 0) { - if ((((char *) nptr) >= ((char *) nodeptr_stack[stackp-1])) && (n != node_stack[stackp-1])) e = 1; - } else { - if ((((char *) nptr) <= ((char *) nodeptr_stack[stackp-1])) && (n != node_stack[stackp-1])) e = 1; - } - if (e) { - Printf(stderr, -"Swig_require('%s'): Fatal memory management error. If you are seeing this\n\ -message. It means that the target language module is not managing its memory\n\ -correctly. A handler for '%s' probably forgot to call Swig_restore().\n\ -Please report this problem to swig-dev@cs.uchicago.edu.\n", nodeType(n), nodeType(node_stack[stackp-1])); - assert(0); + + /* Save the view */ + { + String *view = Getattr(n,"view"); + if (view) { + if (Strcmp(view,ns) != 0) { + strcpy(temp,ns); + strcat(temp,":view"); + Setattr(n,temp,view); + Setattr(n,"view",ns); } + } else { + Setattr(n,"view",ns); } - nodeptr_stack[stackp] = nptr; - node_stack[stackp] = n; - stackp++; } + return 1; } int -Swig_save(Node **nptr, ...) { +Swig_save(const char *ns, Node *n, ...) { va_list ap; char *name; DOH *obj; - DOH *frame; - Node *n = *nptr; + char temp[512]; - if ((stackp > 0) && (nodeptr_stack[stackp-1] == nptr)) { - frame = attr_stack[stackp-1]; - } else { - if (stackp > 0) { - int e = 0; - if (!stack_direction) set_direction(1,0); - if (stack_direction < 0) { - if ((((char *) nptr) >= ((char *) nodeptr_stack[stackp-1])) && (n != node_stack[stackp-1])) e = 1; - } else { - if ((((char *) nptr) <= ((char *) nodeptr_stack[stackp-1])) && (n != node_stack[stackp-1])) e = 1; - } - if (e) { - Printf(stderr, -"Swig_save('%s'): Fatal memory management error. If you are seeing this\n\ -message. It means that the target language module is not managing its memory\n\ -correctly. A handler for '%s' probably forgot to call Swig_restore().\n\ -Please report this problem to swig-dev@cs.uchicago.edu.\n", nodeType(n), nodeType(node_stack[stackp-1])); - assert(0); - } - } - attr_stack[stackp] = NewHash(); - nodeptr_stack[stackp] = nptr; - node_stack[stackp] = n; - frame = attr_stack[stackp]; - stackp++; - } - va_start(ap, nptr); + va_start(ap, n); name = va_arg(ap, char *); while (name) { if (*name == '*') { @@ -362,40 +306,60 @@ Please report this problem to swig-dev@cs.uchicago.edu.\n", nodeType(n), nodeTyp if (!obj) { obj = DohNone; } - if (Setattr(frame,name,obj)) { - Printf(stderr,"Swig_save('%s'): Warning, attribute '%s' was already saved.\n", nodeType(n), name); + strcpy(temp,ns); + strcat(temp,":"); + strcat(temp,name); + if (Setattr(n,temp,obj)) { + Printf(stderr,"Swig_save('%s','%s'): Warning, attribute '%s' was already saved.\n", ns, nodeType(n), name); } name = va_arg(ap, char *); } va_end(ap); + + /* Save the view */ + { + String *view = Getattr(n,"view"); + if (view) { + if (Strcmp(view,ns) != 0) { + strcpy(temp,ns); + strcat(temp,":view"); + Setattr(n,temp,view); + Setattr(n,"view",ns); + } + } else { + Setattr(n,"view",ns); + } + } + return 1; } void -Swig_restore(Node **nptr) { +Swig_restore(Node *n) { String *key; - Hash *frame; - Node *n = *nptr; - assert(stackp > 0); - if (!(nptr==nodeptr_stack[stackp-1])) { - Printf(stderr, -"Swig_restore('%s'): Fatal memory management error. If you are seeing this\n\ -message. It means that the target language module is not managing its memory\n\ -correctly. A handler for '%s' probably forgot to call Swig_restore().\n\ -Please report this problem to swig-dev@cs.uchicago.edu.\n", nodeType(n), nodeType(node_stack[stackp-1])); - assert(0); - } - stackp--; - frame = attr_stack[stackp]; - nodeptr_stack[stackp] = 0; - node_stack[stackp] = 0; - for (key = Firstkey(frame); key; key = Nextkey(frame)) { - DOH *obj = Getattr(frame,key); - if (obj != DohNone) { - Setattr(n,key,obj); - } else { - Delattr(n,key); + char temp[512]; + int len; + List *l; + String *ns; + + ns = Getattr(n,"view"); + assert(ns); + + l = NewList(); + + strcpy(temp,Char(ns)); + strcat(temp,":"); + len = strlen(temp); + + for (key = Firstkey(n); key; key = Nextkey(n)) { + if (Strncmp(temp,key,len) == 0) { + Append(l,key); } - Delattr(frame,key); } + for (key = Firstitem(l); key; key = Nextitem(l)) { + DOH *obj = Getattr(n,key); + Setattr(n,Char(key)+len,obj); + Delattr(n,key); + } + Delete(l); }