// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var limit = 10000; function testStringWrapper(string) { assertEquals('a', string[0]); assertEquals('b', string[1]); assertEquals('c', string[2]); } (function testFastStringWrapperGrow() { var string = new String("abc"); for (var i = 0; i < limit; i += 2) { string[i] = {}; } testStringWrapper(string); for (var i = limit; i > 0; i -= 2) { delete string[i]; } testStringWrapper(string); })(); (function testSlowStringWrapperGrow() { var string = new String("abc"); // Force Slow String Wrapper Elements Kind string[limit] = limit; for (var i = 0; i < limit; i += 2) { string[i] = {}; } testStringWrapper(string); assertEquals(limit, string[limit]); for (var i = limit; i > 0; i -= 2) { delete string[i]; } testStringWrapper(string); assertEquals(undefined, string[limit]); })(); (function testReconfigureStringWrapperElements() { var s = new String('abc'); // Can't reconfigure string contents. assertThrows(() => Object.defineProperty(s, '1', {value: "value"}), TypeError); // Configure a property outside the string range var value = 'v1'; Object.defineProperty(s, '3', { get: () => {return value}, configurable:true }); assertEquals('v1', s[3]); value = 'v2'; assertEquals('v2', s[3]); Object.defineProperty(s, '3', {value: 'v3', configurable: false}); assertEquals('v3', s[3]); assertThrows(() => Object.defineProperty(s, '3', {value:2}), TypeError); })();