githubEdit

1.11.0

March 4, 2026

BoxLang 1.11.0 is a highly focused performance and stability release. The team invested heavily in runtime optimizations across bytecode generation, class loading, lock management, and type casting — delivering measurable speed improvements for nearly every BoxLang application. This release also introduces new developer tooling, enhanced configuration capabilities, and resolves critical concurrency bugs in the locking system and DateTime casting pipeline.

🚀 Major Highlights

⚡ Performance Wave — Across-the-Board Runtime Speedups

BoxLang 1.11.0 includes over 15 targeted performance improvements that collectively make every BoxLang application faster with zero code changes required:

Bytecode & Compilation:

  • Optimized bytecode generation to avoid unnecessary casts during value operations

  • Cached isFinal and isAbstract flags at compile time instead of computing them at runtime

  • Reworked FQN (Fully Qualified Name) parsing to avoid expensive regex operations

  • Improved ClassInfo lookup during compilation using better caching strategies

  • Optimized ClassLocator cache key generation by improving hashCode() creation

Runtime Execution:

// These operations are ALL faster in 1.11.0
result = myClass.doWork()           // Faster class construction via this.get()
found = myArray.find( "value" )     // arrayFind optimized, avoids stream overhead
flag = isBoolean( "true" )          // Faster boolean string parsing
someBif( arg1, arg2 )               // Function arg/return type casting via keys, not reflection

Memory & Concurrency:

  • Cached closest variables scope reference in function contexts

  • Cached web request config instead of re-resolving per request

  • Case-insensitive string matching now uses an optimized algorithm

  • Reduced toRealPath() calls that were silently adding overhead on every file operation

  • Simplified constructor path for Box Classes reduces object creation overhead

  • Removed function inner classes, reducing class loading and GC pressure

  • Avoided Map.containsValue() in UDF invocation (linear scan → constant time)

🔒 Concurrency & Lock Safety

Critical fixes to the exclusive lock and bx:lock (cflock) race condition ensure that concurrent sections are truly thread-safe:

Before 1.11.0, exclusive locks could occasionally allow more than one thread to enter a supposedly exclusive section under high load. Both BL-2203arrow-up-right and BL-2205arrow-up-right addressed this:

Additionally, lock storage has been improved (BL-2201) for better performance and memory efficiency.

🗓️ DateTime Casting Reliability

A comprehensive sweep of DateTime casting fixes ensures robust date handling across all common formats:

🆕 enforceUDFTypeChecks Configuration Setting

A new runtime setting allows you to skip UDF argument and return type validation for maximum compatibility or performance tuning in trusted codebases:

When set to false, BoxLang will skip argument type validation and return type casting on function calls. This acts much how the Java compiler does generic type erasure — it removes the layer of runtime type safety checks, which can improve performance but also means that type mismatches won't throw errors. Thus we always recommend you type your UDFs and keep this setting enabled for the best balance of safety and performance.

⏱️ getTickCount() — Nanosecond & Second Precision

getTickCount() now supports nano and second units in addition to the existing millisecond support:

🗑️ New BIF: ExecutorDelete()

The missing ExecutorDelete() BIF has been added, completing the executor management API:

Previously, shutting down an executor did not remove it from the executor registry (BL-2168), which could cause issues when recreating executors with the same name. ExecutorDelete() now handles full cleanup.

🤖 Core Runtime Updates

🏗️ Class System Improvements

  • Super class loading improved to handle complex inheritance hierarchies more reliably (BL-2211)

  • Abstract class enforcement relaxed — abstract classes are no longer required to implement all interface methods (BL-2251), matching Java/CFML semantics

  • Typed array returns no longer throw NPE when a class is instantiated via a different invocation path (BL-2237)

  • Implicit accessors now generate the correct return type in method signatures instead of always using any (BL-2195)

  • isFinal/isAbstract cached at compile time for major performance gains during runtime class checks (BL-2254)

