OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Flags: --harmony-classes --allow-natives-syntax | 5 // Flags: --harmony-classes --allow-natives-syntax |
6 | 6 |
7 | 7 |
8 (function TestSingleClass() { | 8 (function TestSingleClass() { |
9 function f(x) { | 9 function f(x) { |
10 var a = [0, 1, 2] | 10 var a = [0, 1, 2] |
11 return a[x]; | 11 return a[x]; |
12 } | 12 } |
13 | 13 |
14 function ClassD() { } | 14 function ClassD() { } |
15 | 15 |
16 assertEquals(1, f(1)); | 16 assertEquals(1, f(1)); |
17 var g = f.toMethod(ClassD.prototype); | 17 var g = %ToMethod(f, ClassD.prototype); |
18 assertEquals(1, g(1)); | 18 assertEquals(1, g(1)); |
19 assertEquals(undefined, f[%HomeObjectSymbol()]); | 19 assertEquals(undefined, f[%HomeObjectSymbol()]); |
20 assertEquals(ClassD.prototype, g[%HomeObjectSymbol()]); | 20 assertEquals(ClassD.prototype, g[%HomeObjectSymbol()]); |
21 }()); | 21 }()); |
22 | 22 |
23 | 23 |
24 (function TestClassHierarchy() { | 24 (function TestClassHierarchy() { |
25 function f(x) { | 25 function f(x) { |
26 return function g(y) { x++; return x + y; }; | 26 return function g(y) { x++; return x + y; }; |
27 } | 27 } |
28 | 28 |
29 function Base() {} | 29 function Base() {} |
30 function Derived() { } | 30 function Derived() { } |
31 Derived.prototype = Object.create(Base.prototype); | 31 Derived.prototype = Object.create(Base.prototype); |
32 | 32 |
33 var q = f(0); | 33 var q = f(0); |
34 assertEquals(2, q(1)); | 34 assertEquals(2, q(1)); |
35 assertEquals(3, q(1)); | 35 assertEquals(3, q(1)); |
36 var g = q.toMethod(Derived.prototype); | 36 var g = %ToMethod(q, Derived.prototype); |
37 assertFalse(g === q); | 37 assertFalse(g === q); |
38 assertEquals(4, g(1)); | 38 assertEquals(4, g(1)); |
39 assertEquals(5, q(1)); | 39 assertEquals(5, q(1)); |
40 }()); | 40 }()); |
41 | 41 |
42 | 42 |
43 (function TestErrorCases() { | |
44 var sFun = Function.prototype.toMethod; | |
45 assertThrows(function() { sFun.call({}); }, TypeError); | |
46 assertThrows(function() { sFun.call({}, {}); }, TypeError); | |
47 function f(){}; | |
48 assertThrows(function() { f.toMethod(1); }, TypeError); | |
49 }()); | |
50 | |
51 | |
52 (function TestPrototypeChain() { | 43 (function TestPrototypeChain() { |
53 var o = {}; | 44 var o = {}; |
54 var o1 = {}; | 45 var o1 = {}; |
55 function f() { } | 46 function f() { } |
56 | 47 |
57 function g() { } | 48 function g() { } |
58 | 49 |
59 var fMeth = f.toMethod(o); | 50 var fMeth = %ToMethod(f, o); |
60 assertEquals(o, fMeth[%HomeObjectSymbol()]); | 51 assertEquals(o, fMeth[%HomeObjectSymbol()]); |
61 g.__proto__ = fMeth; | 52 g.__proto__ = fMeth; |
62 assertEquals(undefined, g[%HomeObjectSymbol()]); | 53 assertEquals(undefined, g[%HomeObjectSymbol()]); |
63 var gMeth = g.toMethod(o1); | 54 var gMeth = %ToMethod(g, o1); |
64 assertEquals(fMeth, gMeth.__proto__); | 55 assertEquals(fMeth, gMeth.__proto__); |
65 assertEquals(o, fMeth[%HomeObjectSymbol()]); | 56 assertEquals(o, fMeth[%HomeObjectSymbol()]); |
66 assertEquals(o1, gMeth[%HomeObjectSymbol()]); | 57 assertEquals(o1, gMeth[%HomeObjectSymbol()]); |
67 }()); | 58 }()); |
68 | 59 |
69 | 60 |
70 (function TestBoundFunction() { | 61 (function TestBoundFunction() { |
71 var o = {}; | 62 var o = {}; |
72 var p = {}; | 63 var p = {}; |
73 | 64 |
74 | 65 |
75 function f(x, y, z, w) { | 66 function f(x, y, z, w) { |
76 assertEquals(o, this); | 67 assertEquals(o, this); |
77 assertEquals(1, x); | 68 assertEquals(1, x); |
78 assertEquals(2, y); | 69 assertEquals(2, y); |
79 assertEquals(3, z); | 70 assertEquals(3, z); |
80 assertEquals(4, w); | 71 assertEquals(4, w); |
81 return x+y+z+w; | 72 return x+y+z+w; |
82 } | 73 } |
83 | 74 |
84 var fBound = f.bind(o, 1, 2, 3); | 75 var fBound = f.bind(o, 1, 2, 3); |
85 var fMeth = fBound.toMethod(p); | 76 var fMeth = %ToMethod(fBound, p); |
86 assertEquals(10, fMeth(4)); | 77 assertEquals(10, fMeth(4)); |
87 assertEquals(10, fMeth.call(p, 4)); | 78 assertEquals(10, fMeth.call(p, 4)); |
88 var fBound1 = fBound.bind(o, 4); | 79 var fBound1 = fBound.bind(o, 4); |
89 assertEquals(10, fBound1()); | 80 assertEquals(10, fBound1()); |
90 var fMethBound = fMeth.bind(o, 4); | 81 var fMethBound = fMeth.bind(o, 4); |
91 assertEquals(10, fMethBound()); | 82 assertEquals(10, fMethBound()); |
92 }()); | 83 }()); |
93 | 84 |
94 (function TestOptimized() { | 85 (function TestOptimized() { |
95 function f(o) { | 86 function f(o) { |
96 return o.x; | 87 return o.x; |
97 } | 88 } |
98 var o = {x : 15}; | 89 var o = {x : 15}; |
99 assertEquals(15, f(o)); | 90 assertEquals(15, f(o)); |
100 assertEquals(15, f(o)); | 91 assertEquals(15, f(o)); |
101 %OptimizeFunctionOnNextCall(f); | 92 %OptimizeFunctionOnNextCall(f); |
102 assertEquals(15, f(o)); | 93 assertEquals(15, f(o)); |
103 var g = f.toMethod({}); | 94 var g = %ToMethod(f, {}); |
104 var o1 = {y : 1024, x : "abc"}; | 95 var o1 = {y : 1024, x : "abc"}; |
105 assertEquals("abc", f(o1)); | 96 assertEquals("abc", f(o1)); |
106 assertEquals("abc", g(o1)); | 97 assertEquals("abc", g(o1)); |
107 } ()); | 98 } ()); |
108 | 99 |
109 (function TestExtensibility() { | 100 (function TestExtensibility() { |
110 function f() {} | 101 function f() {} |
111 Object.preventExtensions(f); | 102 Object.preventExtensions(f); |
112 assertFalse(Object.isExtensible(f)); | 103 assertFalse(Object.isExtensible(f)); |
113 var m = f.toMethod({}); | 104 var m = %ToMethod(f, {}); |
114 assertTrue(Object.isExtensible(m)); | 105 assertTrue(Object.isExtensible(m)); |
115 }()); | 106 }()); |
OLD | NEW |