1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/extensions/uneval-strict-functions.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,61 @@ 1.4 +/* 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/licenses/publicdomain/ 1.7 + */ 1.8 + 1.9 +/* Check that strict mode functions get decompiled properly. */ 1.10 +function lenient() { return typeof this == "object"; } 1.11 +assertEq(eval(uneval(lenient) + "lenient;")(), true); 1.12 + 1.13 +function strict() { 'use strict'; return typeof this == "undefined"; } 1.14 +print(uneval(strict)); 1.15 +assertEq(eval(uneval(strict) + "strict;")(), true); 1.16 + 1.17 +function lenient_outer() { 1.18 + function lenient_inner() { 1.19 + return typeof this == "object"; 1.20 + } 1.21 + return lenient_inner; 1.22 +} 1.23 +assertEq(eval(uneval(lenient_outer()) + "lenient_inner;")(), true); 1.24 + 1.25 +function strict_outer() { 1.26 + "use strict"; 1.27 + function strict_inner() { 1.28 + return typeof this == "undefined"; 1.29 + } 1.30 + return strict_inner; 1.31 +} 1.32 +assertEq(eval(uneval(strict_outer()) + "strict_inner;")(), true); 1.33 + 1.34 +function lenient_outer_closure() { 1.35 + return function lenient_inner_closure() { 1.36 + return typeof this == "object"; 1.37 + }; 1.38 +} 1.39 +assertEq(eval(uneval(lenient_outer_closure()))(), true); 1.40 + 1.41 +function strict_outer_closure() { 1.42 + "use strict"; 1.43 + return function strict_inner_closure() { 1.44 + return typeof this == "undefined"; 1.45 + }; 1.46 +} 1.47 +assertEq(eval(uneval(strict_outer_closure()))(), true); 1.48 + 1.49 +function lenient_outer_expr() { 1.50 + return function lenient_inner_expr() (typeof this == "object"); 1.51 +} 1.52 +assertEq(eval(uneval(lenient_outer_expr()))(), true); 1.53 + 1.54 +/* 1.55 + * This doesn't work, because we have no way to include strict mode 1.56 + * directives in expression closures. 1.57 + * 1.58 + * function strict_outer_expr() { 1.59 + * return function strict_inner_expr() (typeof this == "undefined"); 1.60 + * } 1.61 + * assertEq(eval(uneval(strict_outer_expr()))(), true); 1.62 + */ 1.63 + 1.64 +reportCompare(true, true);