Below are the changes for the current release.
See the CHANGES file for changes in older releases.
See the RELEASENOTES file for a summary of changes in each release.

Version 2.0.11 (15 Sep 2013)
============================

2013-09-15: wsfulton
            [R] Fix attempt to free a non-heap object in OUTPUT typemaps for:
              unsigned short *OUTPUT
              unsigned long *OUTPUT
              signed long long *OUTPUT
              char *OUTPUT
              signed char*OUTPUT
              unsigned char*OUTPUT

2013-09-12: wsfulton
            [Lua] Pull Git patch #62.
              1) Static members and static functions inside class can be accessed as
                 ModuleName.ClassName.FunctionName (MemberName respectively). Old way such as
                 ModuleName.ClassName_FunctionName still works.
              2) Same goes for enums inside classes: ModuleName.ClassName.EnumValue1 etc.

2013-09-12: wsfulton
            [UTL] Infinity is now by default an acceptable value for type 'float'. This fix makes
            the handling of type 'float' and 'double' the same. The implementation requires the
            C99 isfinite() macro, or otherwise some platform dependent equivalents, to be available.

            Users requiring the old behaviour of not accepting infinity, can define a 'check' typemap
            wherever a float is used, such as:

              %typemap(check,fragment="<float.h>") float, const float & %{
                if ($1 < -FLT_MAX || $1 > FLT_MAX) {
                  SWIG_exception_fail(SWIG_TypeError, "Overflow in type float");
                }
              %}

            *** POTENTIAL INCOMPATIBILITY  ***

2013-08-30: wsfulton
            [Lua] Pull Git patch #81: Include Lua error locus in SWIG error messages.  
            This is standard information in Lua error messages, and makes it much
            easier to find bugs.

2013-08-29: wsfulton
            Pull Git patch #75: Handle UTF-8 files with BOM at beginning of file. Was giving an
            'Illegal token' syntax error.

2013-08-29: wsfulton
            [C#] Pull Git patch #77: Allow exporting std::map using non-default comparison function.

2013-08-28: wsfulton
            [Python] %implicitconv is improved for overloaded functions. Like in C++, the methods
            with the actual types are considered before trying implicit conversions. Example:

              %implicitconv A;
              struct A {
                A(int i);
              };
              class CCC {
                public:
                  int xx(int i) { return 11; }
                  int xx(const A& i) { return 22; }
              };

            The following python code:

              CCC().xx(-1)

            will now return 11 instead of 22 - the implicit conversion is not done.

2013-08-23: olly
	    [Python] Fix clang++ warning in generated wrapper code.

2013-08-16: wsfulton
            [Python] %implicitconv will now accept None where the implicit conversion takes a C/C++ pointer.
            Problem highlighted by Bo Peng. Closes SF patch #230.

2013-08-07: wsfulton
            [Python] SF Patch #326 from Kris Thielemans - Remove SwigPyObject_print and SwigPyObject_str and
            make the generated wrapper use the default python implementations, which will fall back to repr
            (for -builtin option).

            Advantages:
            - it avoids the swig user having to jump through hoops to get print to work as expected when
              redefining repr/str slots.
            - typing the name of a variable on the python prompt now prints the result of a (possibly redefined)
              repr, without the swig user having to do any extra work.
            - when redefining repr, the swig user doesn't necessarily have to redefine str as it will call the
              redefined repr
            - the behaviour is exactly the same as without the -builtin option while requiring no extra work
              by the user (aside from adding the %feature("python:slot...) statements of course)

            Disadvantage:
            - default str() will give different (but clearer?) output on swigged classes

2013-07-30: wsfulton
            [Python, Ruby] Fix #64 #65: Missing code in std::multimap wrappers. Previously an instantiation
            of a std::map was erroneously required in addition to an instantiation of std::multimap with the
            same template parameters to prevent compilation errors for the wrappers of a std::multimap.

2013-07-14: joequant
            [R] Change types file to allow for SEXP return values

2013-07-05: wsfulton
            [Python] Add %pythonbegin directive which works like %pythoncode, except the specified code is
            added at the beginning of the generated .py file. This is primarily needed for importing from
            __future__ statements required to be at the very beginning of the file. Example:

              %pythonbegin %{
              from __future__ import print_function
              print("Loading", "Whizz", "Bang", sep=' ... ')
              %}

2013-07-01: wsfulton
            [Python] Apply SF patch #340 - Uninitialized variable fix in SWIG_Python_NonDynamicSetAttr
            when using -builtin.

2013-07-01: wsfulton
            [Python, Ruby, Ocaml] Apply SF patch #341 - fix a const_cast in generated code that was generating
            a <:: digraph when using the unary scope operator (::) (global scope) in a template type.

2013-07-01: wsfulton
            [Python] Add SF patch #342 from Christian Delbaere to fix some director classes crashing on
            object deletion when using -builtin. Fixes SF bug #1301.

2013-06-11: wsfulton
            [Python] Add SWIG_PYTHON_INTERPRETER_NO_DEBUG macro which can be defined to use the Release version
            of the Python interpreter in Debug builds of the wrappers. The Visual Studio .dsp example
            files have been modified to use this so that Debug builds will now work without having
            to install or build a Debug build of the interpreter.

2013-06-07: wsfulton
	    [Ruby] Git issue #52. Fix regression with missing rb_complex_new function for Ruby
            versions prior to 1.9 using std::complex wrappers if just using std::complex as an output type.
            Also fix the Complex helper functions external visibility (to static by default).

2013-06-04: olly
	    [PHP] Fix SWIG_ZTS_ConvertResourcePtr() not to dereference NULL
	    if the type lookup fails.

