From 3c69133cc419840c1be34638039cd8c48a7ef581 Mon Sep 17 00:00:00 2001
From: Valerie <spectranaut@gmail.com>
Date: Fri, 9 Mar 2018 11:23:50 -0500
Subject: [PATCH] Bigint typedarray conversion (#1469)

* BigInt: add tests for TypedArray(typedArray) constructor of mixed 'Big'/'not Big' element types

* BigInt: update info text on tests of ToBigInt

* BigInt: conversion to big int on creation of Big(U)Int64 TypedArray

* BigInt: Add tests for ToBigInt64 and ToBigUint64 wrapping
---
 .../object-arg/#undefined-tobigint.js#        | 53 ++++++++++
 .../object-arg/bigint-tobigint64.js           | 98 +++++++++++++++++++
 .../object-arg/bigint-tobiguint64.js          | 98 +++++++++++++++++++
 .../object-arg/boolean-tobigint.js            | 52 ++++++++++
 .../ctors-bigint/object-arg/null-tobigint.js  | 53 ++++++++++
 .../object-arg/number-tobigint.js             | 82 ++++++++++++++++
 .../object-arg/string-nan-tobigint.js         | 61 ++++++++++++
 .../object-arg/string-tobigint.js             | 77 +++++++++++++++
 .../object-arg/symbol-tobigint.js             | 60 ++++++++++++
 ...rows-setting-obj-to-primitive-typeerror.js | 10 +-
 .../throws-setting-obj-to-primitive.js        | 10 +-
 .../object-arg/throws-setting-obj-tostring.js | 12 +--
 .../throws-setting-obj-valueof-typeerror.js   | 12 +--
 .../object-arg/throws-setting-obj-valueof.js  | 12 +--
 .../object-arg/undefined-tobigint.js          | 53 ++++++++++
 .../src-typedarray-not-big-throws.js          | 36 +++++++
 .../src-typedarray-big-throws.js              | 37 +++++++
 17 files changed, 788 insertions(+), 28 deletions(-)
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/#undefined-tobigint.js#
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/bigint-tobigint64.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/bigint-tobiguint64.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/boolean-tobigint.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/null-tobigint.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/number-tobigint.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/string-nan-tobigint.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/string-tobigint.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/symbol-tobigint.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/object-arg/undefined-tobigint.js
 create mode 100644 test/built-ins/TypedArrays/ctors-bigint/typedarray-arg/src-typedarray-not-big-throws.js
 create mode 100644 test/built-ins/TypedArrays/ctors/typedarray-arg/src-typedarray-big-throws.js

diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/#undefined-tobigint.js# b/test/built-ins/TypedArrays/ctors-bigint/object-arg/#undefined-tobigint.js#
new file mode 100644
index 0000000000..26f708df5a
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/#undefined-tobigint.js#
@@ -0,0 +1,53 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Return abrupt on undefined
+info: |
+  TypedArray ( object )
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  [[Set]] ( P, V, Receiver)
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  IntegerIndexedElementSet ( O, index, value )
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+
+  ToBigInt ( argument )
+  Object, Apply the following steps:
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table [BigInt Conversions]
+
+  BigInt Conversions
+    Argument Type: Undefined
+    Result: Throw a TypeError exception.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+testWithBigIntTypedArrayConstructors(function(TA) {
+
+  assert.throws(TypeError, function() {
+    new TA([undefined]);
+  }, "abrupt completion from undefined");
+
+});
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/bigint-tobigint64.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/bigint-tobigint64.js
new file mode 100644
index 0000000000..501df4ec92
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/bigint-tobigint64.js
@@ -0,0 +1,98 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Behavior for input array of BigInts
+info: |
+  TypedArray ( object )
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  [[Set]] ( P, V, Receiver)
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  IntegerIndexedElementSet ( O, index, value )
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+  15. Perform SetValueInBuffer(buffer, indexedPosition, elementType, numValue, true, "Unordered").
+      // NOTE: type will be set to BigInt64 in this test
+  16. Return true.
+
+  SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] )
+  ...
+  8. Let rawBytes be NumberToRawBytes(type, value, isLittleEndian).
+  ...
+
+  NumberToRawBytes( type, value, isLittleEndian )
+  ...
+  3. Else,
+    a. Let n be the Number value of the Element Size specified in Table
+       [The TypedArray Constructors] for Element Type type.
+    b. Let convOp be the abstract operation named in the Conversion Operation
+       column in Table 9 for Element Type type.
+
+  The TypedArray Constructors
+  Element Type: BigInt64
+  Conversion Operation: ToBigInt64
+
+  ToBigInt64 ( argument )
+  The abstract operation ToBigInt64 converts argument to one of 264 integer
+  values in the range -2^63 through 2^63-1, inclusive.
+  This abstract operation functions as follows:
+    1. Let n be ? ToBigInt(argument).
+    2. Let int64bit be n modulo 2^64.
+    3. If int64bit ≥ 2^63, return int64bit - 2^64; otherwise return int64bit.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+var vals = [
+  18446744073709551618n, // 2n ** 64n + 2n
+  9223372036854775810n, // 2n ** 63n + 2n
+  2n,
+  0n,
+  -2n,
+  -9223372036854775810n, // -(2n ** 63n) - 2n
+  -18446744073709551618n, // -(2n ** 64n) - 2n
+];
+
+var typedArray = new BigInt64Array(vals);
+
+assert.sameValue(typedArray[0], 2n,
+                 "ToBigInt64(2n ** 64n + 2n) => 2n");
+
+assert.sameValue(typedArray[1], -9223372036854775806n, // 2n - 2n ** 63n
+                 "ToBigInt64(2n ** 63n + 2n) => -9223372036854775806n");
+
+assert.sameValue(typedArray[2], 2n,
+                 "ToBigInt64(2n) => 2n");
+
+assert.sameValue(typedArray[3], 0n,
+                 "ToBigInt64(0n) => 0n");
+
+assert.sameValue(typedArray[4], -2n,
+                 "ToBigInt64( -2n) => -2n");
+
+assert.sameValue(typedArray[5], 9223372036854775806n, // 2n ** 63n - 2
+                 "ToBigInt64( -(2n ** 64n) - 2n) => 9223372036854775806n");
+
+assert.sameValue(typedArray[6], -2n,
+                 "ToBigInt64( -(2n ** 64n) - 2n) => -2n");
+
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/bigint-tobiguint64.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/bigint-tobiguint64.js
new file mode 100644
index 0000000000..9f87a9be28
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/bigint-tobiguint64.js
@@ -0,0 +1,98 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Behavior for input array of BigInts
+info: |
+  TypedArray ( object )
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  [[Set]] ( P, V, Receiver)
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  IntegerIndexedElementSet ( O, index, value )
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+  15. Perform SetValueInBuffer(buffer, indexedPosition, elementType, numValue, true, "Unordered").
+      // NOTE: type will be set to BigUint64 in this test
+  16. Return true.
+
+  SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] )
+  ...
+  8. Let rawBytes be NumberToRawBytes(type, value, isLittleEndian).
+  ...
+
+  NumberToRawBytes( type, value, isLittleEndian )
+  ...
+  3. Else,
+    a. Let n be the Number value of the Element Size specified in Table
+       [The TypedArray Constructors] for Element Type type.
+    b. Let convOp be the abstract operation named in the Conversion Operation
+       column in Table 9 for Element Type type.
+
+  The TypedArray Constructors
+  Element Type: BigUint64
+  Conversion Operation: ToBigUint64
+
+  ToBigUint64 ( argument )
+  The abstract operation ToBigInt64 converts argument to one of 264 integer
+  values in the range -2^63 through 2^63-1, inclusive.
+  This abstract operation functions as follows:
+    1. Let n be ? ToBigInt(argument).
+    2. Let int64bit be n modulo 2^64.
+    3. Return int64bit.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+var vals = [
+  18446744073709551618n, // 2n ** 64n + 2n
+  9223372036854775810n, // 2n ** 63n + 2n
+  2n,
+  0n,
+  -2n,
+  -9223372036854775810n, // -(2n ** 63n) - 2n
+  -18446744073709551618n, // -(2n ** 64n) - 2n
+];
+
+var typedArray = new BigUint64Array(vals);
+
+
+assert.sameValue(typedArray[0], 2n,
+                 "ToBigUint64(2n ** 64n + 2n) => 2n");
+
+assert.sameValue(typedArray[1], 9223372036854775810n, // 2n ** 63n + 2n
+                 "ToBigUint64(2n ** 63n + 2n) => 9223372036854775810");
+
+assert.sameValue(typedArray[2], 2n,
+                 "ToBigUint64(2n) => 2n");
+
+assert.sameValue(typedArray[3], 0n,
+                 "ToBigUint64(0n) => 0n");
+
+assert.sameValue(typedArray[4], 18446744073709551614n, // 2n ** 64n - 2n
+                 "ToBigUint64( -2n) => 18446744073709551614n");
+
+assert.sameValue(typedArray[5], 9223372036854775806n, // 2n ** 63n - 2n
+                 "ToBigUint64( -(2n ** 63n) - 2n) => 9223372036854775806n");
+
+assert.sameValue(typedArray[6], 18446744073709551614n, // 2n ** 64n - 2n
+                 "ToBigUint64( -(2n ** 64n) - 2n) => 18446744073709551614n");
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/boolean-tobigint.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/boolean-tobigint.js
new file mode 100644
index 0000000000..c277e50fdc
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/boolean-tobigint.js
@@ -0,0 +1,52 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Behavior for input array of Booleans
+info: |
+  TypedArray ( object )
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  [[Set]] ( P, V, Receiver)
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  IntegerIndexedElementSet ( O, index, value )
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+
+  ToBigInt ( argument )
+  Object, Apply the following steps:
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table [BigInt Conversions]
+
+  BigInt Conversions
+    Argument Type: Boolean
+    Result: Return 1n if prim is true and 0n if prim is false.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+testWithBigIntTypedArrayConstructors(function(TA) {
+  var typedArray = new TA([false, true]);
+
+  assert.sameValue(typedArray[0], 0n);
+  assert.sameValue(typedArray[1], 1n);
+});
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/null-tobigint.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/null-tobigint.js
new file mode 100644
index 0000000000..fdbbab93d4
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/null-tobigint.js
@@ -0,0 +1,53 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Return abrupt on null
+info: |
+  TypedArray ( object )
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  [[Set]] ( P, V, Receiver)
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  IntegerIndexedElementSet ( O, index, value )
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+
+  ToBigInt ( argument )
+  Object, Apply the following steps:
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table [BigInt Conversions]
+
+  BigInt Conversions
+    Argument Type: Null
+    Result: Throw a TypeError exception.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+testWithBigIntTypedArrayConstructors(function(TA) {
+
+  assert.throws(TypeError, function() {
+    new TA([null]);
+  }, "abrupt completion from Null");
+
+});
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/number-tobigint.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/number-tobigint.js
new file mode 100644
index 0000000000..886c99f165
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/number-tobigint.js
@@ -0,0 +1,82 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Return abrupt on Number
+info: |
+  22.2.4.4 TypedArray ( object )
+
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  9.4.5.5 [[Set]] ( P, V, Receiver)
+
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  9.4.5.9 IntegerIndexedElementSet ( O, index, value )
+
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+
+  ToBigInt ( argument )
+
+  Object, Apply the following steps:
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table [BigInt Conversions]
+
+  BigInt Conversions
+    Argument Type: Number
+    Result: Throw a TypeError exception.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+testWithBigIntTypedArrayConstructors(function(TA) {
+
+  assert.throws(TypeError, function() {
+    new TA([1]);
+  }, "abrupt completion from Number: 1");
+
+  assert.throws(TypeError, function() {
+    new TA([Math.pow(2, 63)]);
+  }, "abrupt completion from Number: 2**63");
+
+  assert.throws(TypeError, function() {
+    new TA([+0]);
+  }, "abrupt completion from Number: +0");
+
+  assert.throws(TypeError, function() {
+    new TA([-0]);
+  }, "abrupt completion from Number: -0");
+
+  assert.throws(TypeError, function() {
+    new TA([Infinity]);
+  }, "abrupt completion from Number: Infinity");
+
+  assert.throws(TypeError, function() {
+    new TA([-Infinity]);
+  }, "abrupt completion from Number: -Infinity");
+
+  assert.throws(TypeError, function() {
+    new TA([NaN]);
+  }, "abrupt completion from Number: NaN");
+
+});
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/string-nan-tobigint.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/string-nan-tobigint.js
new file mode 100644
index 0000000000..0726d56e52
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/string-nan-tobigint.js
@@ -0,0 +1,61 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Return abrupt String, when StringToBigInt returns NaN
+info: |
+  22.2.4.4 TypedArray ( object )
+
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  9.4.5.5 [[Set]] ( P, V, Receiver)
+
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  9.4.5.9 IntegerIndexedElementSet ( O, index, value )
+
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+
+  ToBigInt ( argument )
+
+  Object, Apply the following steps:
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table [BigInt Conversions]
+
+  BigInt Conversions
+    Argument Type: String
+    Result:
+      1. Let n be StringToBigInt(prim).
+      2. If n is NaN, throw a SyntaxError exception.
+      3. Return n.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+testWithBigIntTypedArrayConstructors(function(TA) {
+
+  assert.throws(SyntaxError, function() {
+    new TA(["definately not a number"]);
+  }, "StringToBigInt(prim) == NaN");
+
+});
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/string-tobigint.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/string-tobigint.js
new file mode 100644
index 0000000000..90b8a41fa4
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/string-tobigint.js
@@ -0,0 +1,77 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Behavior for input array of Strings, successful conversion
+info: |
+  22.2.4.4 TypedArray ( object )
+
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  9.4.5.5 [[Set]] ( P, V, Receiver)
+
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  9.4.5.9 IntegerIndexedElementSet ( O, index, value )
+
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+
+  ToBigInt ( argument )
+
+  Object, Apply the following steps:
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table [BigInt Conversions]
+
+  BigInt Conversions
+    Argument Type: String
+    Result:
+      1. Let n be StringToBigInt(prim).
+      2. If n is NaN, throw a SyntaxError exception.
+      3. Return n.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+testWithBigIntTypedArrayConstructors(function(TA) {
+  var typedArray = new TA(['', '1']);
+
+  assert.sameValue(typedArray[0], 0n);
+  assert.sameValue(typedArray[1], 1n);
+
+  assert.throws(TypeError, function() {
+    new TA(["1n"]);
+  }, "A StringNumericLiteral may not include a BigIntLiteralSuffix.");
+
+  assert.throws(TypeError, function() {
+    new TA(["Infinity"]);
+  }, "Replace the StrUnsignedDecimalLiteral production with DecimalDigits to not allow Infinity..");
+
+  assert.throws(TypeError, function() {
+    new TA(["1.1"]);
+  }, "Replace the StrUnsignedDecimalLiteral production with DecimalDigits to not allow... decimal points...");
+
+  assert.throws(TypeError, function() {
+    new TA(["1e7"]);
+  }, "Replace the StrUnsignedDecimalLiteral production with DecimalDigits to not allow... exponents...");
+
+});
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/symbol-tobigint.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/symbol-tobigint.js
new file mode 100644
index 0000000000..2183b6ab1f
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/symbol-tobigint.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Return abrupt on Symbol
+info: |
+  22.2.4.4 TypedArray ( object )
+
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  9.4.5.5 [[Set]] ( P, V, Receiver)
+
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  9.4.5.9 IntegerIndexedElementSet ( O, index, value )
+
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+
+  ToBigInt ( argument )
+
+  Object, Apply the following steps:
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table [BigInt Conversions]
+
+  BigInt Conversions
+    Argument Type: Symbol
+    Result: Throw a TypeError exception.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray, Symbol]
+---*/
+
+var s = Symbol()
+
+testWithBigIntTypedArrayConstructors(function(TA) {
+
+  assert.throws(TypeError, function() {
+    new TA([s]);
+  }, "abrupt completion from Symbol");
+
+});
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-to-primitive-typeerror.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-to-primitive-typeerror.js
index 027ad4ba66..116401a4ca 100644
--- a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-to-primitive-typeerror.js
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-to-primitive-typeerror.js
@@ -31,15 +31,15 @@ info: |
   9.4.5.9 IntegerIndexedElementSet ( O, index, value )
 
   ...
