Nuitka Release 0.3.16
This time there are many bug fixes, some important scalability work, and again improved compatibility and cleanups.
The release cycle had a focus on fixing the bug reports I received. I
have also continued to look at CPython3 compatibility, and this is the
first version to support Python3 somewhat, at least some of the basic
tests programs run (of course via
2to3 conversion) without trouble.
I don’t know when, but it seems that it’s going to work one day.
Also there has an effort to make the Debian packaging cleaner, addressing all kinds of small issues that prevented it from entering the Debian repository. It’s still not there, but it’s making progress.
Fixed a packaging problem for Linux and x64 platform, the new
swapFiber.Sfile for the fiber management was not included. Released as 0.3.15a hot fix already.
Fixed an error where optimization was performed on removed unreachable code, which lead to an error. Released as 0.3.15b hot fix already.
Fixed an issue with
__import__and recursion not happening in any case, because when it did, it failed due to not being ported to new internal APIs. Released as 0.3.15c hot fix already.
locals()to be supported in generator expressions and contractions too. Released as 0.3.15d hot fix already.
Fixed the Windows batch files
nuitka-python.batto not output the
remstatements with the copyright header. Released as 0.3.15d hot fix already.
Fixed re-raise with
raise, but without a current exception set. Released as 0.3.15e hot fix already.
vars()call on the module level, needs to be treated as
globals(). Released as 0.3.15e hot fix already.
Fix handling of broken new lines in source files. Read the source code in “universal line ending mode”. Released as 0.3.15f hot fix already.
Fixed handling of constant module attribute
__name__being replaced. Don’t replace local variables of the same name too. Released as 0.3.15g hot fix already.
Fixed assigning to
None. There was this old
TODO, and some code has compatibility craft that does it. Released as 0.3.15g hot fix already.
Fix constant dictionaries not always being recognized as shared. Released as 0.3.15g hot fix already.
Fix generator function objects to not require a return frame to exist. In finalize cleanup it may not.
Fixed non-execution of cleanup codes that e.g. flush
sys.stdout, by adding
throw()method of generator expression objects to not check arguments properly.
Fix missing fallback to subscript operations for slicing with non-indexable objects.
Fix, in-place subscript operations could fail to apply the update, if the intermediate object was e.g. a list and the handle just not changed by the operation, but e.g. the length did.
Fix, the future spec was not properly preserving the future division flag.
The optimization scales now much better, because per-module optimization only require the module to be reconsidered, but not all modules all the time. With many modules recursed into, this makes a huge difference in compilation time.
The creation of dictionaries from constants is now also optimized.
As a new feature functions now have the
__defaults__attribute. It works only well for non-nested parameters and is not yet fully integrated into the parameter parsing. This improves the compatibility somewhat already though.
Noneare now converted to constants only when they are read-only module variables.
PYTHONPATHvariable is now cleared when immediately executing a compiled binary unless
--execute-with-pythonpathis given, in which case it is preserved. This allows to make sure that a binary is in fact containing everything required.
The help output of Nuitka was polished a lot more. It is now more readable and uses option groups to combine related options together.
The in-line copy of Scons is not checked with PyLint anymore. We of course don’t care.
Program tests are no longer executed in the program directory, so failed module inclusions become immediately obvious.
The basic tests can now be run with
2to3conversion in that case.
tagsto a separate module, make optimization emit only documented tags, checked against the list of allowed ones.
The Debian package has seen lots of improvements, to make it “lintian clean”, even in pedantic mode. The homepage of Nuitka is listed, a watch file can check for new releases, the git repository and the gitweb are referenced, etc.
os.path.joinin more of the test code to achieve more Windows portability for them.
Some more PyLint cleanups.
There is now a dedicated test for things that crashed Nuitka previously.
Added a program test where the imported module does a
sys.exit()and make sure it really doesn’t continue after the
SystemExitexception that creates.
Cover the type of
__builtins__in the main program and in imported modules in tests too. It’s funny and differs between module and dict in CPython2.
Cover a final
Added test with functions that makes a
raisewithout an exception set.
Cover the calling of
vars()on module level too.
Cover the use of eval in contractions and generator expressions too.
__default__attributes for a function too.
Added test function with two
raisein an exception handler, so that one becomes dead code and removed without the crash.
The “git flow” was really great in this release cycle. There were many hot fix releases being made, so that the bugs could be addressed immediately without requiring the overhead of a full release. I believe that this makes Nuitka clearly one of the best supported projects.
This quick turn-around also encourages people to report more bugs, which is only good. And the structure is there to hold it. Of course, the many bug fixes meant that there is not as much new development, but that is not the priority, correctness is.
The work on Python3 is a bit strange. I don’t need Python3 at all. I also believe it is that evil project to remove cruft from the Python core and make developers of all relevant Python software, add compatibility cruft to their software instead. Yet, I can’t really stop to work on it. It has that appeal of small fixups here and there, and then something else works too.
Python3 work is like when I was first struggling with Nuitka to pass the
CPython2 unit tests for a first time. It’s fun. And then it finds real
actual bugs that apply to CPython2 too. Not doing
having to), the slice operations shortcomings, the bug of subscript
in-place, and so on. There is likely more things hidden, and the earlier
Python3 is supported, the more benefit from increased test covered.
What’s missing is more “hg” completeness. I think only the
without exception set and the
func_defaults issue were going into
its direction, but it won’t be enough yet.