ECMAScript spec assertion fails when binding is deleted?

# Jim Blandy (15 years ago)

When executing this code:

(function () {
     eval("var x=delete(x)")
})()

I think the assertion in the ECMAScript description of the declarative environment record's SetMutableBinding algorithm, 10.2.1.1.3 step 2, fails.

* On entry to the function, we create a lexical environment with a
  declarative environment record (10.4.3).
* When we enter the eval code, we create the binding for 'x' in that
  environment record  (10.5, step 8.c.1). This is a deletable
  binding, as per 10.5 step 2.
* When we evaluate the declaration, we produce a reference with that
  environment record as its base, delete the binding, and then call
  PutValue (12.2, VariableDeclaration : Identifier Initialiser
  semantics).
* PutValue calls the environment record's SetMutableBinding concrete
  method (8.7.2 step 5.a).
* SetMutableBinding's assertion fails, because 'x' is no longer
  bound in that environment record (10.2.1.1.3 step 2).

Have I missed something?

# Jeff Walden (15 years ago)

I think you've rediscovered the bug mentioned in the list thread titled "Assigning to eval-introduced local bindings outside strict mode, and an ES5 spec bug", spanning 20101124-20101126. I don't know whether any followup happened to fix that or not in the spec, haven't been concerned enough to follow up and check.

# Jim Blandy (15 years ago)

This is a bug in the spec, and has been previously discussed here:

mail.mozilla.org/pipermail/es5-discuss/2010-November/003839.html

(Thanks, Jeff!)

# Allen Wirfs-Brock (15 years ago)

This is now ecmascript#79