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
|
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
var obj = {}
function strict() { "use strict"; return this; }
assertEq(strict.call(""), "");
assertEq(strict.call(true), true);
assertEq(strict.call(42), 42);
assertEq(strict.call(null), null);
assertEq(strict.call(undefined), undefined);
assertEq(strict.call(obj), obj);
assertEq(new strict() instanceof Object, true);
/*
* The compiler internally converts x['foo'] to x.foo. Writing x[s] where
* s='foo' is enough to throw it off the scent for now.
*/
var strictString = 'strict';
Boolean.prototype.strict = strict;
assertEq(true.strict(), true);
assertEq(true[strictString](), true);
Number.prototype.strict = strict;
assertEq((42).strict(), 42);
assertEq(42[strictString](), 42);
String.prototype.strict = strict;
assertEq("".strict(), "");
assertEq(""[strictString](), "");
function lenient() { return this; }
assertEq(lenient.call("") instanceof String, true);
assertEq(lenient.call(true) instanceof Boolean, true);
assertEq(lenient.call(42) instanceof Number, true);
assertEq(lenient.call(null), this);
assertEq(lenient.call(undefined), this);
assertEq(lenient.call(obj), obj);
assertEq(new lenient() instanceof Object, true);
var lenientString = 'lenient';
Boolean.prototype.lenient = lenient;
assertEq(true.lenient() instanceof Boolean, true);
assertEq(true[lenientString]() instanceof Boolean, true);
Number.prototype.lenient = lenient;
assertEq(42[lenientString]() instanceof Number, true);
String.prototype.lenient = lenient;
assertEq(""[lenientString]() instanceof String, true);
reportCompare(true, true);
|