-  3. Let numValue be ? ToNumber(value).
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
   ...
 
-  7.1.3 ToNumber ( argument )
+  ToBigInt ( argument )
 
   Object, Apply the following steps:
-
-    1. Let primValue be ? ToPrimitive(argument, hint Number).
-    2. Return ? ToNumber(primValue).
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table 10.
 
   7.1.1 ToPrimitive ( input [ , PreferredType ] )
 
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-to-primitive.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-to-primitive.js
index 9d84bee67e..7742ba6ac9 100644
--- a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-to-primitive.js
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-to-primitive.js
@@ -31,15 +31,15 @@ info: |
   9.4.5.9 IntegerIndexedElementSet ( O, index, value )
 
   ...
-  3. Let numValue be ? ToNumber(value).
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
   ...
 
-  7.1.3 ToNumber ( argument )
+  ToBigInt ( argument )
 
   Object, Apply the following steps:
-
-    1. Let primValue be ? ToPrimitive(argument, hint Number).
-    2. Return ? ToNumber(primValue).
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table 10.
 
   7.1.1 ToPrimitive ( input [ , PreferredType ] )
 
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-tostring.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-tostring.js
index 58801c0b03..bbe3c2c5b5 100644
--- a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-tostring.js
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-tostring.js
@@ -31,15 +31,15 @@ info: |
   9.4.5.9 IntegerIndexedElementSet ( O, index, value )
 
   ...
