-*- text -*- Outstanding issues: - "String newSize: 5" --> '\0\0\0\0\0', which is wrong according to the documentation for newSize: in collection.slate. It should return '' with a *capacity* of 5. This could be tricky to solve? - Loading plugins in general currently requires setting the environment variable LD_LIBRARY_PATH to "./lib/" since C library outputs are deposited relative to the source directory. - Load src/plugins/smart-console/init.slate, enter a repl, close with ctrl+d. Somehow the 'enter' method does not exit (even though there's an explicit return) and the ensure blocks are not executed. Visible symptoms: restarts are not removed, command number in the prompt remains as if the repl was not closed at all. If you press ctrl+d at the root (bootstrap) prompt then the enter methods will exit one by one, as many times as a repl was entered. - Some traits when printed results in an infinite error loop. This is due to a String-printing method on the non-String traits object, and the general issue of traits objects holding methods which cannot apply to them. Examples: Integer traits. Float traits. String traits. FIX: Re-visit the inheritance design. There is a method lookup fix which addresses part of the issue (re-visitng any traits object), but it is not enough. FIX: OR, move printOn: methods to the prototypes themselves. - Redefining a named prototype does not yet update its descendents to point to the new version. Also, adding a slot to a prototype has no effect on descendents unless addDynamicSlot:valued: is used. CAVEAT: This only happens when the derivation is changed. If the derivation remains the same, you can reload code to your heart's content. FIX: Each named prototype could store a weak collection of its descendents and update them appropriately when replaced/updated. This requires WeakArray or weak reference support, so is pending. - #addSlotsFrom: turns immutable slots into mutable ones. - Make addSlot: and variants return the newValue instead of the object. - Make sure to find all users of the return value of theses expressions and migrate them. (There would seem to be none). - Try to make these methods more efficient - 4 locals?? - Add a measurement device for method cache hit ratio. - Add a signal for interpreter stack exhaustion, which userland can handle. Other (website, configuration, etc.): Roadmap to networking support: * Essential - ExternalResource sessionDo: needs to use a counting semaphore (unless we rethink ExternalResource entirely) - We need a counting semaphore implementation [DONE] - ExternalResource enable/disable needs to be separate from startup/shutdown That is, resource acquisition and release is distinct from image persistence and reconnection to the external resources in question. - The multiplexor and libc-dns-resolver need to use external resources appropriately, to avoid kludges with library enable/disable - Make the streams over sockets robust - We need a timer priority-queue (heap) - It will need integrating with the Multiplexor mainloop - Consider exception/error situations in the stream support - We need to make it so that sockets reconnect/rebind appropriately on image startup and shutdown. Server sockets should obviously try to reopen themselves; what happens if that fails? Perhaps next time the accept() comes round, an exception should be thrown ("unavailable resource"; "socket not open"; "invalid fd"?) - Once that is happening reliably, set up a persistent socket service to replace the TTY-based REPL. * Important - finalisation (so that external-resources are collected properly) * Nice-to-have - (maybe) Separate ExternalResource stream-features from the external-resource-ness of the thing? Just for clarity - since there are external-resources that are not stream-like - For preemption of threads, we need an interface to setitimer(2) and associated signals. (Perhaps UNIX signal-handling support in general, then?) Ingredients: 1 x volatile int flag indicating SIGALRM 1 x C-language support routine plus signal hook 1 x primitive for setitimer(2) 1 x new kind of signal the VM can throw 1 x modification to main interpreter loop for checking said volatile flag 1 x userland signal handler that arranges for thread preemption Roadmap to GUI: * Essential - Networking (see above), for its event/timeout framework - Integration of event sources with the networking multiplexor; for a start, integrate the SDL event source * Important * Nice-to-have