🧵 Thread & Execution Fixes

  • Executor shutdown now properly removes the executor from the registry (BL-2168)

  • Parser concurrency issue in LSP fixed when getting cache size (BL-2253)

  • Duplicate bytecode methods no longer generated in edge cases (BL-2207)

  • Incompatible stack heights when not assigning new Foo() resolved (BL-2213)

  • Illegal exception table range in class files fixed (BL-1916)

📊 Query System

  • QueryNew() and queryAddRow() now properly validate column types (BL-2247)

  • distinct(col) no longer confused with a function name in QoQ (BL-2221)

  • QoQ with ODBC Timestamp format columns now compiles correctly (BL-2144)

  • Query column scope no longer found in loops for assignment (BL-2208), fixing variable scoping edge cases

🔤 String & Type Improvements

  • quotedValueList() now correctly wraps values in single quotes (not double quotes) per CFML spec (BL-2185)

  • base64_or_object and mimetype keys no longer have trailing spaces (BL-2180)

  • compareTo() date member method no longer incorrectly attaches to zero-valued BigDecimal (BL-2166)

  • println() can now be called with no arguments to output an empty line — no more println("") workaround (BL-2200)

🌐 XML Handling

  • Deleting a non-existent key from XMLAttribute no longer throws an error (BL-2231)

  • XMLChildren now updates correctly in all mutation cases (BL-2240)

  • WDDX now properly escapes special characters in attribute values (BL-2216)

🔐 Transaction & Stored Procedures

  • Transaction end action no longer throws an error when a stored procedure was executed within the transaction (BL-2157)

  • Transaction action attribute is now case-insensitive (BL-2238)

📡 MiniServer Runtime Updates

📁 .boxlang.json Convention

The MiniServer now automatically detects and loads a .boxlang.json file from the current working directory, merging it with the base BoxLang configuration:

This makes project-level BoxLang configuration portable and self-contained — ideal for containerized deployments and team environments.

⚙️ Undertow / Socket / WebSocket Options

You can now influence Undertow, socket, and WebSocket low-level options directly from miniserver.json:

📂 Logging Directory Output

The MiniServer now logs the logging directory path during startup (BL-1342), making it easier to locate log files:

🔄 Undertow Upgrade

Undertow has been upgraded to 2.3.23.Final, bringing the latest HTTP server fixes and security patches to the MiniServer runtime.

🌐 Web Support Updates

🔀 Pre-Request Interception for Request Rerouting

A new interception point fires before onRequestStart, enabling interceptors to reroute requests before the application lifecycle begins. This enables powerful request gateway patterns — A/B routing, feature flags, maintenance mode, and tenant routing — all handled before the application overhead kicks in.

🛠️ Developer Experience

🌳 Enhanced --bx-printast Tooling

The --bx-printast CLI flag now supports file paths and standard input piping, making it far more useful for debugging parser output and build tooling integration:

🧩 SOAP Client — Binary and Map Type Support

The SOAP client now supports additional complex types for requests and responses, including binary data and maps/structs. It also allows you to execute methods directly without using the invoke() method, we will route the call to the correct method based on the arguments you pass in.

🔧 Session Configuration in boxlang.json

Two previously missing session configuration settings are now supported in boxlang.json:

  • sessionManagement — Enable/disable session management globally

  • sessionCluster — Enable session clustering support across nodes

📋 Improved CLI Error Messages

CLI error messages have been improved to provide clearer context and actionable information when BoxLang scripts fail (BL-2212).

🐛 Notable Bug Fixes

Ticket
Summary

Exclusive locks sometimes allowed multiple threads into the locked section

cflock race condition under high concurrency

Can't cast 01-31-2026 23:59:59 to a DateTime

DateTime Default ODBC Timestamp format was incorrectly quoted

Transaction end threw error when a stored procedure was executed within

getCurrentTemplatePath() didn't work inside a catch block