-  3. Let numValue be ? ToNumber(value).
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
   ...
 
-  7.1.3 ToNumber ( argument )
+  ToBigInt ( argument )
 
   Object, Apply the following steps:
-
-    1. Let primValue be ? ToPrimitive(argument, hint Number).
-    2. Return ? ToNumber(primValue).
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table 10.
 
   7.1.1 ToPrimitive ( input [ , PreferredType ] )
 
@@ -81,7 +81,7 @@ testWithBigIntTypedArrayConstructors(function(TA) {
 
   assert.throws(Test262Error, function() {
     new TA([8n, sample]);
-  }, "abrupt completion from ToNumber(sample)");
+  }, "abrupt completion from ToBigInt(sample)");
 
   assert.sameValue(valueOf, 1, "valueOf called once");
   assert.sameValue(toString, 1, "toString called once");
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-valueof-typeerror.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-valueof-typeerror.js
index 90a587af7d..3165cbd397 100644
--- a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-valueof-typeerror.js
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-valueof-typeerror.js
@@ -31,15 +31,15 @@ info: |
   9.4.5.9 IntegerIndexedElementSet ( O, index, value )
 
   ...
-  3. Let numValue be ? ToNumber(value).
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
   ...
 
-  7.1.3 ToNumber ( argument )
+  ToBigInt ( argument )
 
   Object, Apply the following steps:
