----
0.6-1

Dictionary comparison was returning true if and only if the key lists
were different but the value lists were equivalent, e.g.

	#[] == #[] ==> 0
	#[[1, 2]] == #[[1, 2]] ==> 0
	#[[1, 2]] == #[[3, 2]] ==> 1
	#[[1, 2]] == #[[3, 4]] ==> 0

Fixed in 0.7; problem was caused by a simple logic error in
dict_cmp().

----
0.6-2

Frob comparison was wrong because of the above dictionary comparison
problem, and it was also inversed, so you'd get:

	$lock$[] == $lock$[] ==> 1
	$lock$[[1, 2]] == $lock$[] ==> 1
	$lock$[[1, 2]] == $lock$[[1, 2]] ==> 1
	$lock$[[1, 2]] == $lock$[[3, 4]] ==> 1
	$lock$[[1, 2]] == $lock$[[3, 2]] ==> 0

Fixed in 0.7; problem was caused by a simple logic error in data_cmp().

----
0.7-1

Starting the program with no binary database results in a panic
loading the dbm database file.  Reported by mentor@io.com.

11/7/93: I can't reproduce this under Ultrix on a local file system;
following up to mentor.

----
0.7-2

size() appears to return 7 bytes larger each time you call it, if you
call it through a method.  Reported by Jordan Baker.

11/7/93: Fixed in 0.7.1; problem was caused by object_discard_ident()
in object.c setting .id to 1 instead of -1 when the refcount hits
zero.

----
0.7-3

Output buffer is not flushed on a disconnect.  Reported by Jordan.

11/6/93: Fixed in 0.7.1 by adding a few conditionals to io.c and net.c.

----
0.7-4

The periodic dump done by the Cold World database crashes the server
(leaving a truncated dump), reportedly after just digging two rooms.
Reported by gregb@amber.ecst.csuchico.edu, running Coldmud under
Linux.

11/7/93: I think this was caused by 0.7-6 below, which has been fixed.
Following up to gregb to see if the new code solves his problem.

11/11/93: I'm pretty sure this was the same as 0.7-6.

---
0.7-5