ENV secrets expand issue on Docker images due to *_FILE greediness

Parser error with extra pound signs

Module service re-activated modules whose moduleName was overridden in box.json

Module public remote class requests did not fire Application lifecycle events

CFML compat: form, url, and CGI scopes incorrectly scope-hunted during assignment

Compat: Null in switch statement threw error

Abstract class incorrectly required to implement all interface methods

🔧 Configuration Updates

  • enforceUDFTypeChecks — New boolean setting in runtime to disable UDF argument/return type validation

  • sessionManagement — Enable/disable session management globally in boxlang.json

  • sessionCluster — Enable distributed session clustering in boxlang.json

  • .boxlang.json convention — MiniServer now auto-loads this file from the working directory


🎶 Release Notes

Bugs

BL-1916arrow-up-right Illegal exception table range in class file

BL-2002arrow-up-right cffile upload - upload fails if `accept` attribute is added

BL-2143arrow-up-right DateTime Default ODBC Timestamp format is being incorrectly quoted

BL-2144arrow-up-right QoQ Does not Compile when query contains ODBC Timestamp format

BL-2157arrow-up-right Transaction End Throws Error When Stored Procedure is Executed Within

BL-2160arrow-up-right Compat: RSA Private Key Encryption Not Supported

BL-2163arrow-up-right Exception Util License Exception Check swallows error if message is null

BL-2165arrow-up-right getCurrentTemplatePath() doesn't work inside a catch block

BL-2166arrow-up-right compareTo() date member method attaching to zero-valued BigDecimal

BL-2168arrow-up-right Executor Shutdown was not removing the discarded executor

BL-2180arrow-up-right base64_or_object and mimetype keys have a space at the end

BL-2185arrow-up-right quotedvaluelist() is supposed to wrap in single quotes, not double quotes

BL-2186arrow-up-right remote cfc invocation doesn't support argumentCollection

BL-2188arrow-up-right DateTimeCaster does not support ODBC Date and ODBC Time formats

BL-2189arrow-up-right Can't cast [01-31-2026 23:59:59] to a DateTime

BL-2192arrow-up-right Invoke Webservice does not provide Proper SOAP payload Request

BL-2195arrow-up-right Implicit accessors always generate "any" as returntype in method signature

BL-2196arrow-up-right ENV secrets expand issue on BoxLang Docker base images due to *_FILE greedyness

BL-2197arrow-up-right Dump Template Error with Empty Byte Array

BL-2203arrow-up-right Exclusive locks sometimes allow multiple threads to enter the locked section

BL-2205arrow-up-right cflock race condition

BL-2206arrow-up-right Parser error with extra pound signs

BL-2207arrow-up-right duplicate bytecode method

BL-2208arrow-up-right Don't find query columns in loops for assignment

BL-2209arrow-up-right module service re-activates modules whose modulename is overridden in the box.json

BL-2210arrow-up-right moduleconfig and BX BIFs are not loaded with consistent mapping path and class names

BL-2213arrow-up-right incompatible stack heights when not assigning new Foo()

BL-2216arrow-up-right WDDX doesn't escape special chars in attribute values

BL-2217arrow-up-right Module public remote Class requests do not fire Application Lifecycle events

BL-2221arrow-up-right distinct ( col ) confused with function name

BL-2222arrow-up-right DateTime Cast error with `9-30-2010`

BL-2231arrow-up-right deleting non-existent key from XMLAttribute causes XML error

BL-2236arrow-up-right CF doesn't scope hunt form, url, and CGI when assigning

BL-2237arrow-up-right Typed array return throws NPE when class is instantiated with a different invocation path

BL-2238arrow-up-right Transaction action is case-sensitive

BL-2240arrow-up-right XMLChildren doesn't update in all cases

BL-2241arrow-up-right rewrite directoryList( absolute_path=foo )

BL-2242arrow-up-right Compat: Null in switch statement throws error

