// Copyright (C) 2020 Alexey Shvayka. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- author: André Bargull esid: sec-arraysetlength description: > [[Value]] is coerced to number before current descriptor's [[Writable]] check. info: | ArraySetLength ( A, Desc ) [...] 3. Let newLen be ? ToUint32(Desc.[[Value]]). 4. Let numberLen be ? ToNumber(Desc.[[Value]]). [...] 7. Let oldLenDesc be OrdinaryGetOwnProperty(A, "length"). [...] 12. If oldLenDesc.[[Writable]] is false, return false. features: [Symbol, Symbol.toPrimitive, Reflect, Reflect.set] includes: [compareArray.js] ---*/ var array = [1, 2, 3]; var hints = []; var length = {}; length[Symbol.toPrimitive] = function(hint) { hints.push(hint); Object.defineProperty(array, "length", {writable: false}); return 0; }; assert.throws(TypeError, function() { "use strict"; array.length = length; }, '`"use strict"; array.length = length` throws a TypeError exception'); assert.compareArray(hints, ["number", "number"], 'The value of hints is expected to be ["number", "number"]'); array = [1, 2, 3]; hints = []; assert( !Reflect.set(array, "length", length), 'The value of !Reflect.set(array, "length", length) is expected to be true' ); assert.compareArray(hints, ["number", "number"], 'The value of hints is expected to be ["number", "number"]'); reportCompare(0, 0);