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