Home | History | Annotate | Download | only in webkit
      1 // Copyright 2013 the V8 project authors. All rights reserved.
      2 // Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions
      6 // are met:
      7 // 1.  Redistributions of source code must retain the above copyright
      8 //     notice, this list of conditions and the following disclaimer.
      9 // 2.  Redistributions in binary form must reproduce the above copyright
     10 //     notice, this list of conditions and the following disclaimer in the
     11 //     documentation and/or other materials provided with the distribution.
     12 //
     13 // THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
     14 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     15 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     16 // DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     17 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     18 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     19 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     20 // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     22 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23 
     24 description("Test to ensure correct behaviour of prototype caching with dictionary prototypes");
     25 
     26 function protoTest(o) {
     27     return o.protoProp;
     28 }
     29 
     30 var proto = {protoProp: "PASS", propToRemove: "foo"};
     31 var o = { __proto__: proto };
     32 
     33 delete proto.propToRemove;
     34 
     35 // Prototype lookup caching will attempt to convert proto back to an ordinary structure
     36 protoTest(o);
     37 protoTest(o);
     38 protoTest(o);
     39 shouldBe("protoTest(o)", "'PASS'");
     40 delete proto.protoProp;
     41 proto.fakeProtoProp = "FAIL";
     42 shouldBeUndefined("protoTest(o)");
     43 
     44 function protoTest2(o) {
     45     return o.b;
     46 }
     47 
     48 var proto = {a:1, b:"meh", c:2};
     49 var o = { __proto__: proto };
     50 
     51 delete proto.b;
     52 proto.d = 3;
     53 protoTest2(o);
     54 protoTest2(o);
     55 protoTest2(o);
     56 var protoKeys = [];
     57 for (var i in proto)
     58     protoKeys.push(proto[i]);
     59 
     60 shouldBe("protoKeys", "[1,2,3]");
     61 
     62 function protoTest3(o) {
     63     return o.b;
     64 }
     65 
     66 var proto = {a:1, b:"meh", c:2};
     67 var o = { __proto__: proto };
     68 
     69 delete proto.b;
     70 protoTest2(o);
     71 protoTest2(o);
     72 protoTest2(o);
     73 proto.d = 3;
     74 var protoKeys = [];
     75 for (var i in proto)
     76     protoKeys.push(proto[i]);
     77 
     78 shouldBe("protoKeys", "[1,2,3]");
     79 
     80 function testFunction(o) {
     81     return o.test;
     82 }
     83 
     84 var proto = { test: true };
     85 var subclass1 = { __proto__: proto };
     86 var subclass2 = { __proto__: proto };
     87 for (var i = 0; i < 500; i++)
     88     subclass2["a"+i]="a"+i;
     89 
     90 testFunction(subclass1);
     91 shouldBeTrue("testFunction(subclass1)");
     92 shouldBeTrue("testFunction(subclass2)");
     93 proto.test = false
     94 subclass2.test = true;
     95 shouldBeTrue("testFunction(subclass2)");
     96