listeners()
now uses the correct key for print-messages.- Threaded DNS lookups had an issue that made them freeze the server just as badly as non-threaded DNS lookups. This has been resolved. (See ToastCore for an example implementation of handling slow lookups without allowing a connection to process commands.)
curl
and related functions are now disabled when outbound network connections are disabled.- Large amounts of input on TLS connections could cause it to fail to go through until the next command. This is now fixed.
open_network_connection
now displays more helpful error messages in-MOO, particularly when catching errors in a try.- Outbound TLS connections now include the SNI.
- PCRE improvements.
- Fix memory corruption in the signal handler.
- Fix buffer overflow in telnet IAC capture.
- Fix a memory leak when converting from objects to strings in SQLite.
- Remove the
proxy_rewrite
server option. Instead, you can now add trusted proxy IP addresses to the$server_options.trusted_proxies
property or the equivalent property on the listening object itself. Any connecting IP found in this list will have the login screen suppressed, and will accept forwarded IP addresses via the HAProxy Proxy protocol, at which point the welcome screen will be printed. To regain the legacy functionality, you can set$server_options.trusted_proxies
to{"127.0.0.1", "::1"}
- Add a fourth argument to
occupants()
to inverse the parent match. - Add a command line argument (
--no-ipv6
) to disable the initial IPv6 listener.
- If you rely on the proxy rewriting behavior, note that it is no longer enabled by default. See the entry above about trusted proxies.
- Various 64-bit compatibility fixes.
- PCRE cache no longer ignores the case sensitive option. And other improvements.
- Fix various race conditions.
- Fix a memory leak when LOG_CODE_CHANGES is enabled and you program a verb and then remove it.
- Each connection now has an option to enable TCP keep-alives. These can be configured with
set_connection_option
by either specifying 1 (to enable and use defaults) or by specifying a map of options. The option keys are: idle, interval, and count. More information on what they do, and default values, can be found in options.h. listen()
now accepts a new key in its option map: interface. This allows you to specify the interface to listen on. (Similar to the --ipv4 or --ipv6 command-line arguments.)listeners()
now shows the interface being listened on.
- Fix a memory leak in
open_network_connection()
that occurred after a successful connection. - Fix a bug where the SERVER FULL message wouldn't display the connection name properly.
- Fix a bug where a waif could refer to itself in a map. It now correctly returns E_RECMOVE. The server will also now validate waifs at startup to ensure there are no self-referential waifs. If one is found, it's invalidated.
- Fix an issue that could cause friendly error messages to display 'unknown type'.
- The stack list passed to
handle_lagging_task()
now actually includes the verb that was causing the lag, rather than just the verb(s) that called it. - Detect 32-bit architectures and set the ONLY_32_BITS option appropriately.
- Fix a bug that would cause
file_read()
to over-read if the number of bytes specified was larger than the buffer. - Fix a (rare) crash in the lag profiler.
- Fix an issue where threaded SQLite calls could set the number of locks incorrectly, which would allow a connection to be closed while it was still doing work.
- Fix a couple of race conditions that could result in a server crash.
- Fix a memory leak around
SAVE_FINISHED_TASKS
/ lag reporting. - Fix an issue where
handle_lagging_task()
would get called with empty arguments for single tasks. - Return runtime error messages from
sqlite_execute()
. - Disable virtual timers when running under the Windows Subsystem for Linux. (This fixes things like
seconds_left()
returning 0.) - Fix a potential crash when threaded SQLite functions attempt to write object numbers.
- Add a ceiling to
ctime()
to prevent overflows with large integer arguments. - Fix an issue where friendly tracebacks involving non-existent properties on waifs could crash the server.
- Fix an issue where waifs could get stuck "recycling" forever.
- Fix an issue with start scripts causing a panic, typically with 'no such file or directory' when, in fact, a file does exist.
- Uninstantiated waifs that haven't had their recycle verb called before a shutdown now save their state so they can recycle properly the next time the server starts.
- Legacy
connection_name()
now correctly says 'to' instead of 'from' when a connection is outbound.
- Support TLS / SSL connections in both
listen()
andopen_network_connection()
. Certificate and key can be configured in options.h, specifed as command-line arguments, or given as arguments to in-MOO functions. See warnings at the end of this changelog for important information about these changes. - Add a command line switch (
-t
or--tls-port
) to enable a TLS listening port. - MAX_QUEUED_OUTPUT can be overridden in-database by adding the property
$server_options.max_queued_output
and callingload_server_options()
. queued_tasks()
now accepts a second argument. If true, only the number of queued tasks is returned. This is significantly more performant thanlength(queued_tasks())
- Revamped command-line arguments:
- Each option now supports a single letter and a long form name.
- Arguments can now appear in any order (the only exception is output database must appear somewhere after input database)
- New arguments have been added to override defines in
options.h
. These include:--tls-cert
,--tls-key
,--file-dir
,--exec-dir
- You can now specify as many initial listeners as you want. Use
-p
for a standard port or-t
for a TLS port. (e.g../moo db db2 -p 7777 -t 7443 -p 8888 -t 8443
) - A full list of arguments is now available by supplying
--help
.
- Added CURL_TIMEOUT to options.h to specify the maximum amount of time a CURL request can take before failing. For special circumstances, you can specify a longer or shorter timeout with a new third argument to the
curl()
builtin. - Added an 'outbound' field to
connection_info()
that indicates whether a connection is outbound or not.
- The arguments for
listen()
have changed! Listen now accepts an optional third argument as a map. This map takes over the previous arguments and has the keys: ipv6, tls, certificate, key, print-messages. So if you wanted everything, you would use:listen(#0, 1234, ["ipv6" -> 1, "tls" -> 1, "certificate" -> "/etc/certs/something.pem", "key" -> "/etc/certs/privkey.pem", "print-messages" -> 1]
- The arguments for
open_network_connection()
have changed! All previous optional arguments have been folded into a single optional third MAP argument. It accepts the keys: ipv6, listener, tls. So if you wanted to open a TLS connection to an IPv6 address using #6 as the listener, you would do:open_network_connection("2607:5300:60:4be0::", 1234, ["ipv6" -> 1, "listener" -> #6, "tls" -> 1])
- The command-line argument for enabling/disabling outbound network connections has changed slightly. If you want to enable outbound network connections, use
-o
or--outbound
. To disable outbound connections, use-O
or--outbound
. (Note the capitalization difference.)
- Fix a bug that would cause the number of queued tasks (as seen by
queue_info(<player>)
) to drop into the negatives, effectively disabling task limits. - Fix an off-by-one error in
locate_by_name()
- Fix a crash and spoofing potential in proxy rewriting.
- Fix a bug in
sort()
that could have caused a server crash. - Fix a bug where using floats as map keys could result in lost values. (e.g. [12.1 -> 1, 12.2 -> 2] would lose 12.1)
- Fix a bug that could cause a crash if verb code referenced a waif property with the waif property prefix. (e.g.
foo.bar.:baz
) - Fix a bug in
exec()
that would cause a heap overflow if null bytes were introduced as arguments. - Fix a memory leak when using complex types as the third argument to
slice()
- Apply standard task limits to threaded background tasks.
- Standardize the modulus operator across platforms.
- Add math functions
cbrt()
,atan2
,asinh
,atanh
, andacosh
. - Add support for the SQLite
REGEXP
operator. - Add an
sqlite_interrupt(<handle>)
function to abort long-running SQLite queries. - Allow for retrieval of runtime environment variables from a running task, unhandled exceptions or timeouts, and lagging tasks via
handle_uncaught_error
,handle_task_timeout
, andhandle_lagging_task
, respectively. To control automatic inclusion of runtime environment variables, set theINCLUDE_RT_VARS
server option. Variables will be added to the end of the stack frame as a map. - Providing a true argument to
queued_tasks()
will include all variables for any running tasks that you are authorized to examine. Additionally, a third argument has been added to thetask_stack()
builtin, which toggles whether variables are included with each frame for the provided task. - Add a
BOOL
type to unambiguously indicate whether a value is TRUE or FALSE. Thetrue
andfalse
variables are set at task runtime and can be overridden within verbs if needed. - The
parse_json()
function now uses the BOOL type instead of converting to strings. Similarly, passing a boolean togenerate_json()
is understood to be a BOOL. - Add debug information about task queues to
queue_info(<object>)
when called by a wizard. - Improve reporting of 'x not found' errors. Now when you get a property, verb, or variable not found error, two things happen: First, the traceback message will tell you what exactly was not found. Second, if you catch the error in a try-except, the object number and name of the missing thing will be available as the third argument in the error list (the value).
- Improve type mismatch error reporting. Traceback messages will now tell you what type was expected vs the type that you supplied. The value returned in a caught E_TYPE is now a list of the format
{{expected types}, supplied type}
. Builtin functions will now tell you which argument was incorrect and the expected / supplied type for that argument.` - The addition operator now accepts lists. When adding two lists together, the two will be concatenated. (e.g. {1, 2, 3} + {4, 5, 6} => {1, 2, 3, 4, 5, 6}) When adding another type to a list, it will append that value to the end of the list. (e.g. {1, 2} + #123 => {1, 2, #123})
- User-defined signals (SIGUSR1 and SIGUSR2) will now be passed to #0:handle_signal as strings. If this verb does not exist, or the verb returns a non-true value, the default server behavior will be assumed. If #0:handle_signal returns a true value, the server will conclude that the signal has been appropriately handled and not go any further.
switch_player()
now prints standard messages by default. As such, a new argument has been added. If supplied and true, the switch will be silent and no messages printed.
WARNING: This version increments the database version (DBV_Bool), making databases incompatible with previous releases.
- The
mapvalues
function now accepts any number of keys, the values of which will be returned by the function. If a key doesn't exist, E_RANGE is returned. - Very minor performance improvement for Linux users by saving one (to two) calls to the kernel for every incoming network connection.
- Add a third argument to
slice()
to provide a default value when slicing a list of maps by key. This allows you to maintain index consistency in situations where some of the maps may not contain the sliced key. - Add a third argument to
sqlite_query()
to return the column name along with the result. - Cache
pcre_match()
patterns to speed up matching. Includes apcre_cache_stats()
function to view the number of cache hits per pattern. - Fix a bug that would cause the server to crash (at worst) when a DNS lookup failed.
- Fix a bug where long-running recycle verbs would cause the object to remain unrecycled and unrecyclable in the future.
- Fix bugs in
connection_name_lookup(x, 1)
that could result in a server crash. - Fix a bug in
parse_json()
that could crash the server. (Thanks to Tyler Spivey for the report and fix.) - Populate
server_version(1)
with all of the new options.h options and version control information.
- Fix a security oversight where
recreate()
could allow the recreation of an object that already owns other objects, verbs, or properties. Now therecycle()
function will correct ownership of anything owned by the object being recycled, though at a slight cost to speed on larger databases. If the speed hit proves to be too much and you know what you're doing, you can disable theSAFE_RECYCLE
option in options.h. - Fixed a bug in
exec()
that could cause the server to panic. - Fixed a slow memory leak when pulling telnet sequences.
- Add an
owned_objects(OBJ <who>)
builtin to return a list of valid objects owned by who. - Add the
NO_NAME_LOOKUP
option to options.h. When enabled, the server won't attempt to perform a DNS name lookup on any new connections. This option can be overridden in-DB by setting$server_options.no_name_lookup
to 1 or 0 and callingload_server_options()
. - Add the
connection_name_lookup(<connection> [, <rewrite connection_name>])
function to perform a DNS lookup on a connection's IP address in a background thread. Note that this function implicitly suspends, so if you use it in do_login_command you'll also need to useswitch_player()
orforce_input()
to work around the no-suspend-in-do_login_command shortcoming. - Add a
thread_pool(<function>, <pool> [, <value>])
function that allows control over the thread pools from within the database. - The
connection_name(<obj> [, <method>])
function now only returns obj's hostname (e.g.1-2-3-6.someplace.com
). A new optional argument allows you to specify 1 if you want a numeric IP address, or 2 (well, any value, but 2 is good) if you want to return the legacy connection_name string. - The server will now listen for connections on both IPv4 and IPv6 by default.
- The
listen()
function now has a second optional argument indicating that the server should listen with IPv6 rather than the default IPv4. - The command line argument to specify the listening IPv4 interface has been changed to
-4
and-6
has been added to specify the listening IPv6 interface. switch_player()
now calls the listening object'suser_disconnected
anduser_connected
verbs when appropriate.open_network_connection()
has a new argument to specify that you want the new connection to be IPv6. WARNING: The order of arguments have been switched! If you previously relied on the third argument being an object, you'll need to put a 0 before it to specify the connection is IPv4.listeners([<obj>])
now returns a list of maps with useful information about where objects are listening. If an argument is supplied and obj is a valid listener, only information about that object will be returned.- Added a
connection_info(<obj>)
function to display information about a connection. The information is what you previously would have found in theconnection_name()
string, but more easily accessible. - Removed the
connection_option()
function. Its functionality has been folded intoconnection_options()
. - Removed the process_id() builtin function.
- If your database relies on parsing the
connection_name()
string, you will need to switch to one of the new options. The most preferred would be usingconnection_info()
. If you're only parsing the numeric IP address, theconnection_name(1)
argument will suffice. If you find you desperately need the legacy string, however, you can still access it viaconnection_name(<obj>, 2)
. - The
name_lookup_timeout
option is gone as part of the modernization of the networking. As such, it's recommended that you either switch to in-database DNS (see ToastCore for ideas) or modify your/etc/resolv.conf
settings to adjust the timeout if you find that DNS lookups are causing lag. - Any code relying on
listeners()
being a list should be updated to use the map keys.
- Add a
sqlite_limit()
builtin to limit the size of various SQLite constructs. More information - Add the
-m
command line option for clearing the last_move builtin property on all objects in the database (and not setting it again for the lifetime of the server process). - Move user-visible threading options into
options.h
. - Add a
curl(<url>, <?include headers>)
function to easily return a webpage as a string. - Fix a security oversight where the
chr()
function would allow non-wizards to produce telnet IAC characters. - The
explode()
function now only considers the first character of the delimiter to more closely match the LambdaCore behavior. - Add a second argument to the
locations()
function to indicate an alternate stopping point. If no such point exists, it falls back to $nothing.
- The
chr()
function can now accept any number of arguments, similar to howencode_binary()
works. - Add a
recycled_objects()
builtin, which will return a list of all invalid object numbers currently in the database. - Return
recycle()
to its final glory and call:recycle
on objects and waifs before destroying them instead of:pre_destroy
. (Standard LambdaMOO functionality.) - Add a
next_recycled_object(<?starting-object>)
builtin, which will iterate through the object hierarchy to find the lowest object that is invalid and return it. If none are available, 0 is returned. Providing an object as the first argument will start the search at that object, in the unlikely event that you only want to find non-valid objects passed a certain point.
WARNING: This breaks compatibility with old code that uses destroy()
or relies on :pre_destroy
being called. You will need to open your database file in a text editor and replace destroy
and pre_destroy
with recycle
.
- Catch SIGUSR1 and, if the server was started with a log file, close and reopen the file. This way scripts can move the old log file and
kill -SIGUSR1 <pid>
to rotate logs without restarting the server. - Add an
all_members(<value>, <list>)
function to return the indices of all occurances of in . - Improve performance of string comparisons by using the pre-computed length (if
MEMO_STRLEN
is enabled in options.h) of strings to rule out equality before doing a character by character comparison. - Add the ability to specify the default thread mode in
extension-background.h
. By default (true), threaded functions are threaded unless you explicitlyset_thread_mode(0)
. When set to false, threaded functions are not threaded until you explicitlyset_thread_mode(1)
WARNING: This redefines the SIGUSR1 signal to mean 'reopen logfile' rather than 'shutdown'. If you rely on the old behavior, you will need to update your scripts accordingly.
- Fix a bug in
slice()
where the server would crash ifslice()
raised an error in the middle of processing a list. - Add missing support for strings to
slice()
. - Add support to
slice()
for slicing maps by key. At this time it doesn't support lists of keys. - Increase the performance of the
explode()
builtin. - Add a third argument to the
explode()
builtin to indicate that sequential occurences of the delimiter should be included in the return result. - Fix a memory leak when clearing the ancestor cache.
- The
reverse()
function now accepts strings.
- Add a
reverse(<list>)
function to reverse lists. - Add a
recreate(<object>, <parent>, <?owner>)
function. This will effectively fill in any holes created by destroy()ing an object. - Disabled the Nagle algorithm and delayed acks for better network performance.
- Allow
occupants()
to accept a list of parents to check each object against. - Add
THREAD_ARGON2
to options.h to allowargon2()
andargon2_verify()
to be threaded. There are significant issues to be aware of when enabling this option, so please read the comment in options.h. - Fixed a small bug that would limit 64-bit MOOs to 'only' being able to create 2147483647 objects instead of 9223372036854775807 objects.
WARNING: This potentially breaks compatibility with old code that relies on argon2()
raising errors. Due to threading limitations, it now returns errors as a map with the keys error
and message
.
sort()
more appropriately returns a type mismatch when given an incorrect type rather than an invalid argument.- Fix a bug where
sort()
would crash the server when reversing a sort with identical strings. - Fix a bug in
yin()
where the ticks and seconds remaining checks were inaccurate. - Improved the performance of
sort()
- Fix a bug in
locate_by_name()
where it was possibly to access memory that wasn't what we thought, resulting in mangled and inconsistent output. - Fix a bug in
isa()
that could cause a server panic when checking an object against a list of parents. - Add a
set_thread_mode(<?mode>)
function that can be used to disable threading of functions for a particular verb. No arguments will display the current thread mode. - Update
slice()
to run in a background thread as well as to accept a list of arguments as the index in addition to a numeric index. - Fix a bug where macOS would try (and fail) to use virtual timers, resulting in server panics.
WARNING: This version increments the database version (DBV_Threaded), making databases incompatible with previous releases.
- Fix a bug where
yin()
would suspend a task indefinitely by default rather than 0 seconds. - Add a threaded
sort(<list>, <?keys>, <?natural order>, <?reverse>)
function that will... sort. This provides a significant performance advantage over the default LambdaCore sort verbs.
- Add a
yin(<?time>, <?minimum ticks>, <?minimum seconds>)
function (yield if needed). This is analogous to the suspend_if_needed function in LambdaCore databases. It will suspend the currently running verb if it finds it's approaching the user-defined tick / second limit. - Run
locate_by_name()
in a background thread.
- Add a
slice()
builtin. Note: It only supports indexing numerically, not by list. - Add an argument to
random()
to allow ranged random operations. - Various fixes for macOS.
- Add a field to
server_version()
that will return the name of the OS the server is currently running on. random()
is now seeded with more than 32 bits.- Added a
reseed_random()
function to reseed the random number generator. - Add a
finished_tasks()
function to track the execution time of tasks as they finish. This can be disabled with theSAVE_FINISHED_TASKS
option in options.h. - Add support for calling
$sysobj:handle_lagging_task()
when a task's execution time exceeds that set in$server_options.task_lag_threshold
- Add
$server_options.finished_tasks_limit
to override the number of finished tasks that get saved.
- Fix a bug in PCRE that could result in memory corruption when encountering an excessive substring error.
- Fix a bug in
disassemble()
that could cause a server panic. - Fix a bug in SQLite that could cause a server panic when sanitizing empty strings.
- Fix a bug / exploit where sending large amounts of data to the MOO in single chunks would crash the server. (See MAX_LINE_BYTES in options.h)
- Fix a bug where negating a float would return a bogus int.
- Add a third argument to
move()
that will insert the object anywhere in the destination's .contents property that you wish. - Add a
maphaskey()
function as a faster alternative to indexingmapkeys()
- Fix a bug where newlines wouldn't be detected properly when reading input.
- Fix a bug where
enterfunc
andexitfunc
would get called on objects that hadn't actually moved.
- Waif
:recycle
is now:pre_destroy
- Fix a bug where instantiating a waif with an anonymous object would cause a server panic.
- Fix a bug where waifs with a destroyed parent class would cause a server panic upon being accessed.
- Fix a bug where waifs could be programmers.
- Fix a bug where chparenting a waif's parent wouldn't make instantiated waifs aware of their newly inherited properties.
- Fix a bug where old Stunt databases wouldn't get converted properly, rendering
last_move
values as useless garbage.
WARNING This breaks compatibility with old waif code that uses :recycle
. You will need to open your database file in a text editor and replace :recycle
with :pre_destroy
- Fix a bug with waif recycling that could result in a server panic. (Thanks to Sorressean for the fix)
- Fix a bug where
disassemble()
wouldn't display floats correctly. - Fix a bug in
argon2()
where free was being used instead of myfree. (Thanks to ethindp for the fix) - Add
ONLY_32_BITS
to options.h to run the server in 32-bit mode rather than 64-bit mode. - Automatically set
$maxint
and$minint
(if present) at server start. - Anonymous objects can now act as map keys.
- Fix a bug where using waifs or anonymous objects as map keys in
generate_json()
would cause a server panic. - Fix an off by one error when reading files with the unsafe FIO option set.
- Call
pre_destroy
instead ofrecycle
on anonymous objects. - Unit tests are now compatible with ToastStunt changes.
WARNING This breaks compatibility with old code that uses recycle()
. You will need to open your database file in a text editor and replace recycle
with pre_destroy
- Hostnames for proxy IPs are now resolved rather than being numeric only.
- Improve performance of
locate_by_name()
- Finalize 64-bit support
- Fix a boundary issue when extracted telnet IAC sequences from the middle of input.
- Add a
chr()
function that returns the symbol associated with the ASCII value provided.
- Fix a bug in waif recycling when garbage collection is disabled.
- Fix a bug in
waif_stats()
where classes with no instantiated waifs would still be present in the list. - Fix a bug in telnet IAC support when IAC sequences are mixed with in-band data.
- Allow primitive calls on OBJ types, which counterintuitively is only useful for invalid objects.
- Improve the performance of
argon2()
- Telnet IAC commands now get captured and passed, as binary strings, to a
do_out_of_band_command
verb on the listener.
- Add a third argument to
isa()
that will return the object stopped on as the parent. If there is no match, #-1 is returned. - Fix a bug in
notify()
where the incorrect argument was being tested to disable newlines. - Fix a memory leak in background threads.
- Threads now exist in a thread pool to remove the overhead associated with constantly creating and destroying threads.
- SQLite connections are now locked until background worker threads have finished their work. This prevents them from being closed at inopportune times.
- The second argument to
isa()
can now be a list of objects.
- Add a wizard-only
clear_ancestor_cache()
function to manually reset the ancestor cache. - Fix a memory leak in
locations()
- Fix a bug in the background thread library that would result in a background task not resuming if there was no activity in the MOO.
- Add the function
threads()
, which returns a list of active thread handles. - Add a
thread_info()
function to return basic information about a running thread. Each threaded function will now return a string in thread_info indicating what it is. - The
sqlite_execute()
andsqlite_query()
functions now run in a separate thread. Each now has an additional argument to disable threading.
- Add
locations()
function that will return all nested locations of an object by recursing through .location. spellcheck()
now returns 1 for correct words rather than an empty list.
- Call
pre_destroy()
verb on objects prior to their destruction. This replaces the previousrecycle()
verb. - Add an additional argument to
notify()
to suppress the addition of a newline. - Add recognition of waif properties to the parser. This means you can now do things like
somewaif.:someproperty
directly. - Add a
spellcheck()
function to check spelling using Aspell.
WARNING This breaks compatibility with old code that uses recycle()
. You will need to open your database file in a text editor and replace recycle
with pre_destroy
- Rename
recycle()
todestroy()
WARNING This breaks compatibility with old code that uses recycle()
. You will need to open your database file in a text editor and replace recycle
with destroy
- Use
$server_options.dump_interval
instead of$sysobj.dump_interval
- Remove
tonum()
, thus completing the 30 year deprecation in favor oftoint()
- Properly sanitize PCRE replacement strings to avoid introducing dangerous or annoying characters.
- The ancestor cache now gets invalidated when renumbering an object or resetting the max object.
WARNING This breaks compatibility with old code that uses tonum()
. You will need to open your database file in a text editor and replace tonum
with toint
- Fix a memory corruption bug in SQLite.
- Fix a bug in
simplex_noise()
that would result in a server panic if the last element of the list wasn't a float. - Add
LOG_EVALS
to options.h to allow all evals to be written to the server log.
- Adds support for 64-bit integers.
- Fix a bug in
usage()
where the types weren't correctly set. - Fix a bug in
ctime()
where certain arguments could cause a server panic. - Remove an unused argument from
switch_player()
- Replace 'CONNECTED:' with 'SWITCHED:' in the server log file when using
switch_player()
- Fix a bug in PCRE where named capture groups wouldn't get counted.
- Fix a memory leak in PCRE.
- Add support for Argon2 hashing with the functions
argon2()
andargon2_verify()
- Call the
recycle
verb on instantiated waifs before they're actually destroyed. - Add 'pending_recycle' to
waif_stats()
- Rewrote
pcre_match()
to return a list of maps.
WARNING: This breaks compatibility with old code relying on the output of pcre_match()
.
- Improved PCRE refcounting and performance.
- Improve the robustness of the canonical empty list by never allowing its refcount to fall to 0.
- Use
myrealloc()
to grow streams. - Add
UNSAFE_FIO
to options.h. This allows you to skip the character by character line verification for a small performance boost. Make sure to read the disclaimer above it in options.h. - Avoid growing streams when we know (more or less) how large they're going to be. Instead, allocate all of the memory at once.
- Fix a memory leak in
file_count_lines()
- Fix a buffer overflow in PCRE.
- Fix a bug where waifs wouldn't be freed properly with garbage collection disabled.
- Count the number of instantiated waifs per class in
waif_stats()
in addition to the total. - Add a third argument to the
exec()
function that allows the setup of environment variables.
- Fix ancestor cache refcounting issues. This has the happy consequence of slightly improving performance.
- Fix a memory leak in the ancestor cache.
- Improved the performance of the ancestor cache.
- Invalidate the ancestor cache for descendants of the object whose parent changed.
- Fix a server panic when attempting to use
mapdelete()
on a waif.
- Add
OWNERSHIP_QUOTA
to options.h to control whether or not the server's default ownership quota management is enabled or not. It now defaults to disabled to allow the database to handle quota on its own. - Improve validation of file handles to limit phantom handles.
- The server now caches an object's list of ancestors. This should improve performance of property lookups. Since this functionality is experimental, it can be disabled with the
USE_ANCESTOR_CACHE
option in options.h.
- Replace the
last_location
property withlast_move
, which now returns a map with keys for the time the object moved and the location it moved from. - Add a call to
$sysobj:do_blank_command()
when a blank command is issued from localhost. The default behavior (return 0) will assume that the server should ignore the blank command. If the verb returns 1, the server will process the command normally. - Fix a bug with SQLite handles that will prevent phantom handles from appearing with blank information.
- Return a map from
sqlite_info()
instead of a list. - Add convenience syntax to
in
, allowing you to use the syntax""123" in "abc123"
instead ofindex("abc123", "123")
- Fix a bug where a large file handle would be mistakenly interpreted as meaning that many files were still open.
- Fix a bug in
locate_by_name
where the second argument had an unknown type.
WARNING: This release is incompatible with previous releases containing the last_location
property. You'll need to open your database file in a text editor and replace last_location
with last_move
.
- Add an
explode()
builtin function to mimic the LambdaCore$string_utils:explode()
verb with better performance. - Fix bugs with
last_location
persistence and memory usage. - Add a
waif_stats()
builtin to display how many waifs are currently instantiated. - Fix a bug with WAIF_DICT to make it possible to index the waif properly.
- Add an
occupants()
function to return a list of objects matching certain criteria, including parent and player flag. (See ToastCore documentation for full usage details.)
WARNING: This version increments the database version (DBV_Last_Location), making databases incompatible with previous releases.
- Add sub-second forking and suspending. e.g.
suspend(0.5)
- Add a
last_location
property to all objects to indicate their previous location after amove()
- Removed the PCRE pattern cache, as it was of dubious benefit.
- Adapted Ben Jackson's waif patch for Stunt.
- Added the
WAIF
symbol. - IP addresses from from TCP proxies using the HAProxy Proxy protocol now have their source IP rewritten to match their actual IP rather than the local IP.
- Added
PROXY_REWRITE
to $server_options to control whether IPs from proxies get rewritten. - Added the
simplex_noise()
function to generate Simplex Noise. - Added a startup flag to manually specify the waif type of a v4 LambdaMOO database for conversion. So, for instance, if your v4 database has a waif type of 10 (
typeof(somewaif)
), you can run your server with the flag-w 10
to automatically convert waifs from the v4 format to the new ToastStunt type. This flag only has to be specified the first time you run your v4 database with ToastStunt - Fix a bug where the number of objects being written to disk was incorrectly reported.
WARNING: This version increments the database version (DBV_Waif), making databases incompatible with previous releases.
- Added a threading library (extension-background) to allow server functions to run in a separate thread. To protect the database, these functions will implicitly suspend the MOO code (similar to how read() operates)
- Add
FILE_IO_MAX_FILES
to $server_options to allow DB-changeable limits on how many files can be opened at once. - Replace the SQLite handle array with an std::map.
- Add
SQLITE_MAX_HANDLES
to $server_options to allow DB-changeable limits on how many SQLite connections can be opened at once.
- Add
LOG_CODE_CHANGES
to options.h to write to the log file who changed what verb code. - Added numeric IP addresses to
connection_name()
. - Replace the file table array with an std::map, which effectively removes the restriction on the number of files that can be opened at once.
- Add
frandom()
function to generate floating point random numbers. - Add
round()
function to round a number. - Add
distance()
function to calculate the distance between X number of points. - Add
relative_heading()
function to calculate the bearing between two coordinate sets. - Add
memory_usage()
function to return information about the memory usage of the MOO process. - Add
ftime()
function to return the time in milliseconds. - Add
panic()
function to manually panic the server from in-MOO. - Add
locate_by_name()
function to quickly locate an object by its .name. - Add
parse_ansi()
andremove_ansi()
functions to move ANSI code parsing outside of the database. - Add
file_grep()
function to search the contents of a file. - Add
file_handles()
function to return a list of open file handles. - Add
file_count_lines()
function to return the total number of lines in a file. - Improved the performance of file reads.
- Add
usage()
function to report information about the system the MOO is running on, including: load averages, user time, system time, page reclaims, page faults, block input, block output, voluntary context switches, involuntary context switches, and signals received.
- Added SQLite support.
- Add PCRE support.
- Add additional entropy by default.