test/script/basic/JDK-8035312.js

Sun, 24 Jun 2018 23:15:05 +0100

author
alitvinov
date
Sun, 24 Jun 2018 23:15:05 +0100
changeset 2351
41ac91662b75
parent 1095
3dbb4c9ff43c
permissions
-rw-r--r--

Merge

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");

mercurial