-
-    1. Let primValue be ? ToPrimitive(argument, hint Number).
-    2. Return ? ToNumber(primValue).
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table 10.
 
   7.1.1 ToPrimitive ( input [ , PreferredType ] )
 
@@ -82,7 +82,7 @@ testWithBigIntTypedArrayConstructors(function(TA) {
 
   assert.throws(TypeError, function() {
     new TA([8n, sample]);
-  }, "abrupt completion from ToNumber(sample)");
+  }, "abrupt completion from ToBigInt(sample)");
 
   assert.sameValue(valueOf, 1, "valueOf called once");
   assert.sameValue(toString, 1, "toString called once");
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-valueof.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-valueof.js
index d5138d56eb..b9f0d461a4 100644
--- a/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-valueof.js
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/throws-setting-obj-valueof.js
@@ -31,15 +31,15 @@ info: |
   9.4.5.9 IntegerIndexedElementSet ( O, index, value )
 
   ...
-  3. Let numValue be ? ToNumber(value).
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
   ...
 
-  7.1.3 ToNumber ( argument )
+  ToBigInt ( argument )
 
   Object, Apply the following steps:
-
-    1. Let primValue be ? ToPrimitive(argument, hint Number).
-    2. Return ? ToNumber(primValue).
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table 10.
 
   7.1.1 ToPrimitive ( input [ , PreferredType ] )
 
