- assigned_to: nobody --> caplet
Demonstration of bug:
? def x := 3 _/ 0
# problem: <ArithmeticException: BigInteger divide by zero>
#
# 3 floorDivide(0)
# <interactive interp> evalPrint(e`def x :any := 3
floorDivide(0)`)
? x
# problem: <AssertionError: Internal: must not be null: 31>
#
# <interactive interp> evalPrint(e`x`)
The above transcript shows that 'x' is in a broken
state. Why? The first expression, by static analysis,
exports a binding for x. However, the thrown exception
prevents x from actually getting initialized. In any
context other than an interactive top level scope this
would be fine, as the exception would also prevent any
further execution in the scope into which x has been
exported. However, in an interactive top level scope
(which includes automated execution of updoc scripts),
we see that such further execution can happen,
accessing an allocated index which has never been
initialized with a Slot.
To fix this, all such allocated indexes must act like
they were initialized with an UnboundSlot (to be
defined) until they get initialized with their proper
Slot. This must happen in the Kernel-E implementation.
An UnboundSlot should complain of attempts to access or
set its value.
For the sake of uniformity, the unbound behavior should
be the same we use when we implement the change
proposed by
http://www.eros-os.org/pipermail/e-lang/2002-February/006031.html
, so we let this bug report represent the need for this
proposed change as well.