OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 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 --strong-mode |
| 6 |
| 7 // Forwarding proxies adapted from proposal definition |
| 8 function handlerMaker1(obj) { |
| 9 return { |
| 10 getPropertyDescriptor: function(name) { |
| 11 var desc; |
| 12 var searchObj = obj; |
| 13 while (desc === undefined && searchObj != null) { |
| 14 desc = Object.getOwnPropertyDescriptor(searchObj, name); |
| 15 searchObj = searchObj.__proto__; |
| 16 } |
| 17 // a trapping proxy's properties must always be configurable |
| 18 if (desc !== undefined) { desc.configurable = true; } |
| 19 return desc; |
| 20 }, |
| 21 fix: function() { |
| 22 if (Object.isFrozen(obj)) { |
| 23 var result = {}; |
| 24 Object.getOwnPropertyNames(obj).forEach(function(name) { |
| 25 result[name] = Object.getOwnPropertyDescriptor(obj, name); |
| 26 }); |
| 27 return result; |
| 28 } |
| 29 // As long as obj is not frozen, the proxy won't allow itself to be fixed |
| 30 return undefined; // will cause a TypeError to be thrown |
| 31 } |
| 32 }; |
| 33 } |
| 34 function handlerMaker2(obj) { |
| 35 return { |
| 36 get: function(receiver, name) { |
| 37 return obj[name]; |
| 38 }, |
| 39 fix: function() { |
| 40 if (Object.isFrozen(obj)) { |
| 41 var result = {}; |
| 42 Object.getOwnPropertyNames(obj).forEach(function(name) { |
| 43 result[name] = Object.getOwnPropertyDescriptor(obj, name); |
| 44 }); |
| 45 return result; |
| 46 } |
| 47 // As long as obj is not frozen, the proxy won't allow itself to be fixed |
| 48 return undefined; // will cause a TypeError to be thrown |
| 49 } |
| 50 }; |
| 51 } |
| 52 var baseObj = {}; |
| 53 var proxy1 = Proxy.create(handlerMaker1(baseObj)); |
| 54 var proxy2 = Proxy.create(handlerMaker2(baseObj)); |
| 55 var childObj1 = { __proto__: proxy1 }; |
| 56 var childObj2 = { __proto__: proxy2 }; |
| 57 var childObjAccessor1 = { set foo(_){}, set "1"(_){}, __proto__: proxy1 }; |
| 58 var childObjAccessor2 = { set foo(_){}, set "1"(_){}, __proto__: proxy2 }; |
| 59 |
| 60 (function() { |
| 61 "use strong"; |
| 62 // TODO(conradw): These asserts are sanity checking V8's proxy implementation. |
| 63 // Strong mode semantics for ES6 proxies still need to be explored. |
| 64 assertDoesNotThrow(function(){proxy1.foo}); |
| 65 assertDoesNotThrow(function(){proxy1[1]}); |
| 66 assertDoesNotThrow(function(){proxy2.foo}); |
| 67 assertDoesNotThrow(function(){proxy2[1]}); |
| 68 assertDoesNotThrow(function(){childObj1.foo}); |
| 69 assertDoesNotThrow(function(){childObj1[1]}); |
| 70 assertDoesNotThrow(function(){childObj2.foo}); |
| 71 assertDoesNotThrow(function(){childObj2[1]}); |
| 72 assertThrows(function(){baseObj.foo}, TypeError); |
| 73 assertThrows(function(){baseObj[1]}, TypeError); |
| 74 assertThrows(function(){childObjAccessor1.foo}, TypeError); |
| 75 assertThrows(function(){childObjAccessor1[1]}, TypeError); |
| 76 assertThrows(function(){childObjAccessor2.foo}, TypeError); |
| 77 assertThrows(function(){childObjAccessor2[1]}, TypeError); |
| 78 |
| 79 // Once the proxy is no longer trapping, property access should have strong |
| 80 // semantics. |
| 81 Object.freeze(baseObj); |
| 82 Object.freeze(proxy1); |
| 83 Object.freeze(proxy2); |
| 84 assertThrows(function(){proxy1.foo}, TypeError); |
| 85 assertThrows(function(){proxy1[1]}, TypeError); |
| 86 assertThrows(function(){proxy2.foo}, TypeError); |
| 87 assertThrows(function(){proxy2[1]}, TypeError); |
| 88 assertThrows(function(){childObj1.foo}, TypeError); |
| 89 assertThrows(function(){childObj1[1]}, TypeError); |
| 90 assertThrows(function(){childObj2.foo}, TypeError); |
| 91 assertThrows(function(){childObj2[1]}, TypeError); |
| 92 assertThrows(function(){childObjAccessor1.foo}, TypeError); |
| 93 assertThrows(function(){childObjAccessor1[1]}, TypeError); |
| 94 assertThrows(function(){childObjAccessor2.foo}, TypeError); |
| 95 assertThrows(function(){childObjAccessor2[1]}, TypeError); |
| 96 })(); |
OLD | NEW |