1 /*
   2  * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  * 
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  * 
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  * 
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  * 
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /**
  25  * JDK-8134569: Add tests for prototype callsites
  26  *
  27  * @test
  28  * @run
  29  */
  30 
  31 function create() {
  32     function C() {
  33         this.i1 = 1;
  34         this.i2 = 2;
  35         this.i3 = 3;
  36         return this;
  37     }
  38     return new C();
  39 }
  40 
  41 function createEmpty() {
  42     function C() {
  43         return this;
  44     }
  45     return new C();
  46 }
  47 
  48 function createDeep() {
  49     function C() {
  50         this.i1 = 1;
  51         this.i2 = 2;
  52         this.i3 = 3;
  53         return this;
  54     }
  55     function D() {
  56         this.p1 = 1;
  57         this.p2 = 2;
  58         this.p3 = 3;
  59         return this;
  60     }
  61     C.prototype = new D();
  62     return new C();
  63 }
  64 
  65 function createDeeper() {
  66     function C() {
  67         this.i1 = 1;
  68         this.i2 = 2;
  69         this.i3 = 3;
  70         return this;
  71     }
  72     function D() {
  73         this.p1 = 1;
  74         this.p2 = 2;
  75         this.p3 = 3;
  76         return this;
  77     }
  78     function E() {
  79         this.e1 = 1;
  80         this.e2 = 2;
  81         this.e3 = 3;
  82         return this;
  83     }
  84     D.prototype = new E();
  85     C.prototype = new D();
  86     return new C();
  87 }
  88 
  89 function createEval() {
  90     return eval("Object.create({})");
  91 }
  92 
  93 function p(o) { print(o.x) }
  94 
  95 function e(o) { print(o.e1) }
  96 
  97 var a, b, c;
  98 
  99 create();
 100 a = create();
 101 b = create();
 102 c = create();
 103 a.__proto__.x = 123;
 104 
 105 p(a);
 106 p(b);
 107 p(c);
 108 
 109 a = create();
 110 b = create();
 111 c = create();
 112 b.__proto__.x = 123;
 113 
 114 p(a);
 115 p(b);
 116 p(c);
 117 
 118 a = createEmpty();
 119 b = createEmpty();
 120 c = createEmpty();
 121 a.__proto__.x = 123;
 122 
 123 p(a);
 124 p(b);
 125 p(c);
 126 
 127 a = createEmpty();
 128 b = createEmpty();
 129 c = createEmpty();
 130 b.__proto__.x = 123;
 131 
 132 p(a);
 133 p(b);
 134 p(c);
 135 
 136 a = createDeep();
 137 b = createDeep();
 138 c = createDeep();
 139 a.__proto__.__proto__.x = 123;
 140 
 141 p(a);
 142 p(b);
 143 p(c);
 144 
 145 a = createDeep();
 146 b = createDeep();
 147 c = createDeep();
 148 b.__proto__.__proto__.x = 123;
 149 
 150 p(a);
 151 p(b);
 152 p(c);
 153 
 154 a = createDeeper();
 155 b = createDeeper();
 156 c = createDeeper();
 157 a.__proto__.__proto__.__proto__.x = 123;
 158 
 159 p(a);
 160 p(b);
 161 p(c);
 162 
 163 a = createDeeper();
 164 b = createDeeper();
 165 c = createDeeper();
 166 b.__proto__.__proto__.__proto__.x = 123;
 167 
 168 p(a);
 169 p(b);
 170 p(c);
 171 
 172 a = createDeeper();
 173 b = createDeeper();
 174 c = createDeeper();
 175 a.__proto__.__proto__ = null;
 176 
 177 e(a);
 178 e(b);
 179 e(c);
 180 
 181 a = createDeeper();
 182 b = createDeeper();
 183 c = createDeeper();
 184 b.__proto__.__proto__ = null;
 185 
 186 e(a);
 187 e(b);
 188 e(c);
 189 
 190 
 191 a = createEval();
 192 b = createEval();
 193 c = createEval();
 194 a.__proto__.x = 123;
 195 
 196 p(a);
 197 p(b);
 198 p(c);
 199 
 200 a = createEval();
 201 b = createEval();
 202 c = createEval();
 203 b.__proto__.x = 123;
 204 
 205 p(a);
 206 p(b);
 207 p(c);