Home | History | Annotate | Download | only in harmony
      1 // Copyright 2011 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     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.
     27 
     28 // Flags: --harmony-proxies
     29 
     30 
     31 // Helper.
     32 
     33 function TestWithProxies(test, x, y, z) {
     34   test(function(h) { return new Proxy({}, h) }, x, y, z)
     35   test(function(h) {
     36       return new Proxy(function() {}, h)
     37   }, x, y, z)
     38 }
     39 
     40 
     41 
     42 // Getting.
     43 
     44 function TestWithGet(handler) {
     45   TestWithProxies(TestWithGet2, handler)
     46 }
     47 
     48 var c = "global"
     49 var key = ""
     50 
     51 function TestWithGet2(create, handler) {
     52   var b = "local"
     53 
     54   var p = create(handler);
     55   assertEquals("onproxy", p.a);
     56   assertEquals(undefined, p.b);
     57   assertEquals(undefined, p.c);
     58 
     59   with (p) {
     60     assertEquals("onproxy", a);
     61     assertEquals("local", b);
     62     assertEquals("global", c);
     63   }
     64 
     65   var o = Object.create(p, {d: {value: "own"}})
     66   with (o) {
     67     assertEquals("onproxy", a)
     68     assertEquals("local", b);
     69     assertEquals("global", c)
     70     assertEquals("own", d)
     71   }
     72 }
     73 
     74 TestWithGet({
     75   get(target, k) {
     76     key = k;
     77     return k === "a" ? "onproxy" : undefined
     78   },
     79   has(target, k) { return k === 'a' }
     80 })
     81 
     82 TestWithGet({
     83   get: function(r, k) { return this.get2(r, k) },
     84   get2: function(r, k) { key = k; return k === "a" ? "onproxy" : undefined },
     85   has(target, k) { return k === 'a' }
     86 })
     87 
     88 
     89 
     90 
     91 // Invoking.
     92 
     93 function TestWithGetCall(handler) {
     94   TestWithProxies(TestWithGetCall2, handler)
     95 }
     96 
     97 var receiver = null
     98 var c = function() { return "global" }
     99 
    100 function TestWithGetCall2(create, handler) {
    101   var b = function() { return "local" }
    102 
    103   var p = create(handler)
    104   with (p) {
    105     receiver = null
    106     assertEquals("onproxy", a())
    107     assertSame(p, receiver)
    108     assertEquals("local", b())
    109     assertEquals("global", c())
    110   }
    111 
    112   var o = Object.create(p, {d: {value: function() { return "own" }}})
    113   with (o) {
    114     receiver = null
    115     assertEquals("onproxy", a())
    116     assertSame(o, receiver)
    117     assertEquals("local", b())
    118     assertEquals("global", c())
    119     assertEquals("own", d())
    120   }
    121 }
    122 
    123 function onproxy() { receiver = this; return "onproxy" }
    124 
    125 TestWithGetCall({
    126   get: function(r, k) { key = k; return k === "a" ? onproxy : undefined },
    127   has: function(t, k) {
    128     key = k;
    129     return k === "a";
    130   }
    131 })
    132 
    133 TestWithGetCall({
    134   get: function(r, k) { return this.get2(r, k) },
    135   get2: function(r, k) { key = k; return k === "a" ? onproxy : undefined },
    136   has: function(t, k) {
    137     key = k;
    138     return k === "a";
    139   }
    140 })
    141 
    142 TestWithGetCall({
    143   get: function(r, k) { key = k; return k === "a" ? onproxy : undefined },
    144   has: function(t, k) {
    145     return this.has2(k)
    146   },
    147   has2: function(k) {
    148     key = k;
    149     return k === "a";
    150   }
    151 })
    152 
    153 TestWithGetCall({
    154   get: function(r, k) { key = k; return k === "a" ? onproxy : undefined },
    155   has: function(t, k) {
    156     key = k;
    157     return k === "a";
    158   }
    159 })
    160 
    161 
    162 function TestWithGetCallThrow(handler) {
    163   TestWithProxies(TestWithGetCallThrow2, handler)
    164 }
    165 
    166 function TestWithGetCallThrow2(create, handler) {
    167   var b = function() { return "local" }
    168 
    169   var p = create(handler)
    170   with (p) {
    171     assertThrowsEquals(function(){ a() }, "myexn")
    172     assertEquals("local", b())
    173     assertEquals("global", c())
    174   }
    175 
    176   var o = Object.create(p, {d: {value: function() { return "own" }}})
    177   with (o) {
    178     assertThrowsEquals(function(){ a() }, "myexn")
    179     assertEquals("local", b())
    180     assertEquals("global", c())
    181     assertEquals("own", d())
    182   }
    183 }
    184 
    185 function onproxythrow() { throw "myexn" }
    186 
    187 TestWithGetCallThrow({
    188   has: function(r, k) { return k === "a"; },
    189   get: function(r, k) { key = k; return k === "a" ? onproxythrow : undefined },
    190 })
    191 
    192 TestWithGetCallThrow({
    193   has: function(r, k) { return k === "a"; },
    194   get: function(r, k) { return this.get2(r, k) },
    195   get2: function(r, k) { key = k; return k === "a" ? onproxythrow : undefined },
    196 })
    197 
    198 
    199 
    200 // Setting.
    201 
    202 var key
    203 var val
    204 
    205 function TestWithSet(handler, hasSetter) {
    206   TestWithProxies(TestWithSet2, handler, hasSetter)
    207 }
    208 
    209 var c = "global"
    210 
    211 function TestWithSet2(create, handler, hasSetter) {
    212   var b = "local"
    213 
    214   var p = create(handler)
    215   key = val = undefined
    216   with (p) {
    217     a = "set"
    218     assertEquals("a", key)
    219     assertEquals("set", val)
    220     assertEquals("local", b)
    221     assertEquals("global", c)
    222     b = "local"
    223     c = "global"
    224     assertEquals("a", key)
    225     assertEquals("set", val)
    226   }
    227 
    228   if (!hasSetter) return
    229 
    230   var o = Object.create(p, {d: {value: "own"}})
    231   key = val = undefined
    232   with (o) {
    233     a = "set"
    234     assertEquals("a", key)
    235     assertEquals("set", val)
    236     assertEquals("local", b)
    237     assertEquals("global", c)
    238     assertEquals("own", d)
    239     b = "local"
    240     c = "global"
    241     d = "own"
    242     assertEquals("a", key)
    243     assertEquals("set", val)
    244   }
    245 }
    246 
    247 TestWithSet({
    248   set: function(r, k, v) { key = k; val = v; return true },
    249   has: function(t, k) {
    250     return k === "a"
    251   }
    252 })
    253 
    254 TestWithSet({
    255   set: function(r, k, v) { return this.set2(r, k, v) },
    256   set2: function(r, k, v) { key = k; val = v; return true },
    257   has: function(t, k) {
    258     return k === "a"
    259   }
    260 })
    261 
    262 TestWithSet({
    263   has: function(t, k) {
    264     return k === "a"
    265   },
    266   defineProperty: function(t, k, desc) { key = k; val = desc.value }
    267 })
    268 
    269 TestWithSet({
    270   has: function(t, k) {
    271     return this.has2(k)
    272   },
    273   has2: function(k) {
    274     return k === "a"
    275   },
    276   defineProperty: function(t, k, desc) { this.defineProperty2(k, desc) },
    277   defineProperty2: function(k, desc) { key = k; val = desc.value }
    278 })
    279 
    280 TestWithSet({
    281   has: function(t, k) {
    282     return k === "a"
    283   },
    284   defineProperty: function(t, k, desc) { key = k; val = desc.value }
    285 })
    286 
    287 TestWithSet({
    288   has: function(t, k) {
    289     return this.has2(k) },
    290   has2: function(k) {
    291     return k === "a"
    292   },
    293   set: function(t, k, v) { key = k; val = v; return true }
    294 }, true)
    295 
    296 TestWithSet({
    297   has: function(t, k) {
    298     return k === "a"
    299   },
    300   defineProperty: function(t, k, desc) { key = k; val = desc.value }
    301 })
    302 
    303 
    304 function TestWithSetThrow(handler, hasSetter) {
    305   TestWithProxies(TestWithSetThrow2, handler, hasSetter)
    306 }
    307 
    308 function TestWithSetThrow2(create, handler, hasSetter) {
    309   var p = create(handler)
    310   assertThrowsEquals(function(){
    311     with (p) {
    312       a = 1
    313     }
    314   }, "myexn")
    315 
    316   if (!hasSetter) return
    317 
    318   var o = Object.create(p, {})
    319   assertThrowsEquals(function(){
    320     with (o) {
    321       a = 1
    322     }
    323   }, "myexn")
    324 }
    325 
    326 TestWithSetThrow({
    327   set: function() { throw "myexn" },
    328   has: function(t, k) {
    329     return k === "a"
    330   }
    331 })
    332 
    333 TestWithSetThrow({
    334   has: function() { throw "myexn" },
    335 })
    336 
    337 TestWithSetThrow({
    338   has: function() { throw "myexn" },
    339 })
    340 
    341 TestWithSetThrow({
    342   has: function(t, k) {
    343     return k === "a"
    344   },
    345   defineProperty: function() { throw "myexn" }
    346 })
    347 
    348 TestWithSetThrow({
    349   has: function(t, k) {
    350     return k === "a"
    351   },
    352   set: function() { throw "myexn" }
    353 }, true)
    354