Open Dylan 2020.1

This document describes the 2020.1 release of Open Dylan, released 10 October, 2020. This release contains many enhancements and bug fixes, highlights of which are listed below. For complete details see the opendylan commit logs. (Note that some commit logs, for example for testworks and other libraries that are included in Open Dylan as git submodules, may be in other repositories.)


  • The default compiler-back-end is now selected by querying the SUPPORTED_COMPILER_BACK_ENDS build system variable, normally set at configuration time within the config.jam build script:


    At build time, if the selected back-end is not supported by the build-system configuration, a warning will be issued.

    The default back-end, when it is available, is now LLVM.

  • In the LLVM back-end, improved alignment information is supplied to the llvm.memcpy intrinsic.

  • A new primitive-the primitive function is supported as an annotation that allows the compiler to assume that a value has the given type. These annotations were also added to the dylan library at various frequently-executed expressions where the compiler is otherwise unable to infer the type, reducing the number of run-time type checks when using the LLVM back-end.

  • Optimization for cases where the instance? function is used in an if or case condition has been improved.

  • A bug in the LLVM back-end that could cause stack overflows in long-running functions has been fixed.

  • The C back-end now uses C99 hexadecimal floating-point constants in its output to prevent loss of precision due to decimal conversion.

  • A longstanding bug in an attempted optimization that caused spurious serious warnings when compiling the Dylan library has been fixed.

  • A failure of code generated by the LLVM back-end to detect integer overflows resulting from arithmetic shifts has been fixed.

  • A failure to detect argument mismatches when known functions are called using apply has been fixed.

  • Calls to functions that do not return are now properly recognized by the LLVM code generator.

  • The failure of the LLVM back-end to include NUL termination in <byte-string> instances in the generated heap has been fixed. (NUL termination is added so that string data can be passed to FFI functions without requiring allocation and copying.)

  • Compiler error messages now include column numbers (in GNU standard format) when referring to source locations. Debug information generated by the LLVM back-end also includes column numbers.

  • The compiler can now output etags-format TAGS tables using the export tags command.

  • The command-line compiler now displays a text mode progress bar during the compilation and link phases.

  • The compiler no longer generates dispatch coloring information in Emacs Lisp format by default. When it is needed, it can still be requested by supplying the -dispatch-coloring elisp command-line option at build time. (Note that the IDE dispatch coloring display does not make use of the elisp-format files.)

  • The LLVM back-end now tracks function inlining in generated debug information, allowing breakpoints to be set in inlined code. (Note, however, that functions inlined from the dylan library are excluded.)

  • The HARP back-end is no longer supported on x86 Linux because it is not able to maintain the stack alignment that C code requires on that platform.

  • A bug that prevented the error output of build commands (such as the linker) from appearing in build.log files and the console output has been fixed.


  • An error in the LLVM run-time which prevented call-site method dispatch caches from being used has been fixed. This change significantly improves the performance of code using the LLVM back-end.

  • Support for apply-mep method entry (used for calling a known method using apply when next-methods of the call are known) was added to the LLVM run-time.

  • The interpretation of decode-double-float and encode-double-float on 64-bit platforms has changed, so that 32 bits of the <double-float> value are found in each of the two <machine-word> values. Previously (on 64-bit platforms) the entire 64 bits were placed in one <machine-word> and the other contained zeroes. This change fixes bug 1254.

  • A problem with thread exit that could cause thread finalization cycle warnings from the garbage collector has been fixed.

  • The LLVM run-time on 32-bit x86 platforms now clears the x87 stack when handling exceptions to prevent overflowing the 8-slot FPU stack.

Platform Support

  • The AArch64 (64-bit ARM) platform is now supported on Linux.

  • The 32-bit x86-darwin platform is no longer supported, since macOS 10.15 (Catalina) and later can no longer support running 32-bit applications.


  • The Visual SourceSafe source control interface for the Windows environment has been removed.


  • The Scepter IDL compiler can now #include files via symbolic links.

  • Scepter IDL compiler #include file open errors are now properly signaled.

  • Problems with Portable Object Adapter shutdown have been fixed.

  • The TypeCode type predefined by Scepter now appears in the CORBA IDL module.

  • IDL forward declarations of structures and unions are now properly supported.

  • Typecode marshalling and interpretation has been fixed.

  • The CORBA run-time and the IDL compiler now support long long and unsigned long long types.

  • Marshalling of sequences and arrays to <Any> pseudo-objects is now supported by the CORBA run-time.

  • The deprecated IOP field requesting_principal is now filled in with a empty octet sequence, fixing interoperability with other ORBs.

  • LocateReply responses sent from a POA have been fixed.

  • The Scepter and CORBA runtime unit tests have been improved.

  • The CORBA demo applications have been updated.

  • References in the source code to “Functional Developer ORB” are now updated to “Open Dylan ORB”.


  • The obsolete GDK_SOLID constant is no longer referenced from the DUIM back-end for GTK.


  • The obsolete gdk-pixbuf-gettext function is no longer included in the GTK bindings.

  • A type error that prevented GObject casts from working properly has been fixed.



