1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
load(libdir + "asserts.js");
var valid_strict_funs = [
// directive ends on next line
function () {
"use strict"
;
},
function () {
"use strict"
},
// directive ends on same line
function () { "use strict"; },
function () { "use strict" },
];
for (var f of valid_strict_funs) {
assertThrowsInstanceOf(function() { f.caller }, TypeError);
}
var binary_ops = [
"||", "&&",
"|", "^", "&",
"==", "!=", "===", "!==",
"<", "<=", ">", ">=", "in", "instanceof",
"<<", ">>", ">>>",
"+", "-",
"*", "/", "%",
];
var invalid_strict_funs = [
function () {
"use strict"
, "not";
},
function () {
"use strict"
? 1 : 0;
},
function () {
"use strict"
.length;
},
function () {
"use strict"
[0];
},
function () {
"use strict"
();
},
...([]),
...(binary_ops.map(op => Function("'use strict'\n " + op + " 'not'"))),
];
for (var f of invalid_strict_funs) {
f.caller;
}
var assignment_ops = [
"=", "+=", "-=",
"|=", "^=", "&=",
"<<=", ">>=", ">>>=",
"*=", "/=", "%=",
];
var invalid_strict_funs_syntax_error = assignment_ops.map(op => ("'use strict'\n " + op + " 'not'"));
// assignment with string literal as LHS is an early error, therefore we
// can only test for SyntaxError
for (var f of invalid_strict_funs_syntax_error) {
assertThrowsInstanceOf(function() { Function(f) }, SyntaxError);
}
|