(See test/TRACKING for bug-tracking information.) 0.9 (November 25, 1993) Bug fixes: (0.8.1-1) Output wasn't being flushed on shutdown() (0.8.1-3) has_ancestor() wasn't working (0.8.1-4) Some minor uninbitialized memory problems (0.8.1-5) A few fairly serious memory leaks Added match_regexp(). Frob reps can now be lists as well as dictionaries. substring() changed to substr() for consistency The 'connect' message sent to receiver objects for ports now has two arguments, the remote address and the remote port. Added task_id() The 'connect' message sent to receiver objects for connect() now has one argument, the task ID which called connect(). The 'failed' message sent to receiver objects for connect() now has two arguments; the first is the task ID which called connect(), and the second is the error code of the failure. 0.8.1 (November 21, 1993) Bug fixes: (0.8-1) chparents(), destroy(), conn_assign() were leaking stack frames. (0.8-2) Reading in frobs from a text dump caused crashes 0.8 (November 15, 1993) Bug fixes: (0.7.1-1) .foo() was decompiling to this().foo() (0.7.1-2) Method search bug Added data(). Changed frob construction syntax to <class, rep>. Added optional third argument to throw() and an error_arg() to retrieve it. 0.7.1 (November 12, 1993) Bug fixes: (0.7-2) Memory leak in discarding identifiers (0.7-3) Write buffer wasn't flushed before disconnecting (0.7-4) Crashes under Linux during text dumps (0.7-5) Compile-time portability problem with db.c (0.7-6) Crashes under Linux while traversing object db (0.7-7) Portability problems with NEXTSTEP (0.7-8) [@a, ...] optimization was buggy (0.7-9) Line counter failed on catch statement (0.7-11) union(foo, []) was leaking stack frames Rewrote lexer in C, to avoid lex/flex portability problems. Improved portability to SVR4 systems. 0.7 (November 2, 1993) Bug fixes: The delete() function was leaving its list in an incorrect state, causing memory corruption. A text_dump() immediately after another text_dump() resulted in a blank file, since the current search index wasn't getting updated. The current search index wasn't getting saved on binary dumps. Removing a method while it was running could have caused crashes. chparents() was crashing. It also wasn't checking for empty parents lists, a security hole. The method search was scanning the parents in the wrong direction. replace() was mutating its list argument by mistake. String comparison was severely wrong wrt substrings. Dictionary comparison and frob comparison were wrong. binary/clean file now stores version number (along with current search index), so that the server won't try to load a binary database with a different version number. Revised documentation to reflect lack of pass-to, and made other improvements. this, definer, caller, sender now functions, not variables. Added sugar for '.foobar(...)' --> this().foobar(...), and for @[...] --> this()@[...] (s/@/$/p; see below). Optimized a = [@a, ...] (transparent to users). Frob start token changed from @[ to $[ to remove conflict with splice operator. Added uppercase(), lowercase(), case-sensitive strcmp(), and added size() to return the current object's size. Reorganized the database code to avoid including ndbm.h in a _POSIX_SOURCE'd file (was causing trouble on BSDi systems). 0.6 (October 16, 1993) Bug fixes: Type errors involving dictionaries and frobs were wrong. Case ranges failed badly, causing crashes Adding inappropriate values also caused crashes In fact, a lot of opcodes had this problem. I've checked them pretty thoroughly and fixed a bunch. Added min(), max(), abs(). Added connect(addr, port, dbref), starts connecting to a remote host. dbref receives a "connect" or "failed" message when the connection finishes. Added heartbeat, and administrative operation set_heartbeat_freq(). Eliminated pass-to from the server; only inspecific pass is supported. 0.5.1 (October 9, 1993) Bug fixes: Reading in dictionaries from a binary dump didn't set the reference count, causing crashes. Likewise duplicating dictionaries. A bug in the compiler was causing the decompiler to put `callers' at the end of variable declarations. 0.5 (October 6, 1993) Bug fixes: Some primitives (including setadd() and setremove()) were corrupting lists. Error messages for index() and sublist(), and for getting an invalid object variable. Truth test for strings and lists was wrong. create() wasn't restricted to $sys. The directory "binary" didn't have x permissions. Line-number counting was wrong in some cases. rethrow() dumped core. Binary db output from dbpack.c is no longer binary, although ndbm is still icky that way, so no big deal. ancestors() is back in. Added union() Optimized more cases of 'foo = <expr including foo>' to avoid unnecessary copies. (Especially helpful for the following.) Dictionaries. #[[key, value], [key, value]] creates a dictionary. dict["foo"] indexes into the keys. for i in (dict) iterates over the associations [key, value]. dict_keys(dict) retrieves a list of the keys. dict_add(dict, key, value) returns a dictionary with an added key and value. dict_del(dict, key) returns a dictionary with the association for that key removed. dict_contains(dict, key) determines if a key exists in a dictionary. Frob representations are now dictionaries, not lists. Got rid of 'player'. Also, 'sender' now refers to what 'caller' used to refer to. 'caller' now refers to the dbref of the object which defines the method which sent the message, and 'definer' now refers to the dbref of the object which defines the current method. connect and disconnect messages now get sent to the connection objects, rather than the system object. 0.4.1 (September 19, 1993) Lots of stupid bugs (including some compile-time bugs) fixed which got past me. 0.4 (September 19, 1993) Identifier usage is now local to objects, so the global identifier table doesn't grow with the database. dbrefs are now symbolic, not numbers. You represent them with $foo, not #xx. Where #-1 was used, 0 (the integer) is now used. toliteral() now does what tostr() used to. tostr() now does translations more conveniently for some purposes. In particular, dbrefs, symbols, and error codes get translated to their names as strings, not as literals. Strings are unaffected by tostr(). lists go to "<list>". The printed representations of non-identifier dbrefs, symbols, and error codes are now $"foo", '"foo", and ~"foo" respectively. The parser can read this. Named arguments. In addition to the 'var' declaration, there is an 'arg' declaration, which specifies the argument names. "arg foo, bar, baz;" indicates three arguments named foo, bar, and baz. "arg foo, [bar];" indicates one argument named foo, and then any number of arguments following it, which will be stuffed into a list stored in a variable named bar. Method calls fail if you pass a method too few or too many arguments. Multiple server ports. The command line currently takes one argument, a database directory. The database is responsible for binding server sockets using bind(); unbind() lets you unbind a server socket. When you bind(), you give the server an object for handling the connections. Tracebacks improved. An explanation string only shows up on the first line of the traceback, since the remaining messages are generally not useful, and serve mostly to make the lines too long. Errors generated by throw() result in more understandable tracebacks now, I think. rethrow() now takes only one argument (an error code). foo.bar is no longer an acceptable abbreviation for foo.bar(). You can now append lists using the + operator. The case of 'foo = foo + whatever' is now optimized so that unnecessary string and list copies don't take place. The case of 'foo = [@foo, whatever]' is not optimized, however. Binary database files are all in the directory 'binary', to allow for different implementations of ndbm. I still need to redo the database layer myself, but that will wait. No more ancestor precedence lists. (Purely internal change.) Added find_method() and find_next_method(). Added a new data type, frob, and the built-in function class(). Non-overridable methods. Add a `disallow_overrides;' declaration at the top of your method and it cannot be overridden by children. Removed spew_method(). If I didn't do this before, create(), destroy(), and chparents() are now administrative functions which take arguments. setvar() and getvar() are now set_var() and get_var(). rmvar() and vars() don't exist any more; instead, there is add_parameter(), parameters(), and del_parameter(). Methods refer to variables through the parameters of the object the method is defined on, so the variable namespace is different for each ancestor of an object. 0.3 (July 29, 1993) Went to a global symbol table that grows in memory with the size of the database. I may disk-base this in the future. Rewrote error-handling code. Default return value is now the current object's dbref, instead of 0. We now use a global identifier table. Should improve speed signficantly. It does mean that the process size grows with the db, though, albeit slowly. I can make tradeoffs later if this becomes a problem. Binary database management is different now. version() now returns a number, not a string. Added toerr(), run_script(). Split length() into strlen() and listlen(). Added catch statement, critical expression, propagate expression. Added error(), traceback(), throw(), and rethrow(). ? : changed to ? |, since it was going to happen anyway. There's no longer a configuration file. You can still use -p to specify the port number. For now, the cache width and cache depth are hardcoded; they will hopefully be runtime-settable eventually. 0.2.1 (June 8, 1993) Fixed several bugs in binary dump reading, and got it to work with Linux. Fixed match_pattern() function. Fixed quoted wildcard matches in match_template() function. Fixed pad() function. Fixed setremove() function. Am now making sure to close the dbm file to force consistency. 0.2 (June 5, 1993) Fixed a bug in flush_defunct_connections() in io.c Fixed a bug in the decompiler in if-else unparsing, and another one in expr-message unparsing Fixed binary dumping Fixed strsub() Relaxed the requirement that compound statements and methods must contain at least one statment Fixed text dumps Added version(), random(), time(), ctime() echo_file() now looks in a "text" directory. --port is now -p -d option changes into a directory before running destroy() now reparents orphans to the destroyed object's parents. destroy() now returns E_PERM for system and root objects. Fixed an object reference count bug in object_find_method() in object.c. Fixed op_spawn(), which wasn't discarding an object reference count properly. 0.1 (June 3, 1993) Initial release