Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const unreachable = () => { throw "unreachable"; };
// var-initializer expression is executed before for-in expression.
var log = "";
for (var x = (log += "head") in (log += "|expr", null)) unreachable();
assertEq(log, "head|expr");
log = "";
for (var x = (log += "head") in (log += "|expr", {})) unreachable();
assertEq(log, "head|expr");
// for-in expression isn't executed when var-initializer throws exception.
function ExpectedError() {}
assertThrowsInstanceOf(() => {
var throwErr = () => { throw new ExpectedError(); };
for (var x = throwErr() in unreachable()) unreachable();
}, ExpectedError);
// Ensure environment operations are performed correctly.
var scope = new Proxy({x: 0}, new Proxy({}, {
get(t, pk, r) {
log += pk + "|";
}
}));
log = "";
with (scope) {
for (var x = 0 in {}) ;
}
assertEq(log, "has|get|set|getOwnPropertyDescriptor|defineProperty|");
log = "";
with (scope) {
for (var x = 0 in {p: 0}) ;
}
assertEq(log, "has|get|set|getOwnPropertyDescriptor|defineProperty|".repeat(2));
if (typeof reportCompare === "function")
reportCompare(true, true);