Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: test/mjsunit/harmony/proxies.js

Issue 7799026: Make proxies work as prototypes. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressing Kevin's comments. Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2008 the V8 project authors. All rights reserved. 1 // Copyright 2008 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
(...skipping 10 matching lines...) Expand all
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-proxies 28 // Flags: --harmony-proxies
29 29
30 30
31 // TODO(rossberg): for-in for proxies not implemented. 31 // TODO(rossberg): integer-index properties not implemented properly.
32 // TODO(rossberg): inheritance from proxies not implemented. 32 // TODO(rossberg): for-in not implemented on proxies.
33
33 34
34 // Helper. 35 // Helper.
35 36
36 function TestWithProxies(test, handler) { 37 function TestWithProxies(test, handler) {
37 test(handler, Proxy.create) 38 test(handler, Proxy.create)
38 test(handler, function(h) {return Proxy.createFunction(h, function() {})}) 39 test(handler, function(h) {return Proxy.createFunction(h, function() {})})
39 } 40 }
40 41
41 42
42 // Getters. 43
44 // Getting property descriptors (Object.getOwnPropertyDescriptor).
45
46 var key
47
48 function TestGetOwnProperty(handler) {
49 TestWithProxies(TestGetOwnProperty2, handler)
50 }
51
52 function TestGetOwnProperty2(handler, create) {
53 var p = create(handler)
54 assertEquals(42, Object.getOwnPropertyDescriptor(p, "a").value)
55 assertEquals("a", key)
56 }
57
58 TestGetOwnProperty({
59 getOwnPropertyDescriptor: function(k) {
60 key = k
61 return {value: 42, configurable: true}
62 }
63 })
64
65 TestGetOwnProperty({
66 getOwnPropertyDescriptor: function(k) {
67 return this.getOwnPropertyDescriptor2(k)
68 },
69 getOwnPropertyDescriptor2: function(k) {
70 key = k
71 return {value: 42, configurable: true}
72 }
73 })
74
75 TestGetOwnProperty({
76 getOwnPropertyDescriptor: function(k) {
77 key = k
78 return {get value() { return 42 }, get configurable() { return true }}
79 }
80 })
81
82 TestGetOwnProperty(Proxy.create({
83 get: function(pr, pk) {
84 return function(k) { key = k; return {value: 42, configurable: true} }
85 }
86 }))
87
88
89 function TestGetOwnPropertyThrow(handler) {
90 TestWithProxies(TestGetOwnPropertyThrow2, handler)
91 }
92
93 function TestGetOwnPropertyThrow2(handler, create) {
94 var p = create(handler)
95 assertThrows(function(){ Object.getOwnPropertyDescriptor(p, "a") }, "myexn")
96 }
97
98 TestGetOwnPropertyThrow({
99 getOwnPropertyDescriptor: function(k) { throw "myexn" }
100 })
101
102 TestGetOwnPropertyThrow({
103 getOwnPropertyDescriptor: function(k) {
104 return this.getPropertyDescriptor2(k)
105 },
106 getOwnPropertyDescriptor2: function(k) { throw "myexn" }
107 })
108
109 TestGetOwnPropertyThrow({
110 getOwnPropertyDescriptor: function(k) {
111 return {get value() { throw "myexn" }}
112 }
113 })
114
115 TestGetOwnPropertyThrow(Proxy.create({
116 get: function(pr, pk) {
117 return function(k) { throw "myexn" }
118 }
119 }))
120
121
122
123 // Getters (dot, brackets).
124
125 var key
43 126
44 function TestGet(handler) { 127 function TestGet(handler) {
45 TestWithProxies(TestGet2, handler) 128 TestWithProxies(TestGet2, handler)
46 } 129 }
47 130
48 function TestGet2(handler, create) { 131 function TestGet2(handler, create) {
49 var p = create(handler) 132 var p = create(handler)
50 assertEquals(42, p.a) 133 assertEquals(42, p.a)
134 assertEquals("a", key)
51 assertEquals(42, p["b"]) 135 assertEquals(42, p["b"])
136 assertEquals("b", key)
52 137
53 // TODO(rossberg): inheritance from proxies not yet implemented. 138 var o = Object.create(p, {x: {value: 88}})
54 // var o = Object.create(p, {x: {value: 88}}) 139 assertEquals(42, o.a)
55 // assertEquals(42, o.a) 140 assertEquals("a", key)
56 // assertEquals(42, o["b"]) 141 assertEquals(42, o["b"])
57 // assertEquals(88, o.x) 142 assertEquals("b", key)
58 // assertEquals(88, o["x"]) 143 assertEquals(88, o.x)
144 assertEquals(88, o["x"])
59 } 145 }
60 146
61 TestGet({ 147 TestGet({
62 get: function(r, k) { return 42 } 148 get: function(r, k) { key = k; return 42 }
63 }) 149 })
64 150
65 TestGet({ 151 TestGet({
66 get: function(r, k) { return this.get2(r, k) }, 152 get: function(r, k) { return this.get2(r, k) },
67 get2: function(r, k) { return 42 } 153 get2: function(r, k) { key = k; return 42 }
68 }) 154 })
69 155
70 TestGet({ 156 TestGet({
71 getPropertyDescriptor: function(k) { return {value: 42} } 157 getPropertyDescriptor: function(k) { key = k; return {value: 42} }
72 }) 158 })
73 159
74 TestGet({ 160 TestGet({
75 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, 161 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) },
76 getPropertyDescriptor2: function(k) { return {value: 42} } 162 getPropertyDescriptor2: function(k) { key = k; return {value: 42} }
77 }) 163 })
78 164
79 TestGet({ 165 TestGet({
80 getPropertyDescriptor: function(k) { 166 getPropertyDescriptor: function(k) {
167 key = k;
81 return {get value() { return 42 }} 168 return {get value() { return 42 }}
82 } 169 }
83 }) 170 })
84 171
85 TestGet({ 172 TestGet({
86 get: undefined, 173 get: undefined,
87 getPropertyDescriptor: function(k) { return {value: 42} } 174 getPropertyDescriptor: function(k) { key = k; return {value: 42} }
88 }) 175 })
89 176
90 TestGet(Proxy.create({ 177 TestGet(Proxy.create({
91 get: function(pr, pk) { 178 get: function(pr, pk) {
92 return function(r, k) { return 42 } 179 return function(r, k) { key = k; return 42 }
93 } 180 }
94 })) 181 }))
95 182
96 183
97 function TestGetCall(handler) { 184 function TestGetCall(handler) {
98 TestWithProxies(TestGetCall2, handler) 185 TestWithProxies(TestGetCall2, handler)
99 } 186 }
100 187
101 function TestGetCall2(handler, create) { 188 function TestGetCall2(handler, create) {
102 var p = create(handler) 189 var p = create(handler)
103 assertEquals(55, p.f()) 190 assertEquals(55, p.f())
191 assertEquals(55, p["f"]())
104 assertEquals(55, p.f("unused", "arguments")) 192 assertEquals(55, p.f("unused", "arguments"))
105 assertEquals(55, p.f.call(p)) 193 assertEquals(55, p.f.call(p))
194 assertEquals(55, p["f"].call(p))
106 assertEquals(55, p.withargs(45, 5)) 195 assertEquals(55, p.withargs(45, 5))
107 assertEquals(55, p.withargs.call(p, 11, 22)) 196 assertEquals(55, p.withargs.call(p, 11, 22))
108 assertEquals("6655", "66" + p) // calls p.toString 197 assertEquals("6655", "66" + p) // calls p.toString
198
199 var o = Object.create(p, {g: {value: function(x) { return x + 88 }}})
200 assertEquals(55, o.f())
201 assertEquals(55, o["f"]())
202 assertEquals(55, o.f("unused", "arguments"))
203 assertEquals(55, o.f.call(o))
204 assertEquals(55, o.f.call(p))
205 assertEquals(55, o["f"].call(p))
206 assertEquals(55, o.withargs(45, 5))
207 assertEquals(55, o.withargs.call(p, 11, 22))
208 assertEquals(90, o.g(2))
209 assertEquals(91, o.g.call(o, 3))
210 assertEquals(92, o.g.call(p, 4))
211 assertEquals("6655", "66" + o) // calls o.toString
109 } 212 }
110 213
111 TestGetCall({ 214 TestGetCall({
112 get: function(r, k) { return function() { return 55 } } 215 get: function(r, k) { return function() { return 55 } }
113 }) 216 })
114 217
115 TestGetCall({ 218 TestGetCall({
116 get: function(r, k) { return this.get2(r, k) }, 219 get: function(r, k) { return this.get2(r, k) },
117 get2: function(r, k) { return function() { return 55 } } 220 get2: function(r, k) { return function() { return 55 } }
118 }) 221 })
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 266
164 267
165 function TestGetThrow(handler) { 268 function TestGetThrow(handler) {
166 TestWithProxies(TestGetThrow2, handler) 269 TestWithProxies(TestGetThrow2, handler)
167 } 270 }
168 271
169 function TestGetThrow2(handler, create) { 272 function TestGetThrow2(handler, create) {
170 var p = create(handler) 273 var p = create(handler)
171 assertThrows(function(){ p.a }, "myexn") 274 assertThrows(function(){ p.a }, "myexn")
172 assertThrows(function(){ p["b"] }, "myexn") 275 assertThrows(function(){ p["b"] }, "myexn")
276
277 var o = Object.create(p, {x: {value: 88}})
278 assertThrows(function(){ o.a }, "myexn")
279 assertThrows(function(){ o["b"] }, "myexn")
280 assertEquals(88, o.x)
281 assertEquals(88, o["x"])
173 } 282 }
174 283
175 TestGetThrow({ 284 TestGetThrow({
176 get: function(r, k) { throw "myexn" } 285 get: function(r, k) { throw "myexn" }
177 }) 286 })
178 287
179 TestGetThrow({ 288 TestGetThrow({
180 get: function(r, k) { return this.get2(r, k) }, 289 get: function(r, k) { return this.get2(r, k) },
181 get2: function(r, k) { throw "myexn" } 290 get2: function(r, k) { throw "myexn" }
182 }) 291 })
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 var p = create(handler) 335 var p = create(handler)
227 assertEquals(42, p.a = 42) 336 assertEquals(42, p.a = 42)
228 assertEquals("a", key) 337 assertEquals("a", key)
229 assertEquals(42, val) 338 assertEquals(42, val)
230 assertEquals(43, p["b"] = 43) 339 assertEquals(43, p["b"] = 43)
231 assertEquals("b", key) 340 assertEquals("b", key)
232 assertEquals(43, val) 341 assertEquals(43, val)
233 } 342 }
234 343
235 TestSet({ 344 TestSet({
236 set: function(r, k, v) { key = k; val = v; return true } 345 set: function(r, k, v) { key = k; val = v; return true },
237 }) 346 })
238 347
239 TestSet({ 348 TestSet({
240 set: function(r, k, v) { return this.set2(r, k, v) }, 349 set: function(r, k, v) { return this.set2(r, k, v) },
241 set2: function(r, k, v) { key = k; val = v; return true } 350 set2: function(r, k, v) { key = k; val = v; return true }
242 }) 351 })
243 352
244 TestSet({ 353 TestSet({
245 getOwnPropertyDescriptor: function(k) { return {writable: true} }, 354 getOwnPropertyDescriptor: function(k) { return {writable: true} },
246 defineProperty: function(k, desc) { key = k; val = desc.value } 355 defineProperty: function(k, desc) { key = k; val = desc.value }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 defineProperty: function(k, desc) { key = k, val = desc.value } 404 defineProperty: function(k, desc) { key = k, val = desc.value }
296 }) 405 })
297 406
298 TestSet(Proxy.create({ 407 TestSet(Proxy.create({
299 get: function(pr, pk) { 408 get: function(pr, pk) {
300 return function(r, k, v) { key = k; val = v; return true } 409 return function(r, k, v) { key = k; val = v; return true }
301 } 410 }
302 })) 411 }))
303 412
304 413
305
306 function TestSetThrow(handler, create) { 414 function TestSetThrow(handler, create) {
307 TestWithProxies(TestSetThrow2, handler) 415 TestWithProxies(TestSetThrow2, handler)
308 } 416 }
309 417
310 function TestSetThrow2(handler, create) { 418 function TestSetThrow2(handler, create) {
311 var p = create(handler) 419 var p = create(handler)
312 assertThrows(function(){ p.a = 42 }, "myexn") 420 assertThrows(function(){ p.a = 42 }, "myexn")
313 assertThrows(function(){ p["b"] = 42 }, "myexn") 421 assertThrows(function(){ p["b"] = 42 }, "myexn")
314 } 422 }
315 423
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 get: function(pr, pk) { throw "myexn" } 523 get: function(pr, pk) { throw "myexn" }
416 })) 524 }))
417 525
418 TestSetThrow(Proxy.create({ 526 TestSetThrow(Proxy.create({
419 get: function(pr, pk) { 527 get: function(pr, pk) {
420 return function(r, k, v) { throw "myexn" } 528 return function(r, k, v) { throw "myexn" }
421 } 529 }
422 })) 530 }))
423 531
424 532
533 var key
534 var val
535
536 function TestSetForDerived(handler, create) {
537 TestWithProxies(TestSetForDerived2, handler)
538 }
539
540 function TestSetForDerived2(handler, create) {
541 var p = create(handler)
542 var o = Object.create(p, {x: {value: 88, writable: true}})
543
544 key = ""
545 assertEquals(48, o.x = 48)
546 assertEquals("", key) // trap not invoked
547 assertEquals(48, o.x)
548
549 assertEquals(49, o.y = 49)
550 assertEquals("y", key)
551 assertEquals(49, o.y)
552
553 assertEquals(44, o.p_writable = 44)
554 assertEquals("p_writable", key)
555 assertEquals(44, o.p_writable)
556
557 assertEquals(45, o.p_nonwritable = 45)
558 assertEquals("p_nonwritable", key)
559 assertEquals(45, o.p_nonwritable)
560
561 assertEquals(46, o.p_setter = 46)
562 assertEquals("p_setter", key)
563 assertEquals(46, val) // written to parent
564 assertFalse(Object.prototype.hasOwnProperty.call(o, "p_setter"))
565
566 val = ""
567 assertEquals(47, o.p_nosetter = 47)
568 assertEquals("p_nosetter", key)
569 assertEquals("", val) // not written at all
570 assertFalse(Object.prototype.hasOwnProperty.call(o, "p_nosetter"));
571
572 key = ""
573 assertThrows(function(){ "use strict"; o.p_nosetter = 50 }, TypeError)
574 assertEquals("p_nosetter", key)
575 assertEquals("", val) // not written at all
576
577 assertThrows(function(){ o.p_throw = 51 }, "myexn")
578 assertEquals("p_throw", key)
579
580 assertThrows(function(){ o.p_setterthrow = 52 }, "myexn")
581 assertEquals("p_setterthrow", key)
582 }
583
584 TestSetForDerived({
585 getOwnPropertyDescriptor: function(k) {
586 key = k;
587 switch (k) {
588 case "p_writable": return {writable: true}
589 case "p_nonwritable": return {writable: false}
590 case "p_setter":return {set: function(x) { val = x }}
591 case "p_nosetter": return {get: function() { return 1 }}
592 case "p_throw": throw "myexn"
593 case "p_setterthrow": return {set: function(x) { throw "myexn" }}
594 default: return undefined
595 }
596 }
597 })
598
599
600 // TODO(rossberg): TestSetReject, returning false
601 // TODO(rossberg): TestGetProperty, TestSetProperty
602
603
425 604
426 // Property definition (Object.defineProperty and Object.defineProperties). 605 // Property definition (Object.defineProperty and Object.defineProperties).
427 606
428 var key 607 var key
429 var desc 608 var desc
430 609
431 function TestDefine(handler) { 610 function TestDefine(handler) {
432 TestWithProxies(TestDefine2, handler) 611 TestWithProxies(TestDefine2, handler)
433 } 612 }
434 613
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 } 1000 }
822 }) 1001 })
823 1002
824 TestIn({ 1003 TestIn({
825 getPropertyDescriptor: function(k) { 1004 getPropertyDescriptor: function(k) {
826 key = k; return k < "z" ? {get value() { return 42 }} : void 0 1005 key = k; return k < "z" ? {get value() { return 42 }} : void 0
827 } 1006 }
828 }) 1007 })
829 1008
830 TestIn({ 1009 TestIn({
831 get: undefined, 1010 has: undefined,
832 getPropertyDescriptor: function(k) { 1011 getPropertyDescriptor: function(k) {
833 key = k; return k < "z" ? {value: 42} : void 0 1012 key = k; return k < "z" ? {value: 42} : void 0
834 } 1013 }
835 }) 1014 })
836 1015
837 TestIn(Proxy.create({ 1016 TestIn(Proxy.create({
838 get: function(pr, pk) { 1017 get: function(pr, pk) {
839 return function(k) { key = k; return k < "z" } 1018 return function(k) { key = k; return k < "z" }
840 } 1019 }
841 })) 1020 }))
(...skipping 25 matching lines...) Expand all
867 TestInThrow({ 1046 TestInThrow({
868 getPropertyDescriptor: function(k) { throw "myexn" } 1047 getPropertyDescriptor: function(k) { throw "myexn" }
869 }) 1048 })
870 1049
871 TestInThrow({ 1050 TestInThrow({
872 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) }, 1051 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) },
873 getPropertyDescriptor2: function(k) { throw "myexn" } 1052 getPropertyDescriptor2: function(k) { throw "myexn" }
874 }) 1053 })
875 1054
876 TestInThrow({ 1055 TestInThrow({
877 get: undefined, 1056 has: undefined,
878 getPropertyDescriptor: function(k) { throw "myexn" } 1057 getPropertyDescriptor: function(k) { throw "myexn" }
879 }) 1058 })
880 1059
881 TestInThrow(Proxy.create({ 1060 TestInThrow(Proxy.create({
882 get: function(pr, pk) { throw "myexn" } 1061 get: function(pr, pk) { throw "myexn" }
883 })) 1062 }))
884 1063
885 TestInThrow(Proxy.create({ 1064 TestInThrow(Proxy.create({
886 get: function(pr, pk) { 1065 get: function(pr, pk) {
887 return function(k) { throw "myexn" } 1066 return function(k) { throw "myexn" }
888 } 1067 }
889 })) 1068 }))
890 1069
891 1070
1071 /* TODO(rossberg): does not work yet, JSProxy::GetPropertyAttributeWithHandler
1072 * is not fully implemented.*/
1073 function TestInForDerived(handler) {
1074 TestWithProxies(TestInForDerived2, handler)
1075 }
1076
1077 function TestInForDerived2(handler, create) {
1078 var p = create(handler)
1079 var o = Object.create(p)
1080 assertTrue("a" in o)
1081 assertEquals("a", key)
1082 // TODO(rossberg): integer indexes not correctly imlemeted yet
1083 // assertTrue(99 in o)
1084 // assertEquals("99", key)
1085 assertFalse("z" in o)
1086 assertEquals("z", key)
1087
1088 assertEquals(2, ("a" in o) ? 2 : 0)
1089 assertEquals(0, !("a" in o) ? 2 : 0)
1090 assertEquals(0, ("zzz" in o) ? 2 : 0)
1091 assertEquals(2, !("zzz" in o) ? 2 : 0)
1092
1093 if ("b" in o) {
1094 } else {
1095 assertTrue(false)
1096 }
1097 assertEquals("b", key)
1098
1099 if ("zz" in o) {
1100 assertTrue(false)
1101 }
1102 assertEquals("zz", key)
1103
1104 if (!("c" in o)) {
1105 assertTrue(false)
1106 }
1107 assertEquals("c", key)
1108
1109 if (!("zzz" in o)) {
1110 } else {
1111 assertTrue(false)
1112 }
1113 assertEquals("zzz", key)
1114 }
1115
1116 TestInForDerived({
1117 getPropertyDescriptor: function(k) {
1118 key = k; return k < "z" ? {value: 42} : void 0
1119 }
1120 })
1121
1122 TestInForDerived({
1123 getPropertyDescriptor: function(k) { return this.getPropertyDescriptor2(k) },
1124 getPropertyDescriptor2: function(k) {
1125 key = k; return k < "z" ? {value: 42} : void 0
1126 }
1127 })
1128
1129 TestInForDerived({
1130 getPropertyDescriptor: function(k) {
1131 key = k; return k < "z" ? {get value() { return 42 }} : void 0
1132 }
1133 })
1134
1135 /* TODO(rossberg): this will work once we implement the newest proposal
1136 * regarding default traps for getPropertyDescriptor.
1137 TestInForDerived({
1138 getOwnPropertyDescriptor: function(k) {
1139 key = k; return k < "z" ? {value: 42} : void 0
1140 }
1141 })
1142
1143 TestInForDerived({
1144 getOwnPropertyDescriptor: function(k) {
1145 return this.getOwnPropertyDescriptor2(k)
1146 },
1147 getOwnPropertyDescriptor2: function(k) {
1148 key = k; return k < "z" ? {value: 42} : void 0
1149 }
1150 })
1151
1152 TestInForDerived({
1153 getOwnPropertyDescriptor: function(k) {
1154 key = k; return k < "z" ? {get value() { return 42 }} : void 0
1155 }
1156 })
1157 */
1158
1159 TestInForDerived(Proxy.create({
1160 get: function(pr, pk) {
1161 return function(k) { key = k; return k < "z" ? {value: 42} : void 0 }
1162 }
1163 }))
1164
1165
892 1166
893 // Own Properties (Object.prototype.hasOwnProperty). 1167 // Own Properties (Object.prototype.hasOwnProperty).
894 1168
895 var key 1169 var key
896 1170
897 function TestHasOwn(handler) { 1171 function TestHasOwn(handler) {
898 TestWithProxies(TestHasOwn2, handler) 1172 TestWithProxies(TestHasOwn2, handler)
899 } 1173 }
900 1174
901 function TestHasOwn2(handler, create) { 1175 function TestHasOwn2(handler, create) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 get: function(pr, pk) { 1271 get: function(pr, pk) {
998 return function(k) { throw "myexn" } 1272 return function(k) { throw "myexn" }
999 } 1273 }
1000 })) 1274 }))
1001 1275
1002 1276
1003 1277
1004 // Instanceof (instanceof) 1278 // Instanceof (instanceof)
1005 1279
1006 function TestInstanceof() { 1280 function TestInstanceof() {
1007 var o = {} 1281 var o1 = {}
1008 var p1 = Proxy.create({}) 1282 var p1 = Proxy.create({})
1009 var p2 = Proxy.create({}, o) 1283 var p2 = Proxy.create({}, o1)
1010 var p3 = Proxy.create({}, p2) 1284 var p3 = Proxy.create({}, p2)
1285 var o2 = Object.create(p2)
1011 1286
1012 var f0 = function() {} 1287 var f0 = function() {}
1013 f0.prototype = o 1288 f0.prototype = o1
1014 var f1 = function() {} 1289 var f1 = function() {}
1015 f1.prototype = p1 1290 f1.prototype = p1
1016 var f2 = function() {} 1291 var f2 = function() {}
1017 f2.prototype = p2 1292 f2.prototype = p2
1293 var f3 = function() {}
1294 f3.prototype = o2
1018 1295
1019 assertTrue(o instanceof Object) 1296 assertTrue(o1 instanceof Object)
1020 assertFalse(o instanceof f0) 1297 assertFalse(o1 instanceof f0)
1021 assertFalse(o instanceof f1) 1298 assertFalse(o1 instanceof f1)
1022 assertFalse(o instanceof f2) 1299 assertFalse(o1 instanceof f2)
1300 assertFalse(o1 instanceof f3)
1023 assertFalse(p1 instanceof Object) 1301 assertFalse(p1 instanceof Object)
1024 assertFalse(p1 instanceof f0) 1302 assertFalse(p1 instanceof f0)
1025 assertFalse(p1 instanceof f1) 1303 assertFalse(p1 instanceof f1)
1026 assertFalse(p1 instanceof f2) 1304 assertFalse(p1 instanceof f2)
1305 assertFalse(p1 instanceof f3)
1027 assertTrue(p2 instanceof Object) 1306 assertTrue(p2 instanceof Object)
1028 assertTrue(p2 instanceof f0) 1307 assertTrue(p2 instanceof f0)
1029 assertFalse(p2 instanceof f1) 1308 assertFalse(p2 instanceof f1)
1030 assertFalse(p2 instanceof f2) 1309 assertFalse(p2 instanceof f2)
1310 assertFalse(p2 instanceof f3)
1031 assertTrue(p3 instanceof Object) 1311 assertTrue(p3 instanceof Object)
1032 assertTrue(p3 instanceof f0) 1312 assertTrue(p3 instanceof f0)
1033 assertFalse(p3 instanceof f1) 1313 assertFalse(p3 instanceof f1)
1034 assertTrue(p3 instanceof f2) 1314 assertTrue(p3 instanceof f2)
1315 assertFalse(p3 instanceof f3)
1316 assertTrue(o2 instanceof Object)
1317 assertTrue(o2 instanceof f0)
1318 assertFalse(o2 instanceof f1)
1319 assertTrue(o2 instanceof f2)
1320 assertFalse(o2 instanceof f3)
1035 1321
1036 var f = Proxy.createFunction({}, function() {}) 1322 var f = Proxy.createFunction({}, function() {})
1037 assertTrue(f instanceof Function) 1323 assertTrue(f instanceof Function)
1038 } 1324 }
1039 1325
1040 TestInstanceof() 1326 TestInstanceof()
1041 1327
1042 1328
1043 1329
1044 // Prototype (Object.getPrototypeOf, Object.prototype.isPrototypeOf). 1330 // Prototype (Object.getPrototypeOf, Object.prototype.isPrototypeOf).
1045 1331
1046 function TestPrototype() { 1332 function TestPrototype() {
1047 var o = {} 1333 var o1 = {}
1048 var p1 = Proxy.create({}) 1334 var p1 = Proxy.create({})
1049 var p2 = Proxy.create({}, o) 1335 var p2 = Proxy.create({}, o1)
1050 var p3 = Proxy.create({}, p2) 1336 var p3 = Proxy.create({}, p2)
1051 var p4 = Proxy.create({}, 666) 1337 var p4 = Proxy.create({}, 666)
1338 var o2 = Object.create(p3)
1052 1339
1053 assertSame(Object.getPrototypeOf(o), Object.prototype) 1340 assertSame(Object.getPrototypeOf(o1), Object.prototype)
1054 assertSame(Object.getPrototypeOf(p1), null) 1341 assertSame(Object.getPrototypeOf(p1), null)
1055 assertSame(Object.getPrototypeOf(p2), o) 1342 assertSame(Object.getPrototypeOf(p2), o1)
1056 assertSame(Object.getPrototypeOf(p3), p2) 1343 assertSame(Object.getPrototypeOf(p3), p2)
1057 assertSame(Object.getPrototypeOf(p4), null) 1344 assertSame(Object.getPrototypeOf(p4), null)
1345 assertSame(Object.getPrototypeOf(o2), p3)
1058 1346
1059 assertTrue(Object.prototype.isPrototypeOf(o)) 1347 assertTrue(Object.prototype.isPrototypeOf(o1))
1060 assertFalse(Object.prototype.isPrototypeOf(p1)) 1348 assertFalse(Object.prototype.isPrototypeOf(p1))
1061 assertTrue(Object.prototype.isPrototypeOf(p2)) 1349 assertTrue(Object.prototype.isPrototypeOf(p2))
1062 assertTrue(Object.prototype.isPrototypeOf(p3)) 1350 assertTrue(Object.prototype.isPrototypeOf(p3))
1063 assertFalse(Object.prototype.isPrototypeOf(p4)) 1351 assertFalse(Object.prototype.isPrototypeOf(p4))
1064 assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, o)) 1352 assertTrue(Object.prototype.isPrototypeOf(o2))
1353 assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, o1))
1065 assertFalse(Object.prototype.isPrototypeOf.call(Object.prototype, p1)) 1354 assertFalse(Object.prototype.isPrototypeOf.call(Object.prototype, p1))
1066 assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, p2)) 1355 assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, p2))
1067 assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, p3)) 1356 assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, p3))
1068 assertFalse(Object.prototype.isPrototypeOf.call(Object.prototype, p4)) 1357 assertFalse(Object.prototype.isPrototypeOf.call(Object.prototype, p4))
1069 assertFalse(Object.prototype.isPrototypeOf.call(o, o)) 1358 assertTrue(Object.prototype.isPrototypeOf.call(Object.prototype, o2))
1070 assertFalse(Object.prototype.isPrototypeOf.call(o, p1)) 1359 assertFalse(Object.prototype.isPrototypeOf.call(o1, o1))
1071 assertTrue(Object.prototype.isPrototypeOf.call(o, p2)) 1360 assertFalse(Object.prototype.isPrototypeOf.call(o1, p1))
1072 assertTrue(Object.prototype.isPrototypeOf.call(o, p3)) 1361 assertTrue(Object.prototype.isPrototypeOf.call(o1, p2))
1073 assertFalse(Object.prototype.isPrototypeOf.call(o, p4)) 1362 assertTrue(Object.prototype.isPrototypeOf.call(o1, p3))
1363 assertFalse(Object.prototype.isPrototypeOf.call(o1, p4))
1364 assertTrue(Object.prototype.isPrototypeOf.call(o1, o2))
1074 assertFalse(Object.prototype.isPrototypeOf.call(p1, p1)) 1365 assertFalse(Object.prototype.isPrototypeOf.call(p1, p1))
1075 assertFalse(Object.prototype.isPrototypeOf.call(p1, o)) 1366 assertFalse(Object.prototype.isPrototypeOf.call(p1, o1))
1076 assertFalse(Object.prototype.isPrototypeOf.call(p1, p2)) 1367 assertFalse(Object.prototype.isPrototypeOf.call(p1, p2))
1077 assertFalse(Object.prototype.isPrototypeOf.call(p1, p3)) 1368 assertFalse(Object.prototype.isPrototypeOf.call(p1, p3))
1078 assertFalse(Object.prototype.isPrototypeOf.call(p1, p4)) 1369 assertFalse(Object.prototype.isPrototypeOf.call(p1, p4))
1370 assertFalse(Object.prototype.isPrototypeOf.call(p1, o2))
1079 assertFalse(Object.prototype.isPrototypeOf.call(p2, p1)) 1371 assertFalse(Object.prototype.isPrototypeOf.call(p2, p1))
1080 assertFalse(Object.prototype.isPrototypeOf.call(p2, p2)) 1372 assertFalse(Object.prototype.isPrototypeOf.call(p2, p2))
1081 assertTrue(Object.prototype.isPrototypeOf.call(p2, p3)) 1373 assertTrue(Object.prototype.isPrototypeOf.call(p2, p3))
1082 assertFalse(Object.prototype.isPrototypeOf.call(p2, p4)) 1374 assertFalse(Object.prototype.isPrototypeOf.call(p2, p4))
1375 assertTrue(Object.prototype.isPrototypeOf.call(p2, o2))
1083 assertFalse(Object.prototype.isPrototypeOf.call(p3, p2)) 1376 assertFalse(Object.prototype.isPrototypeOf.call(p3, p2))
1377 assertTrue(Object.prototype.isPrototypeOf.call(p3, o2))
1378 assertFalse(Object.prototype.isPrototypeOf.call(o2, o1))
1379 assertFalse(Object.prototype.isPrototypeOf.call(o2, p1))
1380 assertFalse(Object.prototype.isPrototypeOf.call(o2, p2))
1381 assertFalse(Object.prototype.isPrototypeOf.call(o2, p3))
1382 assertFalse(Object.prototype.isPrototypeOf.call(o2, p4))
1383 assertFalse(Object.prototype.isPrototypeOf.call(o2, o2))
1084 1384
1085 var f = Proxy.createFunction({}, function() {}) 1385 var f = Proxy.createFunction({}, function() {})
1086 assertSame(Object.getPrototypeOf(f), Function.prototype) 1386 assertSame(Object.getPrototypeOf(f), Function.prototype)
1087 assertTrue(Object.prototype.isPrototypeOf(f)) 1387 assertTrue(Object.prototype.isPrototypeOf(f))
1088 assertTrue(Object.prototype.isPrototypeOf.call(Function.prototype, f)) 1388 assertTrue(Object.prototype.isPrototypeOf.call(Function.prototype, f))
1089 } 1389 }
1090 1390
1091 TestPrototype() 1391 TestPrototype()
1092 1392
1093 1393
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 return function() { return [1, 2] } 1558 return function() { return [1, 2] }
1259 }, 1559 },
1260 getOwnPropertyDescriptor: function(k) { throw "myexn" } 1560 getOwnPropertyDescriptor: function(k) { throw "myexn" }
1261 }) 1561 })
1262 1562
1263 1563
1264 1564
1265 // Fixing (Object.freeze, Object.seal, Object.preventExtensions, 1565 // Fixing (Object.freeze, Object.seal, Object.preventExtensions,
1266 // Object.isFrozen, Object.isSealed, Object.isExtensible) 1566 // Object.isFrozen, Object.isSealed, Object.isExtensible)
1267 1567
1268 // TODO(rossberg): use TestWithProxies to include funciton proxies 1568 // TODO(rossberg): use TestWithProxies to include function proxies
1269 function TestFix(names, handler) { 1569 function TestFix(names, handler) {
1270 var proto = {p: 77} 1570 var proto = {p: 77}
1271 var assertFixing = function(o, s, f, e) { 1571 var assertFixing = function(o, s, f, e) {
1272 assertEquals(s, Object.isSealed(o)) 1572 assertEquals(s, Object.isSealed(o))
1273 assertEquals(f, Object.isFrozen(o)) 1573 assertEquals(f, Object.isFrozen(o))
1274 assertEquals(e, Object.isExtensible(o)) 1574 assertEquals(e, Object.isExtensible(o))
1275 } 1575 }
1276 1576
1277 var p1 = Proxy.create(handler, proto) 1577 var p1 = Proxy.create(handler, proto)
1278 assertFixing(p1, false, false, true) 1578 assertFixing(p1, false, false, true)
(...skipping 26 matching lines...) Expand all
1305 1605
1306 var p3 = Proxy.create(handler, proto) 1606 var p3 = Proxy.create(handler, proto)
1307 assertFixing(p3, false, false, true) 1607 assertFixing(p3, false, false, true)
1308 Object.preventExtensions(p3) 1608 Object.preventExtensions(p3)
1309 assertFixing(p3, names.length === 0, names.length === 0, false) 1609 assertFixing(p3, names.length === 0, names.length === 0, false)
1310 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort()) 1610 assertArrayEquals(names.sort(), Object.getOwnPropertyNames(p3).sort())
1311 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(), 1611 assertArrayEquals(names.filter(function(x) {return x < "z"}).sort(),
1312 Object.keys(p3).sort()) 1612 Object.keys(p3).sort())
1313 assertEquals(proto, Object.getPrototypeOf(p3)) 1613 assertEquals(proto, Object.getPrototypeOf(p3))
1314 assertEquals(77, p3.p) 1614 assertEquals(77, p3.p)
1615
1616 var p = Proxy.create(handler, proto)
1617 var o = Object.create(p)
1618 assertFixing(p, false, false, true)
1619 assertFixing(o, false, false, true)
1620 Object.freeze(o)
1621 assertFixing(p, false, false, true)
1622 assertFixing(o, true, true, false)
1315 } 1623 }
1316 1624
1317 TestFix([], { 1625 TestFix([], {
1318 fix: function() { return {} } 1626 fix: function() { return {} }
1319 }) 1627 })
1320 1628
1321 TestFix(["a", "b", "c", "d", "zz"], { 1629 TestFix(["a", "b", "c", "d", "zz"], {
1322 fix: function() { 1630 fix: function() {
1323 return { 1631 return {
1324 a: {value: "a", writable: true, configurable: false, enumerable: true}, 1632 a: {value: "a", writable: true, configurable: false, enumerable: true},
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 assertEquals("", key) 1722 assertEquals("", key)
1415 assertEquals("my_proxy", Object.prototype.toLocaleString.call(p)) 1723 assertEquals("my_proxy", Object.prototype.toLocaleString.call(p))
1416 assertEquals("toString", key) 1724 assertEquals("toString", key)
1417 1725
1418 var f = Proxy.createFunction(handler, function() {}) 1726 var f = Proxy.createFunction(handler, function() {})
1419 key = "" 1727 key = ""
1420 assertEquals("[object Function]", Object.prototype.toString.call(f)) 1728 assertEquals("[object Function]", Object.prototype.toString.call(f))
1421 assertEquals("", key) 1729 assertEquals("", key)
1422 assertEquals("my_proxy", Object.prototype.toLocaleString.call(f)) 1730 assertEquals("my_proxy", Object.prototype.toLocaleString.call(f))
1423 assertEquals("toString", key) 1731 assertEquals("toString", key)
1732
1733 var o = Object.create(p)
1734 key = ""
1735 assertEquals("[object Object]", Object.prototype.toString.call(o))
1736 assertEquals("", key)
1737 assertEquals("my_proxy", Object.prototype.toLocaleString.call(o))
1738 assertEquals("toString", key)
1424 } 1739 }
1425 1740
1426 TestToString({ 1741 TestToString({
1427 get: function(r, k) { key = k; return function() { return "my_proxy" } } 1742 get: function(r, k) { key = k; return function() { return "my_proxy" } }
1428 }) 1743 })
1429 1744
1430 TestToString({ 1745 TestToString({
1431 get: function(r, k) { return this.get2(r, k) }, 1746 get: function(r, k) { return this.get2(r, k) },
1432 get2: function(r, k) { key = k; return function() { return "my_proxy" } } 1747 get2: function(r, k) { key = k; return function() { return "my_proxy" } }
1433 }) 1748 })
1434 1749
1435 TestToString(Proxy.create({ 1750 TestToString(Proxy.create({
1436 get: function(pr, pk) { 1751 get: function(pr, pk) {
1437 return function(r, k) { key = k; return function() { return "my_proxy" } } 1752 return function(r, k) { key = k; return function() { return "my_proxy" } }
1438 } 1753 }
1439 })) 1754 }))
1440 1755
1441 1756
1442 function TestToStringThrow(handler) { 1757 function TestToStringThrow(handler) {
1443 var p = Proxy.create(handler) 1758 var p = Proxy.create(handler)
1444 assertEquals("[object Object]", Object.prototype.toString.call(p)) 1759 assertEquals("[object Object]", Object.prototype.toString.call(p))
1445 assertThrows(function(){ Object.prototype.toLocaleString.call(p) }, "myexn") 1760 assertThrows(function(){ Object.prototype.toLocaleString.call(p) }, "myexn")
1446 1761
1447 var f = Proxy.createFunction(handler, function() {}) 1762 var f = Proxy.createFunction(handler, function() {})
1448 assertEquals("[object Function]", Object.prototype.toString.call(f)) 1763 assertEquals("[object Function]", Object.prototype.toString.call(f))
1449 assertThrows(function(){ Object.prototype.toLocaleString.call(f) }, "myexn") 1764 assertThrows(function(){ Object.prototype.toLocaleString.call(f) }, "myexn")
1765
1766 var o = Object.create(p)
1767 assertEquals("[object Object]", Object.prototype.toString.call(o))
1768 assertThrows(function(){ Object.prototype.toLocaleString.call(o) }, "myexn")
1450 } 1769 }
1451 1770
1452 TestToStringThrow({ 1771 TestToStringThrow({
1453 get: function(r, k) { throw "myexn" } 1772 get: function(r, k) { throw "myexn" }
1454 }) 1773 })
1455 1774
1456 TestToStringThrow({ 1775 TestToStringThrow({
1457 get: function(r, k) { return function() { throw "myexn" } } 1776 get: function(r, k) { return function() { throw "myexn" } }
1458 }) 1777 })
1459 1778
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1498 } 1817 }
1499 1818
1500 function TestIsEnumerable2(handler, create) { 1819 function TestIsEnumerable2(handler, create) {
1501 var p = create(handler) 1820 var p = create(handler)
1502 assertTrue(Object.prototype.propertyIsEnumerable.call(p, "a")) 1821 assertTrue(Object.prototype.propertyIsEnumerable.call(p, "a"))
1503 assertEquals("a", key) 1822 assertEquals("a", key)
1504 assertTrue(Object.prototype.propertyIsEnumerable.call(p, 2)) 1823 assertTrue(Object.prototype.propertyIsEnumerable.call(p, 2))
1505 assertEquals("2", key) 1824 assertEquals("2", key)
1506 assertFalse(Object.prototype.propertyIsEnumerable.call(p, "z")) 1825 assertFalse(Object.prototype.propertyIsEnumerable.call(p, "z"))
1507 assertEquals("z", key) 1826 assertEquals("z", key)
1827
1828 var o = Object.create(p)
1829 key = ""
1830 assertFalse(Object.prototype.propertyIsEnumerable.call(o, "a"))
1831 assertEquals("", key) // trap not invoked
1508 } 1832 }
1509 1833
1510 TestIsEnumerable({ 1834 TestIsEnumerable({
1511 getOwnPropertyDescriptor: function(k) { 1835 getOwnPropertyDescriptor: function(k) {
1512 key = k; return {enumerable: k < "z", configurable: true} 1836 key = k; return {enumerable: k < "z", configurable: true}
1513 }, 1837 },
1514 }) 1838 })
1515 1839
1516 TestIsEnumerable({ 1840 TestIsEnumerable({
1517 getOwnPropertyDescriptor: function(k) { 1841 getOwnPropertyDescriptor: function(k) {
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
1803 2127
1804 function TestConstructThrow2(f) { 2128 function TestConstructThrow2(f) {
1805 assertThrows(function(){ new f(11) }, "myexn") 2129 assertThrows(function(){ new f(11) }, "myexn")
1806 Object.freeze(f) 2130 Object.freeze(f)
1807 assertThrows(function(){ new f(11) }, "myexn") 2131 assertThrows(function(){ new f(11) }, "myexn")
1808 } 2132 }
1809 2133
1810 TestConstructThrow(function() { throw "myexn" }) 2134 TestConstructThrow(function() { throw "myexn" })
1811 TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn" })) 2135 TestConstructThrow(Proxy.createFunction({}, function() { throw "myexn" }))
1812 TestConstructThrow(CreateFrozen({}, function() { throw "myexn" })) 2136 TestConstructThrow(CreateFrozen({}, function() { throw "myexn" }))
OLDNEW
« no previous file with comments | « src/runtime.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698