BL-2243arrow-up-right Compat: Lock component `name` attribute is optional

BL-2244arrow-up-right Compat: Empty Values In Query new DateTime-typed Column Throw casting errors

BL-2245arrow-up-right Compat: FileUpload allows `filefield` to be prefixed with `Form.`

BL-2246arrow-up-right Compat: `File` component action also creates a `file` variable, instead of just `cffile`

BL-2247arrow-up-right QueryNew() and queryAddRow() are missing column type validation

BL-2251arrow-up-right Abstract class required to implement all interface methods

BL-2253arrow-up-right Parser concurrency issue when getting cache size in LSP

New Features

BL-1859arrow-up-right Add missing session config settings: sessionCluster, sessionManagement in the boxlang.json

BL-2164arrow-up-right Web Support: Implement Interception prior to onRequestStart to handle Request Rerouting

BL-2169arrow-up-right Add missing BIF: ExecutorDelete()

BL-2187arrow-up-right Enhanced boxlang --bx-printast to work with files and stadard in for piping in source code

BL-2202arrow-up-right enforceUDFTypeChecks setting to skip UDF argument and return type validation

BL-2214arrow-up-right Support nano and second for getTickCount()

BL-2248arrow-up-right Add ability to influence the undertow, socket and websocket options from the miniserver.json

Improvements

BL-1342arrow-up-right Consider outputting logging directory when miniserver starts

BL-2151arrow-up-right Improve performance of security allowed BIF/component checks

BL-2152arrow-up-right Avoid concurrent modification exception in config

BL-2153arrow-up-right Performance experiment - reduce toRealPath() calls

BL-2154arrow-up-right Simplify constructor path for Box Classes

BL-2162arrow-up-right Remove use of function inner classes

BL-2181arrow-up-right Ignore empty proxy port in http component

BL-2184arrow-up-right Add exceptions for when preserveSingleQuotes() is required

BL-2199arrow-up-right Interface for objects which can be represented as binary

BL-2200arrow-up-right Allow for println() to print a new line for convenience instead of println( "" )

BL-2201arrow-up-right Improve storage of locks for lock component

BL-2211arrow-up-right Improve class super class loading

BL-2212arrow-up-right Improve CLI error messages

BL-2215arrow-up-right Add SOAP Client support for additional complex types - Binary and Map

BL-2218arrow-up-right Convention: Miniserver should look for `.boxlang.json` file and append it to config

BL-2223arrow-up-right Improve parsing of FQN by avoiding regex

BL-2224arrow-up-right Use optimized case-insensitive string matching logic

BL-2225arrow-up-right improve performance of function arg and return type casting by using keys

BL-2226arrow-up-right optimize bytecode to avoid casting where not needed

BL-2227arrow-up-right faster parsing for boolean caster looking at strings

BL-2228arrow-up-right Optimize ClassInfo lookup when compiling

BL-2229arrow-up-right Optimize arrayFind by avoiding streams

BL-2230arrow-up-right Improve ClassLocator cache key generation time by caching improving hashCode creation

BL-2232arrow-up-right cache closest variables scope ref in function context

BL-2233arrow-up-right improve Class creation by using this.get() instead of dereference() which has more overhead

BL-2234arrow-up-right improve UDF invocation perf by avoiding Map.containsValue()

BL-2235arrow-up-right Cache config in web request context

BL-2249arrow-up-right Upgrade undertow to 2.3.23.Final on MiniServer

BL-2254arrow-up-right For performance cache isFinal and isAbstract field on classes at compile time

BL-2255arrow-up-right Update feature audit to recognize CFC service wrappers

BL-2256arrow-up-right Updated Gradle wrapper to 9.3.1

BL-2257arrow-up-right Bump Jackson Jr to 2.21.1

BL-2258arrow-up-right Bump logback classic to 1.5.32

Last updated

Was this helpful?