Dear Community, We are pleased to announce the availability of the Next Scripting Framework (NSF) 2.1.0. This is a maintenance release. Since the release of 2.0.0, there have been 416 commits to our code repository. The Next Scripting Framework was tested with Tcl 8.5.19 and Tcl 8.6.6 on Linux, Mac OS X, and in Windows environments (MinGW, VC). Diff stats since 2.0.0: 173 files changed, 30651 insertions(+), 14286 deletions(-) Major changes relative to 2.0.0 are: New Features - NSF: * Improved debugging/tracing/profiling support: + Entering and exiting NSF procs and methods can be tracked upon invocation when profiling support is configured: ./configure --enable-profile (default: disabled) This can be controlled via nsf::__profile_trace -enable /bool/ ?-verbose /bool/? nsf::configure trace TODO: da fehlt noch eine erklärung, was die befehle genau machen + NSF procs and methods can be marked "deprecated" and/or "debug-enabled". For this, all NSF proc and method definitions in NX and XOTcl2 now accept the new flags "-debug" and "-deprecated". The low-level interface (nsf::method::property) enables introspection and selective enabling during runtime. nsf::proc ... ?-debug? ?-deprecated? ... /name/ /argspec/ /body/ nsf::method::property /obj/ /method/ deprecated ?0|1? nsf::method::property /obj/ /method/ debug ?0|1? A debug-enabled NSF proc or method will be reported on entering and exiting the proc and method (similar to a traced proc/ method incl. a time probe; see above): % nsf::proc -debug foo {} {;} % foo Notice: DB call(1) - foo Notice: DB exit(1) - foo 53 usec -> % nsf::proc -deprecated foo {} {;} % foo * Add ability to call the nsf argument parser also separately. The command ::nsf::parseargs /argspec/ /arglist/ can be used to parse arglist based on the argspec to set the parsed arguments in the local context. For example, the command nsf::parseargs {{-x:integer 1} y} {123} will set the variables x to "1" and y to "123" * Misc: - new flag "-notrace" for "nsf::var::set" and "nsf::var::get" to implement ability to use these low-level commands for accessing variables without firing traces - New cmd "nsf::method::forward::property" for reading and writing introspection of forwarders (important for serializer, when different target objects are specified, to map the per-object forwarder) - ::nsf::current level (TODO was steht in der doc)? - NX: * Support for standardized messaging and debugging: the method defining methods "alias", "forward", "method" accept now the optional flags "-deprecated" and "-debug" (see above). /cls/ public alias ?-deprecated? ?-debug? /method/ ... /cls/ public forward ?-deprecated? ?-debug? /method/ ... /cls/ public method ?-deprecated? ?-debug? /method/ ... /obj/ public object alias ?-deprecated? ?-debug? /method/ ... /obj/ public object forward ?-deprecated? ?-debug? /method/ ... /obj/ public object method ?-deprecated? ?-debug? /method/ ... * Improved introspection: The following subcommands complete the set of introspection commands: /cls/ info method callprotection /cls/ info method debug /cls/ info method deprecated /obj/ info baseclass /obj/ info object method callprotection /obj/ info object method debug /obj/ info object method deprecated * Added a cleaner interface for the interaction of variable traces and slots. It is now possible to specify in the definition of a "property" or "variable" whether the slot-accessor methods (value=get, value=set) should be fired, whenever a variable is read/written or get a default value. /obj/ object property|variable ?-trace set|get|default? ... /cls/ property|variable ?-trace set|get|default? ... This replaces the former rather experimental commands used in XOTcl "initcmd", "valuecmd" and "valuechangedcmd". - XOTcl2: * Support for standardized messaging and debugging: the method defining methods "alias", "forward", "method" accept now the optional flags "-deprecated" and "-debug" (see above). /cls/ instforward -deprecated|-debug /method/ ... /cls/ instproc -deprecated|-debug /method/ ... /obj/ forward -deprecated|-debug /method/ ... /obj/ proc -deprecated|-debug /method/ ... Features added: * New -return flag: XOTcl2 methods can now specify a return-value checker, similar to NX methods. /cls/ instproc -returns /method/ ... /obj/ proc -returns /method/ ... (TODO: what about instforward/ forward?) * New -deprecated and -debug flags: Features removed: none (TODO: what about old trace interface: valuechangedcmd & friends?) Changes to existing features: none Features removed: none Changes to existing features: none Bug Fixes Code Maintenance o) Slot-traces reform: (TODO: ...) o) Improved robustness (under 8.6 and beyond): * Tcl command resolvers and command literals: Between Tcl 8.6.0 and (including) Tcl 8.6.6, there was a problem in the interaction between Tcl 8.6 and the command resolvers of NSF in certain corner cases and Tcl's command literals. The issue and patches were reported upstream to the Tcl core team, was recognized and will enter an upcoming patch release (8.6.7). Our regression test-suite was extended accordingly to track the issue. See Tcl Fossil tickets d4e7780ca1 and 3418547. * Finalizing NSF and NSF object systems: In this release, the finalization procedures of NSF (on process exits, thread exits, and interp teardowns) has been revised. For example, NSF's ExitHandler is guaranteed to be called just once in the above scenarios (e.g., to avoid double frees of NSF structures). * UnsetTracedVars: Provide for a two-pass deletion logic during object shutdown, to account for unset traces possibly reviving an object variable under deletion. This corresponds to a recent memory leak fix to Tcl itself. See also Tcl Fossil ticket 4dbdd9af144dbdd9af14. * Serializer: The combined NX and XOTcl2 serializer has been extended to cover newly added features (esp., NSF procs, method flags) and has been improved based on experiences from multi-threaded NSF/Tcl applications (NaviServer). Improvements and fixes relate to "info" methods and forwarders. o) Improved scripted shells (e.g., nxsh, xotclsh): * There is now an alternative implementation of nx::shell: nx::shell2. It is used by all four shell scripts. nx::shell2 builds on Tcl's event loop, rather than while + update. This avoids blocking the Tk main window (update). In addition, nx::shell2's behavior is more akin to Tcl's native shells (e.g., no extra lines on enter, catches EOF). * The improved shells now accept stdin input (-c option). * They are more robust: Don't quit due to inner [return] calls, [exit] is handled gracefully. * Shell tests were added (shells.test). o) Minor logging reform at the C-level (NsfLog, interp) so that "nsf::configure debugLevel /severity/" will print error messages at a level equal or greater than the given severity (0, 1, 2, 3). For example, "nsf::configure debugLevel 0" will print everything, and "nsf::configure debugLevel 3" will print just error messages while omitting warnings etc. This does not entail changed logging semantics, but helped remove some confusion at the C level. o) Improved NSF/C code generator: Allows for specifying and generating enum types. o) Preliminary support for a future Tcl 8.7 (as of Dec 2, 2016; commit 71fa1f9c91). NSF compiles under 8.7a0 and its regression tests execute successfully. o) API changes: o) Documentation (API and examples): Added: - New Rosetta implementations: Inheritance/single Add object variable dynamically Tree traversal Tokenizer Updated: - Object.man: * Added missing description on 'info lookup parameters' and 'info lookup syntax'. * Correct description of Object->copy. * info baseclass (TODO: check) - alias/forward/method: added debug/ deprecated switches, - current.man: Added description of 'level' option. - Extended/ updated Rosetta implementations: Inheritance/multiple Polymorphic copy Multiple distinct objects o) Code changes (C): * Refactoring: There is now a common infrastructure for hash-tables using function pointers as keys (as required for NSF/C command definitions and enumerations). * Removed all implicit type-conversions, signed/unsigned comparisons as flagged by the following gcc/clang flags (ensure cleanness on 64bit) -Wconversion -Wsign-conversion -Wfloat-conversion -Wsign-compare. * Reduced variable scopes. * Guarded against potential Tcl_Obj leaks, esp. when using NsfMethodNamePath(), as indicated by valgrind. * Refactored functions for topological sorting (TopoSort()) to avoid redundancies. * Addressed more than 18 code-quality issues as indicated by Coverity Scan, incl. control-flow issues (risking NULL dereferencing), dead code branches, etc. * Removed uses of deprecated functions: Tcl_AppendResult, ... * Based on the improve NSF/C code generator, proper enum types are used in generated function signatures and the respective control structures (switch). o) Packaging & distribution: * Updated TEA to 3.10 * Support for MSVC 14 (VS 2015; win/makefile.vc) * Debian package: https://packages.qa.debian.org/n/nsf.html * MacPorts port: https://trac.macports.org/browser/trunk/dports/lang/nsf/Portfile * Part of the KitCreator battery: https://kitcreator.rkeene.org/fossil/ * Part of the kbskit battery: https://sourceforge.net/projects/kbskit/ The Next Scripting Framework 2.1.0 (containing NX 2.1.0 and XOTcl 2.1.0) can be obtained from https://next-scripting.org/. The detailed changelog is available at https://next-scripting.org/xowiki/download/file/ChangeLog-2.0.0-2.1.0.log Best regards - Gustaf Neumann - Stefan Sobernig