summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.current5
-rw-r--r--Doc/Devel/internals.html164
-rw-r--r--Doc/Devel/tree.html35
-rw-r--r--Source/DOH/doh.h4
-rw-r--r--Source/DOH/hash.c53
-rw-r--r--Source/DOH/list.c2
-rw-r--r--Source/Modules/lang.cxx2
-rw-r--r--Source/Modules/swigmod.h9
-rw-r--r--Source/Modules/utils.cxx113
-rw-r--r--Source/Swig/error.c35
-rw-r--r--Source/Swig/misc.c1
-rw-r--r--Source/Swig/swig.h4
-rw-r--r--Tools/swig.gdb41
13 files changed, 421 insertions, 47 deletions
diff --git a/CHANGES.current b/CHANGES.current
index 64770055f..ff5b40fb6 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -5,6 +5,11 @@ See the RELEASENOTES file for a summary of changes in each release.
Version 2.0.1 (in progress)
===========================
+2010-09-15: wsfulton
+ A much improved debugging of SWIG source experience is now available and
+ documented in the "Debugging SWIG" section in the Doc/Devel/internals.html
+ file, including a swig.dbg support file for the gdb debugger.
+
2010-09-11: wsfulton
Fix incorrect line number reporting in errors/warnings when a macro
definition ends with '/' and it is not the end of a C comment.
diff --git a/Doc/Devel/internals.html b/Doc/Devel/internals.html
index 6ac3947f7..d24869d10 100644
--- a/Doc/Devel/internals.html
+++ b/Doc/Devel/internals.html
@@ -7,11 +7,6 @@
<center>
<h1>SWIG Internals Manual</h1>
-<b>Thien-Thi Nguyen <br>
-
-<p>
-David M. Beazley <br>
-
</b>
</center>
@@ -45,6 +40,9 @@ David M. Beazley <br>
<li><a name="i5" href="#5">5. C/C++ Wrapper Support Functions</a>
<li><a name="i6" href="#6">6. Symbol Naming Guidelines for Generated C/C++ Code</a>
<li><a name="i7" href="#7">7. Debugging SWIG</a>
+<ul>
+<li><a name="i7.1" href="#7.1">7.1 Debugging DOH Types The Hard Way</a>
+</ul>
</ul>
<a name="1" href="#i1">
@@ -1015,15 +1013,139 @@ In the past SWIG has generated many symbols which flout the standard especially
<a name="7" href="#i7">
<h2>7. Debugging SWIG</h2>
</a>
-Warning. Debugging SWIG is for the very patient.
+
+<p>
+The DOH types used in the SWIG source code are all typedefined to void.
+Consequently, it is impossible for debuggers to automatically extract any information about DOH objects.
+The easiest approach to debugging and viewing the contents of DOH objects is to make a call into one of the family of SWIG print functions from the debugger.
+The "Debugging Functions" section in <a href="tree.html">SWIG Parse Tree Handling</a> lists them.
+It is sometimes easier to debug by placing a few calls to these functions in code of interest and recompile, especially if your debugger cannot easily make calls into functions within a debugged binary.
+</p>
+
+<p>
+The SWIG distribution comes with some additional support for the gdb debugger in the <tt>Tools/swig.gdb</tt> file.
+Follow the instructions in this file for 'installing'.
+This support file provides an easy way to call into some of the family of SWIG print functions via additional user-defined gdb commands.
+Some usage of the <tt>swigprint</tt> and <tt>locswigprint</tt> user-defined commands are demonstrated below.
+</p>
+
+<p>
+More often than not, a parse tree node needs to be examined.
+The session below displays the node <tt>n</tt> in one of the Java language module wrapper functions.
+The <tt>swigprint</tt> method is used to show the symbol name (<tt>symname</tt> - a DOH String type) and the node (<tt>n</tt> - a DOH Hash type).
+</p>
+<blockquote>
+<pre>
+Breakpoint 1, JAVA::functionWrapper (this=0x97ea5f0, n=0xb7d2afc8) at Modules/java.cxx:799
+799 String *symname = Getattr(n, "sym:name");
+(gdb) next
+800 SwigType *t = Getattr(n, "type");
+(gdb) swigprint symname
+Shape_x_set
+(gdb) swigprint n
+Hash(0xb7d2afc8) {
+ 'membervariableHandler:view' : variableHandler,
+ 'feature:except' : 0,
+ 'name' : x,
+ 'ismember' : 1,
+ 'sym:symtab' : Hash(0xb7d2aca8) {......},
+ 'nodeType' : cdecl,
+ 'nextSibling' : Hash(0xb7d2af98) {.............},
+ 'kind' : variable,
+ 'variableHandler:feature:immutable' : &lt;Object 'VoidObj' at 0xb7cfa008&gt;,
+ 'sym:name' : Shape_x_set,
+ 'view' : membervariableHandler,
+ 'membervariableHandler:sym:name' : x,
+ 'membervariableHandler:type' : double,
+ 'membervariableHandler:parms' : &lt;Object 'VoidObj' at 0xb7cfa008&gt;,
+ 'parentNode' : Hash(0xb7d2abc8) {..............................},
+ 'feature:java:enum' : typesafe,
+ 'access' : public,
+ 'parms' : Hash(0xb7cb9408) {......},
+ 'wrap:action' : if (arg1) (arg1)-&gt;x = arg2;,
+ 'type' : void,
+ 'memberset' : 1,
+ 'sym:overname' : __SWIG_0,
+ 'membervariableHandler:name' : x,
+}
+</pre>
+</blockquote>
+
<p>
+Note that all the attributes in the Hash are shown, including the 'sym:name' attribute which was assigned to the <tt>symname</tt> variable.
+</p>
-The DOH types are all typedefined to void.
-Consequently, it is impossible for debuggers to extract any information about DOH objects.
-Most debuggers will be able to display useful variable information when an object is cast to the appropriate type.
-Below are some tips for displaying some of the DOH objects.
-Be sure to compile with compiler optimisations turned off before attempting the casts shown in a debugger window else they are unlikely to work.
-Even displaying the underlying string in a String* doesn't work straight off in all debuggers due to the multiple definition of String as a struct and a void.
+<p>
+Hash types can be shown either expanded or collapsed.
+When a Hash is shown expanded, all the attributes are displayed along with their values, otherwise a '.' replaces each attribute when collapsed.
+Therefore a count of the dots provides the number of attributes within an unexpanded Hash.
+Below shows the 'parms' Hash being displayed with the default Hash expansion of 1, then with 2 provided as the second argument to <tt>swigprint</tt> to expand to two Hash levels in order to view the contents of the collapsed 'nextSibling' Hash.
+</p>
+
+<blockquote>
+<pre>
+(gdb) swigprint 0xb7cb9408
+Hash(0xb7cb9408) {
+ 'name' : self,
+ 'type' : p.Shape,
+ 'self' : 1,
+ 'nextSibling' : Hash(0xb7cb9498) {...},
+ 'hidden' : 1,
+ 'nodeType' : parm,
+}
+(gdb) swigprint 0xb7cb9408 2
+Hash(0xb7cb9408) {
+ 'name' : self,
+ 'type' : p.Shape,
+ 'self' : 1,
+ 'nextSibling' : Hash(0xb7cb9498) {
+ 'name' : x,
+ 'type' : double,
+ 'nodeType' : parm,
+ },
+ 'hidden' : 1,
+ 'nodeType' : parm,
+}
+</pre>
+</blockquote>
+
+<p>
+The same Hash can also be displayed with file and line location information via the <tt>locswigprint</tt> command.
+</p>
+
+<blockquote>
+<pre>
+(gdb) locswigprint 0xb7cb9408
+example.h:11: [Hash(0xb7cb9408) {
+Hash(0xb7cb9408) {
+ 'name' : self,
+ 'type' : p.Shape,
+ 'self' : 1,
+ 'nextSibling' : Hash(0xb7cb9498) {...},
+ 'hidden' : 1,
+ 'nodeType' : parm,
+}]
+</pre>
+</blockquote>
+
+<p>
+<b>Tip</b>: Commands in gdb can be shortened with whatever makes them unique and can be command completed with the tab key.
+Thus <tt>swigprint</tt> can usually be shortened to <tt>sw</tt> and <tt>locswigprint</tt> to <tt>loc</tt>.
+The help for each command can also be obtained within the debugging session, for example, 'help swigprint'.
+</p>
+
+<p>
+The sub-section below gives pointers for debugging DOH objects using casts and provides an insight into why it can be hard to debug SWIG without the family of print functions.
+<p>
+
+<a name="7.1" href="#i7.1">
+<h3>7.1 Debugging DOH Types The Hard Way</h3>
+</a>
+The DOH types used in SWIG are all typedefined to void and hence the lack of type information for inspecting types within a debugger.
+Most debuggers will however be able to display useful variable information when an object is cast to the appropriate type.
+Getting at the underlying C string within DOH types is cumbersome, but possible with appropriate casts.
+The casts below can be used in a debugger windows, but be sure to compile with compiler optimisations turned off before attempting the casts else they are unlikely to work.
+Even displaying the underlying string in a String * doesn't work straight off in all debuggers due to the multiple definitions of String as a struct and a void.
<p>
Below are a list of common SWIG types.
@@ -1033,36 +1155,30 @@ With each is the cast that can be used in the debugger to extract the underlying
<p>
<li>String *s;</li>
-<br>
-(struct String *)((DohBase *)s)-&gt;data
+<tt>(struct String *)((DohBase *)s)-&gt;data</tt>
<br>
The underlying char * string can be displayed with
<br>
-(*(struct String *)(((DohBase *)s)-&gt;data)).str
+<tt>(*(struct String *)(((DohBase *)s)-&gt;data)).str</tt>
<p>
<li>SwigType *t;</li>
-<br>
-(struct String *)((DohBase *)t)-&gt;data
+<tt>(struct String *)((DohBase *)t)-&gt;data</tt>
<br>
The underlying char * string can be displayed with
<br>
-(*(struct String *)(((DohBase *)t)-&gt;data)).str
+<tt>(*(struct String *)(((DohBase *)t)-&gt;data)).str</tt>
<p>
<li>const_String_or_char_ptr sc;</li>
Either <br>
-(*(struct String *)(((DohBase *)sc)-&gt;data)).str
+<tt>(*(struct String *)(((DohBase *)sc)-&gt;data)).str</tt>
<br> or <br>
-(char *)sc
+<tt>(char *)sc</tt>
<br> will work depending on whether the underlying type is really a String * or char *.
</ul>
-<p>
-Please also read the Debugging Functions section in <a href="tree.html">SWIG Parse Tree Handling</a> for the <tt>Swig_print_node()</tt>, <tt>Swig_print_tree()</tt> and <tt>Swig_print_tags()</tt> functions for displaying node contents. It is often easier to place a few calls to these functions in code of interest and recompile than use the debugger.
-</p>
-
<hr>
Copyright (C) 1999-2010 SWIG Development Team.
diff --git a/Doc/Devel/tree.html b/Doc/Devel/tree.html
index 43ad191f6..db3c6fee4 100644
--- a/Doc/Devel/tree.html
+++ b/Doc/Devel/tree.html
@@ -6,13 +6,6 @@
<body>
<center>
<h1>SWIG Parse Tree Handling</h1>
-
-<p>
-David M. Beazley <br>
-dave-swig@dabeaz.com<br>
-December, 2006<br>
-
-</b>
</center>
<h2>Introduction</h2>
@@ -210,7 +203,33 @@ This function restores a node to the state it was in prior to the last <tt>Swig_
<h2>Debugging Functions</h2>
-The following functions are used to help debug SWIG parse trees.
+<p>
+The following functions can be used to help debug any SWIG DOH object.
+</p>
+
+<b><tt>void Swig_print(DOH *object, int count = -1)</tt></b>
+
+<blockquote>
+Prints to stdout a string representation of any DOH type.
+The number of nested Hash types to expand is set by count (default is 1 if count&lt;0). See Swig_set_max_hash_expand() to change default.
+<pre>
+</pre>
+</blockquote>
+
+<b><tt>void Swig_print_with_location(DOH *object, int count = -1)</tt></b>
+
+<blockquote>
+Prints to stdout a string representation of any DOH type, within [] brackets
+for Hash and List types, prefixed by line and file information.
+The number of nested Hash types to expand is set by count (default is 1 if count&lt;0). See Swig_set_max_hash_expand() to change default.
+<pre>
+</pre>
+</blockquote>
+
+
+<p>
+The following functions can be used to help debug SWIG parse trees.
+</p>
<p>
<b><tt>void Swig_print_tags(Node *node, String_or_char *prefix)</tt></b>
diff --git a/Source/DOH/doh.h b/Source/DOH/doh.h
index e46d103de..6fa352547 100644
--- a/Source/DOH/doh.h
+++ b/Source/DOH/doh.h
@@ -267,6 +267,8 @@ extern int DohIsSequence(const DOH *obj);
extern int DohIsString(const DOH *obj);
extern int DohIsFile(const DOH *obj);
+extern void DohSetMaxHashExpand(int count);
+extern int DohGetMaxHashExpand(void);
extern void DohSetmark(DOH *obj, int x);
extern int DohGetmark(DOH *obj);
@@ -424,6 +426,8 @@ extern void DohMemoryDebug(void);
#define SplitLines DohSplitLines
#define Setmark DohSetmark
#define Getmark DohGetmark
+#define SetMaxHashExpand DohSetMaxHashExpand
+#define GetMaxHashExpand DohGetMaxHashExpand
#define None DohNone
#define Call DohCall
#define First DohFirst
diff --git a/Source/DOH/hash.c b/Source/DOH/hash.c
index 87f8e3c40..48afd2e54 100644
--- a/Source/DOH/hash.c
+++ b/Source/DOH/hash.c
@@ -42,6 +42,7 @@ typedef struct KeyValue {
} KeyValue;
static KeyValue *root = 0;
+static int max_expand = 1;
/* Find or create a key in the interned key table */
static DOH *find_key(DOH *doh_c) {
@@ -379,6 +380,26 @@ static DOH *Hash_keys(DOH *so) {
}
/* -----------------------------------------------------------------------------
+ * DohSetMaxHashExpand()
+ *
+ * Controls how many Hash objects are displayed in full in Hash_str
+ * ----------------------------------------------------------------------------- */
+
+void DohSetMaxHashExpand(int count) {
+ max_expand = count;
+}
+
+/* -----------------------------------------------------------------------------
+ * DohGetMaxHashExpand()
+ *
+ * Returns how many Hash objects are displayed in full in Hash_str
+ * ----------------------------------------------------------------------------- */
+
+int DohGetMaxHashExpand(void) {
+ return max_expand;
+}
+
+/* -----------------------------------------------------------------------------
* Hash_str()
*
* Create a string representation of a hash table (mainly for debugging).
@@ -388,7 +409,8 @@ static DOH *Hash_str(DOH *ho) {
int i, j;
HashNode *n;
DOH *s;
- static int indent = 4;
+ static int expanded = 0;
+ static const char *tab = " ";
Hash *h = (Hash *) ObjData(ho);
s = NewStringEmpty();
@@ -396,22 +418,35 @@ static DOH *Hash_str(DOH *ho) {
Printf(s, "Hash(0x%x)", ho);
return s;
}
+ if (expanded >= max_expand) {
+ /* replace each hash attribute with a '.' */
+ Printf(s, "Hash(0x%x) {", ho);
+ for (i = 0; i < h->hashsize; i++) {
+ n = h->hashtable[i];
+ while (n) {
+ Putc('.', s);
+ n = n->next;
+ }
+ }
+ Putc('}', s);
+ return s;
+ }
ObjSetMark(ho, 1);
- Printf(s, "Hash {\n");
+ Printf(s, "Hash(0x%x) {\n", ho);
for (i = 0; i < h->hashsize; i++) {
n = h->hashtable[i];
while (n) {
- for (j = 0; j < indent; j++)
- Putc(' ', s);
- indent += 4;
+ for (j = 0; j < expanded + 1; j++)
+ Printf(s, tab);
+ expanded += 1;
Printf(s, "'%s' : %s, \n", n->key, n->object);
- indent -= 4;
+ expanded -= 1;
n = n->next;
}
}
- for (j = 0; j < (indent - 4); j++)
- Putc(' ', s);
- Printf(s, "}\n");
+ for (j = 0; j < expanded; j++)
+ Printf(s, tab);
+ Printf(s, "}");
ObjSetMark(ho, 0);
return s;
}
diff --git a/Source/DOH/list.c b/Source/DOH/list.c
index a08cadb5a..d5b532409 100644
--- a/Source/DOH/list.c
+++ b/Source/DOH/list.c
@@ -252,7 +252,7 @@ static DOH *List_str(DOH *lo) {
if ((i + 1) < l->nitems)
Printf(s, ", ");
}
- Printf(s, " ]\n");
+ Printf(s, " ]");
ObjSetMark(lo, 0);
return s;
}
diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx
index e28fcbb89..6ec0463fa 100644
--- a/Source/Modules/lang.cxx
+++ b/Source/Modules/lang.cxx
@@ -52,7 +52,7 @@ extern "C" {
return all_protected_mode;
}
void Language_replace_special_variables(String *method, String *tm, Parm *parm) {
- Language::instance()->replaceSpecialVariables(method, tm, parm);
+ Language::instance()->replaceSpecialVariables(method, tm, parm);
}
}
diff --git a/Source/Modules/swigmod.h b/Source/Modules/swigmod.h
index b0b488d6f..d3074105f 100644
--- a/Source/Modules/swigmod.h
+++ b/Source/Modules/swigmod.h
@@ -380,9 +380,15 @@ void Wrapper_fast_dispatch_mode_set(int);
void Wrapper_cast_dispatch_mode_set(int);
void Wrapper_naturalvar_mode_set(int);
-
void clean_overloaded(Node *n);
+extern "C" {
+ const char *Swig_to_string(DOH *object, int count = -1);
+ const char *Swig_to_string_with_location(DOH *object, int count = -1);
+ void Swig_print(DOH *object, int count = -1);
+ void Swig_print_with_location(DOH *object, int count = -1);
+}
+
/* Contracts */
void Swig_contracts(Node *n);
@@ -395,5 +401,4 @@ void Swig_browser(Node *n, int);
void Swig_default_allocators(Node *n);
void Swig_process_types(Node *n);
-
#endif
diff --git a/Source/Modules/utils.cxx b/Source/Modules/utils.cxx
index 3fe7a2709..13a504bcf 100644
--- a/Source/Modules/utils.cxx
+++ b/Source/Modules/utils.cxx
@@ -100,3 +100,116 @@ void clean_overloaded(Node *n) {
Delattr(n, "sym:overloaded");
}
}
+
+/* -----------------------------------------------------------------------------
+ * Swig_set_max_hash_expand()
+ *
+ * Controls how many Hash objects are displayed when displaying nested Hash objects.
+ * Makes DohSetMaxHashExpand an externally callable function (for debugger).
+ * ----------------------------------------------------------------------------- */
+
+void Swig_set_max_hash_expand(int count) {
+ SetMaxHashExpand(count);
+}
+
+extern "C" {
+
+/* -----------------------------------------------------------------------------
+ * Swig_get_max_hash_expand()
+ *
+ * Returns how many Hash objects are displayed when displaying nested Hash objects.
+ * Makes DohGetMaxHashExpand an externally callable function (for debugger).
+ * ----------------------------------------------------------------------------- */
+
+int Swig_get_max_hash_expand() {
+ return GetMaxHashExpand();
+}
+
+/* -----------------------------------------------------------------------------
+ * Swig_to_doh_string()
+ *
+ * DOH version of Swig_to_string()
+ * ----------------------------------------------------------------------------- */
+
+static String *Swig_to_doh_string(DOH *object, int count) {
+ int old_count = Swig_get_max_hash_expand();
+ if (count >= 0)
+ Swig_set_max_hash_expand(count);
+
+ String *debug_string = object ? NewStringf("%s", object) : NewString("NULL");
+
+ Swig_set_max_hash_expand(old_count);
+ return debug_string;
+}
+
+/* -----------------------------------------------------------------------------
+ * Swig_to_doh_string_with_location()
+ *
+ * DOH version of Swig_to_string_with_location()
+ * ----------------------------------------------------------------------------- */
+
+static String *Swig_to_doh_string_with_location(DOH *object, int count) {
+ int old_count = Swig_get_max_hash_expand();
+ if (count >= 0)
+ Swig_set_max_hash_expand(count);
+
+ String *debug_string = Swig_stringify_with_location(object);
+
+ Swig_set_max_hash_expand(old_count);
+ return debug_string;
+}
+
+/* -----------------------------------------------------------------------------
+ * Swig_to_string()
+ *
+ * Swig debug - return C string representation of any DOH type.
+ * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0
+ * Note: leaks memory.
+ * ----------------------------------------------------------------------------- */
+
+const char *Swig_to_string(DOH *object, int count) {
+ return Char(Swig_to_doh_string(object, count));
+}
+
+/* -----------------------------------------------------------------------------
+ * Swig_to_string_with_location()
+ *
+ * Swig debug - return C string representation of any DOH type, within [] brackets
+ * for Hash and List types, prefixed by line and file information.
+ * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0
+ * Note: leaks memory.
+ * ----------------------------------------------------------------------------- */
+
+const char *Swig_to_string_with_location(DOH *object, int count) {
+ return Char(Swig_to_doh_string_with_location(object, count));
+}
+
+/* -----------------------------------------------------------------------------
+ * Swig_print()
+ *
+ * Swig debug - display string representation of any DOH type.
+ * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0
+ * ----------------------------------------------------------------------------- */
+
+void Swig_print(DOH *object, int count) {
+ String *output = Swig_to_doh_string(object, count);
+ Printf(stdout, "%s\n", output);
+ Delete(output);
+}
+
+/* -----------------------------------------------------------------------------
+ * Swig_to_string_with_location()
+ *
+ * Swig debug - display string representation of any DOH type, within [] brackets
+ * for Hash and List types, prefixed by line and file information.
+ * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0
+ * ----------------------------------------------------------------------------- */
+
+void Swig_print_with_location(DOH *object, int count) {
+ String *output = Swig_to_doh_string_with_location(object, count);
+ Printf(stdout, "%s\n", output);
+ Delete(output);
+}
+
+} // extern "C"
+
diff --git a/Source/Swig/error.c b/Source/Swig/error.c
index fa82ad8d9..5dfcf605b 100644
--- a/Source/Swig/error.c
+++ b/Source/Swig/error.c
@@ -285,6 +285,41 @@ static String *format_filename(const_String_or_char_ptr filename) {
}
/* -----------------------------------------------------------------------------
+ * Swig_stringify_with_location()
+ *
+ * Return a string representation of any DOH object with line and file location
+ * information in the appropriate error message format. The string representation
+ * is enclosed within [] brackets after the line and file information.
+ * ----------------------------------------------------------------------------- */
+
+String *Swig_stringify_with_location(DOH *object) {
+ String *str = NewStringEmpty();
+
+ if (!init_fmt)
+ Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT);
+
+ if (object) {
+ int line = Getline(object);
+ String *formatted_filename = format_filename(Getfile(object));
+ if (line > 0) {
+ Printf(str, diag_line_fmt, formatted_filename, line);
+ } else {
+ Printf(str, diag_eof_fmt, formatted_filename);
+ }
+ if (Len(object) == 0) {
+ Printf(str, "[EMPTY]");
+ } else {
+ Printf(str, "[%s]", object);
+ }
+ Delete(formatted_filename);
+ } else {
+ Printf(str, "[NULL]");
+ }
+
+ return str;
+}
+
+/* -----------------------------------------------------------------------------
* Swig_diagnostic()
*
* Issue a diagnostic message on stdout.
diff --git a/Source/Swig/misc.c b/Source/Swig/misc.c
index 2105f0c51..a57c7cf33 100644
--- a/Source/Swig/misc.c
+++ b/Source/Swig/misc.c
@@ -527,7 +527,6 @@ String *Swig_string_schemify(String *s) {
return ns;
}
-
/* -----------------------------------------------------------------------------
* Swig_string_typecode()
*
diff --git a/Source/Swig/swig.h b/Source/Swig/swig.h
index f90a5ffb1..021c5611f 100644
--- a/Source/Swig/swig.h
+++ b/Source/Swig/swig.h
@@ -319,7 +319,6 @@ extern int ParmList_is_compactdefargs(ParmList *p);
extern String *Swig_string_lower(String *s);
extern String *Swig_string_upper(String *s);
extern String *Swig_string_title(String *s);
-
extern void Swig_init(void);
extern int Swig_value_wrapper_mode(int mode);
@@ -334,6 +333,7 @@ extern int ParmList_is_compactdefargs(ParmList *p);
extern int Swig_warn_count(void);
extern void Swig_error_msg_format(ErrorMessageFormat format);
extern void Swig_diagnostic(const_String_or_char_ptr filename, int line, const char *fmt, ...);
+ extern String *Swig_stringify_with_location(DOH *object);
/* --- C Wrappers --- */
extern String *Swig_cparm_name(Parm *p, int i);
@@ -408,6 +408,8 @@ extern int ParmList_is_compactdefargs(ParmList *p);
extern void Wrapper_director_protected_mode_set(int);
extern void Wrapper_all_protected_mode_set(int);
extern void Language_replace_special_variables(String *method, String *tm, Parm *parm);
+ extern void Swig_print(DOH *object, int count);
+ extern void Swig_print_with_location(DOH *object, int count);
/* -- template init -- */
diff --git a/Tools/swig.gdb b/Tools/swig.gdb
new file mode 100644
index 000000000..195032955
--- /dev/null
+++ b/Tools/swig.gdb
@@ -0,0 +1,41 @@
+# User-defined commands for easier debugging of SWIG in gdb
+#
+# This file can be "included" into your main .gdbinit file using:
+# source swig.gdb
+# or otherwise paste the contents into .gdbinit
+#
+# Note all user defined commands can be seen using:
+# (gdb) show user
+# The documentation for each command can be easily viewed, for example:
+# (gdb) help swigprint
+
+define swigprint
+ if ($argc == 2)
+ set $expand_count = $arg1
+ else
+ set $expand_count = -1
+ end
+ call Swig_print($arg0, $expand_count)
+end
+document swigprint
+Displays any SWIG DOH object
+Usage: swigprint swigobject [hashexpandcount]
+ swigobject - The object to display.
+ hashexpandcount - Number of nested Hash types to expand (default is 1). See Swig_set_max_hash_expand() to change default.
+end
+
+
+define locswigprint
+ if ($argc == 2)
+ set $expand_count = $arg1
+ else
+ set $expand_count = -1
+ end
+ call Swig_print_with_location($arg0, $expand_count)
+end
+document locswigprint
+Displays any SWIG DOH object prefixed with file and line location
+Usage: locswigprint swigobject [hashexpandcount]
+ swigobject - The object to display.
+ hashexpandcount - Number of nested Hash types to expand (default is 1). See Swig_set_max_hash_expand() to change default.
+end