---- 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.