@@ -76,7 +76,7 @@ testWithBigIntTypedArrayConstructors(function(TA) {
 
   assert.throws(Test262Error, function() {
     new TA([8n, sample]);
-  }, "abrupt completion from ToNumber(sample)");
+  }, "abrupt completion from ToBigInt(sample)");
 
   assert.sameValue(valueOf, 1, "valueOf called once");
 });
diff --git a/test/built-ins/TypedArrays/ctors-bigint/object-arg/undefined-tobigint.js b/test/built-ins/TypedArrays/ctors-bigint/object-arg/undefined-tobigint.js
new file mode 100644
index 0000000000..26f708df5a
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/object-arg/undefined-tobigint.js
@@ -0,0 +1,53 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-object
+description: >
+  Return abrupt on undefined
+info: |
+  TypedArray ( object )
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]]
+  internal slot.
+  ...
+  8. Repeat, while k < len
+    ...
+    b. Let kValue be ? Get(arrayLike, Pk).
+    c. Perform ? Set(O, Pk, kValue, true).
+  ...
+
+  [[Set]] ( P, V, Receiver)
+  ...
+  2. If Type(P) is String and if SameValue(O, Receiver) is true, then
+    a. Let numericIndex be ! CanonicalNumericIndexString(P).
+    b. If numericIndex is not undefined, then
+      i. Return ? IntegerIndexedElementSet(O, numericIndex, V).
+  ...
+
+  IntegerIndexedElementSet ( O, index, value )
+  ...
+  5. If arrayTypeName is "BigUint64Array" or "BigInt64Array",
+     let numValue be ? ToBigInt(value).
+  ...
+
+  ToBigInt ( argument )
+  Object, Apply the following steps:
+    1. Let prim be ? ToPrimitive(argument, hint Number).
+    2. Return the value that prim corresponds to in Table [BigInt Conversions]
+
+  BigInt Conversions
+    Argument Type: Undefined
+    Result: Throw a TypeError exception.
+
+includes: [testBigIntTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+testWithBigIntTypedArrayConstructors(function(TA) {
+
+  assert.throws(TypeError, function() {
+    new TA([undefined]);
+  }, "abrupt completion from undefined");
+
+});
diff --git a/test/built-ins/TypedArrays/ctors-bigint/typedarray-arg/src-typedarray-not-big-throws.js b/test/built-ins/TypedArrays/ctors-bigint/typedarray-arg/src-typedarray-not-big-throws.js
new file mode 100644
index 0000000000..190b2356fb
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors-bigint/typedarray-arg/src-typedarray-not-big-throws.js
@@ -0,0 +1,36 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-typedarray
+description: >
+  If typedArray constructor argument is not a Big(U)Int, throw
+info: |
+  22.2.4.3 TypedArray ( typedArray )
+
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object has a [[TypedArrayName]] internal slot.
+
+  ...
+  19. Else,
+    ...
+    c. If one of srcType and elementType contains the substring "Big" and the other
+       does not, throw a TypeError exception.
+
+includes: [testBigIntTypedArray.js, testTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+var notBigTypedArray;
+
+testWithTypedArrayConstructors(function(TA) {
+
+  notBigTypedArray = new TA(16);
+
+  testWithBigIntTypedArrayConstructors(function(BTA) {
+    assert.throws(TypeError, function() {
+      new BTA(notBigTypedArray);
+    });
+  });
+
+});
diff --git a/test/built-ins/TypedArrays/ctors/typedarray-arg/src-typedarray-big-throws.js b/test/built-ins/TypedArrays/ctors/typedarray-arg/src-typedarray-big-throws.js
new file mode 100644
index 0000000000..370f392fb5
--- /dev/null
+++ b/test/built-ins/TypedArrays/ctors/typedarray-arg/src-typedarray-big-throws.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2018 Valerie Young. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-typedarray-typedarray
+description: >
+  If typedArray constructor argument is a Big(U)Int, throw
+info: |
+  22.2.4.3 TypedArray ( typedArray )
+
+  This description applies only if the TypedArray function is called with at
+  least one argument and the Type of the first argument is Object and that
+  object has a [[TypedArrayName]] internal slot.
+
+  ...
+  19. Else,
+    ...
+    c. If one of srcType and elementType contains the substring "Big" and the other
+       does not, throw a TypeError exception.
+
+includes: [testBigIntTypedArray.js, testTypedArray.js]
+features: [BigInt, TypedArray]
+---*/
+
+var bigTypedArray;
+
+testWithBigIntTypedArrayConstructors(function(BTA) {
+
+  bigTypedArray = new BTA(16);
+
+  testWithTypedArrayConstructors(function(TA) {
+    assert.throws(TypeError, function() {
+      new TA(bigTypedArray);
+    });
+  });
+
+});
+
-- 
GitLab