Dear Community, We are pleased to announce the availability of the Next Scripting Framework (NSF) 2.3.0. The changes are mostly perfective improvements in terms of bug fixes, API consistency, and backwards compatibility. See below for the details. Diff stats since 2.2.0: 155 files changed, 15686 insertions(+), 12640 deletions(-) Major changes relative to 2.2.0 are: New Features - NSF: * Rename reform for nsf::procs: NSF procedures can now be safely renamed (or deleted) using the [rename] command. This was only partially supported before, and could also lead to crashes (when redefining a renamed nsf::proc). * New object property "autonamed": NSF objects having been created using "new", rather than using "create", can now be tested for this condition using the object property "autonamed": % package req nx 2.3 % nsf::object::property [nx::Object new] autonamed 1 % nsf::object::property [nx::Object create o] autonamed 0 This is to avoid having to rely on pattern sniffing of the command names. In addition, the property is now set early enough, right after allocating the NSF object, to test for the autonaming condition from within the creation procedure (ttrace). * Extended object property "volatile": By setting or unsetting the object property "volatile", a given NSF object can now be rendered volatile or not (in addition to using the volatile method on the object). * Reform of uplevel and upvar: First, uplevel and upvar methods, as well as [current callinglevel] and [self callinglevel] now behave consistently (re frame skipping for mixin and filter transparency). If there is no innermost enclosing proc frame, the innermost non-proc (e.g., namespace) frame is selected (rather than a "#0" as a default). Second, argument handling for both uplevel (i.e., level sniffing in multi-arg case) and upvar (e.g., made silent TCL_ERROR for an invalid argument arity explicit) have been fixed. - NX: * Properties and variables now provide "exists" as an additional accessor method, in addition to "get": % package req nx 2.3 % nx::Class create C { :property -accessor public {a 1} } ::C % ::C create ::c1 ::c1 % if {[::c1 a exists]} { ::c1 a get } else { ::c1 a set "1" } ^^^^^^ This is mainly to provide for symmetry in the property and variable API, which otherwise requires one to resort to low-level tests for existence, e.g.: if {[::c1 eval {info exists :a}]} ... This breaks the property/ variable abstraction, because one cannot move to a different value store other than object variables w/o rewriting client code. * Method combination for ensemble methods: Using [next] at the end of chains of ensemble methods fired the unknown handler, unintentionally. This was fixed. * nx::zip rewrite: nx::zip now uses the built-in Tcl 8.6 encode and decode facilties, if available, rather than requiring the Trf package to be present. - XOTcl: * Improved compatibility of XOTcl2 with XOTcl1 behavior for volatile objects (see "volatile reform" above). * Improved compatibility of XOTcl2 with XOTcl1 behavior for uplevel/upvar from within methods (see "uplevel/ upvar reform" above). - nx::serializer: * Improved backward compatibility: Preserve overriding accessor/ mutators methods (instprocs) for slots. - MongoDB: * Added JSON serializer: The "find all" and "bson" methods now provide for JSON-formatted results, on request. ::nx::mongo::Class "find all" -asJSON ::nx::mongo::Object bson asJSON This is to facilitate implementing single-page JavaScript applications, among others. * Fixed test suite; tested the NSF MongoDB binding against latest stable releases of MongoDB (4.0.9) and MongoDB-C driver (1.14.0). - Documentation: * Added documentation of uplevel and upvar methods. - Maintenance & bug fixes: * VLA reform: Avoid the use of variable-length arrays (VLA) when building argument vectors of Tcl_Objs internally to NSF. Use fixed-sized ones (stack-allocated for a size known at compile time or dynamically allocated above) to prevent from potential overflows and to produce more time-efficient instructions. * Tcl 8.7: Support for Tcl 8.7a1 and the upcoming, unreleased Tcl 8.7a2 (core.tcl-lang.org/tcl branch "core-8-branch"). NSF compiles and its regression tests execute successfully. * Misc (esp. NSF/C): Ran valgrind checks, plugged one source of potential leaks (NsfProcStubDeleteProc) and one invalid read on a dangling pointer (NsfCCreateMethod). * Test suite: Fix recursion tests on 8.5 (Windows-only, forward.test) for platform-specific error messages (CheckCStack), obsolete for 8.6 with NRE. Guarded test case on recursive forwards, to avoid preemptive crashes on stack-size limited systems. - Build environments: * Turned off COMDAT folding (/opt:icf) under nmake builds which can lead to unusable, pointless function-pointer comparisons (Nsf_ConvertToSwitch vs. Nsf_ConvertToBoolean). * Improve robustness of configure/ make procedure in the absence of generated DTRACE artifacts so that they are truly conditional on the corresponding configure flags for DTRACE. * Improved robustness of Windows (nmake) installation routines by testing for the existence of the install directory. * Rendered inference of GIT commit in autotools setup more robust, in light of partial GIT checkouts (e.g., w/o tags). The detailed changelog is available at https://next-scripting.org/xowiki/download/file/ChangeLog-2.2.0-2.3.0.log The Next Scripting Framework 2.3.0 (containing NX 2.3.0 and XOTcl 2.3.0) can be obtained from https://next-scripting.org/. Please report issues and wishes by opening a ticket at https://sourceforge.net/p/next-scripting/tickets/. Best regards - Gustaf Neumann - Stefan Sobernig