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 3.0.8 (31 Dec 2015)
===========================

2015-12-30: wsfulton
            The pdf documentation is now generated by wkhtmltopdf and has colour
            for the code snippets just like the html documentation!

2015-12-23: ahnolds
            [Python] Fixes for conversion of signed and unsigned integer types:

            No longer check for PyInt objects in Python3. Because PyInt_Check
            and friends are #defined to the corresponding PyLong methods, this
            had caused errors in Python3 where values greater than what could be
            stored in a long were incorrectly interpreted as the value -1 with
            the Python error indicator set to OverflowError. This applies to
            both the conversions PyLong->long and PyLong->double.

            Conversion from PyLong to long, unsigned long, long long, and
            unsigned long long now raise OverflowError instead of TypeError in
            both Python2 and Python3 for PyLong values outside the range
            expressible by the corresponding C type. This matches the existing
            behavior for other integral types (signed and unsigned ints, shorts,
            and chars), as well as the conversion for PyInt to all numeric
            types. This also indirectly applies to the size_t and ptrdiff_t
            types, which depend on the conversions for unsigned long and long.

2015-12-19: wsfulton
            [Python] Python 2 Unicode UTF-8 strings can be used as inputs to char * or
            std::string types if the generated C/C++ code has SWIG_PYTHON_2_UNICODE defined.

2015-12-17: wsfulton
            Issues #286, #128
            Remove ccache-swig.1 man page - please use the CCache.html docs instead.
            The yodl2man and yodl2html tools are no longer used and so SWIG no
            longer has a dependency on these packages which were required when
            building from git.

2015-12-16: zturner/coleb
            [Python] Fix Python3.5 interpreter assertions when objects are being
            deleted due to an existing exception. Most notably in generators
            which terminate using a StopIteration exception. Fixes #559 #560 #573.
            If a further exception is raised during an object destruction,
            PyErr_WriteUnraisable is used on this second exception and the
            original exception bubbles through.

2015-12-14: ahnolds/wsfulton
            [Python] Add in missing initializers for tp_finalize,
            nb_matrix_multiply, nb_inplace_matrix_multiply, ht_qualname
            ht_cached_keys and tp_prev.

2015-12-12: wsfulton
            Fix STL wrappers to not generate <: digraphs.
            For example std::vector<::X::Y> was sometimes generated, now
            corrected to std::vector< ::X::Y >.

2015-11-25: wsfulton
            [Ruby] STL ranges and slices fixes.

            Ruby STL container setting slices fixes:

            Setting an STL container wrapper slice better matches the way Ruby
            arrays work. The behaviour is now the same as Ruby arrays. The only
            exception is the default value used when expanding a container
            cannot be nil as this is not a valid type/value for C++ container
            elements.

            Obtaining a Ruby STL container ranges and slices fixes:

            Access via ranges and slices now behave identically to Ruby arrays.
            The fixes are mostly for out of range indices and lengths.
            - Zero length slice requests return an empty container instead of nil.
            - Slices which request a length greater than the size of the container
              no longer chop off the last element.
            - Ranges which used to return nil now return an empty array when the
              the start element is a valid index.

            Ruby STL container negative indexing support improved.

            Using negative indexes to set values works the same as Ruby arrays, eg

            %template(IntVector) std::vector<int>;

            iv = IntVector.new([1,2,3,4])
            iv[-4] = 9 # => [1,2,3,9]
            iv[-5] = 9 # => IndexError

2015-11-21: wsfulton
            [Ruby, Python] Add std::array container wrappers.

            These work much like any of the other STL containers except Python/Ruby slicing
            is somewhat limited because the array is a fixed size. Only slices of
            the full size are supported.

2015-10-10: wsfulton
            [Python] #539 - Support Python 3.5 and -builtin.  PyAsyncMethods is a new
            member in PyHeapTypeObject.

2015-10-06: ianlancetaylor
	    [Go] Don't emit a constructor function for a director
	    class with an abstract method, since the function will
	    always panic.

2015-10-01: wsfulton
            Fix %shared_ptr support for private and protected inheritance.
            - Remove unnecessary Warning 520: Derived class 'Derived' of 'Base'
              is not similarly marked as a smart pointer
            - Do not generate code that attempts to cast up the inheritance chain in the
              type system runtime in such cases as it doesn't compile and can't be used.
            Remove unnecessary warning 520 for %shared_ptr when the base class is ignored.

2015-10-01: vkalinin
            Fix #508: Fix segfault parsing anonymous typedef nested classes.

2015-09-26: wsfulton
            [Ruby] Add shared_ptr support

2015-09-13: kkaempf
            [Ruby] Resolve tracking bug - issue #225.
            The bug is that the tracking code uses a ruby hash and thus may
            allocate objects (Bignum) while running the GC. This was tolerated in
            1.8 but is invalid (raises an exception) in 1.9.
            The patch uses a C hash (also used by ruby) instead.

2015-09-09: lyze
            [CFFI] Extend the "export" feature in the CFFI module to support
            exporting to a specified package.

2015-09-04: olly
	    [Python] Fix docstrings for %callback functions.

2015-09-03: demi-rluddy
            [Go] Removed golang stringing for signed/unsigned char

            Changed default handling of signed char* and unsigned char* to be
            opaque pointers rather than strings, similarly to how other
            languages work.

            Any existing code relying on treating signed char* or unsigned
            char* as a string can restore the old behavior with typemaps.i by
            using %apply to copy the [unchanged] char* behavior.

            *** POTENTIAL INCOMPATIBILITY ***

2015-08-07: talby
            [Perl] tidy -Wtautological-constant-out-of-range-compare warnings when building generated code under clang

2015-08-07: xantares
            [Python] pep257 & numpydoc conforming docstrings:
            - Mono-line module docsstring
            - Rewrite autodoc parameters section in numpydoc style:
              https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt
            - One line summary should end with "."
            - Adds a blank line after class docstring

2015-08-05: vadz
            [Java] Make (char* STRING, size_t LENGTH) typemaps usable for
            strings of other types, e.g. "unsigned char*".
