test/script/basic/JDK-8035312.js

Sun, 08 Nov 2015 10:25:46 -0800

author
asaha
date
Sun, 08 Nov 2015 10:25:46 -0800
changeset 1687
6abfa80b9ef2
parent 1095
3dbb4c9ff43c
permissions
-rw-r--r--

Added tag jdk8u66-b18 for changeset 39bfb9eb75dc

     1 /*
     2  * Copyright (c) 2010, 2014, 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  */
    24 /**
    25  * JDK-8035312 push to frozen array must not increase length property
    26  *
    27  * @test
    28  * @run
    29  * @fork
    30  * @option -Dnashorn.debug=true
    31  */
    33 function printArrayDataClass(x) {
    34     if (typeof Debug !== 'undefined') {
    35 	print(Debug.getArrayDataClass(x));
    36     }
    37 }
    39 function gpush(x, elem) {
    40     try {
    41 	print("Pushing " + elem + " to " + x);
    42 	x.push(elem);
    43     } catch (e) {
    44 	print("caught error" + e);
    45     }
    46     print("\tarray is now [" + x + "] length is = " + x.length);
    47     print();
    48     printArrayDataClass(x);
    49 }
    51 function gpop(x) {
    52     try {
    53 	print("Popping from " + x);
    54 	x.pop();
    55     } catch (e) {
    56 	if (!(e instanceof TypeError)) {
    57 	    print("e of wrong type " + e);
    58 	}
    59     }
    60     print("\tarray is now [" + x + "] length is = " + x.length);
    61     print();
    62     printArrayDataClass(x);
    63 }
    65 function checkArray(x) {
    66     print();
    67     print(">>> Push test");
    69     var olen = x.length;
    70     gpush(x, 0);
    72     print("x.length === " + x.length + " (should be " + olen + ")");
    73     print("x[3] === " + x[3] + " (should be 0)");
    74     print("x[4] === " + x[4] + " (should be undefined)");
    76     print();
    77     print(">>> Pop test");
    78     gpop(x);
    79     gpop(x);
    80     print("x.length === " + x.length + " (should be " + olen + ")");
    81     print("x === " + x);
    83     for (var i = 0 ; i < 5; i++) {
    84 	gpop(x);
    85     }
    87     print("x.length === " + x.length + " (should be " + olen + ")");
    88     print("x === " + x);
    89 }
    91 print("*** Freezing");
    92 var frozen = [1,2,3];
    93 Object.freeze(frozen);
    94 checkArray(frozen);
    95 printArrayDataClass(frozen);
    97 //so far so good
    99 print();
   100 print("*** Other length not writable issues");
   101 var lengthNotWritable = [1,2,3];
   102 Object.defineProperty(lengthNotWritable, "length", { writable: false });
   103 checkArray(lengthNotWritable);
   104 printArrayDataClass(lengthNotWritable);
   106 function set(array, from, to, stride) {
   107     //add three elements
   108     for (var i = from; i < to; i+=stride) {
   109 	try {
   110 	    print("Writing " + i);
   111 	    array[i] = i;
   112 	    printArrayDataClass(array);
   113 	} catch (e) {
   114 	    print(e instanceof TypeError);
   115 	}
   116     }
   117 }
   119 //define empty array with non writable length
   120 var arr = [1];
   121 Object.defineProperty(arr, "length", { writable: false });
   123 var olen2 = arr.length;
   125 set(arr, 0, 3, 1);
   127 if (arr.length != olen2) {
   128     throw new ("error: " +  arr.length + " != " + olen2);
   129 }
   131 print();
   132 print("array writing 0-3, with 1 stride, array = " + arr);
   133 print("length = " + arr.length + ", but elements are: " + arr[0] + " " + arr[1] + " " + arr[2]);
   134 print();
   136 //do the same but sparse/deleted range
   137 var arr2 = [1];
   138 Object.defineProperty(arr2, "length", { writable: false });
   140 print("initial length = " + arr2.length);
   141 var olen3 = arr2.length;
   143 set(arr2, 0, 30, 3);
   145 if (arr2.length != olen3) {
   146     throw new ("error: " +  arr2.length + " != " + olen3);
   147 }
   149 print();
   150 var larger = 20;
   151 print("array writing 0-" + larger + ", with 3 stride, array = " + arr2);
   152 print("length = " + arr2.length + ", but elements are: " + arr2[0] + " " + arr2[1] + " " + arr2[2]);
   154 for (var i = 0; i < larger; i++) {
   155     if (arr2[i] === undefined) {
   156 	continue;
   157     }
   158     print(arr2[i] + " has length " + arr2.length);
   159 }
   161 print();
   162 var elem = 0x7fffffff - 10;
   163 printArrayDataClass(arr2);
   164 print("adding a new element high up in the array");
   165 print("length before element was added " + arr2.length);
   166 print("putting sparse at " + elem);
   167 arr2[elem] = "sparse";
   168 print("length after element was added " + arr2.length + " should be the same");
   169 printArrayDataClass(arr2);
   171 print();
   172 print("Printing arr2 - this will fail if length is > 28 and it is " + arr2.length);
   173 print("arr2 = [" + arr2 + "]");
   174 print("new length that should not be writable = " + arr2.length);
   175 print(arr2[elem] === "sparse");
   176 print(arr2[elem]);
   177 for (var i = 0; i < larger; i++) {
   178     print(arr2[i]);
   179 }
   180 for (var key in arr2) {
   181     print(key + ":" + arr2[key]);
   182 }
   184 //issues reported by sundar - generic setter doesn't go through push/pop bulkable
   186 function sundarExample2(arr, _writable) {
   187     print("Checking if push works for bulkable non bulkable arrays - Setting length property not allowed");
   188     arr[0] = "bar";
   189     print(arr.length + " should be 1"); // should be 1
   190     print(arr[0] + " should be bar");
   191     print("["+ arr + "] should be [bar]");
   193     //    Object.defineProperty(arr, "length", { configurable: _writable });
   194     Object.defineProperty(arr, "length", { writable: _writable });
   195     arr[1] = "baz";
   197     if (_writable) {
   198 	print(arr.length + " should be 2");
   199 	print(arr[0] + " should be bar");
   200 	print(arr[1] + " should be baz");
   201 	print("["+ arr + "] should be [bar,baz]");
   202     } else {
   203 	print(arr.length + " should STILL be 1");
   204 	print(arr[0] + " should be bar");
   205 	print(arr[1] + " should be baz");
   206 	print("["+ arr + "] should be [bar]");
   207     }
   208 }
   210 var newArr1 = [];
   211 sundarExample2(newArr1, false);
   212 print();
   213 try {
   214     sundarExample2(newArr1, true);
   215     print("should not get here");
   216 } catch (e) {
   217     if (!(e instanceof TypeError)) {
   218 	print("Wrong exception");
   219     }
   220     print("got TypeError when redefining length, as expected")
   221 }
   222 print();
   224 sundarExample2([], true);
   225 print("Done");

mercurial