11/6/93: Including <sys/file.h> in db.c (a _POSIX_SOURCE'd file) causes
trouble on some systems.  Reported by gregb@amber.ecst.csuchico.edu,
while trying to compile Coldmud on a Univel SysVr4 system.

11/6/93: Fixed in 0.7.1 by removing the #include.

---
0.7-6

11/7/93: Possibly related to 0.7-4: traversals of the ndbm database
dump core under Linux.  Probable cause: the gdbm-based ndbm routines
only allocate just enough space for the identifier, so loc_first() and
loc_next() corrupt memory while null-terminating the string.

11/7/93: Fixed in 0.7.1 by using the string with its null-terminator as
the key.

---
0.7-7

11/10/93: NEXTSTEP 3.1 compile: adminop.c fails because pid_t is
undefined.  loc.c fails because S_IRUSR and S_IWUSR are undefined.
net.c fails because FD_CLOEXEC is undefined.  Fails at link time, not
finding waitpid(), sigemptyset, or sigaction.

11/10/93: Compile-time problems fixed in 0.7.1: In adminop.c, I forgot
to define _POSIX_SOURCE.  In loc.c, I put in an #ifdef S_IRUSR, and
used typical Unix constants if it's not defined.  In net.c, I wrapped
the FD_CLOEXEC code in an #ifdef FD_CLOEXEC; this isn't optimal, but
it'll do.

11/11/93: Link-time problems fixed with code replacements documented in
README file in source directory.

---
0.7-8

11/11/93: The line

	matches = matches + [[this(), template, fields, @info]];

reportedly decompiles into

	matches = matches + [[this(), template, fields, @@info]];

It also doesn't work right.  Reported by stewarta@netcom.com.

11/11/93: Fixed in 0.7.1: the problem was that codegen.c was doing
SPLICE_ADD optimization for splices at the *end* of a list, instead of
the beginning.

---
0.7-9

11/11/93: Line numbers in tracebacks are reportedly wrong from time to
time.  Reported by stewarta@netcom.com.

11/11/93: Following up to stewarta for a more specific example.

11/11/93: Specific case:

	catch any {
	} with handler {
	    // line 3
	    // line 4
	    // line 5
	}
	this().error("line 7");

11/11/93: Fixed in 0.7.1: Catch handler in count_lines was using end
instead of body_end in a couple of places, and it was also falling
through into the next case.

---
0.7-10

11/11/93: Destroying an object doesn't remove it from the children list
of its parents.  Reported by brandon@cc.usu.edu.

11/11/93: Can't reproduce this; following up to brandon.

---
0.7-11

11/11/93: The following method produces an error:

	var x;

	for x in ([1, 2, 3])
	    union([], []);

	ERROR: Domain (1) is not a list or dictionary.
	Thrown by interpreter opcode FOR_LIST.

Reported by stewarta@netcom.com.

11/11/93: Fixed in 0.7.1; the short-circuit on the second argument
being empty in op_union() wasn't popping the second argument.  In
fact, that was a pretty silly short-circuit to have in the first
place.

---
0.7.1-1

11/13/93: .foo() decompiles into this().foo().

11/13/93: Fixed in 0.8; is_this() in decode.c was checking expr->u.args
instead of expr->u.function.args.

---
0.7.1-2

11/13/93: An object with parents [$programmer, $root] can't find
methods on $command_handling.  Reported by brandon@cc.usu.edu.

11/13/93: Fixed in 0.8; search_object() in object.c was referring to
parents->el[0] instead of parents->el[i] when looping over the parents
of the object being searched.

---
0.7.1-3

11/13/93: Connection objects hang around when they're not supposed to.
Reported by brandon@cc.usu.edu.

11/15/93: Can't reproduce this in any of the three cases in which
connection objects are destroyed; following up to coldstuff.  I think
this is a database bug.

---
0.8-1

11/15/93: chparents(), destroy(), conn_assign() leak stack frames.
Reported by brandon@cc.usu.edu.

11/15/93: Fixed in 0.8.1.

---
0.8-2

11/19/93: Reading in frobs from text dump fails.  Reported by
gregb@amber.ecst.csuchico.edu.

11/19/93: Fixed in 0.8.1.  I forgot to assign the dict field in the
frob structure in data_from_literal() in data.c.

---
0.8.1-1

11/21/93: pad() can easily crash the server by specifying a large
length.  Reported by quinn@dus.mountain.net.

---
0.8.1-2

11/21/93: shutdown() doesn't flush output buffers.  Reported by
Jordan.

---
0.8.1-3

11/21/93: has_ancestor() fails in the case of, say,
;has_ancestor($player).  Reported by Jordan.

11/21/93: Fixed in 0.9, recursive call was checking (dbref, ancestor)
instead of (parent dbref, ancestor).  Also, it wasn't checking for
dbref == ancestor in initial case.

---
0.8.1-4

11/22/93: Objects' search fields are uninitialized, and so is the
initial bitmap.  Reported by dougo@pure.com, using Purify.

11/22/93: Fixed in 0.9, added initialization for search fields in
object_new() and for bitmap in db.c.

---
0.8.1-5

11/22/93: Memory leaks in text dump reader and other places.  Reported
by dougo@pure.com, using Purify on the regression tests.

11/22/93: In 0.9, eliminated memory leaks in text_dump_get_method()
(forgot to discard code list) and in object_free (forgot to discard
identifiers).  Should follow up to dougo to retry Purify.

11/23/93: Followed up to dougo; there was one remaining memory leak,
traced to text_dump_read(), which was forgetting to discard the
methods it added to objects.

---
0.9-1

11/26/93: Error message for data() is missing a "not".  Reported by
Andrew.Wilson@cm.cf.ac.uk.

11/26/93: Fixed in 0.10; was also wrong in bind(), unbind(), connect(),
and set_heartbeat_freq().

---
0.9-2

11/26/93: Error-checking in op_index() is wrong.  Found in the source.

11/26/93: Fixed in 0.10.

---
0.9-3

12/7/93: explode() doesn't work on multi-character separators when the
first character of the separator appears in the string.  Found in the
source.

12/7/93: Fixed in 0.10; start was being changed when a candidate
separator didn't match.

---
0.9-4

12/7/93: chparents() checking for changing parents of the root object
is wrong.  Found in the source.

12/7/93: Fixed in 0.10; it was checking the current object's dbref
instead of the target object.

---
0.9-5

12/17/93: explode() doesn't check for 0-length separators.  Found in
the source.

12/17/93: Fixed by adding a check and throwing ~range.

---
0.9-6

12/17/93: data_tostr() had the wrong length for "<dict>".  Found in
the source.

12/17/93: Fixed by changing the length from 9 to 6.

---
0.9-7

circa 12/10/93: Dictionaries seem to be unable to find their 27th
elements under some circumstances.

12/21/93: Reproduced a likely candidate for the bug:

	var a, b;

	a = dict_add(#[], 1, 2);
	b = a;
	b = dict_del(b, 1);
	a[1];

12/21/93: I'm not at all sure that this is what caused the bug, but
the effects are certainly the same.

---
0.9-8

12/18/93: echo() was returning 0 instead of 1.  Found in the source.

12/18/93: Fixed by changing "push_int(0)" to "push_int(1)" in
op_echo().

---
0.9-9

12/18/93: When starting up, a child of $connection (from children())
didn't actually exist.  Reported by ghudson@mit.edu.

12/19/93: db_del() wasn't marking the db as dirty when it deletes an
object.  This sounds like the cause of the problem.  Fixed in 0.10.

---
0.9-10

12/21/93: A call to data() was crashing the server (active objects at
start of main loop).  (0.10 sanity-checking code.)  Found when Cold
World crashed.

12/21/93: Fixed in 0.10 by adding a cache_discard(obj) at the end of
op_data() in adminop.c.

---
0.9-11

12/23/93: Frob hashing for dictionaries was using the identifier
number for the class; this is not guaranteed to stay the same.  Found
in the source.

12/23/93: Fixed in 0.10 when dbrefs went numeric.

---
0.9-12

12/23/93: class() was leaking a reference count on the dbref it
returned.  Found in the source.

12/23/93: Fixed in 0.10 when dbrefs went numeric.

---
0.9-13

12/23/93: Error message from op_message() and op_expr_message() was
using an identifier that it had possibly discarded.  Found in the
source.

12/23/93: Fixed in 0.10 when dbrefs went numeric.

---
0.9-14

12/27/93: delete() was failing to copy elements properly for sublists.
Found in the source.

12/27/93: Fixed by getting rid of the "- sublist->start" term in the
MEMCPY() call in op_delete() in listop.c.

---
0.9-15

12/29/93: When creating a dictionary, checking for duplicates is
faulty.  Found in the source.

12/93/93: Fixed by rewriting the duplicate-checking.