Home | History | Annotate | Download | only in regress
      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: --es52_globals
     29 
     30 var setter_value = 0;
     31 
     32 this.__defineSetter__("a", function(v) { setter_value = v; });
     33 eval("var a = 1");
     34 assertEquals(1, setter_value);
     35 assertFalse("value" in Object.getOwnPropertyDescriptor(this, "a"));
     36 
     37 eval("with({}) { eval('var a = 2') }");
     38 assertEquals(2, setter_value);
     39 assertFalse("value" in Object.getOwnPropertyDescriptor(this, "a"));
     40 
     41 // Function declarations are treated specially to match Safari. We do
     42 // not call setters for them.
     43 this.__defineSetter__("a", function(v) { assertUnreachable(); });
     44 eval("function a() {}");
     45 assertTrue("value" in Object.getOwnPropertyDescriptor(this, "a"));
     46 
     47 this.__defineSetter__("b", function(v) { setter_value = v; });
     48 try {
     49   eval("const b = 3");
     50 } catch(e) {
     51   assertUnreachable();
     52 }
     53 assertEquals(3, setter_value);
     54 
     55 try {
     56   eval("with({}) { eval('const b = 23') }");
     57 } catch(e) {
     58   assertInstanceof(e, TypeError);
     59 }
     60 
     61 this.__defineSetter__("c", function(v) { throw 42; });
     62 try {
     63   eval("var c = 1");
     64   assertUnreachable();
     65 } catch(e) {
     66   assertEquals(42, e);
     67   assertFalse("value" in Object.getOwnPropertyDescriptor(this, "c"));
     68 }
     69 
     70 
     71 
     72 
     73 __proto__.__defineSetter__("aa", function(v) { assertUnreachable(); });
     74 eval("var aa = 1");
     75 assertTrue(this.hasOwnProperty("aa"));
     76 
     77 __proto__.__defineSetter__("bb", function(v) { assertUnreachable(); });
     78 eval("with({}) { eval('var bb = 2') }");
     79 assertTrue(this.hasOwnProperty("bb"));
     80 
     81 // Function declarations are treated specially to match Safari. We do
     82 // not call setters for them.
     83 __proto__.__defineSetter__("cc", function(v) { assertUnreachable(); });
     84 eval("function cc() {}");
     85 assertTrue(this.hasOwnProperty("cc"));
     86 
     87 __proto__.__defineSetter__("dd", function(v) { assertUnreachable(); });
     88 try {
     89   eval("const dd = 23");
     90 } catch(e) {
     91   assertUnreachable();
     92 }
     93 
     94 try {
     95   eval("with({}) { eval('const dd = 23') }");
     96 } catch(e) {
     97   assertInstanceof(e, TypeError);
     98 }
     99