blob: 06e0b09d2f02475112431ec11920c47a8124500a [file] [log] [blame]
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
/* Check that strict mode functions get decompiled properly. */
function lenient() { return typeof this == "object"; }
assertEq(eval(uneval(lenient) + "lenient;")(), true);
function strict() { 'use strict'; return typeof this == "undefined"; }
print(uneval(strict));
assertEq(eval(uneval(strict) + "strict;")(), true);
function lenient_outer() {
function lenient_inner() {
return typeof this == "object";
}
return lenient_inner;
}
assertEq(eval(uneval(lenient_outer()) + "lenient_inner;")(), true);
function strict_outer() {
"use strict";
function strict_inner() {
return typeof this == "undefined";
}
return strict_inner;
}
assertEq(eval(uneval(strict_outer()) + "strict_inner;")(), true);
function lenient_outer_closure() {
return function lenient_inner_closure() {
return typeof this == "object";
};
}
assertEq(eval(uneval(lenient_outer_closure()))(), true);
function strict_outer_closure() {
"use strict";
return function strict_inner_closure() {
return typeof this == "undefined";
};
}
assertEq(eval(uneval(strict_outer_closure()))(), true);
function lenient_outer_expr() {
return function lenient_inner_expr() (typeof this == "object");
}
assertEq(eval(uneval(lenient_outer_expr()))(), true);
/*
* This doesn't work, because we have no way to include strict mode
* directives in expression closures.
*
* function strict_outer_expr() {
* return function strict_inner_expr() (typeof this == "undefined");
* }
* assertEq(eval(uneval(strict_outer_expr()))(), true);
*/
reportCompare(true, true);