mirror of https://github.com/tc39/test262.git
112 lines
2.8 KiB
JavaScript
112 lines
2.8 KiB
JavaScript
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
|
// This code is governed by the BSD license found in the LICENSE file.
|
|
/*---
|
|
esid: sec-for-statement-runtime-semantics-labelledevaluation
|
|
description: >
|
|
No variable environment is created for each evaluation of the statement
|
|
body
|
|
info: |
|
|
[...]
|
|
11. Let bodyResult be ForBodyEvaluation(the first Expression, the second
|
|
Expression, Statement, perIterationLets, labelSet).
|
|
[...]
|
|
|
|
13.7.4.8 Runtime Semantics: ForBodyEvaluation
|
|
|
|
[...]
|
|
2. Perform ? CreatePerIterationEnvironment(perIterationBindings).
|
|
3. Repeat
|
|
[...]
|
|
b. Let result be the result of evaluating stmt.
|
|
[...]
|
|
e. Perform ? CreatePerIterationEnvironment(perIterationBindings).
|
|
[...]
|
|
|
|
13.7.4.9 Runtime Semantics: CreatePerIterationEnvironment
|
|
|
|
1. If perIterationBindings has any elements, then
|
|
[...]
|
|
e. Let thisIterationEnv be NewDeclarativeEnvironment(outer).
|
|
f. Let thisIterationEnvRec be thisIterationEnv's EnvironmentRecord.
|
|
flags: [noStrict]
|
|
---*/
|
|
|
|
var probeBefore = function() { return [x, y, z]; };
|
|
var probeTest, probeIncr, probeBody;
|
|
var run = true;
|
|
|
|
for (
|
|
;
|
|
run && (eval('var x = 1;'), probeTest = function() { return [x, y, z]; });
|
|
eval('var y = 1;'), probeIncr = function() { return [x, y, z]; }
|
|
)
|
|
var z = 1, _ = (probeBody = function() { return [x, y, z]; }), run = false;
|
|
|
|
var x = 2;
|
|
var y = 2;
|
|
var z = 2;
|
|
|
|
assert.sameValue(
|
|
probeBefore()[0],
|
|
2,
|
|
'reference preceding statement (redeclared in "test" position)'
|
|
);
|
|
assert.sameValue(
|
|
probeBefore()[1],
|
|
2,
|
|
'reference preceding statement (redeclared in statement body)'
|
|
);
|
|
assert.sameValue(
|
|
probeBefore()[2],
|
|
2,
|
|
'reference preceding statement (redeclared in "increment" position)'
|
|
);
|
|
|
|
assert.sameValue(
|
|
probeTest()[0],
|
|
2,
|
|
'reference from "test" position (redeclared in "test" position)'
|
|
);
|
|
assert.sameValue(
|
|
probeTest()[1],
|
|
2,
|
|
'reference from "test" position (redeclared in statement body)'
|
|
);
|
|
assert.sameValue(
|
|
probeTest()[2],
|
|
2,
|
|
'reference from "test" position (redeclared in "increment" position)'
|
|
);
|
|
|
|
assert.sameValue(
|
|
probeBody()[0],
|
|
2,
|
|
'reference from statement body (redeclared in "test" position)'
|
|
);
|
|
assert.sameValue(
|
|
probeBody()[1],
|
|
2,
|
|
'reference from statement body (redeclared in statement body)'
|
|
);
|
|
assert.sameValue(
|
|
probeBody()[2],
|
|
2,
|
|
'reference from statement body (redeclared in "increment" position)'
|
|
);
|
|
|
|
assert.sameValue(
|
|
probeIncr()[0],
|
|
2,
|
|
'reference from "increment" position (redeclared in "test" position)'
|
|
);
|
|
assert.sameValue(
|
|
probeIncr()[1],
|
|
2,
|
|
'reference from "increment" position (redeclared in statement body)'
|
|
);
|
|
assert.sameValue(
|
|
probeIncr()[2],
|
|
2,
|
|
'reference from "increment" position (redeclared in "increment" position)'
|
|
);
|