Tue, 16 Aug 2016 21:41:28 -0700
Added tag jdk8u102-b33 for changeset 36e3c21b5fca
lagergren@1095 | 1 | /* |
lagergren@1095 | 2 | * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. |
lagergren@1095 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
lagergren@1095 | 4 | * |
lagergren@1095 | 5 | * This code is free software; you can redistribute it and/or modify it |
lagergren@1095 | 6 | * under the terms of the GNU General Public License version 2 only, as |
lagergren@1095 | 7 | * published by the Free Software Foundation. |
lagergren@1095 | 8 | * |
lagergren@1095 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
lagergren@1095 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
lagergren@1095 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
lagergren@1095 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
lagergren@1095 | 13 | * accompanied this code). |
lagergren@1095 | 14 | * |
lagergren@1095 | 15 | * You should have received a copy of the GNU General Public License version |
lagergren@1095 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
lagergren@1095 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
lagergren@1095 | 18 | * |
lagergren@1095 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
lagergren@1095 | 20 | * or visit www.oracle.com if you need additional information or have any |
lagergren@1095 | 21 | * questions. |
lagergren@1095 | 22 | */ |
lagergren@1095 | 23 | |
lagergren@1095 | 24 | /** |
lagergren@1095 | 25 | * JDK-8035312 push to frozen array must not increase length property |
lagergren@1095 | 26 | * |
lagergren@1095 | 27 | * @test |
lagergren@1095 | 28 | * @run |
lagergren@1095 | 29 | * @fork |
lagergren@1095 | 30 | * @option -Dnashorn.debug=true |
lagergren@1095 | 31 | */ |
lagergren@1095 | 32 | |
lagergren@1095 | 33 | function printArrayDataClass(x) { |
lagergren@1095 | 34 | if (typeof Debug !== 'undefined') { |
lagergren@1095 | 35 | print(Debug.getArrayDataClass(x)); |
lagergren@1095 | 36 | } |
lagergren@1095 | 37 | } |
lagergren@1095 | 38 | |
lagergren@1095 | 39 | function gpush(x, elem) { |
lagergren@1095 | 40 | try { |
lagergren@1095 | 41 | print("Pushing " + elem + " to " + x); |
lagergren@1095 | 42 | x.push(elem); |
lagergren@1095 | 43 | } catch (e) { |
lagergren@1095 | 44 | print("caught error" + e); |
lagergren@1095 | 45 | } |
lagergren@1095 | 46 | print("\tarray is now [" + x + "] length is = " + x.length); |
lagergren@1095 | 47 | print(); |
lagergren@1095 | 48 | printArrayDataClass(x); |
lagergren@1095 | 49 | } |
lagergren@1095 | 50 | |
lagergren@1095 | 51 | function gpop(x) { |
lagergren@1095 | 52 | try { |
lagergren@1095 | 53 | print("Popping from " + x); |
lagergren@1095 | 54 | x.pop(); |
lagergren@1095 | 55 | } catch (e) { |
lagergren@1095 | 56 | if (!(e instanceof TypeError)) { |
lagergren@1095 | 57 | print("e of wrong type " + e); |
lagergren@1095 | 58 | } |
lagergren@1095 | 59 | } |
lagergren@1095 | 60 | print("\tarray is now [" + x + "] length is = " + x.length); |
lagergren@1095 | 61 | print(); |
lagergren@1095 | 62 | printArrayDataClass(x); |
lagergren@1095 | 63 | } |
lagergren@1095 | 64 | |
lagergren@1095 | 65 | function checkArray(x) { |
lagergren@1095 | 66 | print(); |
lagergren@1095 | 67 | print(">>> Push test"); |
lagergren@1095 | 68 | |
lagergren@1095 | 69 | var olen = x.length; |
lagergren@1095 | 70 | gpush(x, 0); |
lagergren@1095 | 71 | |
lagergren@1095 | 72 | print("x.length === " + x.length + " (should be " + olen + ")"); |
lagergren@1095 | 73 | print("x[3] === " + x[3] + " (should be 0)"); |
lagergren@1095 | 74 | print("x[4] === " + x[4] + " (should be undefined)"); |
lagergren@1095 | 75 | |
lagergren@1095 | 76 | print(); |
lagergren@1095 | 77 | print(">>> Pop test"); |
lagergren@1095 | 78 | gpop(x); |
lagergren@1095 | 79 | gpop(x); |
lagergren@1095 | 80 | print("x.length === " + x.length + " (should be " + olen + ")"); |
lagergren@1095 | 81 | print("x === " + x); |
lagergren@1095 | 82 | |
lagergren@1095 | 83 | for (var i = 0 ; i < 5; i++) { |
lagergren@1095 | 84 | gpop(x); |
lagergren@1095 | 85 | } |
lagergren@1095 | 86 | |
lagergren@1095 | 87 | print("x.length === " + x.length + " (should be " + olen + ")"); |
lagergren@1095 | 88 | print("x === " + x); |
lagergren@1095 | 89 | } |
lagergren@1095 | 90 | |
lagergren@1095 | 91 | print("*** Freezing"); |
lagergren@1095 | 92 | var frozen = [1,2,3]; |
lagergren@1095 | 93 | Object.freeze(frozen); |
lagergren@1095 | 94 | checkArray(frozen); |
lagergren@1095 | 95 | printArrayDataClass(frozen); |
lagergren@1095 | 96 | |
lagergren@1095 | 97 | //so far so good |
lagergren@1095 | 98 | |
lagergren@1095 | 99 | print(); |
lagergren@1095 | 100 | print("*** Other length not writable issues"); |
lagergren@1095 | 101 | var lengthNotWritable = [1,2,3]; |
lagergren@1095 | 102 | Object.defineProperty(lengthNotWritable, "length", { writable: false }); |
lagergren@1095 | 103 | checkArray(lengthNotWritable); |
lagergren@1095 | 104 | printArrayDataClass(lengthNotWritable); |
lagergren@1095 | 105 | |
lagergren@1095 | 106 | function set(array, from, to, stride) { |
lagergren@1095 | 107 | //add three elements |
lagergren@1095 | 108 | for (var i = from; i < to; i+=stride) { |
lagergren@1095 | 109 | try { |
lagergren@1095 | 110 | print("Writing " + i); |
lagergren@1095 | 111 | array[i] = i; |
lagergren@1095 | 112 | printArrayDataClass(array); |
lagergren@1095 | 113 | } catch (e) { |
lagergren@1095 | 114 | print(e instanceof TypeError); |
lagergren@1095 | 115 | } |
lagergren@1095 | 116 | } |
lagergren@1095 | 117 | } |
lagergren@1095 | 118 | |
lagergren@1095 | 119 | //define empty array with non writable length |
lagergren@1095 | 120 | var arr = [1]; |
lagergren@1095 | 121 | Object.defineProperty(arr, "length", { writable: false }); |
lagergren@1095 | 122 | |
lagergren@1095 | 123 | var olen2 = arr.length; |
lagergren@1095 | 124 | |
lagergren@1095 | 125 | set(arr, 0, 3, 1); |
lagergren@1095 | 126 | |
lagergren@1095 | 127 | if (arr.length != olen2) { |
lagergren@1095 | 128 | throw new ("error: " + arr.length + " != " + olen2); |
lagergren@1095 | 129 | } |
lagergren@1095 | 130 | |
lagergren@1095 | 131 | print(); |
lagergren@1095 | 132 | print("array writing 0-3, with 1 stride, array = " + arr); |
lagergren@1095 | 133 | print("length = " + arr.length + ", but elements are: " + arr[0] + " " + arr[1] + " " + arr[2]); |
lagergren@1095 | 134 | print(); |
lagergren@1095 | 135 | |
lagergren@1095 | 136 | //do the same but sparse/deleted range |
lagergren@1095 | 137 | var arr2 = [1]; |
lagergren@1095 | 138 | Object.defineProperty(arr2, "length", { writable: false }); |
lagergren@1095 | 139 | |
lagergren@1095 | 140 | print("initial length = " + arr2.length); |
lagergren@1095 | 141 | var olen3 = arr2.length; |
lagergren@1095 | 142 | |
lagergren@1095 | 143 | set(arr2, 0, 30, 3); |
lagergren@1095 | 144 | |
lagergren@1095 | 145 | if (arr2.length != olen3) { |
lagergren@1095 | 146 | throw new ("error: " + arr2.length + " != " + olen3); |
lagergren@1095 | 147 | } |
lagergren@1095 | 148 | |
lagergren@1095 | 149 | print(); |
lagergren@1095 | 150 | var larger = 20; |
lagergren@1095 | 151 | print("array writing 0-" + larger + ", with 3 stride, array = " + arr2); |
lagergren@1095 | 152 | print("length = " + arr2.length + ", but elements are: " + arr2[0] + " " + arr2[1] + " " + arr2[2]); |
lagergren@1095 | 153 | |
lagergren@1095 | 154 | for (var i = 0; i < larger; i++) { |
lagergren@1095 | 155 | if (arr2[i] === undefined) { |
lagergren@1095 | 156 | continue; |
lagergren@1095 | 157 | } |
lagergren@1095 | 158 | print(arr2[i] + " has length " + arr2.length); |
lagergren@1095 | 159 | } |
lagergren@1095 | 160 | |
lagergren@1095 | 161 | print(); |
lagergren@1095 | 162 | var elem = 0x7fffffff - 10; |
lagergren@1095 | 163 | printArrayDataClass(arr2); |
lagergren@1095 | 164 | print("adding a new element high up in the array"); |
lagergren@1095 | 165 | print("length before element was added " + arr2.length); |
lagergren@1095 | 166 | print("putting sparse at " + elem); |
lagergren@1095 | 167 | arr2[elem] = "sparse"; |
lagergren@1095 | 168 | print("length after element was added " + arr2.length + " should be the same"); |
lagergren@1095 | 169 | printArrayDataClass(arr2); |
lagergren@1095 | 170 | |
lagergren@1095 | 171 | print(); |
lagergren@1095 | 172 | print("Printing arr2 - this will fail if length is > 28 and it is " + arr2.length); |
lagergren@1095 | 173 | print("arr2 = [" + arr2 + "]"); |
lagergren@1095 | 174 | print("new length that should not be writable = " + arr2.length); |
lagergren@1095 | 175 | print(arr2[elem] === "sparse"); |
lagergren@1095 | 176 | print(arr2[elem]); |
lagergren@1095 | 177 | for (var i = 0; i < larger; i++) { |
lagergren@1095 | 178 | print(arr2[i]); |
lagergren@1095 | 179 | } |
lagergren@1095 | 180 | for (var key in arr2) { |
lagergren@1095 | 181 | print(key + ":" + arr2[key]); |
lagergren@1095 | 182 | } |
lagergren@1095 | 183 | |
lagergren@1095 | 184 | //issues reported by sundar - generic setter doesn't go through push/pop bulkable |
lagergren@1095 | 185 | |
lagergren@1095 | 186 | function sundarExample2(arr, _writable) { |
lagergren@1095 | 187 | print("Checking if push works for bulkable non bulkable arrays - Setting length property not allowed"); |
lagergren@1095 | 188 | arr[0] = "bar"; |
lagergren@1095 | 189 | print(arr.length + " should be 1"); // should be 1 |
lagergren@1095 | 190 | print(arr[0] + " should be bar"); |
lagergren@1095 | 191 | print("["+ arr + "] should be [bar]"); |
lagergren@1095 | 192 | |
lagergren@1095 | 193 | // Object.defineProperty(arr, "length", { configurable: _writable }); |
lagergren@1095 | 194 | Object.defineProperty(arr, "length", { writable: _writable }); |
lagergren@1095 | 195 | arr[1] = "baz"; |
lagergren@1095 | 196 | |
lagergren@1095 | 197 | if (_writable) { |
lagergren@1095 | 198 | print(arr.length + " should be 2"); |
lagergren@1095 | 199 | print(arr[0] + " should be bar"); |
lagergren@1095 | 200 | print(arr[1] + " should be baz"); |
lagergren@1095 | 201 | print("["+ arr + "] should be [bar,baz]"); |
lagergren@1095 | 202 | } else { |
lagergren@1095 | 203 | print(arr.length + " should STILL be 1"); |
lagergren@1095 | 204 | print(arr[0] + " should be bar"); |
lagergren@1095 | 205 | print(arr[1] + " should be baz"); |
lagergren@1095 | 206 | print("["+ arr + "] should be [bar]"); |
lagergren@1095 | 207 | } |
lagergren@1095 | 208 | } |
lagergren@1095 | 209 | |
lagergren@1095 | 210 | var newArr1 = []; |
lagergren@1095 | 211 | sundarExample2(newArr1, false); |
lagergren@1095 | 212 | print(); |
lagergren@1095 | 213 | try { |
lagergren@1095 | 214 | sundarExample2(newArr1, true); |
lagergren@1095 | 215 | print("should not get here"); |
lagergren@1095 | 216 | } catch (e) { |
lagergren@1095 | 217 | if (!(e instanceof TypeError)) { |
lagergren@1095 | 218 | print("Wrong exception"); |
lagergren@1095 | 219 | } |
lagergren@1095 | 220 | print("got TypeError when redefining length, as expected") |
lagergren@1095 | 221 | } |
lagergren@1095 | 222 | print(); |
lagergren@1095 | 223 | |
lagergren@1095 | 224 | sundarExample2([], true); |
lagergren@1095 | 225 | print("Done"); |