Implement ToIndex abstract operation (#4287)

https://www.ecma-international.org/ecma-262/11.0/#sec-toindex

Made DataView constructor, DataView.prototype.setXXX/getXXX methods ES11 conform.

JerryScript-DCO-1.0-Signed-off-by: Csaba Osztrogonác csaba.osztrogonac@h-lab.eu
This commit is contained in:
Csaba Osztrogonác
2020-10-27 10:37:50 +01:00
committed by GitHub
parent d5d27afd39
commit 24a5489331
7 changed files with 153 additions and 190 deletions
+34 -62
View File
@@ -13,7 +13,7 @@
* limitations under the License.
*/
/* ES2015 24.2.2.1.1 */
/* ES11 24.3.2.1.1 */
try {
DataView ();
assert (false);
@@ -21,7 +21,7 @@ try {
assert (e instanceof TypeError);
}
/* ES2015 24.2.2.1.2 */
/* ES11 24.3.2.1.2 (not object) */
try {
new DataView (5);
assert (false);
@@ -29,7 +29,7 @@ try {
assert (e instanceof TypeError);
}
/* ES2015 24.2.2.1.3 */
/* ES11 24.3.2.1.2 (no [[ArrayBufferData]] internal slot) */
try {
new DataView ({});
assert (false);
@@ -39,7 +39,23 @@ try {
var buffer = new ArrayBuffer (16);
/* ES2015 24.2.2.1.6 */
/* ES11 24.3.2.1.3 (offset < 0)*/
try {
new DataView (buffer, -1);
assert (false);
} catch (e) {
assert (e instanceof RangeError);
}
/* ES11 24.3.2.1.3 (offset > 2^53) */
try {
new DataView (buffer, Number.MAX_SAFE_INTEGER + 1);
assert (false);
} catch (e) {
assert (e instanceof RangeError);
}
/* ES11 24.3.2.1.3 (ToInteger throws ReferenceError) */
try {
new DataView (buffer, { toString: function () { throw new ReferenceError ('foo') } });
assert (false);
@@ -48,24 +64,8 @@ try {
assert (e.message === 'foo');
}
/* ES2015 24.2.2.1.7 (numberOffset != offset)*/
try {
new DataView (buffer, 1.5);
assert (false);
} catch (e) {
assert (e instanceof RangeError);
}
/* ES2015 24.2.2.1.7 (offset < 0) */
try {
new DataView (buffer, -1);
assert (false);
} catch (e) {
assert (e instanceof RangeError);
}
/* ES2015 24.2.2.1.10 */
/* ES11 24.3.2.1.6 */
try {
new DataView (buffer, 17);
assert (false);
@@ -73,7 +73,7 @@ try {
assert (e instanceof RangeError);
}
/* ES2015 24.2.2.1.12.b */
/* ES11 24.3.2.1.8.a */
try {
new DataView (buffer, 0, { toString: function () { throw new ReferenceError ('bar') } });
assert (false);
@@ -82,7 +82,7 @@ try {
assert (e.message === 'bar');
}
/* ES2015 24.2.2.1.12.b */
/* ES11 24.3.2.1.8.a */
try {
new DataView (buffer, 0, Infinity);
assert (false);
@@ -90,7 +90,7 @@ try {
assert (e instanceof RangeError);
}
/* ES2015 24.2.2.1.12.c */
/* ES11 24.3.2.1.8.b */
try {
new DataView (buffer, 4, 13);
assert (false);
@@ -98,11 +98,10 @@ try {
assert (e instanceof RangeError);
}
/* Tests accessors: ES2015 24.2.2.1 - 24.2.2.3 */
var accessorList = ['buffer', 'byteOffset', 'byteLength'];
/* Tests accessors: ES11 24.3.4.{1, 2, 3}.2 */
var accessorList = ['buffer', 'byteLength', 'byteOffset'];
accessorList.forEach (function (prop) {
/* ES2015 24.2.4.{1, 2, 3}.{2, 3} */
try {
var obj = {};
Object.setPrototypeOf (obj, DataView.prototype);
@@ -136,7 +135,7 @@ var setters = ['setInt8', 'setUint8', 'setInt16', 'setUint16', 'setInt32', 'setU
var gettersSetters = getters.concat (setters);
gettersSetters.forEach (function (propName) {
/* ES2015 24.2.1.{1, 2}.1 */
/* ES11 24.3.1.{1, 2}.1 */
var routine = DataView.prototype[propName];
try {
DataView.prototype[propName].call (5);
@@ -145,7 +144,7 @@ gettersSetters.forEach (function (propName) {
assert (e instanceof TypeError);
}
/* ES2015 24.2.1.{1, 2}.2 */
/* ES11 24.3.1.{1, 2}.1 */
try {
DataView.prototype[propName].call ({});
assert (false);
@@ -153,7 +152,7 @@ gettersSetters.forEach (function (propName) {
assert (e instanceof TypeError);
}
/* ES2015 24.2.1.{1, 2}.5 */
/* ES11 24.3.1.{1, 2}.3 (ToInteger throws ReferenceError) */
try {
var buffer = new ArrayBuffer (16);
var view = new DataView (buffer)
@@ -167,14 +166,7 @@ gettersSetters.forEach (function (propName) {
var buffer = new ArrayBuffer (16);
var view = new DataView (buffer)
/* ES2015 24.2.1.{1, 2}.6 (numberIndex != getIndex) */
if (propName.indexOf("get") !== -1) {
assert(view[propName] (1.5) === 0);
} else {
assert(view[propName] (1.5) === undefined);
}
/* ES2015 24.2.1.{1, 2}.6 (getIndex < 0) */
/* ES11 24.3.1.{1, 2}.3 (getIndex < 0) */
try {
view[propName] (-1);
assert (false);
@@ -182,7 +174,7 @@ gettersSetters.forEach (function (propName) {
assert (e instanceof RangeError);
}
/* ES2015 24.2.1.{1, 2}.13 */
/* ES11 24.3.1.1.10, 24.3.1.2.12 */
try {
view[propName] (20);
assert (false);
@@ -254,26 +246,6 @@ var dtviewF = new DataView (arrayBufferOk, null, 1);
assert (dtviewF.byteLength === 1);
assert (dtviewF.byteOffset === 0);
/* In ES6 the second argument is processed with ToNumber and ToInteger calls.
* A RangeError is reported if the values returned by the operations are different.
* The "undefined" value converted with ToNumber will return "NaN" and the ToInteger
* operation will return "0". Thus creating a RangeError.
*
* After ES6 the second argument should be converted via ToIndex.
* Providing "undefined" value for the ToIndex operation will return "0".
* Thus there is no error generated.
*/
try {
var dtviewF = new DataView (arrayBufferOk, undefined, 1);
/* TODO: enable these tests after the DataView is updated for newer standard and
* remove the try-catch.
*/
/*
* assert(dtviewF.byteLength === 1);
* assert(dtviewF.byteOffset === 0);
*/
assert (false);
} catch (ex) {
assert (ex instanceof RangeError);
}
var dtviewF = new DataView (arrayBufferOk, undefined, 1);
assert(dtviewF.byteLength === 1);
assert(dtviewF.byteOffset === 0);
-54
View File
@@ -34,9 +34,6 @@
<test id="built-ins/BigInt/asUintN/length.js"><reason></reason></test>
<test id="built-ins/BigInt/asUintN/name.js"><reason></reason></test>
<test id="built-ins/BigInt/asUintN/order-of-steps.js"><reason></reason></test>
<test id="built-ins/DataView/excessive-byteoffset-throws.js"><reason></reason></test>
<test id="built-ins/DataView/length.js"><reason></reason></test>
<test id="built-ins/DataView/negative-bytelength-throws.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/index-is-out-of-range.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/name.js"><reason></reason></test>
@@ -75,57 +72,6 @@
<test id="built-ins/DataView/prototype/setBigInt64/set-values-return-undefined.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/to-boolean-littleendian.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat32/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat32/no-value-arg.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat32/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat32/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat32/return-abrupt-from-tonumber-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat32/set-values-return-undefined.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat32/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat64/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat64/no-value-arg.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat64/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat64/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat64/return-abrupt-from-tonumber-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat64/set-values-return-undefined.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setFloat64/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt16/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt16/no-value-arg.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt16/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt16/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt16/return-abrupt-from-tonumber-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt16/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt32/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt32/no-value-arg.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt32/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt32/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt32/return-abrupt-from-tonumber-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt32/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt8/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt8/no-value-arg.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt8/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt8/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt8/return-abrupt-from-tonumber-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setInt8/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint16/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint16/no-value-arg.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint16/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint16/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint16/return-abrupt-from-tonumber-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint16/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint32/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint32/no-value-arg.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint32/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint32/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint32/return-abrupt-from-tonumber-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint32/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint8/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint8/no-value-arg.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint8/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint8/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint8/return-abrupt-from-tonumber-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setUint8/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/Date/prototype/setTime/new-value-time-clip.js"><reason></reason></test>
<test id="built-ins/Date/prototype/toDateString/format.js"><reason></reason></test>
<test id="built-ins/Date/prototype/toDateString/negative-year.js"><reason></reason></test>