diff --git a/CHANGES.current b/CHANGES.current index dbb4ec9a7..937f9f871 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,16 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.1.0 (in progress) =========================== +2022-03-25: wsfulton + The debug command line options that display parse tree nodes + (-debug-module, -debug-top, -debug-symtabs) now display previously hidden + linked list pointers which are useful for debugging parse trees. + + Added new command line option -debug-quiet. This suppresses the display + of most linked list pointers and symbol table pointers in the parse tree nodes. + + The keys in the parse tree node are now shown in alphabetical order. + 2022-03-24: wsfulton #2244 Fix using declaration in derived class bugs when all the base class's overloaded methods were overridden in the derived class - diff --git a/Doc/Manual/Extending.html b/Doc/Manual/Extending.html index ad90d7b63..e70f30183 100644 --- a/Doc/Manual/Extending.html +++ b/Doc/Manual/Extending.html @@ -462,187 +462,220 @@ the stage being processed. There are a number of other parse tree display options, for example, swig -debug-module <n> will avoid displaying system parse information and only display the parse tree pertaining to the user's module at stage n of processing. +Adding the -debug-quiet option is recommended as it removes some noise which is not usually needed, +that is, the display of many linked list pointers and symbol table pointers.
-$ swig -c++ -python -debug-module 4 example.i - +++ include ---------------------------------------- - | name - "example.i" +$ swig -c++ -python -debug-module 1 -debug-quiet example.i +debug-module stage 1 ++++ module ---------------------------------------- +| name - "example" +| ++++ insert ---------------------------------------- +| code - "\n#include \"example.h\"\n" +| ++++ include ---------------------------------------- +| name - "example.h" - +++ module ---------------------------------------- - | name - "example" - | - +++ insert ---------------------------------------- - | code - "\n#include \"example.h\"\n" - | - +++ include ---------------------------------------- - | name - "example.h" + +++ class ---------------------------------------- + | abstracts - 0x7f4f15182930 + | allows_typedef - "1" + | kind - "class" + | name - "Shape" + | sym:name - "Shape" - +++ class ---------------------------------------- - | abstract - "1" - | sym:name - "Shape" - | name - "Shape" - | kind - "class" - | symtab - 0x40194140 - | sym:symtab - 0x40191078 + +++ access ---------------------------------------- + | kind - "public" + | + +++ constructor ---------------------------------------- + | access - "public" + | code - "{\n nshapes++;\n }" + | decl - "f()." + | feature:new - "1" + | ismember - "1" + | name - "Shape" + | sym:name - "Shape" + | + +++ destructor ---------------------------------------- + | access - "public" + | code - "{\n nshapes--;\n }" + | decl - "f()." + | ismember - "1" + | name - "~Shape" + | storage - "virtual" + | sym:name - "~Shape" + | + +++ cdecl ---------------------------------------- + | access - "public" + | decl - "" + | ismember - "1" + | kind - "variable" + | name - "x" + | sym:name - "x" + | type - "double" + | + +++ cdecl ---------------------------------------- + | access - "public" + | decl - "" + | ismember - "1" + | kind - "variable" + | name - "y" + | sym:name - "y" + | type - "double" + | + +++ cdecl ---------------------------------------- + | access - "public" + | decl - "f(double,double)." + | ismember - "1" + | kind - "function" + | name - "move" + | parms - 'double dx,double dy' + | sym:name - "move" + | type - "void" + | + +++ cdecl ---------------------------------------- + | abstract - "1" + | access - "public" + | decl - "f()." + | ismember - "1" + | kind - "function" + | name - "area" + | storage - "virtual" + | sym:name - "area" + | type - "double" + | value - "0" + | valuetype - "int" + | + +++ cdecl ---------------------------------------- + | abstract - "1" + | access - "public" + | decl - "f()." + | ismember - "1" + | kind - "function" + | name - "perimeter" + | storage - "virtual" + | sym:name - "perimeter" + | type - "double" + | value - "0" + | valuetype - "int" + | + +++ cdecl ---------------------------------------- + | access - "public" + | decl - "" + | ismember - "1" + | kind - "variable" + | name - "nshapes" + | storage - "static" + | sym:name - "nshapes" + | type - "int" + | + +++ class ---------------------------------------- + | allows_typedef - "1" + | baselist - 0x7f4f15182ad0 + | kind - "class" + | name - "Circle" + | privatebaselist - 0x7f4f15182b10 + | protectedbaselist - 0x7f4f15182af0 + | sym:name - "Circle" - +++ access ---------------------------------------- - | kind - "public" - | - +++ constructor ---------------------------------------- - | sym:name - "Shape" - | name - "Shape" - | decl - "f()." - | code - "{\n nshapes++;\n }" - | sym:symtab - 0x40194140 - | - +++ destructor ---------------------------------------- - | sym:name - "~Shape" - | name - "~Shape" - | storage - "virtual" - | code - "{\n nshapes--;\n }" - | sym:symtab - 0x40194140 - | - +++ cdecl ---------------------------------------- - | sym:name - "x" - | name - "x" - | decl - "" - | type - "double" - | sym:symtab - 0x40194140 - | - +++ cdecl ---------------------------------------- - | sym:name - "y" - | name - "y" - | decl - "" - | type - "double" - | sym:symtab - 0x40194140 - | - +++ cdecl ---------------------------------------- - | sym:name - "move" - | name - "move" - | decl - "f(double, double)." - | parms - double, double - | type - "void" - | sym:symtab - 0x40194140 - | - +++ cdecl ---------------------------------------- - | sym:name - "area" - | name - "area" - | decl - "f(void)." - | parms - void - | storage - "virtual" - | value - "0" - | type - "double" - | sym:symtab - 0x40194140 - | - +++ cdecl ---------------------------------------- - | sym:name - "perimeter" - | name - "perimeter" - | decl - "f(void)." - | parms - void - | storage - "virtual" - | value - "0" - | type - "double" - | sym:symtab - 0x40194140 - | - +++ cdecl ---------------------------------------- - | sym:name - "nshapes" - | name - "nshapes" - | decl - "" - | storage - "static" - | type - "int" - | sym:symtab - 0x40194140 - | - +++ class ---------------------------------------- - | sym:name - "Circle" - | name - "Circle" - | kind - "class" - | bases - 0x40194510 - | symtab - 0x40194538 - | sym:symtab - 0x40191078 + +++ access ---------------------------------------- + | kind - "private" + | + +++ cdecl ---------------------------------------- + | access - "private" + | decl - "" + | ismember - "1" + | kind - "variable" + | name - "radius" + | type - "double" + | + +++ access ---------------------------------------- + | kind - "public" + | + +++ constructor ---------------------------------------- + | access - "public" + | code - "{ }" + | decl - "f(double)." + | feature:new - "1" + | ismember - "1" + | name - "Circle" + | parms - 'double r' + | sym:name - "Circle" + | + +++ cdecl ---------------------------------------- + | access - "public" + | decl - "f()." + | ismember - "1" + | kind - "function" + | name - "area" + | storage - "virtual" + | sym:name - "area" + | type - "double" + | + +++ cdecl ---------------------------------------- + | access - "public" + | decl - "f()." + | ismember - "1" + | kind - "function" + | name - "perimeter" + | storage - "virtual" + | sym:name - "perimeter" + | type - "double" + | + +++ class ---------------------------------------- + | allows_typedef - "1" + | baselist - 0x7f4f15183830 + | kind - "class" + | name - "Square" + | privatebaselist - 0x7f4f15183870 + | protectedbaselist - 0x7f4f15183850 + | sym:name - "Square" - +++ access ---------------------------------------- - | kind - "private" - | - +++ cdecl ---------------------------------------- - | name - "radius" - | decl - "" - | type - "double" - | - +++ access ---------------------------------------- - | kind - "public" - | - +++ constructor ---------------------------------------- - | sym:name - "Circle" - | name - "Circle" - | parms - double - | decl - "f(double)." - | code - "{ }" - | sym:symtab - 0x40194538 - | - +++ cdecl ---------------------------------------- - | sym:name - "area" - | name - "area" - | decl - "f(void)." - | parms - void - | storage - "virtual" - | type - "double" - | sym:symtab - 0x40194538 - | - +++ cdecl ---------------------------------------- - | sym:name - "perimeter" - | name - "perimeter" - | decl - "f(void)." - | parms - void - | storage - "virtual" - | type - "double" - | sym:symtab - 0x40194538 - | - +++ class ---------------------------------------- - | sym:name - "Square" - | name - "Square" - | kind - "class" - | bases - 0x40194760 - | symtab - 0x40194788 - | sym:symtab - 0x40191078 - - +++ access ---------------------------------------- - | kind - "private" - | - +++ cdecl ---------------------------------------- - | name - "width" - | decl - "" - | type - "double" - | - +++ access ---------------------------------------- - | kind - "public" - | - +++ constructor ---------------------------------------- - | sym:name - "Square" - | name - "Square" - | parms - double - | decl - "f(double)." - | code - "{ }" - | sym:symtab - 0x40194788 - | - +++ cdecl ---------------------------------------- - | sym:name - "area" - | name - "area" - | decl - "f(void)." - | parms - void - | storage - "virtual" - | type - "double" - | sym:symtab - 0x40194788 - | - +++ cdecl ---------------------------------------- - | sym:name - "perimeter" - | name - "perimeter" - | decl - "f(void)." - | parms - void - | storage - "virtual" - | type - "double" - | sym:symtab - 0x40194788 + +++ access ---------------------------------------- + | kind - "private" + | + +++ cdecl ---------------------------------------- + | access - "private" + | decl - "" + | ismember - "1" + | kind - "variable" + | name - "width" + | type - "double" + | + +++ access ---------------------------------------- + | kind - "public" + | + +++ constructor ---------------------------------------- + | access - "public" + | code - "{ }" + | decl - "f(double)." + | feature:new - "1" + | ismember - "1" + | name - "Square" + | parms - 'double w' + | sym:name - "Square" + | + +++ cdecl ---------------------------------------- + | access - "public" + | decl - "f()." + | ismember - "1" + | kind - "function" + | name - "area" + | storage - "virtual" + | sym:name - "area" + | type - "double" + | + +++ cdecl ---------------------------------------- + | access - "public" + | decl - "f()." + | ismember - "1" + | kind - "function" + | name - "perimeter" + | storage - "virtual" + | sym:name - "perimeter" + | type - "double"
-$ swig -debug-top 4 example.i +$ swig -debug-top 1 -debug-quiet example.i ... +++ cdecl ---------------------------------------- - | sym:name - "foo_i" - | name - "foo" | decl - "f(int)." + | name - "foo" | parms - int + | sym:name - "foo_i" | type - "void" - | sym:symtab - 0x40165078 | +++ cdecl ---------------------------------------- - | sym:name - "foo_d" - | name - "foo" | decl - "f(double)." + | name - "foo" | parms - double + | sym:name - "foo_d" | type - "void" - | sym:symtab - 0x40165078 | +++ cdecl ---------------------------------------- - | sym:name - "foo" - | name - "foo" | decl - "f(p.Bar)." + | name - "foo" | parms - Bar * + | sym:name - "foo" | type - "void" - | sym:symtab - 0x40165078
+++ cdecl ---------------------------------------- - | sym:name - "getitem" - | name - "getitem" | decl - "f(int).p." - | parms - int - | type - "Object" | feature:except - "{\n try {\n $action\n } catc..." - | sym:symtab - 0x40168ac8 + | name - "getitem" + | parms - int + | sym:name - "getitem" + | type - "Object" |
For a comprehensive understanding of how the matching works, the internal parse tree needs to be examined using the -command line option: -debug-module 1. +command line option: -debug-module 1 -debug-quiet. A snippet of the resulting output might be:
- +++ destructor - 0x7fc10ea05af0 ---------------------------------------- - | name - "~Shape" - | ismember - "1" - | sym:name - "~Shape" + +++ destructor ---------------------------------------- | access - "public" + | decl - "f()." + | ismember - "1" + | name - "~Shape" | storage - "virtual" + | sym:name - "~Shape"