We're proud to announce BoxLang 1.11.0, a highly focused performance and stability release that delivers measurable speed improvements across every BoxLang application, with zero code changes required. The team invested deeply in bytecode generation, class loading, lock management, and type casting to produce one of the most impactful runtime optimization releases to date. Alongside the performance wave, this release resolves critical concurrency bugs, hardens DateTime handling, and ships powerful new developer tooling.
π What's New in 1.11.0
You can find the full release notes here: https://boxlang.ortusbooks.com/readme/release-history/1.11.0
β‘ Performance Wave β 15+ Targeted Runtime Speedups
BoxLang 1.11.0 includes over 15 targeted performance improvements spanning bytecode compilation, runtime execution, memory management, and concurrency. Every BoxLang application benefits immediately.
Bytecode & Compilation
The compiler has been significantly tightened:
- Optimized bytecode generation avoids unnecessary casts during value operations
- Cached
isFinalandisAbstractflags at compile time instead of computing them at runtime - Reworked FQN parsing eliminates expensive regex operations on every class lookup
- Improved ClassInfo lookup during compilation using better caching strategies
- Optimized ClassLocator cache key generation via improved
hashCode()creation
Runtime Execution
Core runtime operations are noticeably faster:
// All of these are faster in 1.11.0 β no code changes needed
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 ) // Arg/return type casting via keys, not reflection
Memory & Concurrency
- Cached closest
variablesscope reference in function contexts - Cached web request config instead of re-resolving per request
- Case-insensitive string matching 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)
The cumulative effect is meaningful: applications under load will see reduced latency, lower GC pressure, and better throughput β all with zero migration effort.
π Concurrency & Lock Safety β Critical Fix
Two critical bugs in the exclusive lock system have been resolved. Before 1.11.0, exclusive locks could occasionally allow more than one thread into a supposedly exclusive section under high load (BL-2203, BL-2205).
// This critical section is now truly exclusive under concurrent load
lock name="processPayment_#orderId#" type="exclusive" timeout="30" {
// Only ONE thread will be here at a time β guaranteed in 1.11.0
if ( !paymentProcessed( orderId ) ) {
processPayment( orderId )
}
}
Lock storage has also been improved (BL-2201) for better performance and memory efficiency. If you rely on exclusive locks for payment processing, inventory management, or any critical section β this is an important upgrade.
ποΈ DateTime Casting Reliability
A comprehensive sweep of DateTime casting fixes ensures robust date handling across all common formats and edge cases:
// All of these now work reliably in 1.11.0
date1 = createDateTime( "01-31-2026 23:59: 59" ) // BL-2189
date2 = createDateTime( "9-30-2010" ) // BL-2222
date3 = parseDateTime( "2026-01-31 00:00: 00.000" ) // ODBC Timestamp (BL-2143)
// Query of Queries with ODBC Timestamp columns now compiles correctly
qoq = queryExecute(
"SELECT * FROM myQuery WHERE dateCol > :dt",
{ dt : now() },
{ dbtype : "query" }
) // BL-2144
// DateTimeCaster now handles ODBC Date/Time formats
cast1 = dateTimeFormat( odbcDate, "yyyy-mm-dd" ) // BL-2188
π enforceUDFTypeChecks Configuration Setting
A new runtime setting allows you to skip UDF argument and return type validation β useful for trusted high-performance codebases:
// boxlang.json
{
"enforceUDFTypeChecks": false
}
When false, BoxLang skips argument type validation and return type casting on function calls β similar to how the Java compiler performs generic type erasure. This can improve performance but removes the safety net of runtime type checks.
β±οΈ getTickCount() β Nanosecond & Second Precision
getTickCount() now supports nano and second units alongside the existing millisecond support:
// Micro-benchmark with nanosecond precision
start = getTickCount( "nano" )
doExpensiveWork()
elapsed = getTickCount( "nano" ) - start
println( "Elapsed: #elapsed# ns" )
// Coarse timing in seconds
start = getTickCount( "second" )
sleep( 2000 )
elapsed = getTickCount( "second" ) - start
println( "Elapsed: #elapsed# seconds" ) // 2
ποΈ New BIF: ExecutorDelete()
The missing ExecutorDelete() BIF has been added, completing the executor lifecycle management API. Previously, shutting down an executor did not remove it from the executor registry (BL-2168), causing issues when recreating executors with the same name.
// Create an executor
myExecutor = executorNew( "myPool", "fixed", 10 )
// Submit work
future = executorSubmit( myExecutor, () => doWork() )
future.get()
// Full cleanup β now properly removes it from the registry
executorDelete( "myPool" )
π€ Core Runtime Updates
ποΈ Class System Improvements
- Super class loading improved to handle complex inheritance hierarchies reliably (BL-2211)
- Abstract class enforcement relaxed β abstract classes are no longer required to implement all interface methods (BL-2251), matching Java and 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)
π§΅ Thread & Execution Fixes
- 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)
- Parser concurrency issue in LSP fixed when getting cache size (BL-2253)
π Query System
QueryNew()andqueryAddRow()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 per CFML spec (BL-2185)println()can now be called with no arguments to output an empty line β no moreprintln( "" )workaround (BL-2200)compareTo()date member method no longer incorrectly attaches to zero-valuedBigDecimal(BL-2166)
π XML Handling
- Deleting a non-existent key from
XMLAttributeno longer throws an error (BL-2231) XMLChildrennow updates correctly in all mutation cases (BL-2240)- WDDX now properly escapes special characters in attribute values (BL-2216)
π Transaction & Stored Procedures
- Transaction
endaction no longer throws an error when a stored procedure was executed within the transaction (BL-2157) - Transaction
actionattribute 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 (BL-2218):
# Start the server β .boxlang.json is automatically picked up
$ boxlang server start
// .boxlang.json β project-level configuration, committed to source control
{
"enforceUDFTypeChecks": false,
"defaultDatasource": "mydb"
}
This makes project-level BoxLang configuration portable and self-contained β ideal for containerized deployments and team environments.
βοΈ Undertow / Socket / WebSocket Options
You can now tune Undertow, socket, and WebSocket low-level options directly from miniserver.json:
{
"undertow": {
"ioThreads": 8,
"workerThreads": 64,
"bufferSize": 16384
},
"socket": {
"tcpNoDelay": true,
"reuseAddress": true
},
"websocket": {
"maxFrameSize": 65536,
"maxTextMessageSize": 65536
}
}
π Logging Directory Output
The MiniServer now logs the logging directory path during startup (BL-1342) β a small but welcome quality-of-life improvement:
[BoxLang] MiniServer starting...
[BoxLang] Logging directory: /home/app/.boxlang/logs
[BoxLang] Server started on http://localhost:8080
π Undertow Upgraded to 2.3.23.Final
The MiniServer now runs on Undertow 2.3.23.Final, bringing the latest HTTP server fixes and security patches.
π 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 (BL-2164). This unlocks powerful request gateway patterns:
- A/B routing and feature flags
- Maintenance mode bypasses
- Multi-tenant request routing
- Authentication redirects
All handled before any application overhead kicks in.
π οΈ Developer Experience
π³ Enhanced --bx-printast Tooling
The --bx-printast CLI flag now supports file paths and standard input piping (BL-2187), making it far more useful for debugging parser output and build tooling integration:
# Print AST for a specific file
boxlang --bx-printast /path/to/MyClass.bx
# Pipe source code directly
echo 'result = 1 + 2' | boxlang --bx-printast
# Integrate with editors and build pipelines
cat MyComponent.bx | boxlang --bx-printast | jq '.body[0]'
π§© SOAP Client β Binary and Map Type Support
The SOAP client now supports binary data and map/struct types for both requests and responses. It also allows you to call service methods directly without going through invoke():
ws = soap( "http://example.com/DataService?wsdl" )
// Send binary data
result = ws.uploadDocument( {
name : "report.pdf",
data : fileReadBinary( "/reports/annual.pdf" ) // Binary now supported
} )
// Send map/struct data
result = ws.updateRecord( {
id : 123,
metadata : { region : "US", tier : "premium" } // Map/Struct now supported
} )
π§ Session Configuration in boxlang.json
Two previously missing session configuration settings are now supported (BL-1859):
{
"sessionManagement": true,
"sessionCluster": false
}
π Improved CLI Error Messages
CLI error messages now provide clearer context and actionable information when BoxLang scripts fail (BL-2212).
π Notable Bug Fixes
| Ticket | Summary |
|---|---|
| BL-2203 | Exclusive locks sometimes allowed multiple threads into the locked section |
| BL-2205 | cflock race condition under high concurrency |
| BL-2189 | Can't cast 01-31-2026 23:59: 59 to a DateTime |
| BL-2143 | DateTime Default ODBC Timestamp format was incorrectly quoted |
| BL-2157 | Transaction end threw error when a stored procedure was executed within |
| BL-2165 | getCurrentTemplatePath() didn't work inside a catch block |
| BL-2196 | ENV secrets expand issue on Docker images due to *_FILE greediness |
| BL-2206 | Parser error with extra pound signs |
| BL-2217 | Module public remote class requests did not fire Application lifecycle events |
| BL-2236 | form, url, and CGI scopes incorrectly scope-hunted during assignment |
| BL-2242 | Null in switch statement threw error |
| BL-2251 | Abstract class incorrectly required to implement all interface methods |
π§ Configuration Updates Summary
| Setting | Description |
|---|---|
enforceUDFTypeChecks | New boolean 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 | MiniServer now auto-loads this file from the working directory |
π¦ Dependency Updates
- Undertow upgraded to
2.3.23.Final - Gradle wrapper updated to
9.3.1 - Jackson Jr bumped to
2.21.1 - Logback Classic bumped to
1.5.32
π― Upgrading
BoxLang 1.11.0 is a drop-in upgrade. No code changes are required to benefit from the performance improvements.
# CommandBox
box install boxlang@1.11.0
# BVM
bvm install 1.11.0 && bvm use 1.11.0
# Docker
FROM ortussolutions/boxlang:1.11.0
Full release notes, documentation, and downloads are available at boxlang.io and boxlang.ortusbooks.com.
Add Your Comment