Build System

  • The build system now reliably detects when changes have been made to Jamfile sources while the environment is running.

  • The build tool used during bootstrapping was improved so that it can build multiple libraries for each invocation of dylan-compiler, significantly reducing the time required to do bootstrap builds.

Library Changes

dylan Library

  • A bug that broke limited(<array>) instantiation has been fixed.

common-dylan Library

  • The simple-io module has been removed. This module was deprecated in Open Dylan 2014.1 and is replaced by the simple-format module.

  • The performance of the join method was improved.

  • The split function now signals an error when called with an empty separator (e.g., the empty string) or with a separator function that returns start/end indices that are equal.

io Library

  • A longstanding bug in the tab position computation used by the pprint-tab function is now fixed.

  • The unit tests for the pprint and print modules were improved.

  • *print-escape?* and the escape? parameter for the print function have been documented.

  • The printing-object macro has been documented.

system Library

  • Library initialization under the LLVM back-end has been changed to enable using the load-library function on all supported platforms.

  • The load-library function will now signal an <error> if it fails.

  • A bug in delete-directory:file-system:system was fixed.

  • A bug that prevented file open failures from being detected on 64-bit platforms has been fixed.

  • A bug that affected the file-type function on macOS has been fixed.

  • The run-application:operating-system:system function has changed to accept the command as a <sequence> instead of a limited type. This simplifies the specification of the command at the call site.

  • There have been several improvements to the locators module:

    • Locators always show the path when printed, for improved debugging.

    • simplify-locator now resolves .. correctly.

    • The resolve-locator function has been added. It is similar to simplify-locator but also resolves links in the file system.

    • merge-locators now correctly handles merging a directory locator from a file locator that has no directory component. Example:

      merge-locators(as(<directory-locator>, "a/"),
                     as(<file-locator>, "b"))
        => {<file-locator> "a/b"}
    • merge-locators no longer calls simplify-locator. Because the semantics of simplifying a locator depend on whether or not the file system is checked (i.e., simplify-locator vs resolve-locator) it is left to end-user code to decide whether and how to do it.

c-ffi Library

  • The import mapping for types such as <C-int> has been changed to return a <abstract-integer> (as per the original design) rather than <machine-word>. The Win32 and OLE interface libraries were modified to accommodate this change.

  • LLVM code generation for C-FFI code that requires type casting or sign extension has been fixed.

network library

  • A deadlock that occurred when shutting down listening socket threads has been fixed.

  • Error code generation on BSD operating systems has been fixed.

testworks Library

  • A new executable library, testworks-run, can be used to run any test library compiled as a shared library. On Linux, testworks-run --load

  • The testworks-specs library has been folded into testworks and has been greatly simplified. See Interface Specification Suites. Note that the new specification suites no longer expect you to define one test per exported name in your interface module. Instead you can write tests in whatever way best suits your needs and the interface specification suite only verifies that the specification matches the implementation.

  • A new function has been added to retrieve a unique directory for the current test: test-temp-directory

  • The –report command line option now accepts “full” as a value, meaning to display individual assertion results in addition to the normal output.

  • Support for benchmarks has been improved. A new benchmark-repeat macro for use within testworks runs its body multiple times, causing the “full” report to display basic statistics characterizing the benchmark execution.

  • The output for several assertions has been made less verbose.

  • Use --report json to generate reports in JSON format. These are much like the XML reports but less verbose.

  • --report log has been removed. Use --report json or --report xml instead.

  • The testworks-report library has received some love and is now able to parse json and xml reports.

  • An error is signalled if two tests are defined with the same name. (Note that when using combined test suites, or using the --load testworks-run option multiple times the names of all loaded tests and suites must be unique.)

  • When a test has no assertions it receives a “not implemented” result. This is now considered to be a passing result rather than failing. The reasoning is that “not implemented” should be a reminder to implement the test (so it is still displayed prominently in the test output) but it should not obscure real test failures in the results. Tests that fail constantly because they’re unimplemented are not very useful.

collections Library

  • A warning displayed when compiling the collections library with the LLVM back-end has been fixed.

big-integers library

  • The integer-length function is now implemented for <double-integer>.

progress-stream library

  • A new library for displaying text mode progress bars is provided.

gabriel-benchmarks library

  • The Gabriel benchmarks have been improved and brought in line with the Common Lisp cl-bench project, and now make use of the Testworks benchmarking facilities.


We’d like to thank all the people that made contributions to this release and to surrounding libraries in the Dylan ecosystem. This list is probably incomplete…

  • Peter S. Housel

  • Carl Gay

  • Peter Hull

  • Fernando Raya

  • Tim McNamara

  • Alfredo Beaumont

  • Bruce Mitchener