From: Marcelo M. <mar...@us...> - 2004-11-01 08:38:32
|
Update of /cvsroot/swig/SWIG/Source/CParse In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1107/Source/CParse Modified Files: cparse.h parser.y templ.c Log Message: fixes for namespaces + class declarations + %template directive Index: parser.y =================================================================== RCS file: /cvsroot/swig/SWIG/Source/CParse/parser.y,v retrieving revision 1.75 retrieving revision 1.76 diff -C2 -d -r1.75 -r1.76 *** parser.y 29 Oct 2004 21:33:31 -0000 1.75 --- parser.y 1 Nov 2004 08:38:08 -0000 1.76 *************** *** 714,717 **** --- 714,813 ---- } + /* If the class name is qualified. We need to create or lookup namespace entries */ + static Node *nspace = 0; + static Node *nspace_inner = 0; + static String *resolve_namespace_class(String *cname) { + nspace = 0; + nspace_inner = 0; + if (Swig_scopename_check(cname)) { + Node *ns; + String *prefix = Swig_scopename_prefix(cname); + String *base = Swig_scopename_last(cname); + if (!prefix) { + /* Use the global scope */ + Symtab *symtab = Swig_symbol_current(); + Node *pn = parentNode(symtab); + while (pn) { + symtab = pn; + pn = parentNode(symtab); + if (!pn) break; + } + Swig_symbol_setscope(symtab); + Namespaceprefix = 0; + nspace = new_node("namespace"); + Setattr(nspace,"symtab", symtab); + nspace_inner = nspace; + return base; + } + /* Try to locate the scope */ + ns = Swig_symbol_clookup(prefix,0); + if (!ns) { + Swig_error(cparse_file,cparse_line,"Undefined scope '%s'\n", prefix); + } else { + if (Strcmp(nodeType(ns),"namespace") != 0) { + Swig_error(cparse_file,cparse_line,"'%s' is not defined as namespace.\n", prefix); + ns = 0; + } else { + Symtab *nscope = Getattr(ns,"symtab"); + String *tname = Swig_symbol_qualifiedscopename(0); + String *nname = Swig_symbol_qualifiedscopename(nscope); + if (tname && (Strcmp(tname,nname) == 0)) { + ns = 0; + cname = base; + } + Delete(tname); + Delete(nname); + } + if (ns) { + List *scopes; + String *sname; + Iterator si; + String *name = NewString(prefix); + scopes = NewList(); + while (name) { + String *base = Swig_scopename_last(name); + String *tprefix = Swig_scopename_prefix(name); + Insert(scopes,0,base); + Delete(name); + name = tprefix; + } + for (si = First(scopes); si.item; si = Next(si)) { + Node *ns1,*ns2; + sname = si.item; + ns1 = Swig_symbol_clookup(sname,0); + assert(ns1); + if (Strcmp(nodeType(ns1),"namespace") == 0) { + if (Getattr(ns1,"alias")) { + ns1 = Getattr(ns1,"namespace"); + } + } else { + assert(0); + } + ns2 = new_node("namespace"); + Setattr(ns2,"name",sname); + Setattr(ns2,"symtab", Getattr(ns1,"symtab")); + add_symbols(ns2); + Swig_symbol_setscope(Getattr(ns1,"symtab")); + Namespaceprefix = Swig_symbol_qualifiedscopename(0); + if (nspace_inner) { + if (Getattr(nspace_inner,"symtab") != Getattr(ns2,"symtab")) { + appendChild(nspace_inner,ns2); + } + } + nspace_inner = ns2; + if (!nspace) nspace = ns2; + } + cname = base; + } + } + Delete(prefix); + } + return cname; + } + + + + + /* Structures for handling code fragments built for nested classes */ *************** *** 2050,2054 **** Parm *p, *tp; Node *n; - Node *nspace = 0, *nspace_inner = 0; Node *tnode = 0; Symtab *tscope = 0; --- 2146,2149 ---- *************** *** 2059,2134 **** tscope = Swig_symbol_current(); /* Get the current scope */ ! /* If the template name is qualified. We need to create or lookup namespace entries */ ! if (Swig_scopename_check($5)) { ! String *prefix, *base; ! Node *ns; ! prefix = Swig_scopename_prefix($5); ! base = Swig_scopename_last($5); ! ! /* Try to locate the scope */ ! ns = Swig_symbol_clookup(prefix,0); ! if (!ns) { ! Swig_error(cparse_file,cparse_line,"Undefined scope '%s'\n", prefix); ! } else { ! if (Strcmp(nodeType(ns),"namespace") != 0) { ! Swig_error(cparse_file,cparse_line,"'%s' is not defined as namespace.\n", prefix); ! ns = 0; ! } else { ! /* Swig_symbol_setscope(Getattr(ns,"symtab")); ! Namespaceprefix = Swig_symbol_qualifiedscopename(0); */ ! } ! } ! ! if (ns && Namespaceprefix) { ! Swig_error(cparse_file,cparse_line, ! "Can't instantiate template '%s' inside namespace '%s'.\n" ! "Suggest moving %%template outside the namespace.\n", $5, Namespaceprefix); ! } ! /* Create namespace nodes to enclose the template declaration */ ! if (ns) { ! List *scopes; ! String *sname; ! Iterator si; ! String *name = NewString(prefix); ! scopes = NewList(); ! while (name) { ! String *tprefix; ! String *base = Swig_scopename_last(name); ! Insert(scopes,0,base); ! tprefix = Swig_scopename_prefix(name); ! Delete(name); ! name = tprefix; ! } ! for (si = First(scopes); si.item; si = Next(si)) { ! Node *ns1,*ns2; ! sname = si.item; ! ns1 = Swig_symbol_clookup(sname,0); ! assert(ns1); ! if (Strcmp(nodeType(ns1),"namespace") == 0) { ! if (Getattr(ns1,"alias")) { ! ns1 = Getattr(ns1,"namespace"); ! } ! } else { ! assert(0); ! } ! ns2 = new_node("namespace"); ! Setattr(ns2,"name",sname); ! Setattr(ns2,"symtab", Getattr(ns1,"symtab")); ! add_symbols(ns2); ! Swig_symbol_setscope(Getattr(ns1,"symtab")); ! Namespaceprefix = Swig_symbol_qualifiedscopename(0); ! if (nspace_inner) { ! appendChild(nspace_inner,ns2); ! } ! nspace_inner = ns2; ! if (!nspace) nspace = ns2; ! } ! $5 = base; ! } ! } ! ! n = Swig_cparse_template_locate($5,$7); /* Patch the argument types to respect namespaces */ --- 2154,2168 ---- tscope = Swig_symbol_current(); /* Get the current scope */ ! /* If the class name is qualified. We need to create or lookup namespace entries */ ! $5 = resolve_namespace_class($5); ! /* ! we use the new namespace entry 'nspace' only to ! emit the template node. The template parameters are ! resolved in the current 'tscope'. ! this is closer to the C++ (typedef) behavior. ! */ ! n = Swig_cparse_template_locate($5,$7,tscope); /* Patch the argument types to respect namespaces */ *************** *** 2140,2154 **** if (ty) { if (template_reduce) { ! SwigType *rty = Swig_symbol_typedef_reduce(ty,0); ! ty = Swig_symbol_type_qualify(rty,0); Setattr(p,"type",ty); Delete(rty); } else { ! ty = Swig_symbol_type_qualify(ty,0); Setattr(p,"type",ty); } } } else { ! value = Swig_symbol_type_qualify(value,0); Setattr(p,"value",value); } --- 2174,2188 ---- if (ty) { if (template_reduce) { ! SwigType *rty = Swig_symbol_typedef_reduce(ty,tscope); ! ty = Swig_symbol_type_qualify(rty,tscope); Setattr(p,"type",ty); Delete(rty); } else { ! ty = Swig_symbol_type_qualify(ty,tscope); Setattr(p,"type",ty); } } } else { ! value = Swig_symbol_type_qualify(value,tscope); Setattr(p,"value",value); } *************** *** 2218,2227 **** } if ($3) { ! Swig_cparse_template_expand(templnode,$3,temparms); Setattr(templnode,"sym:name",$3); } else { static int cnt = 0; String *nname = NewStringf("__dummy_%d__", cnt++); ! Swig_cparse_template_expand(templnode,nname,temparms); Setattr(templnode,"sym:name",nname); if (!Swig_template_extmode()) { --- 2252,2261 ---- } if ($3) { ! Swig_cparse_template_expand(templnode,$3,temparms,tscope); Setattr(templnode,"sym:name",$3); } else { static int cnt = 0; String *nname = NewStringf("__dummy_%d__", cnt++); ! Swig_cparse_template_expand(templnode,nname,temparms,tscope); Setattr(templnode,"sym:name",nname); if (!Swig_template_extmode()) { *************** *** 2645,2648 **** --- 2679,2689 ---- storage_class cpptype idcolon inherit LBRACE { List *bases = 0; + + /* preserve the current scope */ + prev_symtab = Swig_symbol_current(); + + /* If the class name is qualified. We need to create or lookup namespace entries */ + $3 = resolve_namespace_class($3); + class_rename = make_name($3,0); Classprefix = NewString($3); *************** *** 2701,2704 **** --- 2742,2746 ---- Node *p; SwigType *ty; + Symtab *cscope = prev_symtab; Node *am = 0; inclass = 0; *************** *** 2769,2778 **** Setattr($$,"symtab",Swig_symbol_popscope()); - yyrename = NewString(class_rename); Classprefix = 0; ! Namespaceprefix = Swig_symbol_qualifiedscopename(0); ! add_symbols($$); ! add_symbols($9); } --- 2811,2831 ---- Setattr($$,"symtab",Swig_symbol_popscope()); Classprefix = 0; ! if (nspace) { ! appendChild(nspace_inner,$$); ! Swig_symbol_setscope(Getattr(nspace_inner,"symtab")); ! Namespaceprefix = Swig_symbol_qualifiedscopename(0); ! add_symbols($$); ! $$ = nspace; ! Swig_symbol_setscope(cscope); ! Namespaceprefix = Swig_symbol_qualifiedscopename(0); ! add_symbols($9); ! } else { ! yyrename = NewString(class_rename); ! Namespaceprefix = Swig_symbol_qualifiedscopename(0); ! add_symbols($$); ! add_symbols($9); ! } } *************** *** 2909,2912 **** --- 2962,2982 ---- int error = 0; + /* check if we get a namespace node with a class declaration, and retrieve the class */ + Symtab *cscope = Swig_symbol_current(); + Symtab *sti = 0; + Node *ntop = $6; + Node *ni = ntop; + SwigType *ntype = ni ? nodeType(ni) : 0; + while (ni && Strcmp(ntype,"namespace") == 0) { + sti = Getattr(ni,"symtab"); + ni = firstChild(ni); + ntype = nodeType(ni); + } + if (sti) { + Swig_symbol_setscope(sti); + Namespaceprefix = Swig_symbol_qualifiedscopename(0); + $6 = ni; + } + template_parameters = 0; $$ = $6; *************** *** 3086,3090 **** tparms = SwigType_function_parms(tname); /* add default args from generic template */ ! Swig_cparse_template_defargs(tparms, Getattr(tempn,"templateparms")); Append(fname,"<("); p = tparms; --- 3156,3160 ---- tparms = SwigType_function_parms(tname); /* add default args from generic template */ ! Swig_cparse_template_defargs(tparms, Getattr(tempn,"templateparms"),0); Append(fname,"<("); p = tparms; *************** *** 3125,3128 **** --- 3195,3201 ---- } } + $$ = ntop; + Swig_symbol_setscope(cscope); + Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (error) $$ = 0; } Index: templ.c =================================================================== RCS file: /cvsroot/swig/SWIG/Source/CParse/templ.c,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** templ.c 27 Oct 2004 01:59:20 -0000 1.15 --- templ.c 1 Nov 2004 08:38:20 -0000 1.16 *************** *** 211,215 **** int ! Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms) { List *patchlist, *cpatchlist, *typelist; String *templateargs; --- 211,215 ---- int ! Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *tscope) { List *patchlist, *cpatchlist, *typelist; String *templateargs; *************** *** 365,369 **** Iterator b; for (b = First(bases); b.item; b = Next(b)) { ! String *qn = Swig_symbol_type_qualify(b.item,0); Clear(b.item); Append(b.item,qn); --- 365,369 ---- Iterator b; for (b = First(bases); b.item; b = Next(b)) { ! String *qn = Swig_symbol_type_qualify(b.item,tscope); Clear(b.item); Append(b.item,qn); *************** *** 388,392 **** void ! Swig_cparse_template_defargs(Parm *parms, Parm *targs) { if (Len(parms) < Len(targs)) { Parm *lp = parms; --- 388,392 ---- void ! Swig_cparse_template_defargs(Parm *parms, Parm *targs, Symtab *tscope) { if (Len(parms) < Len(targs)) { Parm *lp = parms; *************** *** 404,408 **** Parm *ta = targs; Parm *p = parms; ! SwigType *nt = Swig_symbol_typedef_reduce(value,0); while(p && ta) { String *name = Getattr(ta,"name"); --- 404,408 ---- Parm *ta = targs; Parm *p = parms; ! SwigType *nt = Swig_symbol_typedef_reduce(value,tscope); while(p && ta) { String *name = Getattr(ta,"name"); *************** *** 413,417 **** ta = nextSibling(ta); } ! cp = NewParm(Swig_symbol_type_qualify(nt,0),0); set_nextSibling(lp,cp); lp = cp; --- 413,417 ---- ta = nextSibling(ta); } ! cp = NewParm(Swig_symbol_type_qualify(nt,tscope),0); set_nextSibling(lp,cp); lp = cp; *************** *** 433,437 **** static Node * ! template_locate(String *name, Parm *tparms) { Node *n; String *tname, *rname = 0; --- 433,437 ---- static Node * ! template_locate(String *name, Parm *tparms, Symtab *tscope) { Node *n; String *tname, *rname = 0; *************** *** 446,455 **** /* Search for generic template */ ! templ = Swig_symbol_clookup_local(name,0); /* Add default values from generic template */ if (templ) { targs = Getattr(templ,"templateparms"); ! Swig_cparse_template_defargs(parms, targs); } --- 446,455 ---- /* Search for generic template */ ! templ = Swig_symbol_clookup(name,0); /* Add default values from generic template */ if (templ) { targs = Getattr(templ,"templateparms"); ! Swig_cparse_template_defargs(parms, targs, tscope); } *************** *** 460,465 **** SwigType *ty = Getattr(p,"type"); if (ty) { ! SwigType *rt = Swig_symbol_typedef_reduce(ty,0); ! SwigType *nt = Swig_symbol_type_qualify(rt,0); Setattr(p,"type",nt); Delete(rt); --- 460,465 ---- SwigType *ty = Getattr(p,"type"); if (ty) { ! SwigType *rt = Swig_symbol_typedef_reduce(ty,tscope); ! SwigType *nt = Swig_symbol_type_qualify(rt,tscope); Setattr(p,"type",nt); Delete(rt); *************** *** 617,623 **** Node * ! Swig_cparse_template_locate(String *name, Parm *tparms) { Node *n = 0; ! n = template_locate(name, tparms); /* this function does what we want for templated classes */ if (n) { --- 617,623 ---- Node * ! Swig_cparse_template_locate(String *name, Parm *tparms, Symtab *tscope) { Node *n = 0; ! n = template_locate(name, tparms, tscope); /* this function does what we want for templated classes */ if (n) { Index: cparse.h =================================================================== RCS file: /cvsroot/swig/SWIG/Source/CParse/cparse.h,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** cparse.h 28 Oct 2004 23:49:40 -0000 1.9 --- cparse.h 1 Nov 2004 08:38:08 -0000 1.10 *************** *** 58,64 **** /* templ.c */ ! extern void Swig_cparse_template_defargs(Parm *parms, Parm *targs); ! extern int Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms); ! extern Node *Swig_cparse_template_locate(String *name, ParmList *tparms); extern void Swig_cparse_debug_templates(int); --- 58,64 ---- /* templ.c */ ! extern void Swig_cparse_template_defargs(Parm *parms, Parm *targs, Symtab *tscope); ! extern int Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *tscope); ! extern Node *Swig_cparse_template_locate(String *name, ParmList *tparms, Symtab *tscope); extern void Swig_cparse_debug_templates(int); |