OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
11 // with the distribution. | 11 // with the distribution. |
12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
15 // | 15 // |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
| 28 // Flags: --harmony-symbols |
| 29 |
28 var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); | 30 var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); |
29 assertEquals("function", typeof desc.get); | 31 var getProto = desc.get; |
30 assertEquals("function", typeof desc.set); | 32 var setProto = desc.set; |
31 assertDoesNotThrow("desc.get.call({})"); | 33 |
32 assertDoesNotThrow("desc.set.call({}, {})"); | 34 function TestNoPoisonPill() { |
| 35 assertEquals("function", typeof desc.get); |
| 36 assertEquals("function", typeof desc.set); |
| 37 assertDoesNotThrow("desc.get.call({})"); |
| 38 assertDoesNotThrow("desc.set.call({}, {})"); |
| 39 |
| 40 var obj = {}; |
| 41 var obj2 = {}; |
| 42 desc.set.call(obj, obj2); |
| 43 assertEquals(obj.__proto__, obj2); |
| 44 assertEquals(desc.get.call(obj), obj2); |
| 45 } |
| 46 TestNoPoisonPill(); |
33 | 47 |
34 | 48 |
35 var obj = {}; | 49 function TestRedefineObjectPrototypeProtoGetter() { |
36 var obj2 = {}; | 50 Object.defineProperty(Object.prototype, "__proto__", { |
37 desc.set.call(obj, obj2); | 51 get: function() { |
38 assertEquals(obj.__proto__, obj2); | 52 return 42; |
39 assertEquals(desc.get.call(obj), obj2); | 53 } |
| 54 }); |
| 55 assertEquals({}.__proto__, 42); |
| 56 assertEquals(desc.get.call({}), Object.prototype); |
| 57 |
| 58 var desc2 = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); |
| 59 assertEquals(desc2.get.call({}), 42); |
| 60 assertEquals(desc2.set.call({}), undefined); |
| 61 |
| 62 Object.defineProperty(Object.prototype, "__proto__", { |
| 63 set: function(x) {} |
| 64 }); |
| 65 var desc3 = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); |
| 66 assertEquals(desc3.get.call({}), 42); |
| 67 assertEquals(desc3.set.call({}), undefined); |
| 68 } |
| 69 TestRedefineObjectPrototypeProtoGetter(); |
40 | 70 |
41 | 71 |
42 // Check that any redefinition of the __proto__ accessor works. | 72 function TestRedefineObjectPrototypeProtoSetter() { |
43 Object.defineProperty(Object.prototype, "__proto__", { | 73 Object.defineProperty(Object.prototype, "__proto__", { set: undefined }); |
44 get: function() { | 74 assertThrows(function() { |
45 return 42; | 75 "use strict"; |
46 } | 76 var o = {}; |
47 }); | 77 var p = {}; |
48 assertEquals({}.__proto__, 42); | 78 o.__proto__ = p; |
49 assertEquals(desc.get.call({}), Object.prototype); | 79 }, TypeError); |
| 80 } |
| 81 TestRedefineObjectPrototypeProtoSetter(); |
50 | 82 |
51 | 83 |
52 var desc2 = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); | 84 function TestGetProtoOfValues() { |
53 assertEquals(desc2.get.call({}), 42); | 85 assertEquals(getProto.call(1), Number.prototype); |
54 assertDoesNotThrow("desc2.set.call({})"); | 86 assertEquals(getProto.call(true), Boolean.prototype); |
| 87 assertEquals(getProto.call(false), Boolean.prototype); |
| 88 assertEquals(getProto.call('s'), String.prototype); |
| 89 assertEquals(getProto.call(Symbol()), Symbol.prototype); |
| 90 |
| 91 assertThrows(function() { getProto.call(null); }, TypeError); |
| 92 assertThrows(function() { getProto.call(undefined); }, TypeError); |
| 93 } |
| 94 TestGetProtoOfValues(); |
55 | 95 |
56 | 96 |
57 Object.defineProperty(Object.prototype, "__proto__", { set:function(x){} }); | 97 var values = [1, true, false, 's', Symbol()]; |
58 var desc3 = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); | |
59 assertDoesNotThrow("desc3.get.call({})"); | |
60 assertDoesNotThrow("desc3.set.call({})"); | |
61 | 98 |
62 | 99 |
63 Object.defineProperty(Object.prototype, "__proto__", { set: undefined }); | 100 function TestSetProtoOfValues() { |
64 assertThrows(function() { | 101 for (var i = 0; i < values.length; i++) { |
65 "use strict"; | 102 assertEquals(setProto.call(values[i], i), undefined); |
| 103 } |
| 104 |
| 105 assertThrows(function() { setProto.call(null, 7); }, TypeError); |
| 106 assertThrows(function() { setProto.call(undefined, 8); }, TypeError); |
| 107 } |
| 108 TestSetProtoOfValues(); |
| 109 |
| 110 |
| 111 function TestSetProtoToValue() { |
| 112 var object = {}; |
| 113 var proto = {}; |
| 114 setProto.call(object, proto); |
| 115 |
| 116 var valuesWithUndefined = values.concat(undefined); |
| 117 |
| 118 for (var i = 0; i < valuesWithUndefined.length; i++) { |
| 119 assertEquals(setProto.call(object, valuesWithUndefined[i]), undefined); |
| 120 assertEquals(getProto.call(object), proto); |
| 121 } |
| 122 |
| 123 // null is the only valid value that can be used as a [[Prototype]]. |
| 124 assertEquals(setProto.call(object, null), undefined); |
| 125 assertEquals(getProto.call(object), null); |
| 126 } |
| 127 TestSetProtoToValue(); |
| 128 |
| 129 |
| 130 function TestDeleteProto() { |
| 131 assertTrue(delete Object.prototype.__proto__); |
66 var o = {}; | 132 var o = {}; |
67 var p = {}; | 133 var p = {}; |
68 o.__proto__ = p; | 134 o.__proto__ = p; |
69 }, TypeError); | 135 assertEquals(Object.getPrototypeOf(o), Object.prototype); |
70 | 136 var desc4 = Object.getOwnPropertyDescriptor(o, "__proto__"); |
71 | 137 assertTrue(desc4.configurable); |
72 assertTrue(delete Object.prototype.__proto__); | 138 assertTrue(desc4.enumerable); |
73 var o = {}; | 139 assertTrue(desc4.writable); |
74 var p = {}; | 140 assertEquals(desc4.value, p); |
75 o.__proto__ = p; | 141 } |
76 assertEquals(Object.getPrototypeOf(o), Object.prototype); | 142 TestDeleteProto(); |
77 var desc4 = Object.getOwnPropertyDescriptor(o, "__proto__"); | |
78 assertTrue(desc4.configurable); | |
79 assertTrue(desc4.enumerable); | |
80 assertTrue(desc4.writable); | |
81 assertEquals(desc4.value, p); | |
OLD | NEW |