Non-Upwards Compatible Changes
Non-Upwards Compatible ChangesENodes are DeepPassByCopy. The safeScope is now arguably immutable enough.The highlight of this release is fixing the safeScope Mutability breaks confinement bug. The manner in which this has currently been fixed is, at this time, intended to be an interim fix, awaiting the "proper" fix. However, we must admit that such interim fixes often live past their expected lifetimes. The interim fix has three parts:
Top Level Bindings are No Longer Retroactively UpdatedTo fix bug Conflict between ForwardingSlots & PassByCopy,etc..., in order to make the world safe for Auditors (and to fix bug Reversion of FlexOuterScope is wrong ), the ForwardingSlot has been removed from the system, and old uses of old variables are no longer retroactively "fixed" to use the new redefinition of that same variable name. Instead, as explained above, evaluation produces a pair of a value and a new derived replacement Scope. In the interactive case, in order to support redefinition, we consider each top level expression to be evaluated in a new contour nested within the previous one, as if there was a "{" between each top level expression. ? def a := 3 # value: 3 ? def f() :any { return a } # value: <f> ? f() # value: 3 ? def a := "foo" # value: "foo" ? f() # value: 3 Previously, this would have returned "foo", since the old use of a within f would now be referring to the new definition of a. While the old behavior was, in many ways more pleasant, the new (ML-like) behavior works with our other requirements. ? def i :int := 3 # value: 3 ? [i, var i :String := "foo", i := "bar", i] # value: [3, "foo", "bar", "bar"] This last example shows that it really is like nesting contours. The first i in the last expression above refers to the definition already in scope. The remaining uses of i refer to the new definition. The non-interactive case is unchanged: You may not have two different definitions of the same variable in the same contour. SendExpr no longer in Kernel-EThe SendExpr (receiver <- verb(args...)) is no longer part of Kernel-E, but instead expands to (E.send(reveiver, "verb", [args...])) . This means that the Kernel-E evaluation machinery considered by itself -- the semantics of the special forms without considering the libraries -- defines only a sequential call-return language, without built-in committment to the E concurrency control model (event loops with promise pipelining). For example, the Kernel-E evaluation machinery could be used, if desired, for an E-like shell language for EROS, whose concurrency control was based on EROS's concurrency control model. The for-loop has been weakened as requested.The old sum.emaker can no longer work, and so has been removed, as a consequence of fixing the 'for' loop security concerns bug. This is a consequence of two upwards incompatibilities introduced by this bug fix:
Indeed, these two non-upwards compatibilities were the point of the bug fix. Bugs Closed
|
|||||||||||||||||||||||||||||||||||||||||||||||||
Unless stated otherwise, all text on this page which is either unattributed or by Mark S. Miller is hereby placed in the public domain.
|