| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Flags: --harmony-proxies | |
| 6 | |
| 7 | |
| 8 function TestBasics() { | |
| 9 var log = []; | |
| 10 | |
| 11 var proxy = new Proxy({}, { | |
| 12 get: function(target, key) { | |
| 13 log.push("get " + String(key)); | |
| 14 if (key === 'x') return 1; | |
| 15 }, | |
| 16 has: function(target, key) { | |
| 17 log.push("has " + String(key)); | |
| 18 if (key === 'x') return true; | |
| 19 return false; | |
| 20 } | |
| 21 }); | |
| 22 | |
| 23 var x = 'local'; | |
| 24 | |
| 25 with (proxy) { | |
| 26 assertEquals(1, x); | |
| 27 } | |
| 28 | |
| 29 assertEquals(['has assertEquals', 'has x', 'get Symbol(Symbol.unscopables)', | |
| 30 'get x'], log); | |
| 31 } | |
| 32 TestBasics(); | |
| 33 | |
| 34 | |
| 35 function TestInconsistent() { | |
| 36 var log = []; | |
| 37 | |
| 38 var proxy = new Proxy({}, { | |
| 39 get: function(target, key) { | |
| 40 log.push("get " + String(key)); | |
| 41 return undefined; | |
| 42 }, | |
| 43 has: function(target, key) { | |
| 44 log.push("has " + String(key)); | |
| 45 if (key === 'x') return true; | |
| 46 return false; | |
| 47 } | |
| 48 }); | |
| 49 | |
| 50 var x = 'local'; | |
| 51 | |
| 52 with (proxy) { | |
| 53 assertEquals(void 0, x); | |
| 54 } | |
| 55 | |
| 56 assertEquals(['has assertEquals', 'has x', 'get Symbol(Symbol.unscopables)', | |
| 57 'get x'], log); | |
| 58 } | |
| 59 TestInconsistent(); | |
| 60 | |
| 61 | |
| 62 function TestUseProxyAsUnscopables() { | |
| 63 var x = 1; | |
| 64 var object = { | |
| 65 x: 2 | |
| 66 }; | |
| 67 var calls = 0; | |
| 68 var proxy = new Proxy({}, { | |
| 69 has: function() { | |
| 70 assertUnreachable(); | |
| 71 }, | |
| 72 get: function(target, key) { | |
| 73 assertEquals('x', key); | |
| 74 calls++; | |
| 75 return calls === 2 ? true : undefined; | |
| 76 } | |
| 77 }); | |
| 78 | |
| 79 object[Symbol.unscopables] = proxy; | |
| 80 | |
| 81 with (object) { | |
| 82 assertEquals(2, x); | |
| 83 assertEquals(1, x); | |
| 84 } | |
| 85 | |
| 86 // HasBinding, HasBinding | |
| 87 assertEquals(2, calls); | |
| 88 } | |
| 89 TestUseProxyAsUnscopables(); | |
| 90 | |
| 91 | |
| 92 function TestThrowInHasUnscopables() { | |
| 93 var x = 1; | |
| 94 var object = { | |
| 95 x: 2 | |
| 96 }; | |
| 97 | |
| 98 function CustomError() {} | |
| 99 | |
| 100 var calls = 0; | |
| 101 var proxy = new Proxy({}, { | |
| 102 has: function() { | |
| 103 assertUnreachable(); | |
| 104 }, | |
| 105 get: function(target, key) { | |
| 106 if (calls++ === 0) { | |
| 107 throw new CustomError(); | |
| 108 } | |
| 109 assertUnreachable(); | |
| 110 } | |
| 111 }); | |
| 112 | |
| 113 object[Symbol.unscopables] = proxy; | |
| 114 | |
| 115 assertThrows(function() { | |
| 116 with (object) { | |
| 117 x; | |
| 118 } | |
| 119 }, CustomError); | |
| 120 } | |
| 121 TestThrowInHasUnscopables(); | |
| 122 | |
| 123 | |
| 124 var global = this; | |
| 125 function TestGlobalShouldIgnoreUnscopables() { | |
| 126 global.x = 1; | |
| 127 var proxy = new Proxy({}, { | |
| 128 get: function() { | |
| 129 assertUnreachable(); | |
| 130 }, | |
| 131 has: function() { | |
| 132 assertUnreachable(); | |
| 133 } | |
| 134 }); | |
| 135 global[Symbol.unscopables] = proxy; | |
| 136 | |
| 137 assertEquals(1, global.x); | |
| 138 assertEquals(1, x); | |
| 139 | |
| 140 global.x = 2; | |
| 141 assertEquals(2, global.x); | |
| 142 assertEquals(2, x); | |
| 143 | |
| 144 x = 3; | |
| 145 assertEquals(3, global.x); | |
| 146 assertEquals(3, x); | |
| 147 } | |
| 148 TestGlobalShouldIgnoreUnscopables(); | |
| OLD | NEW |