Closed Bug 1069480 Opened 10 years ago Closed 8 years ago

Update for- and for-in/of TDZ rules to match latest spec

Categories

(Core :: JavaScript Engine, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: anba, Assigned: Waldo)

References

Details

(Whiteboard: [v8api])

Expected: ReferenceError thrown when calling the various test* functions
Actual: No ReferenceError thrown


function testForOfRhs() {
  let x = "outer";
  for (let x of [x]) print(x);
}
testForOfRhs();

function testForOfComputed() {
  let x = "outer";
  for (let {[x]: x} of [{outer: 123}]) {
    print(x)
  }
}
testForOfComputed();

function testForInRhs() {
  let x = "outer";
  for (let x in {key: x}) print(x);
}
testForInRhs();

function testForInComputed() {
  let x = "0";
  for (let {[x]: x} in {key: 123}) {
    print(x)
  }
}
testForInComputed();

function testForRhs() {
  let x = "outer";
  for (let x = x;;) {
    print(x);
    break;
  }
}
testForRhs()

function testForComputed() {
  let x = "outer";
  for (let {[x]: x} = {outer: 123};;) {
    print(x);
    break;
  }
}
testForComputed();
Another fun addition I seem to have discovered in reading the semantics for this stuff just now:

  var item;
  for (let x of [function() { x; }])
    item = x;
  // This is a TDZ violation as far as I can tell: |x;| refers to
  // an x in the loop-head, not an x for an iteration of the loop.
  item();

I don't believe this changes the implementability of anything (or at least it seems like it shouldn't, in advance of implementation) -- but it is a rather odd bit of behavior.
Depends on: 1233249
Will see if I can make any progress on this.
Assignee: nobody → winter2718
Assignee: winter2718 → nobody
Whiteboard: [v8api]
I have a PR against the Github repo/branch where bug 1263355 is being worked on, that I believe fixes this.  Don't anybody bother testing it, tho, because there are known cases (e.g. any for-in/of loop with lexical declaration whose body captures one of those lexical declarations) where the PR falls down, because the underlying branch isn't fully completed yet.

https://github.com/syg/gecko-dev/pull/1
Assignee: nobody → jwalden+bmo
Status: NEW → ASSIGNED
Fixed by bug 1263355.
Status: ASSIGNED → RESOLVED
Closed: 8 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.