test262/test/language/statements/for/scope-body-var-none.js
Mike Pennisi 3b3bd06819 Add tests for Lexical Environment management
Add tests that assert the management of the running execution context's
LexicalEnvironment and VariableEnvironment components, as created by the
following abstract operations:

- NewDeclarativeEnvironment
- NewObjectEnvironment
- NewFunctionEnvironment

Many tests require the use of non-strict direct eval, meaning they may
not be run in strict mode. This does not effect coverage because the
semantics in these cases are not observable from strict mode code.

Some situations require the creation of a binding, but this binding has
no relevance to the test itself. In these cases, use names consisting
solely of the underscore character (`_`).

Avoid the use of Block statements wherever possible, as these trigger
the creation of additional environments which may interfere with the
behavior under test.
2016-04-28 09:44:41 -04:00

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 preceeding statement (redeclared in "test" position)'
);
assert.sameValue(
probeBefore()[1],
2,
'reference preceeding statement (redeclared in statement body)'
);
assert.sameValue(
probeBefore()[2],
2,
'reference preceeding 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)'
);