From ba1e3f9ee3ece616f72e7d7014fe3b73a6dad494 Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Mon, 30 Jan 2006 22:22:13 +0000 Subject: [PATCH] add fragment warning and fixes git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8645 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Lib/python/std_wiostream.i | 2 ++ Lib/std/std_multimap.i | 2 +- Source/Include/swigwarn.h | 3 +++ Source/Modules/emit.cxx | 6 +++++- Source/Swig/fragment.c | 34 ++++++++++++++++++++++------------ Source/Swig/typemap.c | 12 ++++++++++-- 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/Lib/python/std_wiostream.i b/Lib/python/std_wiostream.i index eb1a155f9..d3a5ee785 100644 --- a/Lib/python/std_wiostream.i +++ b/Lib/python/std_wiostream.i @@ -5,4 +5,6 @@ namespace std %callback(1) wflush; } +%include +%include %include diff --git a/Lib/std/std_multimap.i b/Lib/std/std_multimap.i index b0a770bc1..0cf46a962 100644 --- a/Lib/std/std_multimap.i +++ b/Lib/std/std_multimap.i @@ -62,7 +62,7 @@ namespace std { %fragment(SWIG_Traits_frag(std::multimap<_Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair<_Key, _Tp >), - fragment="StdMultiapTraits") { + fragment="StdMultimapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; diff --git a/Source/Include/swigwarn.h b/Source/Include/swigwarn.h index 5eaa8d682..2a1ebdc59 100644 --- a/Source/Include/swigwarn.h +++ b/Source/Include/swigwarn.h @@ -158,6 +158,9 @@ #define WARN_TYPEMAP_TYPECHECK_UNDEF 472 #define WARN_TYPEMAP_DIRECTOROUT_PTR 473 +/* -- Fragments -- */ +#define WARN_FRAGMENT_NOT_FOUND 490 + /* -- General code generation -- */ #define WARN_LANG_OVERLOAD_DECL 501 diff --git a/Source/Modules/emit.cxx b/Source/Modules/emit.cxx index e32f4aea8..c43162410 100644 --- a/Source/Modules/emit.cxx +++ b/Source/Modules/emit.cxx @@ -374,7 +374,11 @@ void emit_action(Node *n, Wrapper *f) { c = Char(t); tok = strtok(c,","); while (tok) { - Swig_fragment_emit(tok); + String *fname = NewString(tok); + Setfile(fname, Getfile(n)); + Setline(fname, Getline(n)); + Swig_fragment_emit(fname); + Delete(fname); tok = strtok(NULL,","); } Delete(t); diff --git a/Source/Swig/fragment.c b/Source/Swig/fragment.c index 2793a5915..f5ab462d3 100644 --- a/Source/Swig/fragment.c +++ b/Source/Swig/fragment.c @@ -18,6 +18,7 @@ char cvsroot_fragment_c[] = "$Header$"; #include "swig.h" #include "swigkeys.h" +#include "swigwarn.h" static Hash *fragments = 0; static Hash *looking_fragments = 0; @@ -89,7 +90,11 @@ Swig_fragment_emit(Node *n) { String *name = 0; String *type = 0; - if (!fragments) return; + if (!fragments) { + Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name); + return; + } + name = Getattr(n,k_value); if (!name) { @@ -139,19 +144,24 @@ Swig_fragment_emit(Node *n) { Delattr(looking_fragments,name); } } - } else { - if (code && type) { - SwigType *rtype = SwigType_typedef_resolve_all(type); - if (!Equal(type,rtype)) { - String *name = Copy(Getattr(n,k_value)); - Append(name,rtype); - Swig_fragment_emit(name); - Delete(name); - } - Delete(rtype); - } + } else if (!code && type) { + SwigType *rtype = SwigType_typedef_resolve_all(type); + if (!Equal(type,rtype)) { + String *name = Copy(Getattr(n,k_value)); + String *mangle = Swig_string_mangle(type); + Append(name,mangle); + Setfile(name, Getfile(n)); + Setline(name, Getline(n)); + Swig_fragment_emit(name); + Delete(mangle); + Delete(name); + } + Delete(rtype); } + if (!code) { + Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name); + } tok = pc ? pc + 1 : 0; if (tok) { pc = char_index(tok,','); diff --git a/Source/Swig/typemap.c b/Source/Swig/typemap.c index 23b14298d..495fdf732 100644 --- a/Source/Swig/typemap.c +++ b/Source/Swig/typemap.c @@ -1358,7 +1358,11 @@ Printf(stdout, "Swig_typemap_lookup %s [%s %s]\n", op, type, pname ? pname : "NO sprintf(temp,"%s:fragment", cop); f = Getattr(node,tmop_name(temp)); if (f) { - Swig_fragment_emit(f); + String *fname = Copy(f); + Setfile(fname, Getfile(node)); + Setline(fname, Getline(node)); + Swig_fragment_emit(fname); + Delete(fname); } } @@ -1433,7 +1437,11 @@ Swig_typemap_emit_code_fragments(const String_or_char *op, Parm *p) { String *temp = NewStringf("%s:fragment",op); String *f = Getattr(p,tmop_name(temp)); if (f) { - Swig_fragment_emit(f); + String *fname = Copy(f); + Setfile(fname, Getfile(p)); + Setline(fname, Getline(p)); + Swig_fragment_emit(fname); + Delete(fname); } Delete(temp); }