1// Copyright 2015 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5function f(a, b, c, d) { return arguments; } 6 7// Ensure non-configurable argument elements stay non-configurable. 8(function () { 9 var args = f(1); 10 Object.defineProperty(args, "0", {value: 10, configurable: false}); 11 assertFalse(Object.getOwnPropertyDescriptor(args, "0").configurable); 12 for (var i = 0; i < 10; i++) { 13 args[i] = 1; 14 } 15 assertFalse(Object.getOwnPropertyDescriptor(args, "0").configurable); 16})(); 17 18// Ensure read-only properties on the prototype chain cause TypeError. 19 20// Newly added. 21(function () { 22 var o = []; 23 var proto = {}; 24 var index = 3; 25 function store(o, i, v) { "use strict"; o[i] = v; }; 26 o.__proto__ = proto; 27 for (var i = 0; i < index; i++) { 28 store(o, i, 0); 29 } 30 Object.defineProperty(proto, index, {value: 100, writable: false}); 31 assertThrows(function() { store(o, index, 0); }); 32 assertEquals(100, o[index]); 33})(); 34 35// Reconfigured. 36(function () { 37 var o = []; 38 var proto = {3: 10000}; 39 var index = 3; 40 function store(o, i, v) { "use strict"; o[i] = v; }; 41 o.__proto__ = proto; 42 for (var i = 0; i < index; i++) { 43 store(o, i, 0); 44 } 45 Object.defineProperty(proto, index, {value: 100, writable: false}); 46 assertThrows(function() { store(o, index, 0); }); 47 assertEquals(100, o[index]); 48})(); 49 50// Newly added to arguments object. 51(function () { 52 var o = []; 53 var proto = f(100); 54 var index = 3; 55 function store(o, i, v) { "use strict"; o[i] = v; }; 56 o.__proto__ = proto; 57 for (var i = 0; i < index; i++) { 58 store(o, i, 0); 59 } 60 Object.defineProperty(proto, index, {value: 100, writable: false}); 61 assertThrows(function() { store(o, index, 0); }); 62 assertEquals(100, o[index]); 63})(); 64 65// Reconfigured on to arguments object. 66(function () { 67 var o = []; 68 var proto = f(100, 200, 300, 400); 69 var index = 3; 70 function store(o, i, v) { "use strict"; o[i] = v; }; 71 o.__proto__ = proto; 72 for (var i = 0; i < index; i++) { 73 store(o, i, 0); 74 } 75 Object.defineProperty(proto, index, {value: 100, writable: false}); 76 assertThrows(function() { store(o, index, 0); }); 77 assertEquals(100, o[index]); 78})(); 79 80// Extensions prevented object. 81(function () { 82 var o = []; 83 var proto = [0, 1, 2, 3]; 84 var index = 3; 85 function store(o, i, v) { "use strict"; o[i] = v; }; 86 o.__proto__ = proto; 87 for (var i = 0; i < index; i++) { 88 store(o, i, 0); 89 } 90 Object.preventExtensions(proto); 91 Object.defineProperty(proto, index, {value: 100, writable: false}); 92 assertThrows(function() { store(o, index, 0); }); 93 assertEquals(100, o[index]); 94})(); 95 96// Extensions prevented arguments object. 97(function () { 98 var o = []; 99 var proto = f(100, 200, 300, 400); 100 var index = 3; 101 function store(o, i, v) { "use strict"; o[i] = v; }; 102 o.__proto__ = proto; 103 for (var i = 0; i < index; i++) { 104 store(o, i, 0); 105 } 106 Object.preventExtensions(proto); 107 Object.defineProperty(proto, index, {value: 100, writable: false}); 108 assertThrows(function() { store(o, index, 0); }); 109 assertEquals(100, o[index]); 110})(); 111 112// Array with large index. 113(function () { 114 var o = []; 115 var proto = []; 116 var index = 3; 117 function store(o, i, v) { "use strict"; o[i] = v; }; 118 o.__proto__ = proto; 119 for (var i = 0; i < index; i++) { 120 store(o, i, 0); 121 } 122 proto[1 << 30] = 1; 123 Object.defineProperty(proto, index, {value: 100, writable: false}); 124 assertThrows(function() { store(o, index, 0); }); 125 assertEquals(100, o[index]); 126})(); 127 128// Frozen object. 129(function () { 130 var o = []; 131 var proto = [0, 1, 2, 3]; 132 function store(o, i, v) { "use strict"; o[i] = v; }; 133 o.__proto__ = proto; 134 for (var i = 0; i < 3; i++) { 135 store(o, i, 0); 136 } 137 Object.freeze(proto); 138 assertThrows(function() { store(o, 3, 0); }); 139 assertEquals(3, o[3]); 140})(); 141 142// Frozen arguments object. 143(function () { 144 var o = []; 145 var proto = f(0, 1, 2, 3); 146 function store(o, i, v) { "use strict"; o[i] = v; }; 147 o.__proto__ = proto; 148 for (var i = 0; i < 3; i++) { 149 store(o, i, 0); 150 } 151 Object.freeze(proto); 152 assertThrows(function() { store(o, 3, 0); }); 153 assertEquals(3, o[3]); 154})(); 155