- About 3.3.715 (changelog)
- New efun
tls_refresh_certs() to reload the certificates
and certificate revocation information.
- New commandline options to handle certification revocations:
--tls-crlfile pathname and
--tls-crldirectory pathname.
- About 3.3.714
- Implemented the array/mapping intersection.
- Modified a case of undefined behaviour in the creation
of the character classification tables during the build. This undefined
behavior caused problems with newer GCC versions.
- If the driver runs low on memory, it also prints the
current object and program in the low-on-memory message.
- New efuns hash() and hmac() offer flexible hash and HMAC
calculation if the driver is compiled to use OpenSSL (provided by
Philipp).
- New macros __OPENSSL__ and __GNUTLS__ are set depending on
which TLS package is being used.
- Corrected a bug with extremely long object names
(Bug #466).
- Added support for GEN_EMAIL, GEN_URI and GEN_DNS
certificates. tls_verify_callback() now prints diagnostics
only if the '-d' option was given (thanks, Philipp).
- lfun closures now
keep track to which program they belong, to avoid ambiguities
in case of complex inheritance relationships. This also affects
the savefile format: lfun closures are saved with their inheritance
path
(Bug #443,
#444).
- If a non-virtual baseclass was inherited multiple times
with a virtual class inside the inheritance tree, its members
were merged even though they shouldn't
(Bug #422).
- About 3.3.713
- Master function
disconnect() receives the remaining input
data is passed as the second argument (suggested by Philipp).
- The TLS implementation is more robust.
- A missing return is noted at runtime only once per
function. This is achieved by runtime code modification, but we
do that for switch() as well
(Bug #430).
- Added support for: International Domain Names, SQLite
(Bug #431).
- Virtual blueprint objects are guaranteed to have their
'clone' flag unset.
- Removed the stipulation that CATCH_RESERVED_COST
must be twice as much as MASTER_RESERVED_COST, since the master
reserve is used automatically anyway.
-
sscanf(): The new modifier '+' requires the matching of
the characters after a field in order to consider the field
as matched.
- remove_interactive() now preserves the current object
(Bug #431).
- Corrected the tracedepth handling in efun closures and non-toplevel
callbacks
(Bug #441).
- Private lfuns no longer hide simul-efuns.
- Private lfuns can be hidden by public functions without
warning, ie. the former are now really invisible to inheritors. This
also corrects a crasher with multi-level virtual inherits.
- Multiple virtual inheritance of the same program with
changing visibility is now handled with a better calculation of
the final visibilities
(Bug #362).
- Calling an unbound lambda cleaned the control stack
twice, causing errors
(Bug #374).
- Only public simul-efuns can be called. This was always
valid for sefuns outside the 256-range, but now also applies to
normal sefuns as well
(Bug #419).
- For completeness sake: removed the compilation
errors happening when disabling the new inline closures
(Bug #423).
-
present(): Modified the 'n' search behaviour so that the
numbering is applied over both inventory and environment
together. Before, the numbering was individual in each
space, leading to situations where low-numbered objects in the
environment were hidden by those in the inventory
(Bug #417).
- (object.c) Efun function_exists(): The 'FEXISTS_ALL' result also contains
information about the function's type, flags, and number of
arguments
(Bug #410).
- Efuns
md5()/sha1(): Accept the number of iterations as
optional argument
(Bug #418).
- About 3.3.712
- Efun
md5() wasn't 64-bit clean
(Bug #413).
-
foreach(): When looping over a mapping with no values,
or with only the index being extracted, the loop actually loops over the
mapping and not just the indices copied into an array
(Bug #388).
- Efun
set_environment(): clear the RESET_STATE flag of
of the moved object's original environment, if any
(Bug #387).
- Efun
md5()/sha1() can now hash arrays of numbers as well
(Bug #411).
- The string_copy() function checks if the requested
memory is actually allocated, throwing an error if not
(Bug #397).
- Errors during the processing of a fatal() will be
recognized and treated as double-fatal
(Bug #408).
- free_svalue() now recognizes the free of nested
structures and de-serializes them to avoid stack overflows
(Bug #416).
- When re-using a sentence structure for marker_sent,
the shadow_ob member wasn't cleared out, causing crashes
down the road
(Bug #414).
- Efun
bind_lambda() doesn't ignore unbindable closures
when the second argument is missing
(Bug #407).
- Fixed object reference leaks
(Bug #412).
- (pkg-tls.c) When accepting a SSL connection, request a client
certificate. The driver itself won't check the correctness,
but the result will be available in the connection status.
- About 3.3.711
- Implemented a low/high watermark logic for the backend call to
cleanup all objects, in order to prevent the driver from hogging
the CPU.
- Updates to the OpenSSL interface.
- The test for struct equivalence now recurses through
member structs; otherwise changes in an contained struct wouldn't
be reflected in the containing struct, leading to LPC compilation
errors.
-
to_int() no longer accepts "x<num>" as valid sedecimal
notation
(Bug #0000402).
- Errors during the backend cleanup will now find a consistent
virtual machine
(Bugs #0000405
and #0000406).
- About 3.3.710
- Moved the repository from PRCS to Subversion.
- About 3.3.709
- Oops, I accidentally broke compilation on systems which allow
the replacement of the system
malloc() function.
It should now work again
(Bug #0000393).
- About 3.3.706-.708
- Added new efun
pg_conv_string(), courtesy of Philipp.
- Added new flag setting '4' to get_type_info() for closures
to return the function name of lfun closures
(Bug #0000392).
- Possibly corrected a refcounting bug in handling prepositions which
caused crashers
(Bug #0000391).
- Since the operators
#'&, #'|,
#'^ and #'! are now considered efuns, the
closure compiler skipped the special treatment of these. As an added
bonus of the correction, #'| and #'^ can now
take an arbitrary number of arguments, too.
(Bug #0000389).
- If the number of destructed pending objects
exceeds the number of active objects, a cleanup of all objects
is triggered. Also, the incremental cleanup in each cycle
cleans at least the number of objects destructed in the cycle.
- About 3.3.705
-
runtime_error(), runtime_warning() and
heart_beat_error()
now receive a flag telling if the error is caught or not
(Bug #0000385).
- About 3.3.704
- Restoring a saved array with one-character operator closures
like
#'- works again
(Bug #0000384).
- About 3.3.703
-
sprintf("%c", 0) returned an empty string ""
instead of a string with the 0 character "\0" because
internally the system's sprintf() was used for the formatting
(Bug #0000378).
- About 3.3.702
- When printing structs with
sprintf("%O"), the output
now also contains the names of the structure members
(Bug #0000380).
- About 3.3.701
- The
iconv delivered as part of glibc 2.2.5 can get stuck
in an endless loop. The configuration script now disables iconv support
for glibc 2.0-2.2
(Bug #0000374).
- About 3.3.700
- There was a problem in the LPC compiler which lead to memory corruption
whenever two strings were added in a preprocessor condition. Often
enough the corruption was harmless, but sometimes it bit.
- About 3.3.699
- I was hoping to include fixes for two crashers recently discovered,
but no such luck: one is caused by an incompatibility between
FreeBSD and ptmalloc which will take some time to nail down, the
other one occured only once so far and didn't leave much clues.
- When using TLS, the new configuration parameter '--with-tls-path'
can be used to specify the installation location for the TLS
package.
- Corrected a crasher when the TLS certfile locations are printed.
- The config macro LOG_NEW_CLEANUP in config.h can be used to enable the
logging of the new cleanup calls. Use this if the cleanup seems
to hog the CPU to get an idea of how often it is called.
- About 3.3.696-.698
- Ralph provided a couple of adjustments for FreeBSD 5.4 .
- About 3.3.695
- Just a little tweaking to the version number determination.
- About 3.3.694
- Aaaand I had to reintroduce the numeric limit on the number
of objects to data-clean per backend cycle, as even with the
random factor in the timing sometimes hundreds of objects
could become eligible at once.
- About 3.3.693
- I found the probably reason for the lags experienced by some
muds in flaws in the data-cleanup handling (whereas the tunables
in the allocators made no difference in my testing):
- The data cleanup didn't check whether it still had time to spend
or not - as a result the driver could cleanup thousands of objects
in a backend cycle even if it had time for only one.
- I underestimated the amount of data some muds hold in the default
wizlist entry and let the driver clean it up with every object. A
mistake, and now the driver applies the cleanup-time timing
to the fixed structures as well.
- About 3.3.692
-
input_to() and call_out() no longer
accept local references as extra function arguments.
- About 3.3.691
- Since some muds (but not all) report occasional high CPU loads and lag,
I have added a few statistics in order to locate the problem:
- The data-cleanup logs which object is cleant up and how long it
took.
- The slaballoc extstats provide an overall and a weighted average
of how many search steps per free operation are executed.
-
status tables Now provides a weighted average of
the VM ticks and time per execution (command, callout, heartbeat).
- If you suspect the ordering of free blocks to be the culprit, try
undefining the macros
MALLOC_ORDER_LARGE_FREELISTS and
MALLOC_ORDER_SLAB_FREELISTS in config.h. If the lags
get milder by this, but don't go away completely, the root cause
is somewhere else.
- In either case, if you encounter such situations, please gather
information from
status tables, status
malloc, and status malloc extstats, and send it to
me.
- About 3.3.690
- Made the last-data-cleaned statistics more useful.
- About 3.3.689
- The synch heartbeat patch wasn't quite correct: one condition was
still reversed, and I had left some debug code in. ...it had been a
long day.
- About 3.3.688
- The synchronous heartbeats didn't initialise properly, and thus never
executed.
- About 3.3.687
- Gnomi provided a patch improving the configurability of the
call_out() and heartbeat timing at driver compile time; I added some
touches to provide commandline options as well:
- The basic timing granularity and the heartbeat interval time
can be configured at compile time and with the commandline options
--alarm-time and --heart-interval. The
values are available in LPC with the macros
__ALARM_TIME__ and
__HEART_BEAT_INTERVAL__.
- Heartbeats can be executed synchronously (all at the same time as far
as granularity allows, regardless of when inside one hb interval
they have executed last). The commandline options are
--sync-heart and --async-heart; if
enabled, the macro __SYNCHRONOUS_HEART_BEAT__ is
defined.
- About 3.3.686
- Efun
tell_object() can now take a non-string as second
argument, and will call lfun catch_msg() in the receiver.
This functionality is not exactly essential (as it boils down to
a call_other()), but brings tell_object()
more in line with tell_room() and say()
(Bug #0000354).
- Efuns
tell_room() and say() now accept
mappings, structs, and objects as well as arrays for the
catch_msg() mechanism.
- About 3.3.685
- The statistics for hybrid and hash mappings were off.
- The data-cleanup is now controlled solely by the configure time
interval. Previous drivers imposed an additional limitation on the
number of objects data-cleaned in one backend cycle, which
as FinalFrontier demonstrates is too restrictive.
- About 3.3.684
- Finetuned the slab allocator for better use of the slabs.
- Corrected a crasher in the error handling for uncallable closures
(Bug #0000374).
- Corrected the
snoop() manpage
(Bug #0000372).
- About 3.3.683
-
regreplace() put the stack into an inconsistent state,
causing crashes further down the road.
- About 3.3.682
- The mapping indexing with strings was not correct: under certain
circumstances existing entries would not be found.
- Corrected various memory leaks and missing error checks when
using
unique_array() and regreplace()
with faulty closures
(Bug #0000370).
- About 3.3.681
- I reduced the overhead used by the string allocator; in particular
strings no longer need two memory blocks and their hidden overhead.
- About 3.3.678
- Corrected a fatal bug in smalloc/slaballoc which appeared on machines
where sbrk() could be used
(Bug #0000368).
- About 3.3.677
- It is now possible to set the maximum number of mapping keys (entries)
separately from the number of values held. The runtime limits parameter
is
LIMIT_MAPPING_KEYS (the former
LIMIT_MAPPING is an alias hereto), and
LIMIT_MAPPING_SIZE respectively. The configuration and
commandline parameters changed accordingly
(Bug #0000360).
- About 3.3.676
- Corrected a crasher in smalloc.
- Newly allocated core memory is coagulated with existing free memory
where possible
(Bug #0000364).
- About 3.3.675
- Corrected a compilation error when GnuTLS was used.
- Removing an interim pending input_to should no longer mess up
the telnet state (I hope!)
(Bug #0000363).
- About 3.3.674
- During a (re)compilation of the master object, simul-efuns are
disabled to avoid accidental use.
- About 3.3.673
- The permanent block statistics for slaballoc/smalloc was wrong.
- About 3.3.672
- Philip added a new efun
tls_check_certificate().
- About 3.3.671
- Oops, the TLS change was premature. Normal operation isn't
affected, but I'll undo the change until a better solution
is available.
- About 3.3.670
- Extended the extended string statistics to keep better track
of how existance checks are resolved.
- New macro __BOOT_TIME__ expands to the time() the driver was
started.
- Corrected a bug in slaballoc/smalloc when new system memory
was allocated with brk().
- TLS: When using OpenSSL, the session setup distinguishes between
a received connection, and one opened with
net_connect().
- About 3.3.669
- The driver checked the list of destructed objects for deallocatable
objects after every execution, which after some time put noticeable
load on the CPU when the list got long. Now the driver checks it
only every backend cycle (about 2 seconds), and only if before
candidates for deallocation presented themselves.
- Added statistics for how often the shared string table simplifies
the comparison of strings. The statistics are printed as part
of the "
status tables" and will be removed again
at a later point.
- About 3.3.668
- The large block handler of smalloc/slaballoc can now handle blocks
up to 232 words.
- The extended memory statistics have been separated out as
"status
malloc extstats"
(Bug #0000358).
- About 3.3.667
-
start_mccp_compress() crashed because of an uninitialized
variable
(Bug #0000361).
- The success code passed to the TLS-handshake callback was
wrong: it passed '1' for success instead of '0'.
- About 3.3.666
- Some leftover debugging code caused the allocator to run on
an fatal() on allocation retries
(Bug #0000359).
- I also removed some compiler warnings in slaballoc
(Bug #0000358).
-
foreach(i : __INT_MIN__ .. __INT_MAX__) now
works as well
(Bug #0000355).
- When a TLS handshake is in progress, the printing of prompts is
suppressed.
- Using
tls_deinit_connection() inside the TLS-failed
callback freed the callback memory while it was still executing.
The callback is now protected.
- It is possible to start an MCCP compression with the telnet machine
enabled. This is useful for special applications where the driver knows
without negotiation that the other side can receive compressed data.
- About 3.3.665
-
foreach(i : x .. __INT_MAX__) didn't execute
the body at all - this has been fixed
(Bug #0000355).
- About 3.3.664
- I noticed in FinalFrontier that over time there are megabytes of
free memory tied up in small blocks which isn't used. Avoiding the
splitting of blocks does not help; so I tried a different approach:
slab allocation.
The new 'slaballoc' allocator clusters small blocks of the same size
into so-called slabs, so when allocating new small blocks the allocator
tries to fill up one slab before digging into the next one. This
applies to both allocation of fresh memory as well as reusing freed
small blocks.
Additionally the allocator is capable of returning completely free
slabs back into the large memory pool - to avoid thrashing, this is
done with a 1 minute delay.
I tested the allocator in a local copy of Evermore, loading all
objects, destructing them, and loading them again.
- slaballoc is the new default allocator; and while there are a couple
of tweakables, the current setup should provide a decent all-round
behaviour.
-
foreach() used on references clobbered memory
(Bug #0000353).
- About 3.3.663
- There is no point in keeping unused shadow and action sentences
in freelists: the memory allocator is quite fast, and the memory
could be used otherwise.
- About 3.3.662
- Deep-copying a mapping with shared arrays as keys
(e.g.
([ arr, ([ arr ]) ]) )could cause
memory corruption due to the premature deallocation of an array
(Bug #0000351).
- Disabling telnet-negotiations in linemode caused the driver to
treat lineends as if in charmode, confusing the higher parsing
routines.
- About 3.3.661
- Corrected two memory leaks:
- If program was swapped out, the GC didn't properly clean the references
to the program name during the temporary swap-in
(Bug #0000348).
- The error handling in the regular expressions didn't properly
deallocate all intermediate structures
(Bug #0000349).
- About 3.3.660
- Corrected two memory leaks:
- If destructed blueprint was held by a self-reference, the GC didn't
properly clear the program's name's references, thus leaking the
program name until the next GC
(Bug #0000099).
- And
to_string(closure) leaked
the program name as well
(Bug #0000347).
- About 3.3.659
- Peng provided an improvement to the mySQL library configuration check
(Bug #0000343).
- About 3.3.656-.658
- The GC forgot to clear out the references of the names of destructed
objects, leaving them dangling when the object was deallocated
(Bug #0000343).
- Exceptions during a
restore_object() should no longer
leak values or memory
(Bug #0000344).
- Exceptions during a
unique_array() no longer leak
the internal structures
(Bug #0000345).
- And in the extended smalloc statistics the large-free count
was still off.
- About 3.3.654 and .655
- Two changes to improve the memory handling somewhat: when
small free blocks are split, the remaining block will have
a minimum size larger than the smallest possible small block. This
should prevent the free memory from becoming tied up in free
8-byte-blocks which the driver doesn't need.
Second, the data cleanup is now independent from the time
of the last reference, as that kept busy objects from being
cleant up.
- About 3.3.653
- Gnomi provided a patch to resolve a hanger in xerq
(Bug #0000342).
- About 3.3.652
- Indexing a 0-width mapping actually returned a garbage value
(Bug #0000341).
- About 3.3.651
- Last change wasn't quite enough: SuSE needed a different searchpath.
- About 3.3.649 and .650
- A correction the mySQL detection: it should find mySQL on
SuSE again.
- About 3.3.648
- Added the settings file for TimeWarp.
- Quickie feature:
get_dir() can return access time
and mode masks.
- About 3.3.647
- I (hopefully) improved the ability of the mySQL configuration
check to find the installed include files (Bug
#0000338).
- About 3.3.646
- The array range warnings at runtime are now controlled by
the pragma
range_check, by default they are off.
- About 3.3.645
- Corrected the extended memory statistics ('status malloc').
- The communications statistics now also count the outgoing
traffic (
debug_info() options
DINFO_DATA:DID_ST_PACKETS_IN and
DINFO_DATA:DID_ST_PACKET_SIZE_IN).
- The 'status tables' command lists the total network traffic
size as well.
- About 3.3.644
- Small corrections to the documentation (Bugs
#0000333
and
#0000335
).
- About 3.3.643
- Mappings over efun closures in some places considered the
bound object being part of the efun information - this is inconsistent
with the way efun closures usually compare, and would make efun closure
comparisons quite useless to boot.
- About 3.3.642
- An internal updated: refactored the code in the LPC lexer a bit.
- About 3.3.641
- Evermore had a nasty crash which was caused by lambda closures
not being initialized properly. I now modified the driver to
internally use just the few dedicated lambda creation functions
introduced in 3.3.639 instead of manually creating and initializing
the lambdas.
- About 3.3.640
- The SQL efuns now raise privilege violations ("mysql",
"efun name") and ("pgsql", "efun name") (Bug #0000318).
- About 3.3.639
- The closure changes did not compile under all configuration - this
should be corrected now.
- Added a couple of internal functions to create closures, so that
external creators of closures like FinalFrontier's stringcompiler no
longer have to care about the exact closure structure.
- About 3.3.638
- Closures (ok, non-operator, non-simul efun, non-efun) closures
are now annotated with the location of their creation - this
should make especially error messages in lambdas a bit more
helpful.
- Some corrections to manpages.
- About 3.3.637
- Efun
input_to(): New flag INPUT_APPEND allows to queue
input_to()s.
- About 3.3.636
- Another small correction to
to_int(): Too large negative
numbers are now mapped to INT_MIN, not just -INT_MAX. The LPC compiler
itself unfortunately can't be as clever, but at least now emits
warnings when encountering such numbers.
- More TLS bugfixes from Fippo and Peng (Bug #0000138 and #0000140).
- About 3.3.635
- Incorporated Gawain's and Peng's patched to GNU tls; including
a new efun
tls_available() which reflects whether
the TLS system could be initialized or not (the originally suggested
name was tls_is_available(), but I just don't like the
'is' in names) (Bug #0000082).
- About 3.3.634
- Added efun
regexp_package() to determine the currently
active default regexp package.
- About 3.3.633
- The number parsing was not quite correct yet - Evermore no longer
booted with it (Bug #0000327).
- About 3.3.632
- Corrected a nasty bug in the string handling which could lead
to memory being freed which was still used. The error was most likely
to surface when a string was first used to create a mapping entry, and
then extended in size.
- Numbers exceeding the numeric range limit ('111111111111111') are
now evaluated as MAX_INT (Bug #0000327).
- The warnings about improper array range indices are now controlled
by the warn_deprecated pragma (Bug #0000325).
- About 3.3.631
- Assignments to negative sized ranges now generate an error;
indexing an array with an out-of-bounds range generates
a warning (Bug #0000325).
- About 3.3.630
- The TLS package of course needs to use non-collectable memory
(Bug #0000323).
- About 3.3.629
- The garbage collection now zeroes out closures found to be bound
to destructed objects. The old behaviour was to change them into
'undef' closures (Bug #0000322).
- About 3.3.628
- Another correction to the internal memory allocation functions
to conform to the C standard.
- About 3.3.627
- Modified the internal memory allocation functions to conform
to the C standard, to make interfacing with external libraries
easier (Bug #0000132).
- GNU TLS's allocations now use the driver's allocator, to enable
the tracing offered by smalloc.
- About 3.3.626
- Corrected the sending of UPD packets in the Amylaar erq.
- About 3.3.625
- If privilege_violation() for input_to() and rename_object() destructs
the objects in question, the driver should no longer crash (Bug
#0000316).
- The Amylaar erq errorneously assumed fixed datalengths when
handling UDP packets.
- About 3.3.623
- Corrected a memory leak when no-bang input_to()s are denied
by the master (Bug #0000143).
- About 3.3.622
- When assigning characters to a string, the driver failed to duplicate
the target string.
- About 3.3.621
- Bugfix: The inherited-lfun closures broke the handling of virtual
superclasses.
- About 3.3.620
- An organisational release: I have moved all old bug reports and
feature requests out of the driver archive into the bugtracker.
It might be faster for you to download the complete archive than
trying to apply this diff.
- A man page ldmud.1 is now generated from the driver's --longhelp
output if the tool (help2man) is available.
- About 3.3.619
- Calls to explicitely inherited lfun closures (we need a better name
for these :-) ) weren't compiled correctly in
lambda()s
(Bug #0000145).
- About 3.3.617
- When the driver was compiled for the old inline implementation,
it created invalid bytecode for closures, and also didn't interpret
it correctly.
- About 3.3.616
- Implemented closures explicitely referencing inherited functions
(
#'super::fun).
- About 3.3.615
- Efun
net_connect(): On multi-homed machines, the created
socket is bound to the hostname given at program start (Bug #0000137).
- You will also have noticed that updates have been sparse over the
last weeks. But after having lived through a stressful production
release (it took three weekend-long attempts to get everything in
line), my geek enthusiasm at home was a bit subdued.
- About 3.3.614
- I don't know that this was even supported, but
to_int()
now recognizes the plus sign again (as in to_int("+34")).
- About 3.3.613
-
to_int() didn't recognize non-number strings and
returned garbage values (Bug #0000141).
- About 3.3.612
- Efun
insert_alist() was no longer able to lookup the
insertion position for new keys into a key array.
- About 3.3.611
- Efun
to_int() now supports the '0x', '0b', and '0o'
bases.
- About 3.3.610
- Efun
present() now accepts the argument form
(str, n) to allow for ids with embedded numbers.
- About 3.3.609
- Ok, ordering the small block freelists was a bad idea - I
removed that now. Ordering the large block freelists doesn't seem
to make a performance difference, so I keep it in for now to see
if it helps with the fragmentation over the long term.
- About 3.3.608
- Reduced the aggressiveness of the new cleanup scheme - this should
reduce the processor load somewhat.
- About 3.3.607
- The NOECHO hook was called with the wrong number of arguments.
- About 3.3.606
- Added a number of NULL pointer checks to the regexp code, which
should fix the latest crop of crashers (#0000130, #0000135).
- About 3.3.605
- A bug in the SMALLOC_ORDER_FREELISTS code caused interesting
crashes, which in part could be mistaken for problemsin the
regexp handling.
- About 3.3.604
- Corrected callback problems in
tls_init_connection()
(Bug #0000131).
- About 3.3.603
- Since Finalfrontier manages to hold a steady 4:1 ratio of used
to free small blocks, I added some extended statistics to smalloc to
see what kind all these free small blocks are. No guarantee that
that will help battle the fragmentation, but it'll be interesting
nonetheless. The statistics are as usual available through the
debug_info() efun, and as part of the "status malloc"
output.
- About 3.3.602
- The config.h macro SMALLOC_ORDER_FREELISTS instructs smalloc to keep
its freelists ordered by block address. This is an experiment to see if
the high heap fragmentation can be reduced this way.
If you experience memory problems, deactivate this macro in config.h
and recompile (sorry, no configure option).
- About 3.3.601
- To simplify the adaption of legacy mudlib code with its sloppy
handling of types, the pragma
no_warn_function_inconsistent can be used to
turn off warnings about inconsistent function redefinitions.
In general, however, turning off these warnings is a bad idea,
as they usually point to a violation of the function's calling
contract.
- About 3.3.600
- When redefining variables from an inherited program, it is now
possible to redefine an inherited nosave variable with another
nosave variable (it will still generate a warning, though).
- Corrected the handling of pragma warn_deprecated when it comes
to affecting the code as it's executed at runtime (Bug #000059,
#0000093).
- Efun
shutdown() now can take an argument which
is used as the return code for the driver process.
- About 3.3.599
- Corrected a crasher in the regular expressions (Bug #0000128).
- About 3.3.598
- Updating the master object deleted the default regexp selection done
by configuration/commandline argument. I changed it so that the
'builtin' default is stored separate from the driver hook setting.
- About 3.3.597
- Corrected a compilation error when USE_PCRE was not the default.
- About 3.3.596
- I have added the possibility to use both traditional regexps and
PCRE in parallel. The configuration of the driver determines the
default package; but by using the new option form of the regexp
efuns together with the flags RE_PCRE and RE_TRADITIONAL, the
package for a particular efun call can be chosen at will.
Of course the driver also supports a default selection: by default the
package chosen at configuration time with
--enable-use-pcre (as before) will be used for any given
regexp fun call. This default can be further selected at start time
with the commandline argument --regexp, or at runtime via
the new driver hook H_REGEXP_PACKAGE.
...at least that's the idea.
- About 3.3.593
- The new
input_to() flag INPUT_NO_TELNET
modifies the INPUT_CHARMODE behaviour such that
only the driver's handling of incoming data is adjusted.
- About 3.3.592
- Bugfixes galore:
- Removed a couple of memory leaks (Bug #0000120).
- Using a too large fieldsize or precision in
sprintf()
could abort the driver due to a numeric overflow (Bug #0000119).
- Some operator closures didn't restore properly, and could even
confuse the restore-parser completely (Bug #0000118).
- When switching out of CHARMODE, the driver accidentally
discarded any pending input lines after the current one (Bug #0000123).
- About 3.3.591
- Corrected the actual struct related error: a reference count error
happened whenever an inline closure was compiled with a struct
return type. However, to make the error really reproducable, you
needed a program with a private struct, an inline closure returning
that struct, and syntax errors in that program.
- About 3.3.590
- Corrected the last patch, which caused the LPC compiler to generate
faulty bytecode.
- When struct types were used as function returntypes, the LPC compiler
was likely to clobber memory due to faulty reference counting.
Unfortunately the correction now introduced a memory leak... C++ sounds
more appealing with every day.
- About 3.3.589
- Removed a C99 construct which broke compilation under C90
compilers ... I hope (Bug #0000116).
- About 3.3.588
- Corrected a few compiler warnings.
- About 3.3.587
- Calls from destructed objects to other objects now elicit
a warning (Bug #0000113).
- When using PCRE, the driver now automatically uses the system's
PCRE library, using the builtin package only if (at configuration
phase) no PCRE is found of if the builtin is requested explicitely.
- About 3.3.586
- Corrected a number of memory leaks (Bug #0000114).
- About 3.3.585
- Float variables without an initializer are now properly initialized
to float-0 instead of number-0.
- Corrected a nasty memory leak in MCCP - patch supplied by Alwin
(Bug #0000111).
- About 3.3.584
- An error while loading an object with a too-long filename could
cause a crash.
- About 3.3.583
- Corrected a memory leak when efun
garbage_collection()
can't open its logfile.
- Corrected the strings and small blocks statistics.
- About 3.3.582
- The range given by the macros __FLOAT_MIN__ and __FLOAT_MAX__ was
too small (Bug #0000101).
- About 3.3.581
- Corrected a crasher in the call_out code.
- About 3.3.580
-
funcall(#'->, ({}), "") crashed the driver (Bug
#0000097).
- The traceback collection now uses unlimited arrays (Bug #0000097).
-
to_array('symbol) caused a crash
(Bug #0000097).
- An error in
save_{object,
value}() followed by a GC left behind an
invalid pointer (Bug #0000097).
- About 3.3.579
- Corrections in the XERQ to make it more robust when used to start
subprograms.
- If an ERQ callback accepts an array, the numbers in that array
are now all positive in the range 0..255.
- About 3.3.578
- Improved the verbose debugging of XErq.
- Efun
input_to() didn't properly test its arguments (Bug
#0000098).
- If a call-out function causes an error, all further call-outs for
the same user in this cycle are re-schedule to the next cycle.
This avoids a loop due to eval-cost resets then the function
causes a too-long-evaluation (Bug #0000095).
- About 3.3.577
- Corrected a number of memory leaks caused by runtime errors (Bug
#0000096).
- About 3.3.576
- Warnings printed during the generation of a closure crashed the
driver (part of Bug #0000091).
- About 3.3.575
- The 'missing return' warning is no longer triggered if
a function ends with raise_error() or throw().
- Efun
input_to(): the check for a change in the CHARMODE mode
did not properly check if the command_giver was valid - this could
cause a segfault if input_to() was used without an interactive (Bug
#0000090).
- A too-large allocation (like in
" "*MAX_INT) no
longer crashes the mud unless done in SYSTEM allocation mode
(Bug #0000086).
- Allocating an array enough elements to exceed the internal numeric
limits (part of Bug #0000091).
- About 3.3.574
- The 'public foo() shadows private bar()' warning no longer
warns about the
__INIT() function (Bug #0000085).
- Removed a memory leak in
ctime(vector) (Bug #0000087).
- In catch(), the check if there are enough evals left
was done before the reserve had been added to the eval cost. Since
the handling for this case was changed to a runtime error, this
caused the error handler to subtract a reserve which wasn't there,
in the process messing up eval cost handling (Bug #0000088).
- The restoration of eval limits didn't handle the case
of a fixed eval cost (USE_EVAL_COST > 0) correctly if the process had
used more than the given amount: the total eval cost was set to the
given amount, instead of adding the amount to the previous eval cost
value (Bug #0000077).
- About 3.3.573
- A shadow executing
remove_action(1, shadowee)
crashed the driver.
- About 3.3.572
- If a message or command is too long, the error messages prints the
begin of it as a debugging aid.
- About 3.3.571
- The tracedepth wasn't calculated correctly.
- About 3.3.569-570
- Updated PCRE to version 4.5.
- About 3.3.568
- The LPC symbol
__MAX_MALLOC__ now reflects the actual
maximum allocation limit in effect, not the default value selected
during configuration.
- About 3.3.567
- Improved the check in
input_to() for a change of
the NOECHO/CHARMODE mode while the telnet machine is disabled.
- About 3.3.566
- Corrected a fatal error in the handling of the memory reserve:
freeing the reserve used the wrong function and thus crashed
the driver.
- About 3.3.565
- Efun
save_object() now really removes a trailing ".c"
from a filename.
- Efun
net_connect() should now compile with IPv6 enabled.
- About 3.3.564
- Corrected bugs in the implementation of
set_limits()
and limited() which messed up the LPC stack.
- About 3.3.563
- The new limit
LIMIT_COST can be used to control
the evaluation cost of a limited() execution.
- When using
set_limits() and limited(),
the resulting limits are passed as argument to the
master::privilege_violation() call.
- About 3.3.562
- Small changes: removed some gcc 3.4 incompatibilities, and some
warnings from the lp-245 mudlib.
- About 3.3.561
- The 'public shadows private' warning should be triggered now only
when genuinely private functions are involved.
- About 3.3.560
- The modifier
reserve expr can be used to
modify the eval tick reserve in catch().
- About 3.3.559
- The compiler now warns if a privately inherited function is shadowed
by a publicly inherited one. If this produces too much output, I'll
probably introduce a pragma to control the warning.
- If a
catch() doesn't have enough eval ticks left
to even execute, this error is now thrown from 'inside' the
catch(), streamlining the handling for the caller.
- About 3.3.558
- When restoring a struct, the gamedriver no longer insists that the
sizes match, but instead restores as many members by position as
possible.
- Corrected a typo in the configure script.
- About 3.3.556
- The efun
member() and rmember() can
take a 'start' parameter for their search.
- About 3.3.555
- When USE_AVL_FREELIST was active (the default), the AVL tree could
get clobbered, causing the driver to crash.
- About 3.3.554
- The efun
deep_inventory() now takes a 'depth' parameter
to somewhat filter the results.
- About 3.3.553
- Oops, the combination of AVL nodes and freelists for large free blocks
in smalloc was never activated.
- Small blocks recycled from the their freelist never had their
'collectable' flag set. No direct harm, except that the GC couldn't
find these blocks if they ever got lost.
- When writing savefiles, only the names of structs use the shared
string notation; normal strings are always printed out for readability.
- About 3.3.552
- The
H_NOECHO hook is no longer called if the target
object is destructed.
- Fini donated a Perl snippet to parse LPmud savefiles.
- About 3.3.551
- Runtime warnings now also call the master lfun
runtime_warning().
- About 3.3.550
- Corrected a compilation problem with MALLOC_TRACE defined.
- About 3.3.549
- Efun
get_type_info() can now return the name of the
defining program for a lfun/context closure.
- Made sure that during a GC all string references are cleared - so far
this didn't happen, possibly causing string leaks going unnoticed.
- About 3.3.548
- If you use Linux or FreeBSD, you need this patch to get the
stdint.h to work. ...or buy a Mac :-)
- About 3.3.547
- The configuration now tests for the existance of C99 include
stdint.h (required by the SHA1 code), and provides a
replacement if it's not available.
- About 3.3.546
- Corrected two late-night-induced compilation problems.
- About 3.3.545
- Let's see if this works: when pthreads are enabled, smalloc will
no longer replace system malloc(), even if it could. Also, the
thread-related memory allocations are always done by system malloc()
and not the driver's allocator. I hope that this way we can finally
use TLS in the threaded version of the driver.
- It is again possible to work without an simul-efun object altogether
by returning 0 from the master::get_simul_efun() lfun.
- When an interactive is forcefully disconnected, the MCCP connection
is also forced to shutdown.
- About 3.3.544
- I managed to break
unique_array() in 3.3.539 - sorry!
- About 3.3.543
- Corrected a memory leak when using PCRE.
- If the simul-efun object can't be reloaded at runtime, a normal
runtime error occurs - not a driver shutdown.
- About 3.3.542
- Corrected a bug in the string handling which caused the driver to
not find mapping entries.
- Menaures provided updates for the German manpages.
- About 3.3.541
- Efun
tls_init_connection() is now able to complete
the TLS handshake in the background, thus avoiding blocking the
whole driver. Optionally it can be provided with a callback function
which is called once the handshake is complete (successfully
or not).
- About 3.3.540
- Corrected a problem in the mapping key lookup connected to the more
aggressive string tabling.
- Strings can now store their hash value (internally) so that the
hash doesn't need to be computed more than once.
- About 3.3.539
- Efun
unique_array() crashed on using a name-based
callback.
- Strings can now be made tabled ("shared") in place, removing the
the need for memory allocations in the process.
- Assigning or transferring strings no longer make the strings
tabled - since strings have refcounts and are made tabled on a
regular basis, this former memory saving step is no longer required.
- Lynx provided an updated version of the manpage for inheritance.
- About 3.3.538
-
tls_query_connection() now returns FALSE when used
on non-interactive objects, instead of raising an error.
- About 3.3.537
- The warning about missing return statements is now controlled by
the pragma '(
no_)warn_missing_return'
(by default it is active). Also, the driver tries to perform the
check at compile time, using the runtime warnings as fallback.
- While I don't know why anybody wouldn't want the new inlines :-),
I corrected the compilation errors for the old-style inlines.
- About 3.3.536
- When not using pthreads, the TLS implementation retries the opening
handshake should it fail with the equivalent of an EAGAIN.
- About 3.3.535
- Corrections to
convert_charset(): the efun crashed
when an empty string was passed in; and the libiconv detection
in configure was not perfect.
- About 3.3.534
- I had some time at work, so I implemented the idea from Bug #0000053:
large free blocks of equal size are kept in a linked list hanging
of the AVL node for this size of blocks. The idea is to improve the
locality of the free large block handling - but only practical use
will show if it's any use.
- About 3.3.533
- Efun
convert_charset() got the conversion direction
wrong.
- About 3.3.532
- Added corrections for AIX/Visual Age 6.
- Efun
reverse() can now reverse the bits in an integer.
- Menaures provided a new version of
lpc.xml.
- int
-=float subtracted a random
value instead of the given float.
- About 3.3.531
- New efun
convert_charset() converts a string between
character sets.
- Efun
make_share_string() is deprecated, as the driver
is using shared strings (even if not tabled) all the time now.
- About 3.3.530
- Changed the memory dump format so that all the information for
a memory block is printed on one line.
- About 3.3.528 and .529
-
net_connect() can now open IPv6 connections.
- Added a few more german Efun manpage translations. If the patch chokes
on this bit, I advise to get the full archive.
- New efun
reverse() to reverse the content of a string
or array - supplied by Ralph, thanks!
- About 3.3.527
- Corrected a compilation problem under Linux.
- About 3.3.526
-
debug_info(DINFO_DUMP, "memory") writes a list of
all allocated memory blocks into a file, by default
mudlib/MEMORY_DUMP. Intention is to
aid the investigation of high memory usages - however, you may want
to add sanity checks (for example in valid_write()) to
make sure that Joe Everywizard cannot call this function at whim.
Currently this dump is supported just by the smalloc allocator.
- About 3.3.525
- Corrected a compilation problem with the SHA1 implementation.
- Active objects were never cleant up at all.
- About 3.3.524
- Improved the detection of MySQL on Mac OS-X (I hope), and corrected
a typo in
mudlib/sys/lpctypes.h.
- About 3.3.521-3.3.523
- In a lambda closure, executing a
return while computing
arguments for a varargs efun caused the driver to raise a fatal
error in DEBUG mode. As such code is legal, though senseless, I changed
the fatal error into a runtime warning (Bug #0000051).
- New efun
sha1() to compute a SHA1 message digest
(thanks, Fippo!)
- Efun
write_file() can now delete a file before
writing to it.
- About 3.3.520
- A suggestion from BatMUD:
unique_array() The separator
function can now be a closure, and can also be given extra arguments.
- About 3.3.519
- I had to restrict
'
&(struct->member)' type constructs
to a single level of member lookups because I couldn't really figure
out how to get the lvalue generation right over multiple levels.
- About 3.3.518
-
sprintf(), printf(): Format specifier '%b'
prints a number in binary notation (thanks, Ralph!).
- About 3.3.516
- I had to undo the numeric range change as it interfered with
the bitflags we use. LPC needs a proper unsigned type for this
kind of thing.
- About 3.3.515
- Heaven7 is using LDMud
as native driver - updated the settings/heaven7 accordingly.
- Constant numbers exceeding the numeric range (like 2147483648 on a
32-bit machine) cause a runtime error.
- About 3.3.514
- The closure typecode returned by
get_type_info()
is now identical to that returned by the 3.2 driver.
- However, you are strongly advised to use the newly added
symbolic constants in
mudlib/sys/lpctypes.h
instead of the numeric values.
- About 3.3.513
- Using
input_to() without a command giver crashed
the driver.
- Corrected a compilation problem when TELNET_DEBUG was enabled.
- The erq/xerq checked the wrong error variable when deciding
whether to retry a DNS lookup or not.
- Under *BSD, using ptmalloc as
malloc() replacement
caused a deadlock when threads were enabled - now, ptmalloc
won't be used as malloc() replacement on *BSD.
- About 3.3.512
- The configuration should now detect platforms without a
trunc() library function.
- Corrected the ERQ_LOOKUP in standard erq.
- Added lots of german efun manpages.
- Added an example for non-blocking DNS lookups from LPC.
- About 3.3.511
-
input_to() should now be able to put the driver into
charmode even with telnet disabled.
- About 3.3.510
- Added the experimental efun
enable_telnet().
- About 3.3.509
-
function_exists() and variable_exists() now
check if the object is destructed, instead of crashing (Bug #0000038).
- If the H_RESET/H_CREATE_* hooks are defined by name, static functions
are found as well.
- Made the driver more palatable for SunOS 4.1.
- About 3.3.508
-
restore_value() now checks for and rejects extraneous
characters after the '\n' delimiting the value string (Bug #0000039).
- Casts to type 'mixed' are exempted from generating
an "empty cast" warning (Bug #0000041).
- The configuration now checks for libnsl as standard
system library - it is needed for ERQ on Solaris (Bug #0000012).
- About 3.3.507
- Implemented mapping
&= mapping and
mapping &= vector.
- Allowed longer program names in tracebacks.
- About 3.3.506
- Corrected a sanity range-check in the LPC compiler.
- About 3.3.505
- The internal declaration of
m_entry() specified
an incorrect result type.
- Updated the random generator to the latest version of the Mersenne
Twister.
- About 3.3.504
- More string handling improvements.
- Corrected an editor bug: the faulty commands 'quit'/'Quit'
are caught before the text buffer is cleared (#0000046).
- Corrected an editor bug: giving 'Z' at the end of the text
buffer followed by two 'd' corrupted the internal text
storage, which could cause crashers (#0000045).
- About 3.3.503
- Tweaked the string handling, hopefully improving the memory
usage.
- About 3.3.502
- If H_COMMAND named an non-existing lfun, the driver now raises
a proper error instead of crashing..
- About 3.3.501
- Added fix for a crasher by Alwin - thanks!
- About 3.3.500
- When sending data over a congested socket, the Xerq a lost and dropped
data as result of a bug in the data queuing (thanks, Fantom!).
- About 3.3.499
-
net_connect() wasn't prepared for errors during
the LPC logon handling, and tried it over and over again.
- About 3.3.498
-
net_connect() prematurely closed sockets for which
it was still waiting on for a connection to succeed.
- About 3.3.497
-
net_connect() crashed the driver.
- About 3.3.496
- Corrected efun
variable_list(): Filtering for static
variables didn't work.
- Added efun
net_connect() courtesy of Muve - have fun
testing!
- About 3.3.495
- It's been a while... what can I say, days have been busy.
- Fiona provided updates to the XErq socket daemon code and the
telnet negotiation.
-
sprintf() with the formats %O and %Q now prints
floats always with a decimal point.
- About 3.3.494
- When doing a
foreach() over a varargs
parameter, the LPC compiler got confused and generated code for a
reference-foreach().
- About 3.3.493
- More improvements to the library detection in configure - I hope.
- Retrieving the full socket address from
query_ip_number()
didn't work.
- About 3.3.492
- Corrected (hopefully) a configuration problem for Avalon.
- About 3.3.491
- The max_commands setting was defaulted to 0 instead of -1 for
new connections.
- Officially documented that a new
interactive connection is bound to the master at the time
of
master::connect().
- The macros
__RESET_TIME__ and
__CLEANUP_TIME__ always used the configured values, ignoring
commandline overrides.
- New efun
master() to return the master object.
- About 3.3.490
- Corrected a crasher in
set_max_commands().
- About 3.3.488 and .489
- Added a third argument to
debug_info(DINFO_OBJLIST) to
return multiple objects; this can be used to simulate MudOS'
objects() efun (yes, this was originally listed for
3.3.486, but that was not true).
- New efuns
set_max_commands() and
get_max_commands() to control the command rate of an
interactive connection.
- Pragma (
no_)warn_empty_casts to control
the warnings for casts of an value to its own type.
-
to_array(string) now treats the string
characters as unsigned.
- The call_other() on arrays of objects is now configurable; if enabled,
__LPC_ARRAY_CALLS__ is defined.
- About 3.3.487
- The correction to the function handling missed a couple of subtleties,
which are corrected in this patch.
-
__INIT() is no longer visible as simul-efun.
- About 3.3.486
- Removed a crasher when a private lfun shadowing
a public sefun was virtually inherited twice in parallel.
- Removed a crasher when a
walk_mapping() over a mapping
deleted elements from the very same mapping.
- Passing 0 as argument to
set_{combine,connection}_charset()
re-establishes the default charset.
- New efuns
get_combine_charset() and
get_connection_charset().
- Experimental: the number of commands (line or char) of a connection
is now limited to 10 per second. This is meant as a safety measure
for muds using lots or charmode connections - if it works out,
I'll make the feature permanent and more configurable.
- About 3.3.485
- Removed a crasher when printing anonymous structs with no members.
- About 3.3.484
- Removed a problem in creating local context lvalues, which caused
map( arr, (: mm[$1]; :) ) to fail.
- About 3.3.483
- Removed a crasher in the lexer.
- About 3.3.482
- Postgres on SuSE 8 systems is now detected.
- Also removed a number of signed/unsigned compiler warnings.
- About 3.3.481
- When mySQL/PostgreSQL support is requested, but not implemented on
the machine, the configure script still enabled the respective
packages, causing the driver build to fail. This should no longer
happen.
- About 3.3.480
- Redefinitions of LPC preprocessor macros now list the file and line
of the original definition.
- About 3.3.479
- Added statistics for the small block defragmentation.
- About 3.3.476-.478
- Added support for OpenSSL as alternative to GnuTLS. As there are
hardly any usable docs for OpenSSL (at least none that I could find),
I had to copy&paste from demo programs - so expect a lot of bugs.
- About 3.3.475
- New commandline options
--tls-key and
--tls-cert to define the x509 key- and certfile for
the TLS package.
- About 3.3.473 and .474
- Gawain provided a TLS implementation using GnuTLS.
- .474 corrects a couple of compilation errors (it took me the good
part of a day to install GnuTLS after I checked in .473, so I didn't
notice before).
- About 3.3.472
- Casey provided a change to
variable_list() to return
the value of the variables as well.
- About 3.3.471
- The mySQL package now checks if it has been compiled against the
client the driver was actually linked with.
- About 3.3.470
- Reduced the computational expense of the small block defragmentation
(I hope!).
- Saving object values in the old format still used the new syntax
for shared strings.
- About 3.3.469
- A single missing '
|' in the smalloc allocator caused
a flag to be clobbered and occasionally the driver to crash.
- About 3.3.468
- Corrected a crasher in the small block defragmentation, and
reduced its overhead.
- About 3.3.467
- If a
#pragma requires the return type of a function,
the error message now prints the correct name of the pragma.
- In charmode, CR and LF are considered normal data characters.
- About 3.3.466
- Reduced the number of times
check_map_for_destr() is
called during mapping compaction.
- About 3.3.465
- I implemented a lazy defragmentation scheme for the small blocks
in the smalloc allocator.
- Oh, and the dhrystone modules reported a result which was by the
factor 10 too low.
- About 3.3.464
- Improved the recognition of the crypto libraries.
- Added some experimental code for machines with 64-bit
longs. This however will be a long-term development.
- About 3.3.463
- Corrected compilation errors in sysmalloc and ptmalloc.
- About 3.3.462
- Embarassing:
-= errorneously raised an argument error
when subtracting an int from an int.
- About 3.3.461
- Made the cast checks more informative.
- About 3.3.460
- Casts with no effect (like casting an int value to int) now
generate a warning.
- The operators
-=, *= and /=
can now operate on int x float values, yielding a
float result.
- About 3.3.459
- Bugfix: Subtracting arrays of closures from each other now actually
identifies identical closures.
- About 3.3.458
- Overflowing the value stack during a secure apply (e.g. during
an implicit master call) could crash the driver in the error recovery.
- About 3.3.457
- Corrected a compilation problem when using ptmalloc, and also
implemented Gawain's patches for the lock logic in that allocator.
- About 3.3.456
- Improved the stack/heap check to better cope with machines with
non-traditional memory layout.
- Character constants with the 8th bit set now appear as positive
numbers.
- New macro
__MAX_MALLOC__ returns the internal upper limit
for the total memory usage.
- About 3.3.455
- Removed a memory leak in efun
printf().
- About 3.3.454
- Made the error handlng more robust against recursive out-of-memory
conditions.
- About 3.3.453
- Improved the handling of CRLFs when restoring values.
- Oops, I accidentally disabled the strong type pragmas some time ago.
- About 3.3.452
- Added the modifier
publish zu catch().
It causes catch() to call master::runtime_error()
for a caught error, which is useful if you have an error database
running from the method.
- About 3.3.451
- When using pthreads, the flushing of the remaining data on closing
of a connection was not quite correct.
- Restoring values now accepts CRLFs as line end convention.
- About 3.3.450
- In the editor, only consecutive 'z'/'Z' commands do not reprint
the current line; a 'z'/'Z' after any other command does.
- When removing an interactive connection while using pthreads, the
remaining unset data is flushed out before the connection is closed.
- About 3.3.449
- Corrected a crasher in PCRE routines: repeated replacements within
one string used illegal arguments.
- About 3.3.448
- If during a
funcall(lfun-closure)
the object holding the lfun is destructed, the driver could crash
under adverse circumstances.
- About 3.3.447
- Added support for the MCCP protocol, kindly donated by Finalfrontier.
- About 3.3.446
- The PostgreSQL code could crash in a GC.
- The small-free-blocks statistics was wrong.
- About 3.3.445
- Added support for PostgreSQL. Please test it and let me know what
is missing.
- About 3.3.443+.444
- The
save_object() and save_value()
efuns now allow to specify the format of the saved data.
- About 3.3.441+.442
- The smalloc allocator is now able to merge adjacent free small
blocks right when they are freed, eliminating the need for
the expensive memory consolidation.
- If the GC finds lost memory blocks of unknown type, their data
is printed as proper hexdump to the gc log.
- About 3.3.440
- A preparationary patch on the way towards a more efficient
defragmentation of small blocks in smalloc. This patch
cleans up some code and introduces an (internal) minimum
allocation size.
- About 3.3.439
- The efuns
filter() and map() can now be
applied on strings.
- About 3.3.438
- A runtime error in a heartbeat no longer aborts the heartbeat cycle.
-
debug_info(): Added DID_ST_BOOT_TIME to the
DINFO_DATA: DID_STATUS result.
-
wizlist_info(): The evalcost statistic is now split into
'ticks' and 'gigaticks', and a second non-decaying evalcost
statistic has been added.
- About 3.3.437
- Made the use of
set_this_object() clearer in the
manpage.
- Efun
remove_action() can now also remove all actions
defined by an object.
- About 3.3.436
- Self-referential struct types could crash the GC when the defining
program was destructed.
- About 3.3.435
- The driver now logs which erq executable it tries to start.
- About 3.3.434
- The automatic cleanup didn't properly handle swapped out programs,
causing the swapped data to hold invalid pointers.
- About 3.3.433
- The efuns
mkmapping() and to_struct()
can now convert between mappings and structs.
- About 3.3.432
- The
switch() now demands a syntactic block (statements
enclosed in {}) as body, not just a statements. This
deviates from the C syntax, but as the LPC compiler doesn't
compile switch bodies of a single statement well, this will help
to prevent malfunctioning code (at least until the compiler has
been improved).
-
remove_input_to() now restores the proper noecho
state after removing a pending input_handler.
- About 3.3.431
- While a
set_this_object() is in effect, the driver
now actively prevents function calls by address and accesses to
global variables. Both were already illegal, but still possible and
could cause strange malfunctions or even crash the driver.
- About 3.3.430
- Removed a crasher when assignments were made to non-existing
struct members.
- About 3.3.429
- When saving values, shared strings now use the
<n> notation - this is
mostly useful to reduce the size of struct value sets.
- About 3.3.428
- New efun
m_entry() to return all values for mapping entry
at once (the counterpart to this efun is m_add()).
- New efun
strrstr() can search strings within strings
backwards.
- Operator
& can intersect mappings with other
mappings and arrays.
- Corrected the restoring of saved operator closure
#e:,.
- About 3.3.427
- New efun
rmember() to search arrays and strings from
the end.
- Modifier
# for sprintf() types %O and
%Q to print the values in a compact format.
- About 3.3.426
- Saving struct values now includes the defining program's name in
the data, so that the restoring can be done across objects.
- About 3.3.425
- Made a couple of corrections to the data cleanup code; this also
should fix the 'memory freed twice' crasher during the GC.
- Removed a memory leak in
find_call_out()/remove_call_out().
- About 3.3.424
- Corrected a bug in saving shared variable closure values.
- New commandline option
--filename-spaces to
allow space characters in filenames.
- About 3.3.423
- Removed a memory leak in the mapping code.
- About 3.3.422
- The cleanup algorithm accidentally freed closure driver hooks
if they were still bound to destructed objects.
- About 3.3.421
- Corrected a build problem concerning an interaction between
MALLOC_CHECK and MALLOC_TRACE: the latter requires the former.
- About 3.3.420
- New configuration option
--enable-malloc-sbrk
to selectively allow the memory allocator to use sbrk() instead of
malloc() where available (default is to allow sbrk()).
- About 3.3.419
- Corrected a problem in the GC: the hash part of mappings wasn't
properly marked as 'referenced'.
- About 3.3.418
- Removed a crasher in the struct code.
- The garbage collector can now collect mappings with a hash
part (I hope).
- Gawain added more locking code to the ptmalloc allocator.
- About 3.3.417
- I gave the LPC compiler the ability to reactivate old struct
definitions, if they match the new ones in name, defining program
and internal structure. This way accidental updates of for
example an
/std/types object won't break the whole
mud.
- About 3.3.416
- The variable swapper got out of sync when encountering mappings
with destructed objects as keys. This wasn't a problem before
because mappings were compacted faster than they were swapped.
- About 3.3.415
- Configuration option
--with-optimize to set the
optimization level in the generated Makefiles. Settings are:
no, low, med
or high.
- There is a problem in the driver which manifests itself in
corrupt data in variable swap blocks. As this is my only
clue at the moment, I have added some sanity checks to the
swapper.
- About 3.3.414
- I modified the mapping compaction conditions: a mapping is compacted
(outside of a GC) when entries haven't been added or deleted
for at least 10 minutes, and if either more than half of the
condensed entries have been deleted, or if the number of hashed
entries exceeds the number of condensed entries.
- About 3.3.413
- Since the driver already cleans up the objects in the backend, the
mapping compaction might as well be done then, too. So: no extra
'dirty mapping list' anymore.
- About 3.3.412
- An experimental change to the internal memory pools: by restricting
the maximum size of one of their blocks, I hope to reduce fragmentation
in the large block heap.
- About 3.3.411
- The GC with enabled MALLOC_LPC_TRACE crashed if a mapping or
vector was owned by the 'default wizlist entry'.
- About 3.3.410
- I modified the mapping compaction such that a dirty mapping is
compacted if either more than 10 minutes have passed since the last
change, if more than half of the condensed entries have been deleted,
or during a GC. The idea is to avoid frequent reallocations for busy
mappings, especially big busy mappings where the compaction can cause
severe memory fragmentation issues.
- About 3.3.409
- The OBJ_DUMP now also contains the object's creation times.
- When printing an alien-lfun closure, the object the closure is
bound to is printed in
[].
- Consecutive 'z' or 'Z' commands in the editor no longer repeat
the previous current line.
- About 3.3.407 + 3.3.408
- New configuration option
--enable-malloc-sbrk-trace to
enable a log of all system memory requests, including the stats for
the memory allocation requests causing them. The intention is to
help debugging muds with high system memory usage.
- About 3.3.406
- Corrected a bug in the garbage collection of structs, which could
lead to memory corruption.
- Corrected a memory leak in efun
m_add(), which happened
when existing entries with no-scalar values were overwritten.
- About 3.3.405
- Two new efuns:
variable_list() and
variable_exists().
- About 3.3.404
- Improved the error messages for when
mapping
[a, b]
is used with wrong types at runtime.
- About 3.3.403
- Corrected a problem in the interaction of the GC and the swap memory
buffers, which could lead to memory corruption.
- About 3.3.402
- Made the internal
strbuf routines more resilient
against out-of-memory conditions.
- Improved the
DEBUG: MEM diagnostics when memory blocks
are just re-allocated.
- About 3.3.401
- Corrected a bug in the struct code which could cause structs to
be dereferenced prematurely.
- About 3.3.399 + 3.3.400
- Some muds are still using enourmous amounts of system memory
for no apparent reason. I have now added a diagnostic to every
esbrk() memory request, logging the location and
originally requested size to stdout. The diagnostics start with the
text "DEBUG: MEM ", and you should at least define
MALLOC_TRACE to make them useful.
- About 3.3.398
- Corrected a compilation problem.
- About 3.3.397
-
Macro __MSDOS_FS__ is defined on systems using the
MS-DOS filesystem conventions.
- About 3.3.395 + 3.3.396
- I have the suspicion that the swapper and the file-reading
efuns (
read_file(), read_bytes() and
restore_xxx()) cause an
increase in the total memory allocation when confronted with large
data: the necessary buffers can't be allocated from the existing
memory pool due to fragmentation.
I have therefore added persistent buffers for these efuns, which
only increase in size, but aren't deallocated except by a GC.
- About 3.3.394
- Simplified the small block allocator somewhat: since the allocator
has been enable to handle 'oversized' small blocks, the special
case of 'unused space' in the current small chunk is no longer
necessary.
- About 3.3.393
- I reduced the upper limit for small block sizes, and also defragment
the small freelists automatically, hoping to achieve a better reuse
of freed memory.
-
sprintf() now works with a static format buffer, instead
of continuously allocating and deallocating one from the dynamic
memory.
- About 3.3.392
- When parameter
min-small-malloc is used, the allocator
now makes sure that this block is allocated directly from the
system as well.
- About 3.3.391
- Gawain provided first code to make the ptmalloc-GC threadsafe.
Have fun testing!
- About 3.3.390
- Inverted
case ranges like 100..50 have
always been illegal, but so far the LPC compiler just ignored them
instead of generating an error message.
- About 3.3.389
- Corrected a compilation problem of ptmalloc with x86-gcc.
- About 3.3.388
- The last patch introduced a fatal error into the
break
and continue handling - this is corrected now.
- About 3.3.387
- The LPC compiler choked on
break and continue
when used in large programs, and silently corrupted the generated
bytecode.
- Gawain has brought the GC in ptmalloc into alpha-status: it can be
tested, will likely crash, and it isn't threadsafe yet.
- About 3.3.386
- I finally found (with help) that insidious bug in the memory allocator,
which requested more and more memory from the system even though
there were megabytes available in the freelists.
- About 3.3.385
- Assignments to multi-level struct references didn't work.
- About 3.3.384
- Runtime warnings leaked the filename of the affected object.
- About 3.3.383
- The reference count of struct typeobjects is no longer changed
by the swapper. This avoids premature freeing of typeobjects with
swapped-out values, and also avoids a nasty interaction between
swapper and garbage collector.
- About 3.3.382
- Corrected a small, but fatal error in the memory allocator.
- About 3.3.381
- Improved the error messages when an expected structure is not found
at runtime.
- It is no longer possible to drive a struct from a struct prototype
(this also catches
struct Foo (Foo) { ... }).
- About 3.3.380
- Restoring plain lfun closures no longer worked.
- About 3.3.379
- Small correction to the operators
&&= and ||=.
- About 3.3.378
- I removed the configuration option INITIALIZATION_BY___INIT. In
it's stead, it is now possible to select on a per-program basis
if a clone's variables are initialized by __INIT(), or by copying
the current values from the blueprint. The default behaviour
can be selected during configuration, or with a commandline argument.
See initialisation(LPC) for more information.
- About 3.3.377
- The LPC parser didn't compile on all systems.
- About 3.3.376
- The configuration check for
pthread_atfork() always failed.
- Removed a compilation problem.
- About 3.3.374+.375
- Implemented proper short-circuit evaluation for operators
&&= and ||=.
- About 3.3.373
- Corrected a string reference count bug in
andor//xor_bits(),
which over time could cause memory corruption.
- About 3.3.372
- Gnomi pointed out historic misfeature:
a
#pragma strict,strong_types in an
included file was valid only until the end of the include; the
including file saw no change. I can't seen any sense in this, so
I removed this behaviour.
- About 3.3.371
- Saving/restoring objects didn't handle shared closures, which
could lead to endless recursions.
- The context for inline closures wasn't compiled correctly when
local variables were used in the initialisation expressions.
- About 3.3.370
- Improved pthreads support for platforms without
pthread_atfork(), like FreeBSD.
- About 3.3.369
- Swapping structs during a GC needlessly triggered a sanity check.
- About 3.3.368
- Removed a fatal bug in the
rexalloc() implementation.
- About 3.3.367
- The typetracking for assignments to struct members was faulty.
- About 3.3.366
- Corrected the allocation statistics, which could lead to
false 'MAX_MALLOCED limit reached' aborts.
- About 3.3.365
- Efun
member() crashed when passed a struct as second
argument.
- Implemented struct-lookups on
mixed-typed expressions.
- About 3.3.364
- The configuration option
--with-malloc didn't quite work.
- About 3.3.363
- Self-referential structs caused the GC to crash.
- About 3.3.361+.362
- Found an implementation restriction in
replace_program():
If the replacement program contains virtually inherited variables,
it must be the first inherited program for the replacement to work.
The efun now checks for this condition.
- About 3.3.360
- Well, *blush*, seems that I was a bit too enthusiastic in the last
announcement - Gawain is working on bringing the GC to ptmalloc, and
he's making great progress; but it's not finished yet. Still... Yay!
- Gawain fixed a fatal bug in the GC part of ptmalloc.
- About 3.3.358+.359
- Gawain has added GC support to the ptmalloc allocator - this brings
the pthreads-using drivers to the same level as their single-threaded
incarnations.
- If no specific allocator is selected during the configuration, the
script will automatically select the proper allocator to suit the
pthreads setting.
- About 3.3.357
- Bug corrections: indexing one-past the end of an empty string
didn't work; the lexer got confused with line contiuations
in preprocessor conditionals under Windows.
- It is now possible to redefine a function using more arguments.
- About 3.3.356
- Corrected two more fatal struct errors.
- About 3.3.355
- Just a small internal improvement.
- About 3.3.354
- Removed the configuration option 'no-blueprint', as the code has
been proven stable.
- About 3.3.353
- Corrected two more errors in the compilation of struct code.
- About 3.3.352
- The result array for
wizlist_info() was allocated
too small, eventually crashing the driver.
- Removed compilation errors when
__INIT was not used.
- About 3.3.351
- The ptmalloc module didn't compile on all systems.
- New configuration option
malloc-check (enabled by
default) allows the allocator to implement simple checks. Currently
smalloc uses this to tag allocations with magic words, catching
basic memory misuses.
- About 3.3.350
- Removed a couple of refcount errors in the struct handling.
- About 3.3.349
- Many mudlibs like to index one past the end of a string, which in the
older drivers was legal. But it's not exactly clean coding because
it relies on how strings are stored internally (ie. with a trailing
null character), so while it's (again) possible with 3.3 to read a
character this way, with
#pragma warn_deprecated you
will get a warning.
- About 3.3.348
- Removed a crasher when inheriting functions with struct arguments.
- About 3.3.347
- Removed a crasher from the memory consolidation phase
of the GC.
- About 3.3.346
- Corrected a compilation problem (gcollect.c still used
SMALLOC_OVERHEAD).
- About 3.3.345
- A garbage collection did not adjust the xalloc statistics.
- About 3.3.344
- I re-implemented the struct support: structs are now datatypes
by themselves (and not rebadged arrays), and allow reflection, ie.
looking up and using member names at runtime. See
doc/LPC/structs for more information.
- About 3.3.343
- Gawain adapted the threadsafe ptmalloc2 allocator for LDMud - thanks!
Only drawback is that it doesn't support GC (yet?).
- About 3.3.342
- Removed a crasher: when saving lfun closures, the function name
could be looked up in the wrong program.
- About 3.3.341
- Just clarified a comment.
- About 3.3.340
- Efun
regreplace() didn't test the existance of a
particular subexpression match for the \int
replacement pattern.
- About 3.3.338+.339
- Cygwin in highest optimization created buggy code in the LPC lexer.
- About 3.3.337
- A missing H_NOTIFY_FAIL hook could crash the driver if the
H_SEND_NOTIFY hook was set.
- About 3.3.336
- The counter for memory used was never decremented, causing the driver
to signal a 'MAX_MALLOCED reached' when in fact memory was available.
- About 3.3.335
- Saving lfun closures could crash the driver (I accidentally deleted
an important piece of code).
- About 3.3.334
- Restoring efun closure values now checks if the efun has been
overridden by a nomask simul-efun.
- With pthreads: made removing an interactive thread safer.
- About 3.3.333
- Restoring mappings with closure values didn't work.
- About 3.3.332
- Corrected a preprocessor problem in the xalloc layer.
- About 3.3.331
- Corrected a small problem in the xalloc layer.
- About 3.3.330
- Removed a crasher which happened if a login-object destructed itself
in the logon() function.
- About 3.3.329
- Corrected a compilation problem (which my gcc leniently ignored).
- About 3.3.328
- It is no longer possible to define a variable to be of type 'void'.
- About 3.3.327
- I straightened out the interface between the allocator and the
rest of the system. In particular, the MALLOC-tracing is now
done on the xalloc() level, and the GC no longer relies on
the knowledge of smalloc's internal structures.
- About 3.3.326
- The
restore_() and save_() efuns can
now save and restore non-lambda closures, symbols, and quoted
arrays - perfect for storing ready-to-be-compiled lambda closures.
However, the savefiles can no longer be read by earlier drivers
(the other way around works).
- About 3.3.325
- Removed a memory leak in the mappings - it mostly happened
during swapping and (ironically) cleanup.
- About 3.3.324
- New operators
&&= and ||=
for logical assignments.
- Added some documentation.
- About 3.3.323
- Dale Perkins provided a nifty web logo.
- Efuns copy_file() and rename() no longer throw exceptions on errors,
but just return a non-0 value. In some future, the result will
be an error code or message.
- Fiona provided more patches for the telnet code, and an updated
telnetneg LPC module.
- About 3.3.322
- The input prompt was not always piped through an existing catch_tell().
- About 3.3.321
- When logging in a new player, the prompt wasn't printed, which played
havoc with muds which are using the new input_to(INPUT_PROMPT) feature.
- If the driver is able to reallocate the reserved areas after detecting
an 'out of memory' condition, the condition flag is reset.
- About 3.3.320
- Updated the
patch-o-matic to use the new executable name.
- The filenames returned by
include_list()
now always start with a '/' to make their reuse in include statements
simpler.
- Fiona generously donated the telnet negotiations module from
Wunderland, containing a complete implementation of the telnet protocol.
- In efun
sprintf.c the %O/%Q formatter stumbled over really
large arrays and mappings; in fact this was a potential crasher.
- About 3.3.319
- Corrected a typo in the Makefile.
- About 3.3.318
- The executable has been renamed to 'ldmud'.
- A couple of changes to the configuration and compilation process:
- The configure script tries to find out the valid compiler warning
options on its own.
-
send_erq() callback closures can now accept a string
instead of an array.
- Corrected the lp-245 mudlib to no longer use the
function
keyword as variable name.
- About 3.3.317
- Fiona provided a number of corrections for CHARMODE handling - thanks!
- About 3.3.316
- Brainfart: the problem to correct was that wildcarded supercalls
(
"*"::fun()) looked at all inherited programs, and not
just the directly inherited ones.
- About 3.3.315
- For wildcarded supercalls (
"*"::fun()) the compiler
now makes sure that each function is called only once.
- About 3.3.314
- Small corrections: removed a defunct source-file; documented in
doc/LPC/types the formats of ints, floats, chars and strings, and
corrected doc/concepts/erq in a detail.
- About 3.3.313
- Small change to the BeOS development process, so that it is no longer
necessary to store the version numbers in the BeOS Makefile.
...and this is patch #5 for today...
- About 3.3.312
- More corrections to
transfer() - funny though that
nobody has noticed these errors before :-)
Hmm, this is now the fourth patch in one day - a new best!
- About 3.3.311
- Correction of a deadlock when using pthreads.
- About 3.3.310
- Corrected a bug in the deprecated efun
transfer(): the
result of dest->can_put_and_get() was
ignored.
- About 3.3.309
- Removed a potential racing problem when using pthreads.
-
restore_object("#0:0") caught the driver in an endless
loop.
- Guandalug contributed a
patch-o-matic for automatic
driver updates.
- About 3.3.308
- With the invention of the context closures the internal space advantage
of lfun- over alien-lfun closures is mostly gone, so I merged the two.
- About 3.3.307
- Corrected a few refcount errors in the dangling-lfun handling.
- An internal change to the lfun-closure layout in 3.3.306 caused strange
crashes - I undid the change.
- About 3.3.306
- The conversion of dangling lfuns into dangling alien-lfuns (dev.482)
had the small problem that these lfuns had to be created as
alien-lfuns. That's what is done now.
- About 3.3.305
- When cleaning up objects, strings could get freed twice. Oops.
- Some source cosmetics.
- About 3.3.304
- Inline closure spanning include files were created even though
the parser recognized them as faulty.
- About 3.3.303
- Destructed objects sometimes weren't cleaned up.
- About 3.3.302
- The list of players to flush could get clobbered, stopping output
for certain players altogether.
- About 3.3.301
- Corrected a linenumber counting bug caused by the new inline
closures.
- About 3.3.300
- A typo in a preprocessor conditional had permanently disabled the
data cleanup code.
- About 3.3.299
- Swapping strings during a GC could crash the driver.
- About 3.3.298
- Corrected an off-by-one error in sprintf() which crept in with
the last patch, but wasn't noticeable in the simple tests.
- Corrected a crasher in
get_type_info(unbound-lambda,2).
- Corrected a potential crasher in the handling of netdead objects
with pending output.
- About 3.3.297
- The crashes were caused by a bug in the swapper, which was not
prepared to swap strings with embedded \0 bytes; the new cleanup
code just happen to trigger the bug sooner than later. I corrected
the swapper and reactivated the cleanup code (if you want to deactivate
it for testing purposes, you have to edit the define in
config.h).
- I reduced the frequence of the data cleanup so that it takes an hour
to process all objects. Swapped and reset objects are not cleaned up
unless more than the normal cleanup time has elapsed.
- I made the efuns
debug_message(), sprintf()
and printf() work better with strings with \0 characters.
- About 3.3.296
- The new cleanup code seems to have a weird interaction with the
swapper - I got several reports from crashes - so for now I deactivated
it. If you want to play with it, add a define for NEW_CLEANUP to
the compiler options in the Makefile.
- About 3.3.295
- Corrected an off-by-one error in the linecounting of the auto-include
string.
- Removed a warning under gcc 2.x (I hope!).
- The backend of the driver now regularly scans the variables of every
object for references to destructed objects and removes them/replaces
them by 0s. This is in particular helpful for mappings which use
objects as keys: if such a mapping is only changed by adding/removing
entries one at a time, destructed object keys in the condensed part
of the mapping would never be removed. Not only wasted this memory,
it also could cause the GC to flag the values referenced by these
entries as 'leaks', producing enormous log files.
- About 3.3.294
- Fixed a crasher when H_NOECHO was called for an destructed object.
- About 3.3.293
- The library tests in configure weren't quite functional.
- The editor sometimes crashed on a missing filename - added checks
to prevent that.
- About 3.3.292
- Dangling lfun-closures are now converted into dangling alien-lfun
closures, so that the error handler can determine the originating
object.
- If the initialisation value to
allocate() is a mapping
or array, the created array elements will receive a shallow copy
of the init value.
- Indexing
[<] created an out-of-bounds condition
which wasn't caught.
- About 3.3.291
- On (Debian) Linux, the test whether libpthread is required didn't work.
- The test in
xfree() regarding multi-threaded use also
triggered when the memory reserves were released.
- About 3.3.290
- Sorry, I accidentally removed support for TELOPT_EOR in the last patch,
this one rectifies this.
- About 3.3.289
- TELOPT_BINARY is now one of the options negotiable by H_TELNET_NEG;
it is needed for non-US charsets.
- About 3.3.288
- The auto-include correction uncovered another bug in the
LPC compiler.
- The configuration script now tries to add only those libraries
to the compilation which are actually needed.
- About 3.3.287
- Improvement to
find_input_to() and
input_to_info(): functions can be specified by
object+name.
- Using auto-include strings no longer mess up the line counting.
- When the xerq finishes a queued write, it sends a ERQ_OK message
to the driver.
- Removed a crasher in
regmatch( , RE_MATCH_SUBS).
- About 3.3.286
- Bugfix to reset: the previous object was set incorrectly.
- New efuns
find_input_to() and input_to_info()
to make handling input-tos simpler.
- Added a (very) primitive safeguard to the mallocator - I suspect that
pthreads are making re-entrant calls to it.
- About 3.3.285
- configure now checks for the libresolv, as it's needed on some systems.
- The configure script now keeps track which features (like pthreads
or mysql) can't be enabled because of missing support.
- About 3.3.284
- Recognition of pthread support was broken, and if pthreads weren't
available, a 'use-pthread=yes' was not deactivated.
- The bug b-020916 contained a few segments which played havoc
with patches. I split the bug into several, which also means that
this patch won't apply either - download the full archive if
that happens.
- About 3.3.282+.283
- Restoring structs stored in mappings didn't work.
- When DYNAMIC_COSTS are enabled,
deep_copy() counts
array/mapping size and nesting depth towards evaluation costs.
- About 3.3.281
- The OPCPROF functions still used old-style strings.
- About 3.3.280
- When using structs, inheriting programs clobbered memory, and
sprintf("%O",quoted-array)
crashed the driver.
- In struct literals a trailing ',' is now allowed.
- structs are not flattened by the '...' operator or by
apply().
- About 3.3.279
- Gah, forgot to remove a debug output from the LPC compiler.
- About 3.3.278
- Lfun closures can now explicitely name inherited functions,
for example
#'base::create.
- I also forgot the regenerate the configure script in the previous
patch.
- About 3.3.277
- In struct literals, a trailing ',' is now allowed.
- The indexing range
[..expr]
created faulty bytecode, maybe even clobbered memory, under certain
circumstances.
- About 3.3.276
- structs now carry an id string which can be queried using
get_type_info().
- About 3.3.275
- There goes to show: I just have to declare categorically that
the form
(: <statements> :)
is impossible to parse with the new inlines and go run a race, and
promptly I get an idea how to parse it after all. A plain obvious
one, too. My apologies to all who started rewriting their mudlibs.
- Removed a couple of crashers regarding structures and new inlines.
- About 3.3.274
- The error handling for the
(: :) form of the new
inline closures was lacking, causing the parser to get confused
or crash after an error.
- I probably haven't documented it clearly enough, but the new
inline closures bring to important changes from the old:
-
function is now a reserved word.
- The old implementation allowed the use of statements instead
of expressions within
(: :), for example
(: return 1; :). This made possible with a horrible
lexer hack which looked for a ; before the
:).
Unfortunately with the new implementation this is no longer
possible. I know, it would have been nice, but this special
form is impossible to parse - you will have to rewrite your
code to use function { } instead in these cases.
- About 3.3.273
- Untyped inline closures didn't cooperate with
#pragma strict_types
- And guess what: there was no predicate
structp() to
detect structures.
- About 3.3.271+.272
- I have debugged the new inline closure code, and it seems to run
quite well. Therefore this new feature is on by
default. If you experience too many incompatibilities with
your existing code, or if the driver misbehaves, you can deactivate the
new inline closures in the configuration.
- And 3.3.272 corrects a compilation error in 3.3.271 .
- About 3.3.270
- The new inline closures are alpha-complete: I can't think of anything
else to add, the code compiles, but hasn't been tested yet. It is
therefore still inactive, and the point of this release is to
see if I broke anything else in the process.
- About 3.3.269
- Added some infrastructure for the new inline closures.
- About 3.3.268
- Small corrections; in particular the debug.log file was opened
with an incomplete name.
- About 3.3.267
- New driver option
--hostname <name> to
specify the hostname, overriding the value returned by the
system.
- New driver option
--hostaddr <addr> to
specify the hosts address, overriding the value returned by
the system. In particular this address will be used to open
the driver ports under.
- With pthreads: the diagnostic 'Thread x cancelled and cleant up'
might again cause memory corruption. I replaced the fprintf() with
something safer.
- The driver now checks if an object to be loaded appeared out of
nowhere while it was compiled. This can happen when the compilation
caused warnings or errors, and the mudlib handled used rename_object()
carelessly.
- About 3.3.266
- The PThread support can now be configured normally using the
--enable-use-pthreads. The maximum amount of data
pending is configured with --with-pthread-write-max-size
and can be changed with the commandline option
--max-thread-pending (yeah, inconsistent naming here).
- If a connection is marked for removal (e.g. due to a
remove_interactive()), telnet commands are still
sent to the socket and not dumped to stdout.
- Struct can now be compared with
== and !=;
they can be used as values in foreach() statements
and with apply() resp. the ... operator.
- About 3.3.265
- With USE_PTHREAD: the thread cleanup sometimes dereference a NULL
pointer.
- About 3.3.264
- Using LPC tracing with lambda closures or
call_resolved() crashed the driver.
- About 3.3.263
- The USE_PTHREAD implemention unfortunately ignored that the
smalloc memory allocator is not threadsafe: when printing large
amounts of texts, eventually the writer thread would free a memory
block while the main thread was in the mid of an
allocation/deallocation of its own.
- The GC miscounted the references on program names, introducing
a small memory leak.
- Guandalug provided a couple of bug fixes.
- About 3.3.262
- Bugfixes to efuns
set_modify_command() and
inherit_list(), and to the check for duplicate
toplevel inherits in the LPC compiler.
- Added the
lpc-mode.el written by Vivek Dasmohapatra.
- About 3.3.261
- Added the interpreter infrastructure for the new inline closure.
Now we just need to add the compiler support...
- About 3.3.259/3.3.260
- Efun
transfer() is now officially deprecated (but
still available); the old behaviour of parse_command()
is no longer available.
- Since the efuns
set_light(), set_is_wizard(),
and process_string() have been optional for a long time,
they can now be enabled/disabled in the configuration process. Oh, and
I renamed the config option supply-parse-command into
use-parse-command.
- The new doc directory
doc/obsolete/ holds all the
manpages for removed driver functionality - this information
sometimes comes in handy, for example when reworking old code.
- The driver hooks are now documented one-per-file in the directory
doc/hook/.
- And a new efun
match_command(), which performs the
normal driver command matching and returns an array with the
results. It can be used for debugging, or to implement your
own command handling (in the H_COMMAND hook).
- About 3.3.258
- Nasty crasher in the LPC compiler: assignments to a struct member
caused the LPC compiler to use uninitialized memory if the member
lookup had failed.
- About 3.3.257
- Two bugfixes to the LPC compiler for bugs which clobbered memory.
- Then PThreads are used, the newly created threads are now
properly detached.
- The argument checking for sefun compiled in lambda closures
didn't work properly.
- The object statistics seem to be correct, so the CHECK_OBJECT_STAT
debug macro is by default off now.
- About 3.3.256
- Some source changes to reduce the coupling on generated include
files.
- Config option
COMPAT_MODE is now purely a default
for the runtime option.
- About 3.3.255
- The new
#pragma warn_deprecated instructs the LPC
compiler to print a warning whenever a deprecated efun is used.
- The string statistics were slightly wrong.
- About 3.3.254
- The "some source work" also broke mapping lookups *blush*.
- Wildcarded supercalls (e.g.
"*"::reset()) created
invalid bytecode if there was not function found to call.
- The type checking regarding assignment and addition of structs
had minor flaws.
- About 3.3.253
- Just some source work.
- About 3.3.252
- The
struct accidentally interfered with virtual
inheritance, leaving behind all kinds of uninitialized memory.
- Array-additions are now covered
DYNAMIC_COSTS as well.
- About 3.3.251
- Just a small internal improvement of the commandline argument parser.
Oh, and I also removed the compatibility arguments like
"check_a_lot_of_refcounts".
- About 3.3.250
- The efuns
to_string() and to_array()
now support structs; the new efun to_struct() complements
the set.
- struct literals with both named and unnamed initializers are no
longer legal - it was considered borderline featuritis and not
really useful.
- About 3.3.249
- A
struct bugfix: inheriting struct variables accidentally
confused the visibility tracking of the LPC compiler.
- Just for fun I added the rules for a new inline function syntax.
But don't worry: it was really just an experiment to see how
complicated it would be - by default the whole shebang is disabled.
- About 3.3.248
- Markus Peter provided a patch for
debug_info() which
corrected two crashers, one of them related to structs.
- Assignments of
mixed to struct are now
possible without casts. If you assign something which is not a struct,
you'll get a runtime error as soon as you try to access one of
the members.
- About 3.3.247
- What did I say about bugs? Well,
restore_object()
restored arrays as struct values, and vice versa.
- About 3.3.246
-
structs are fully implemented - Yay! Of course,
there are still bugs to fix, and I probably didn't think of
the one or other feature, but otherwise...
- About 3.3.245
- More
struct work: Fixed a crasher, and implemented
constant struct initializations when __INIT() is
not used.
- About 3.3.244
-
struct definitions are now implemented, and can even
be inherited (though I didn't test the latter yet). You still
can't use them, however.
- About 3.3.243
- Made some internal changes for
struct support.
Nothing accessible to the wizards yet, mind you, except that
configuration option ALIGN_FUNCTIONS is now mandatory.
- About 3.3.242
- The string statistics were miscalculated when untabled
strings were made tabled.
- External callbacks to lambdas (ie. driver hooks) now clear the eval
cost before an error is processed.
- The object statistics get messed up because variables are counted
as 'swapped in' more often than they had been swapped out. I am
not exactly sure why - it could be an interaction with the GC - but
I moved the computations at somewhat better places in the swap
process. Let's see if that helps.
- About 3.3.241
- Whoa, the SSTAT diagnostics produced really a lot of output.
But I have a first clue about what's happening, so I will debug
that problem in OSB; for everybody else the diagnostics will be
disabled.
- About 3.3.240
- Added missing
%endif in the LPC compiler source -
I am surprised that I didn't get any compilation errors before.
- About 3.3.239
- The string module statistics seem to go haywire after some time.
I added a 'DEBUG: SSTAT' diagnostic when that happens.
- About 3.3.238
- Support for international characters was broken.
- About 3.3.237
- A first step towards
structs: I added the necessary
rules to the LPC compiler in order to see if the syntax could
be done. Right now they don't generate code, but just throw
errors reminding you that structs are not yet implemented.
- About 3.3.236
- Corrected bytecode generation bug.
- About 3.3.235
- Since the LP-245 mudlib is actually used by some, I changed it
so that all functions are compiled with type-checking enabled.
- About 3.3.234
- The USE_PTHREAD code didn't compile.
- Corrected a few messages.
- About 3.3.233
- Efun
terminal_colour() again: not a crasher this
time, but garbage data was printed.
- About 3.3.232
- Efun
terminal_colour(): the bugfix to handle
strings with single '%' was not quite complete - the driver
still could crash.
- About 3.3.231
- External master calls (like for ERQ messages) get the same eval-cost
benefits during error handling as normal call-others.
- About 3.3.230
- Corrected some build problems.
- The ERQ debugging level is now configured with the option
--with-erq-debug=number, where number
can currently be 0 (disabled, the default), 1 (normal debug output) and
2 (lots of debug output).
- About 3.3.229
- Corrected a crasher in the error handling of defines given
on the command line.
- The ERQs now print their name and compilation date to stderr
on startup.
- If the driver uses the default debug.log file, its (mudlib)
name is available in the predefined macro
__DEBUG_LOG__.
- Corrected a some minor build problems.
- Efun
symbol_function() freed a symbol as a string.
- Corrected a crasher in the regexp() modifications.
- About 3.3.228
- New predefined macro
__RESET_TIME__ and
__CLEANUP_TIME__
to return the default reset and cleanup interval time.
- About 3.3.227
- Formatting a text with single '%' with terminal_colour()
caused to code to search random memory for the '%^' marker -
this would explain a number of crashes.
- Argument errors in the vararg efuns printed the wrong efun name.
- About 3.3.226
- Corrected a bug in the array-array operations which forgot to
clean out references to destructed objects in short arrays.
- About 3.3.225
- Corrected a bug in the array-array operations which produced
incorrect results for arrays with multiple copies of the
same value.
- About 3.3.224
- Corrected a fatal bug in the array-array operations.
- About 3.3.223
- Removed compiler option
-funroll-all-loops from the
configuration as it produced buggy code.
- Plugged two memory leaks.
- About 3.3.222
- One error message printed memory garbage.
- Corrected some build problems.
- About 3.3.221
- I forgot to allow
|= on arrays even though |
already worked.
- And the operators
^ and ^= now also
work with arrays and compute the symmetric difference.
- About 3.3.220
- Ok, adding the copy-on-write semantic was a bad idea:
it broke more than it fixed. Therefore I took it out again.
- Corrected two small bugs in the configuration code - my gcc
took it in stride, other compilers were pickier.
- About 3.3.219
- The last PCRE patches - Yay!
- PCRE is now the configured default for the driver (but I modified
all existing mud setting files to use the old regexp package).
- Both packages increase the eval-cost counter for every backtrack
they have to make during a match. Intention is to catch a
pathological match like
regexp(({"=XX==================="}), "X(.+)+X")
before it freezes the driver for hours.
- About 3.3.218
- New predefined macros
__CATCH_EVAL_COST__ and
__MASTER_EVAL_COST__ to carry the corresponding
configuration options over to LPC.
- The debugging compilation options are now part of the normal
configuration mechanism.
- Debug macro
CHECK_OBJECT_STAT allows tracing of all
changes to the tot_alloc_object(_size) statistics. Aim is to
find the discrepancy in the 'status' command. To activate the
tracing, the commandline option --check-object-stat
must be given.
- The operations map += map
and map -= map
now implement the copy-on-write semantic to mirror the
behaviour of the related array operations.
-
get_type_info(closure,2) did not return the
bound object for efun, simul-efun and operator closures .
- Attempting to replace a program in an object
which already has closures bound no longer raises an error,
but issues a debug_message().
- It is now possible to define non-vararg efuns with more than
six arguments.
- About 3.3.217
- In
symbol_function(), symbols were freed as if
they were strings.
- Signal USR2 forces the driver to reopen the host.debug.log file.
- Experimental: Defining USE_PTHREAD (if your system has pthread support)
activates code which uses threads to write the socket data to the
network in the background. Intention is to avoid EWOULDBLOCK errors on
slow connections.
- About 3.3.216
- How embarassing: the bugfix for
filter() and
map() broke the efuns for non-multi-value mappings.
- About 3.3.215
- It has been quite some time since the last update - reason being
that I am switching my main development over to OS X, which means
that my software environment is not quite working yet. In particular
PRCS, which is not quite adjusted to the caseless-ness of the HFS
filesystem.
- When the efuns
filter(), map() were used
on multi-value mappings, the driver did not recognize when the called
closure kept a reference to the array with the values, overwriting
the values in the next iteration.
- Fixed two crashers: Calling a self-destructing closure from
limited(), and two uninitialized variables
in the traceback collection for a catch() frame.
- If a program is inherited twice at the toplevel, a warning
is raised. If pragma 'pedantic' is in effect, an error instead
of the warning is raised.
- About 3.3.214
- Two changes to
regmatch(), suggested by Fiona: non-matches
return 0 instead of the empty string, and the efun now takes and
returns a start index for repeated matches.
- About 3.3.213
- During a GC, the list of destructed objects could get clobbered,
leading to an insiduous memory leak.
- Added some support for local charsets; in particular character
conversions are now done with regard to the locale defined in
the environment variable LANG.
- Corrected a bug in
regreplace().
- Wonder why this patch does not include a correction to the error
correction to the virtual inheritance problem, but the corresponding
patch for 3.2 does? Well, this driver already had the correct code.
- About 3.3.212
- Applied the two bugfixes provided by Guandalug for efuns
get_dir() and strstr()
- About 3.3.211
- Sorry, yesterday's bugfix had a bug itself.
- About 3.3.210
- Corrected a rare and complicated, but fatal error in virtual
inheritance.
- The new arguments to
garbage_collection() are
ignored if the used memory allocator doesn't support GC.
- About 3.3.209
- The option
TRACE_CODE moved from the Makefile
into config.h, and is also configurable per argument
to the configure script.
- Efun
garbage_collection() now optionally takes a
filename argument to specify a different logfile but the default
one, or even to change the default log file.
- Fixed a nasty bug in the hash routines which caused FinalFrontier
to crash on startup.
- About 3.3.208
- 'mapping += mapping' throws an error if the mappings are of unequal
width.
- The notation
([:expr]) can
be used to create empty mappings of the given width.
- About 3.3.207
- Nothing terribly important, just a small correction to a diagnostic.
- About 3.3.206
- Another exception to the rule that references can't be put into
arrays: the H_DEFAULT_METHOD hook.
- Apparently the LPC compiler was a little lax in checking if it
got enough memory for the program code it generated. This may
have been the reason for the occasional crasher on corrupted
memory.
- About 3.3.205
- The new swapping code could clobber memory - fixed that.
- Corrected a small problem with inheritance of variables with
differing visibility.
- The compiler error and warning messages now have the
"file
line line
: text" format.
- Deactivated the debug defines CHECK_MAPPING_TOTAL and CHECK_OBJECT_REF,
since these bugs seem to be fixed. This will also reduce the
CPU usage of the driver.
- About 3.3.204
- Using unbound lambdas for prompts crashed the driver.
- The new debug macro CHECK_OBJECT_GC_REF instructs the GC to check
if non-object memory references really don't point to non-object
memory blocks. No performance penalty (unlike CHECK_OBJECT_REF), but
you need MALLOC_TRACE activated, too, for it to work.
- About 3.3.203
- The line number information is now stored in a memory block separate
from the main program block. This makes the swapping code simpler,
and hopefully makes it easier to debug a swapping related crash
in 3.2.9-dev.429 - maybe it even fixes it.
- About 3.3.202
- If the compiler runs out of eval ticks because of too many calls
to the master applies, a compilation error is generated and subsequent
master calls are suppressed.
- Blueprints without code could case a crash if destructed while
being swapped out.
- If pragma pedantic is in effect, calls to undefined functions
are flagged (as warning) even in functions without typechecks.
- About 3.3.201
- A new efun:
m_add().
- Corrected a bug in the error message generated when wrong arguments
are passed to a varargs function..
- About 3.3.200
- Efun
regreplace() efun copied garbage characters when
subexpressions were inserted.
- The typechecking for the assign operator was broken.
- About 3.3.199
- In efun
regreplace() the length of the result was
sometimes miscomputed, leading to fandango on the core.
- The typechecking for the op
= operator accepted
fewer value combinations than possible.
- About 3.3.198
- I renamed a couple of files, so here is a full release since
diffs are notoriously unreliable in this situation.
- The PCRE support is mostly complete (documentation and testing
are still missing), and is even stable enough to not crash the
driver immediately.
- A new efun
regmatch() allows for a quick check
if a string matches a pattern or not.
- And
regexplode() got a new option flag.
- About 3.3.197
- A bug correction to the 0-refcount correction in the last patch.
- Hopefully I also corrected the bogus mapping statistics.
- About 3.3.196
- The construct string
*= int didn't
compile.
- I think the problem with the 0-refcount objects is caused by
swapping the blueprints. I made a change to deal with this situation,
let's see if it works.
- About 3.3.195
- The PCRE changes did indeed break the driver. This patch corrects
it so far that OSB can be used and Evermore at least boots - but there
is work left to be done.
- The H_DEFAULT_METHOD implementation had pretty nasty bug.
- About 3.3.194
- An error during the initial load of the master object could crash
the driver.
- About 3.3.193
- PCRE support is now good enough to match patterns - pattern
replacement doesn't work yet. However, as I didn't have much
time for testing, this change might have broken even the normal
regexps - consider yourself warned :-)
- About 3.3.192
- Deactivating the blueprint code helped some people with the object
refcount problem, so as countercheck I activated it again.
- Updates to the bugs reports.
- About 3.3.191
-
md5_crypt() overwrote array bounds when passed a numeric
second argument.
- About 3.3.190
- Another babystep towards PCRE: the regexp related efuns now take
an option argument so that the PCRE options can be used from LPC.
- About 3.3.189
- One more babystep towards PCRE, meaning that the driver doesn't
compile at all when USE_PCRE is active :-)
- About 3.3.188
- If macro NO_BLUEPRINT is defined in driver.h, the driver does not
track the program->blueprint relation anymore. While this impedes
the
blueprint() efun, it might solve the object
refcount problem. If it does, I have a better idea what to look for.
- During the initial load of the master, any warning would cause
the driver to wimp out.
- Efun
query_verb() now takes an optional flag argument
to return the set action verb.
- About 3.3.187
- Removing the last pending input_to() did not reset the internal 'this
user has an input_to() pending' flag.
- About 3.3.186
- I didn't have much time over the last days, but it was enough
to make the source a bit more palatable for Compaq's True64
compiler.
- About 3.3.185
- The CHECK_OBJECT_REF is now a bit less thorough, but also less
wasteful with cycles.
- About 3.3.184
- Corrected a piece of code which relied on the undocumented
behaviour of
free_svalue().
- New efun
blueprint() to return the blueprint for an
object.
- Defaultoptimization level for Makefiles now is Medium (usually -O2).
- About 3.3.183
-
CHECK_OBJECT_REF had yet another bug, which
unfortunately didn't materialise with the Finalfrontier lib I used
for testing. Hmpf.
- Cygwin is so special, it even puts the stack segment under the heap.
The heap/stack gap check code of course wasn't prepared for this
constellation.
- About 3.3.182
- The
CHECK_OBJECT_REF sanity check was a tad too zealous
and dumped core even if everything was correct. Sorry.
- Efun
all_environment() errorenously rejected destructed
objects as arguments.
- About 3.3.181
- The previous stack/heap check implementation was overwhelmed by the
big address spaces some machines have - this has been corrected.
- Whereever a new value was added to a mapping, the code did not check
if the requested memory had been allocated.
- About 3.3.180
- The driver now keeps an eye of the distance between stack and heap.
If they get too close, it will throw an error; should they overlap,
the driver will fatal with a nice error message. This might remove
(or at least explain) a few mysterious crashers we had before.
- Pulami contributed a whole bunch of german translations for
efun manpages.
- About 3.3.179
- The
CHECK_OBJECT_REF now checks the validity of
list of the destructed objects and fatal()s the driver on a
detected inconsistency. You have been warned.
- About 3.3.178
- Efun
deep_copy() didn't handle quoted arrays properly.
And while I was at it, I also added the efun unquote()
- There have been a couple of crashers caused by strange refcount
errors on objects. To investigate these, I added some tracing
output about the lifetimes of blueprints. If your mud is not
afflicted and the output is too much for you, disable the define
CHECK_OBJECT_REF in the file driver.h before
compiling.
- About 3.3.177
- Corrected a problem with inheritance: early inherited protected
functions could hide later inherited public ones.
- Efun
get_dir() now supports the GETDIR_NAMES
flag to return full pathnames.
- About 3.3.176
- When the gamedriver runs into a fatal error, it calls
notify_shutdown() in the master before dumping core.
- Added the mapping statistics diagnostic code from 3.2.9 .
- About 3.3.175
- A bit more PCRE code - still not functional.
- About 3.3.174
- Efun
debug_info() can now return the call trace for
both the last error in general and the last uncaught error.
- The
--no-heart option was somewhat ignored.
- Configuration parameter
MAX_MAPPING_SIZE (and its
associated commandline parameter) now determines the maximum size
of a mapping in total elements (that is: keys + values), not just
the maximum number of entries (keys). As a guesstimate, I tripled
all existing MAX_MAPPING_SIZE parameter values.
- Corrected a small miscounting in the malloc statistics.
- About 3.3.173
- An error in
add_action() could cause the driver to
free memory twice.
- Added a parameter sanity check to
terminal_colour():
the given indentation has to be smaller than the wrapping limit.
- About 3.3.172
- Unloadable objects with names with printf() style formatters in them
could crash the driver.
- Array-joins didn't work properly.
- Fixed a few memory leaks.
- About 3.3.171
- It is now possible to define local variables anywhere in a block
(like in C++) not just at a block start.
- About 3.3.170
- I forgot to close a comment in gcollect.c in the last patch, but
somehow my compile didn't pick that error up. Weird.
- About 3.3.169
- In a for() statement, loop variables can now be declared without
an initialisation (e.g.
for(int i; ...)) - they will
be then initialised to 0 automatically.
- Collin Baillie found an overflow problem with the
random()
efun on Alpha machines - I think I fixed it.
- simul-efuns shadowing efuns weren't properly discarded on a simul-efun
object update, so that the old implementations couldn't be
reactivated.
- If a closure was called securely (ie. with any errors caught
internally), the error handling did not properly dereference the
the closure. This leaked memory for example in ERQ callbacks.
- I removed a couple of crashers caused by incomplete argument checking.
- There seems to be a strange object leak which leaves behind objects
without a valid name pointer. Since this crashes the GC, I disabled
that particular bit of data dumping.
- About 3.3.168
- Oops, I accidentally delete two lines from the
copy_bits()
efun. Also, the efun was not safe against malicious numerical overflows.
- Corrected a column formatting error in
sprintf().
- About 3.3.167
- The Makefile didn't correctly build the PCRE stuff.
-
terminal_colour() miscounted on some texts and
subsequently failed a sanity check.
- Corrections to new efun
copy_bits().
- Destructing players during a shutdown in master lfun
notify_shutdown() would later cause the driver to
pass these destructed objects to remove_player()
and most likely crash.
- And errors in
add_action() could leak memory.
- About 3.3.166
- A new efun:
copy_bits()
- The formatting in
terminal_colour() was corrected like
for sprintf() before.
- Began the integration of PCRE into the driver. The configuration
parameter is
--use-pcre (disable by default for now),
and if enabled the PCRE code will even be compiled; but so far
all regexps continue to use the old regexp code.
- About 3.3.165
- I simplified the internal handling of the editor prompt; and if
we're lucky this might also get rid of one of the known memory leaks.
- And efun
notify_fail() had a memory leak if it
was used by a non-command giver object.
- About 3.3.164
- Nothing important, I just cleaned up the
bugs/ directory.
If your patch program barfs on the diff, don't worry:
I'll put up a complete archive this weekend.
- About 3.3.163
- New driver hooks:
H_DEFAULT_PROMPT to specify a default
prompt different from "> "; and
H_PRINT_PROMPT if you want to do extra magic when printing
prompts.
- Improved the formatting of
sprintf(): Too long words
are no longer forced onto the next line.
- About 3.3.162
- No code change; I just added some more feedback about memory
leaks to the bugs/ files and it got rather large, so I decided
to check it in separately.
- About 3.3.161
- (simul-)efuns overrode inherited public undefined functions, which
made a crossdefinition of these functions through another inherited
module impossible.
- About 3.3.160
- Too long error message could crash the driver; they are now truncated
when necessary.
- Removed the undocumented 'feature' of
process_string()
that a space terminated a function call specification.
- The
| can now be used to compute the union of two
arrays.
- About 3.3.159
- Corrected a crasher:
input_to with all the nasty flags
crashed the driver in the privilege violation check when there
was no this_player().
- About 3.3.158
- The GC did not clear the refcounts of known destructed objects, which
occasionally lead to the 'First reference to program but refcount != 0'
fatal error.
-
replace_program() without an argument refused to work
if the superprogram had virtual variables somewhere up the inheritance
tree.
- About 3.3.157
- The wildcarded supercall "*":: no longer throws an
error if none of the inherited objects defines the called function.
It fits into the semantics of the '*' wildcard ("any or none"), and
it is practical for supercalls like "*"::reset().
- About 3.3.156
- If
switch() is used on a value which is neither
a string nor a number, the driver no longer generates a runtime
error messge, but instead jumps to the default label.
- About 3.3.155
- Improved the compilation of negative numbers, which also fixed
the problem that all uses of
__INT_MIN__ caused
a runtime error.
- The
:: operator did not recognize the separate
namespace of local variables.
- Subtracting or copying mappings did not remove destructed elements
first.
- Compilation error messages now list the inheritance chain.
- About 3.3.154
- Fiona did more analysis of the hash function used for the RXCache
and found that using a prime table size does not improve the
fill or collision ratio. So the table size is back at 8192.
- More care is taken to discard all registered simul-efuns whenever
the simul-efun object is destructed. This should solve the problems
that updating the simul-efun object suddenly produces 'undefined
function' errors on existing sefuns.
- About 3.3.153
- Ooops, the overflow check for float arithmetics wasn't quite correct.
- Reduced the RXCACHE table to size to prime 8191 - Fiona noted that
just halfing the size doesn't improve the fill ratio.
- Added a couple string table statistics to check the efficiency
of its hash function.
- About 3.3.152
- Added new predefined macros
__FLOAT_MIN__
and __FLOAT_MAX__ for the float value limits.
- Float arithmetics is now checked for overflows, too.
- The default size of the RXCACHE table is now 8192 instead of 16384
entries.
- About 3.3.151
- Removed an occasional crasher from efun
terminal_colour().
- About 3.3.150
- Corrected a refcount leak in the replacement and freeing
of programs, which led to leaked objects.
- Corrected a crasher in the GC, introduced with the last patch.
- About 3.3.149
- There was a potential crasher in the error handling of invalid
arguments to the
input_to().
- The driver seems to have a leak in object references. The GC
did clean up the memory, but messed up the object statistics
by doing so. I corrected the latter problem, and will now look
for the former.
- About 3.3.148
- Destructed objects are now kept in a list to aid mud admins in
controlling the resource usage of the mud. The statistics about
the destructed objects are returned by
debug_info(DINFO_STATUS) in the new fields
DID_ST_OBJECTS_NEWLY_DEST and
DID_ST_OBJECTS_DEST. A OBJ_DUMP-style dump of the
destructed objects is available with debug_info(DINFO_DUMP,
"destructed"), by default the created file is
/DEST_OBJ_DUMP. The built-in commands
dumpallobj and status tables have been
changed accordingly.
- About 3.3.147
-
to_string() can now handle operator closures, too.
- About 3.3.146
- Corrected the handling of one-line columns in (s)printf().
- Added diagnostic code to determine the reason for the reported
miscounting in the mappings statistics.
- About 3.3.145
- Fixed a sweet little crasher connected with the updating of simul-efun
objects: if objects had been compiled before, and one of the called
sefuns changed their argument signature, future calls could cause
the driver to execute random bytecode and/or crash.
- Acius wrote an implementation of the A* pathfinding algorithm and
allowed me to add it to the distribution.
- About 3.3.144
- The extra refcount check didn't count call_out references properly.
- About 3.3.143
- The mapping handling had a couple of pointer bugs, occasionally
crashing the driver.
- About 3.3.142
- Corrected another occasional crasher caused by a misinitialized
variable in efun
say().
- About 3.3.141
- The input escape character can now be configured at compiled
time to something different from '!'.
- Using
set_this_object() before the simul-efun
object was loaded crashed the driver.
- Added a settings file for BatMUD.
- About 3.3.140
- The increment and decrement operators now also check for numeric
overflows.
- The overflow
__INT_MIN__ / -1 is recognized.
- The driver defines the values
__INT_MAX__ and
__INT_MIN__ for your convenience (and better
portability).
- Telnet option TM can be negotiated directly by the mudlib.
- Efun
call_out_info() now returns the target object
for closure callouts.
- And I corrected a reference count bug in
say().
- About 3.3.139
- All additions, subtractions and multiplications now check for
numeric overflows.
- About 3.3.138
- Oops, the overflow checks introduced in the previous patch sometimes
divided by zero. Well, not any longer.
- Another overflow in
sprintf() removed.
- About 3.3.137
- Real life is quite busy, with Christmas coming and deadlines looming,
so I am a bit behind with my mail. Meanwhile, Menaures threw a nasty
testprogram against the driver which discovered a number of
overflows in size computations in string multiplications and
mapping sizing, so here are the fixes.
- It was also discovered that gcc 2.91 generates buggy code
for the computation MAX_INT % -1, so the driver works around
that one, too.
- About 3.3.136
- New driver option
--random-seed num sets
the seed value
for the random number generator for debugging purposes.
If not given, the driver chooses a seed value on its own.
- When an alien lfun closure has been created by a different object
than the code resides in, any call to it will create two entries
in the caller_stack - one for each object. This is to avoid
security holes.
This behaviour is not really new; it was deactivated in 3.3.83
because at that time it always created the two entries even if
the objects were identical, and nobody knew the reason.
- About 3.3.135
- Removed an obscure crasher in the error handling of call_other()s
on arrays of objects.
- About 3.3.134
- Corrected a small bug with the linecounting in error messages.
- About 3.3.133
- Another correction to the compiler bugfix of .dev-368. We're really
messing with the darker parts of the LPC compiler here *sigh*.
- About 3.3.132
- Yesterday's error correction in the compiler caused the driver
to choke on legitimate code. It should work now.
- About 3.3.131
- The
mudlib/sys/functionlist.h now uses a ""-type
include for lpctypes.h instead of the old <>-type.
- Inheriting two private functions of the same caused the
compiler to crossdefine the second one to the first. Not directly
visible to the user, this messed up any use of these functions
by INITIALIZATION_BY___INIT.
- Efun
replace_program() can omit the argument if the
object has only one inherit.
- About 3.3.130
- Corrected a problem with the auto-include string: preprocessor
directives in the first line weren't recognized.
- Efun
say() could leak object references.
- The
mudlib/sys/functionlist.h now uses a <>-type
include for lpctypes.h instead of the old absolute path.
- The mySQL package now uses a generated id as handle, making it more
reliable.
- New editor command 'T' to perform Tab <-> Whitespace conversion.
- About 3.3.129
- Corrected another obscure crasher in
sprintf().
- About 3.3.128
- The change is probably a bit deep for 3.2.9, but since 3.3 is a playing
field anyway... efun
include_list() now has a proper
implementation.
- About 3.3.127
- The bugfix to the hidden-(simul)efun problem itself had a bug, causing
the LPC compiler to ignore functions or even crash. It should be fixed
now.
- An unlucky combination of an invalid format string and a formatting
error in (s)printf() could crash the driver.
- The H_AUTO_INCLUDE closure now also receives a flag telling whether
the include was a system include or normal include.
- Corrected a bit mishandling in
and_bits(),
or_bits(), xor_bits().
- Getting to the files included by a program is unfortunately more
difficult than expected, so therefore
include_list()
is currently just 'preliminary' in behaviour.
- About 3.3.126
- If H_AUTO_INCLUDE is set to a closure, it is called for every
file read during a compilation.
- Bugfixes: The tagging of virtual inherits sometimes tagged the
base program, too. And inherited private functions hid
(simul-)efuns of the same name.
- Small new efun
include_list() to return the files
included in a program file.
- About 3.3.125
- This is going to hurt a bit: I deprecated the efun
set_auto_include_string() in favour of the new driver hook
H_AUTO_INCLUDE. In return it is now possible to
use a closure as auto-include setting, thus allowing to compute
the value of the string depending on the object compiled.
- Efun
inherit_list() can now tag virtual inherits
as such in the result.
- Efun
input_to() can now be instructed to print a prompt.
That means, instead of writing
write("Enter your name: ");
input_to("enter_name", ...);
you can now write:
input_to("enter_name", INPUT_PROMPT, "enter your name", ...);
- About 3.3.124
- I corrected a bug in the handling of VM stack overflows: svalues were
freed twice, occasionally crashing the driver.
- The efun
terminal_colour() now uses less VM stack for
temporary storage.
- The efun
debug_info() now returns additional
(DINFO_DATA, DID_MEMORY) statistics:
DID_MEM_ALLOCATED is the amount of memory allocated by
the driver, including all allocator overhead;
DID_MEM_USED is the amount of memory actually used by
the driver for data (the difference to DID_MEM_ALLOCATED
is overhead); and DID_MEM_TOTAL_UNUSED is the amount of
memory allocated from the system, but currently not used by the
driver.
- About 3.3.123
- If driver hook is set to an array of directory names,
names with leading '/' weren't recognized properly.
-
member() used with closures didn't always find them.
- About 3.3.122
- I noticed that the automatic mapping compaction in the backend
did not remove destructed entries from the mappings. This is not
fatal, but could lead to higher-than-necessary memory retention.
- I the macro
DUMP_GC_REFS is defined in
driver.h, the GC writes a log of every reference
it finds. This is meant to debug tricky problems like the "Program
block referenced as something else" fatal errors some people
experience.
Since this option produces a lot of output, care has
to be taken in order to prevent the log from overflowing the disks.
Using bash and awk, the following command
can be used to store the log from just the latest GC in a file called
"gc.log":
(driver your options --gcollect-outfd=3 3>&1 > parse.log 2>&1)
| awk 'BEGIN { f = "gc.log" }
{ print $0 > f }
/--- Garbage Collection ---/ { close(f); print $0 > f }'
- About 3.3.121
- Sorry, I introduced a compilation problem in the last patch
when MALLOC_LPC_TRACE was not defined.
- Removed a bug/occasional crasher from the freelist consolidation
phase of the garbage collection.
- Efun
transfer() miscalculated weights when used
with non-livings.
- Bug fix in closure calls.
- About 3.3.120
- Removed the "last_dirty_mapping" inconsistency bug.
- Improved the output on the "First ref to" sanity check in the GC.
- The
make_func lexer can now handle files in DOS format.
- About 3.3.119
- If
regreplace() is passed a closure, the closure
will also receive the position at which a match was found.
- New efun
remove_input_to().
- About 3.3.118
-
add_action() now requires that both action giver and
receiver have a valid environment. Previously this wasn't checked,
and destructing the action giver would then crash the driver.
- About 3.3.117
- Removed a crasher from
sprintf() which happened when
a string to be justified contained only one word.
- Oh, and the nomenclature for
sprintf() is the
following (I asked somebody with experience in layouting): the generic
term is alignment, sprintf() defaults to
right alignment, the modifier '-' requests
left alignment, the modifier '$' requests
justification.
- About 3.3.116
- I reactived the assignments to negative ranges - the feature is
indeed in use (and apologies to TubMud!).
- There is a crasher in the flush formatting in
sprintf()
which I didn't get around to fix yet.
- About 3.3.115
- Another crasher in call_other()s on arrays of objects.
- And
call_out() now allows 0 delays.
- About 3.3.114
- The driver didn't compile with SYSMALLOC as allocator.
- There was a bug in call_other()s on arrays on objects, causing
the driver to crash.
- And
strstr() referenced freed memory.
- About 3.3.113
- The flushing algorithm wasn't quite correct yet.
- It is now possible to pass simple arguments to the erq using
the
--erq driver options.
- The erq/xerq understand the
--execdir commandline
option to override the default directory for the callable
programs.
- The new driver hook
H_DEFAULT_METHOD allows to
provide a default implementation for unresolved
call_other()s. The new efun call_direct()
can be used if you don't want a default call.
- About 3.3.112
-
sprintf(): New modifier '$' for strings implements
flushed formatting.
- About 3.3.111
-
inherit_list() can now the inherited objects neatly
arranged in a tree structure.
-
varargs arguments didn't quite work on simul-efun
calls when no argument was passed.
- About 3.3.110
- I removed what looked like a possible race condition in the GC.
-
function_exists() can now return the filename and
linenumber of the function looked up.
- About 3.3.109
- Just improved some error and warning messages.
- About 3.3.108
- Termating a macro in an include with end-of-file confused the lexer.
- Restricted warnings about visibility changes to prototypes.
- Efun
binary_message() wrote random data.
- About 3.3.107
- Renamed efun
md5_encrypt() to md5().
- New efun
md5_crypt() to generate Apache compatible
encrypted passwords.
- About 3.3.106
- Prototypes could modify the definition of inherited functions
in obscure ways. As a side effect there are now warnings if
the visibility of a function differs between prototype and
function.
- About 3.3.105
- The
nomask modifier no longer worked.
- About 3.3.104
- Added a warning for empty #pragmas.
- The driver crashed when tracing was active and the current player
changed to a non-interactive object.
- About 3.3.103
- The pragma recognition worked fine, less so the recognition of
faulty pragma statements - both false positives and negatives occured.
- To achieve some compatibility with MudOS muds, the pattern "%%^^"
serves as second encoding of literal "%^" in efun terminal_colour().
- Added support for the telnet options 85, 86, 90 and 91 which are
used by the Mud Compression, Sound, and Extension Protocol.
- Integrated some changes from Freaky which make the driver more
amenable to run on Linux/s390.
- About 3.3.102
- A bugfix: the pragma recognition code couldn't handle CR characters.
- It was pointed out to me that the idiom
[i..i-1] = ... is used
to insert elements before position i in a string or array, so
I allowed it again as special case. Large negative ranges remain
illegal.
- About 3.3.101
- Under certain circumstances the GC could crash while trying to
print information about recycled closures.
- Assignments to ranges of negative length like
[3..2]
are now caught.
- It is now possible to specify multiple options in one
#pragma directive by separating them with commas.
- About 3.3.100
- The lexer now warns about unknown pragmas.
- The check for tracing was done against the current commandgiver, not
against the current interactive as it should be.
- About 3.3.99
- There was a crasher in the LPC compiler when a
private
nomask function was inherited over several levels - possibly
only when the function was inherited this way multiple times in
parallel, I didn't quite figure that out. Anyway, the crasher, which
affected inline closures, is gone.
- About 3.3.98
- I added an internal function to the allocator to help with memory
problem diagnostics.
- About 3.3.97
- Corrected the problem in
terminal_colour(): repeated calls
to the color-mapping closure clobbered the previous results.
- Inline closures are now all
private nomask.
- The recent adjustment of the allocation statistics introduced
a fatal, but unfortunately sporadic bug into the variable swapper.
- About 3.3.96
- A few corrections to statistics.
- Cleared a confusion of the lexer between macro arguments and
mapping indices within macro arguments.
- About 3.3.95
- We discovered major memory leak in the mySQL package:
the memory holding query results wasn't freed. Poor Finalfrontier
ended up with 270MB in clib allocations after only a few hours.
- Some more tweaks to the check-refcounts diagnostic code.
- During a low memory situation,
slow_shut_down() is
called only if the previous call is longer than the requested
shutdown time ago.
- There is no 3.3.94.
- About 3.3.93
- The reference loop check was too strict, flagging even some
legal assignments.
- About 3.3.92
- Improved the detection of reference loops on assignment.
- Reloading the master object accidentally freed a few object
references too many.
- About 3.3.91
- The check for the MAX_MALLOCED limit was incomplete and could
lead to the driver clobber memory.
- Remove two crashers in the debug and check-refcount diagnostic
code.
- The range changes for the new
[>] indexing
were incomplete.
- Efun
sscanf() didn't check its arguments.
- About 3.3.90
- Argh, this
private thing is like a thread in a wollen
sweater: one tuck and everything falls apart. But it's getting
better.
- Also fixed is a crasher in the error handling when there is no
valid current_object, e.g. when ERQ callbacks are executed.
- About 3.3.89
- Yup, there still was a crasher: it happened when a program called a
non-lambda closure from inside a lambda closure. Thanks to Fiona
for narrowing down the offensive LPC code.
- About 3.3.88
- The correction to the 'private' problem had problems itself, causing
the driver to crash under obscure circumstances. I solved it now
in a different, hopefully stable way.
- Another crasher solved: if an efun was called with too many arguments,
the error handling in the compiler clobbered memory.
- If a catch() is execute with not enough time left, a better error
message is generated.
- Note: The correction of the lambda problem from
3.3.85/.86 may not be complete yet. We're investigating.
- About 3.3.87
- It is now possible to define a function with the same name as an
inherited private function without redefining that inherited function
as well.
- New format specifier "%Q" for printf()/sprintf() works like "%O",
except that special characters in strings are printed in LPC
notation. For example:
sprintf("%Q", "\n") returns
"\n"
- About 3.3.86
- Ooops, the fix for the lambda crasher introduced a crasher on its own.
- About 3.3.85
- Fixed two crashers: Adding a mapping to itself with
+=
clobbered memory; and it was possible to delete a lambda closure
while it was executed, again clobbering memory.
Thanks go to Dan, Fiona, and Patryn for nailing these down.
- About 3.3.84
- The recognition of numeric character constants was flawed - and
nobody noticed it :-)
- Efun program_name() now also accepts a 0 as argument, and
- Efuns ceil() and floor() join the club of float efuns accepting
integers as arguments.
- About 3.3.83
After a week of recovery from
this
(if you can't find me, look
here
for a hint (the caption is wrong, though)), I caught up with a couple of
reported problems:
- Indexing strings for assignment did not detect shared strings properly,
occasionally changing logically different strings as well.
- Deleting a shadowed object crashed the driver.
- Efuns load_name() and object_name() can now be used with 0 as argument
and return 0 in that case.
- The detection of mySQL support became more flexible: if you specify
the use-mysql path to path, the include files will be searched
in path and path
/include; and the
libraries will be searched in path/lib/mysql,
path/lib, and
path, in this order. It is amazing in
how many ways this package is installed...
- It is now possible for the first 255 simul efuns to receive reference
arguments as a vararg, for example to fully implement an overload
for
call_other. But heed this Warning:
Storage of references in arrays is by large unimplemented, and
arguments such received should only be used as function call arguments
through apply()!
- About 3.3.82
- Efun
sizeof() can now be used on strings, too.
- About 3.3.81
- It sucks that I can't compile the mySQL package at home - so I didn't
find the really stupid syntax error myself.
- Fuchur corrected an age-old bug in the parsing of macro definitions.
It must have been in there for years, but wasn't noticed until
I added the redefinition warnings.
- About 3.3.80
- I added a warning yesterday about redefined macros where the definition
itself didn't change. Unfortunately this clobbered an internal
structure, crashing the driver on some machines.
- And another crasher fixed, in terminal_colour(): under rare
circumstances the use of a closure to lookup colour keywords could
dereference a NULL pointer.
- Niels submitted another clean_up correction, which should prevent
that lots of clones never get a chance to clean up.
- And I'm one year older today, which has nothing to do with anything,
I just thought I mention it :-)
- About 3.3.79
- Small corrections to the efuns sprintf(), regreplace() and db_error().
- The clean_up mechanism had some serious flaws which dated back to
3.2.1 times.
- The alarm checking and restart under Windows should work better now.
- About 3.3.78
- The '$' modifier from
sprintf() is gone again - Largo
pointed out that it's sufficient (and easier to understand) to
use the explicite pad string instead. So if you want sprintf()
to pad your table to the full length with spaces, specify
the pad string ' ' explicitely.
- The special command
malloc is now also under the
control of the IS_WIZARD flag.
- The count of mappings and arrays in
status is now
updated by the GC.
- About 3.3.77
- Finally a change which is really unique to 3.3, and not just
transported stuff from the 3.2 line:
- I added the
[>] indexing method to single and
range indices. With this one, the sign of the index at runtime
determines whether it will index from the end or from the
beginning. With this, we get the one piece of true functionality
the now-gone efun extract() had to offer. In fact,
we get more: these indices and ranges can also be used as lvalues.
- When the driver was compiled with MALLOC_LPC_TRACE, and the garbage
collector freed a circular array reference, the driver crashed in
the dump routine. Oops.
- About 3.3.76
- Some work on actions: actions added by shadows are now removed
properly when the shadow vanishes; and the new
add_action() flag AA_IMM_ARGS implements
the sane handling of short verbs.
- About 3.3.75
- Comparison of operator-, efun- and simul efun-closures was unstable.
- When printing closures with %O, simul efun closures are marked as
such.
- A couple of changes to the autoconfiguraton and the startup/shutdown
of the driver to make it more amenable for Windows.
- About 3.3.74
- The format modifier '$' for
sprintf() keeps padding
spaces before a newline. This is useful when formatting tables
which are later embedded into something else.
- Fiona corrected the parsing of escaped character constants.
- You can get the detailed time with
gmtime() and
localtime().
- About 3.3.73
- I relaxed the typechecking on inherited variables a bit: it is again
possible to redefine a static variable by a non-static one of the same
name, and vice versa. Language purists will probably cringe (I know
I did), but it's one of the features of LPC.
- About 3.3.72
- Figures. I completely missed a syntax error in the LPC compiler.
- About 3.3.71
- '//' didn't like to be terminated by the end of file.
- The configuration script was not quite correct.
- About 3.3.70 (and all the intermediate versions)
During the last days I made more frequent checkins, so this time you'll
get a whole bunch of diffs in one swoop.
- We have a new OS/2 port, thanks to Bart!
- I clarified the behaviour of '//' comments with respect of
line ends.
- Configuration of mySQL should be more reliable now. Especially,
the definable path is now used for both include and library
searches.
- The type checking for function redefinitions has been relaxed.
A non-mixed argument can be redefined as mixed, and vice versa.
- An experimental new hook
H_SEND_NOTIFY_FAIL can
be used to have more control over the notify_fail handling.
- Another experimental feature: it is now possible to define a
default visibility for variables and functions.
- Commandline arguments can now be read from a textfile using the
new
--args option. And yes, this behaviour can be nested.
- About 3.3.65
- A couple of new bugfixes - one fixing a crasher which happened during
a garbage collection of call_outs with destructed command givers.
- The name and path of the WIZLIST file can now be configured as
compile time and also as runtime option (
--wizlist-file).
Best would be to take it out of the driver completely, though.
- About 3.3.64
- Added a new mySQL efun: db_error(). It might not compile, though :-)
- Hopefully removed a crasher in the new cleanup behaviour.
- About 3.3.63
- Some small changes; the most important being that global variables
can no longer be redefined.
- About 3.3.62
- Well, zeroing the closures bound to an destructed
object kind of pulled the rug from under
apply() and
funcall() which got confused in their stack cleanup if the
closure in question selfdestructed. A typical case of
I-don't-need-to-check-the-type optimized function calls.
- About 3.3.61
- When destructing an object, all closures referencing this object
and currently stored in local variables are zeroed out, too.
- Bugfixes to the
strstr() and db_connect()
efun, and in the internal size computation of mappings.
- Keyword
nosave is now a permanent feature of LPC.
- About 3.3.60
- Dear oh dear. The type checking on function return proved to be too
strict, so I had to take it out again.
- About 3.3.59
- I admit being a bit lazy over the last two weeks - but the weather
outside is just too nice, and my new mountain bike just begs to
be ridden. But here are a couple of bug fixes and small improvments.
- It is now possible to embed literal \0s in strings.
- The Garbage Collector failed to trace a recently introduced
pointer reference, potentially allowing the freeing of objects
with references pending. It has to be seen if this was the
reason for the crashes TubMud experienced lately.
- Integers and floats can now be compared with each other.
- Small improvements to the type tracking in the compiler.
- About 3.3.58
- Fixed a crasher: the more aggressive cleanup introduced in dev-291
occasionally crashed on objects, which are destructed right after
they scheduled a program replacement.
- Efuns terminal_colour() and regreplace() can now use closures to
determine the replacement texts.
- Removed a crasher in the efun say().
- About 3.3.57
- I made a small improvement to the clean_up handling to allow more
chained clean ups.
- The regexp cache was a bit sloppy in comparing the regexps, sometimes
re-using the wrong regexp.
- A small bug in the new mappings code crashed the driver occasionally.
- About 3.3.56
- An important correction:
lambda() did not compile
simul efuns with extended varargs correctly, occasionally crashing
the driver.
- About 3.3.55
- I had to undo the casting change, as it broke a common idiom which
interprets the number 0 as
NIL values, for example
s = (string) foo->bar(); if (s) ....
- And a correction to
sscanf(): the format '%s%d' did
not always work.
- About 3.3.54
- Gallivanting around the world in order to throw rice at my brother's
wedding did not completely use up all my time, so here are a couple
bugfixes adapted from the 3.2 line.
- Added a simple protection against reference loops, and improved
the type tracking of the & operator.
- Casting of unknown or mixed values now generates a proper
type conversion. This especially means that
(string)0
no longer returns the number 0, but instead the string
"0".
- Added basic support for the MorgenGrauen 3.2.6 mudlib and the 3.2.9
driver - I haven't tried to run it with 3.3 yet (Chicago O'Hare
airport is quite a distracting place to hack at).
- About 3.3.53
- Time for a new full-size release.
- Some bugfixes: subtracting arrays didn't work properly; efun
m_values() was a bit confused about the width
of its argument mappings; and nested inline closure definitions
generated spurious warnings.
- About 3.3.52
- A drastic cut in the hosts/ section: Ataris and OS/2 are no longer
supported; Amiga is supported only in the gcc/ixemul environment.
Reason is that I can't keep ports up to date which I can't test
myself, and get no feedback on either.
- About 3.3.51
- Freeing empty mappings sometimes clobbered memory.
- The configuration script lacked one replacement instruction in
the generation of config.h .
- The number of call_outs as returned by debug_info() became when
call_outs were removed or became stale.
- Two corrections to the sprintf() function: '%^' no longer eats
the next character, and the field size given with a leading 0
now really prints leading 0s, and doesn't use them as generic
pad string.
- About 3.3.49 and .50
- Pre-increment or -decrement of an uninitialized variable caused the
LPC compiler to crash.
- Alists are now an optional package. By default it is not selected,
however, I added it to all known mud settings.
- And of course after I checked in 3.3.49 I realised that I forgot
to recreate the configure script - and thus 3.3.50 came to life.
- About 3.3.48
- Ok, the mapping code is now rewritten. Initially I experimented
with an alternative way of storing the data in memory (the mapping2.c
from two days ago), but in the
end I came back Amylaar's initial scheme. Just now the layout
and the code are more straightforward and easier to maintain.
- Small bugfix in efun
sgn().
- And efun
copy_mapping() is gone on account of being
obsolete.
- About 3.3.47
- I started rewriting the mapping code into something more maintainable,
buts its far from ready yet. If you're curious, take a look
at
mapping2.c.
- Fixed a crasher:
allocate( ({ 0 }) ) was bad mojo.
- The LPC compiler created faulty lookup tables for closely consecutive
case ranges. For example
switch(x) {
case 3..100: write("3..100\n"); break;
case -2..-1: write("-2..-1\n"); break;
case 1..2: write("1..2\n"); break;
}
would print "1..2" if x was 0. The bug depended much on the number
and type of case statements, which explains why it went undetected for
so long.
- About 3.3.46
- The changes to the mapping code still had a couple of fatal bugs.
- About 3.3.44 and .45
- A new runtime limit: the maximum number of callouts in the whole game.
As usual the default is specified at compile time, it can be set
on the commandline with
--max-callouts, and it can
be changed temporarily with the limited() efun.
-
foreach() can now iterate over references, integers
and integer arrays.
- Fixed a hidden crasher in
free_svalue().
- About 3.3.43
- Redefining an inherited private heart_beat() with a public one didn't
work.
- debug_info(DINFO_DATA, DID_STATUS) was too slow.
- Local variables can now have the same names as global functions; the
compiler will sort them out depending on the context.
- About 3.3.41 and .42
- Lfun- and variable closures can be used in array intersections and
sensibly as keys in mappings.
-
sprintf() is now more compatible with
terminal_colour() in that the formatstring '%^'
expands to itself.
- Some bugfixes.
- About 3.3.40
- Wildcarded super calls messed up the interpreter stack.
- An external master update via the SIGUSR1 signal now also updates
all programs inherited by the master.
- Some small bugfixes.
- About 3.3.39
- Small corrections to the allocator and the Makefile, but the main
point is to release a fresh full archive.
- About 3.3.38
- Lots of bugfixes for the '...' operator. It's amazing that my
simple tests with 3.3.37 worked at all.
- On Darwin, the system allocator returned memory in multiples of 64
Bytes, which led to wasted memory in the large block area. This
has been fixed.
- About 3.3.37
- I added the operator '...' to flatten arrays in function argument
lists. For example:
fun(m..., 1) is equivalent
to fun(m[0], m[1], ..., m[<1], 1).
- There was an occasional crasher in restore_object().
- About 3.3.36
- Oops, I broke the Makefiles.
- Gawain provided a new efun:
md5_encrypt() to create
MD5 message digests.
- About 3.3.35
- Accidentally I broke the inheriting of identifiers, and of
course my own tests didn't detect that.
- I think I made the compilation less warningful under Darwin.
- I made the docs look a bit nicer (spaces instead of tabs).
- About 3.3.34
- This new version fixes a couple of bugs: a nasty crasher when you
#define the name of an inline closure to something else
(who in their right mind would do that anyway? :-); using charmode
with TinyFugue did not work properly; all <op>=
assignment operators can now take an indexed string character on
the lefthand side; and lambda closures now generate proper bytecodes.
- When the mudlib generates the name of an include file, it can now
start with leading '/'.
- About 3.3.33
- A really embarassing bug: multiplying a string by 0 clobbered memory.
- About 3.3.32
- Two more bugfixes.
- Since I had a bit of time, I extended efun
allocate()
to be able to create multidimensional arrays, and to initialise them
with an arbitrary value.
- Variable swapping is now less cautious with soon-due resets. Before,
it hardly every swapped in some muds.
- About 3.3.31
Since I spent most of the weekend mastering the art of skiing, only
a small update this time:
- Two new mySQL efuns,
db_coldefs() and
db_insert_id(), courtesy of Dafire.
-
functionlist() does not really work well when you specify
flags to filter out unwanted functions - this is still being worked
on.
- About 3.3.30
- String comparisons were still slightly buggy, occasionally failing
to detect equality (e.g.
#if __FILE__ == "/std/foo.c".
- The runtime type testing failed for all but the first argument
of efuns - this has been fixed.
- The extensive debug logging in xerq has been turned off.
- About 3.3.29
- More bugfixes. This time I fixed a couple of bugs which didn't
show up on AIX/powerpc, but on Linux/x86.
- About 3.3.28
- It's almost boring: lots of small changes to iron out the kings.
At least the driver can now run Evermore-native on AIX without
obvious problems; and Unitopia at least boots.
- About 3.3.27
- Bugfixes, bugfixes. The driver can now run lp-245 and boot into
Evermore-native.
- Copied the Darwin adaptions from 3.2.9-dev.264.
- About 3.3.26
- Ok, it didn't quite compile. But now it does, and we can even
run the dhrystone test.
- About 3.3.25
- Woohoo! The driver is now stable enough to boot the test_master.c
and log into it.
- And I brought the driver up to sync with 3.2.9-dev.263.
- About 3.3.24
- Well, it has been months, not just weeks; but the conversion of the
internal string management is complete. It still has to be debugged,
of course.
- About 3.3.4
- The configuration for mySQL was broken - sorry about that. I really
shouldn't do such things when pressed for time. It might still
malfunction in places, I'm going to look into it tomorrow.
- This is going to the the last public development version for some time:
over the next weeks I plan to overhaul the internal string management,
which will render the driver incompilable until it's all done.
However, I'll update the page with the Changelogs as I progress.
- About 3.3.3
- Uwe und Fiona found a bug in the IPv6 name lookup in the xerq: a buffer
was freed twice, causing the xerq to crash.
- The mySQL support is now part of the driver proper and can be activated
with a configuration switch.
- New LPC macros return the various parts of the driver version.
- Removed all the obsolete and deprecated efuns, which were just aliases
to other efuns anyway.
- About 3.3.2
- The first public release of the 3.3 branch, this implements a
thorough change in the byte code generation. Almost all efuns
are now 'tabled', which greatly simplifies the argument checking
and passing, and also reduces the complexity of the interpreter
loop. As a side effect, the error messages regarding faulty
arguments are much more informative.