From 22a389ba20cb8bf1e6850050d2140cc7d04fe5c1 Mon Sep 17 00:00:00 2001 From: Sanggyu Lee Date: Fri, 11 Aug 2017 13:21:22 +0900 Subject: [PATCH] Fix new ArrayBuffer(length) for variaous input Currently new ArrayBuffer(length) does not conform to ES2017. Major JS implementations follow ES2017 for ArrayBuffer(length). For example, new ArrayBuffer(length) should not throw RangeError for length = NaN, undefined, negative number, floating point, and so on. JerryScript-DCO-1.0-Signed-off-by: Sanggyu Lee sg5.lee@samsung.com --- .../ecma/operations/ecma-arraybuffer-object.c | 21 +++++++++------ .../es2015/24/24.01/24.01.02/24.01.02-001.js | 1 + .../es2015/24/24.01/24.01.02/24.01.02-002.js | 1 + .../es2015/24/24.01/24.01.02/24.01.02-003.js | 1 + .../es2015/24/24.01/24.01.02/24.01.02-006.js | 14 ++-------- .../es2015/24/24.01/24.01.02/24.01.02-007.js | 14 ++-------- .../es2015/24/24.01/24.01.02/24.01.02-008.js | 13 ++-------- .../es2015/24/24.01/24.01.02/24.01.02-009.js | 17 ++++++++++++ .../es2015/24/24.01/24.01.02/24.01.02-010.js | 17 ++++++++++++ .../es2015/24/24.01/24.01.02/24.01.02-011.js | 20 ++++++++++++++ .../es2015/24/24.01/24.01.02/24.01.02-012.js | 26 +++++++++++++++++++ .../es2015/24/24.01/24.01.02/24.01.02-013.js | 26 +++++++++++++++++++ 12 files changed, 128 insertions(+), 43 deletions(-) create mode 100644 tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-009.js create mode 100644 tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-010.js create mode 100644 tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-011.js create mode 100644 tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-012.js create mode 100644 tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-013.js diff --git a/jerry-core/ecma/operations/ecma-arraybuffer-object.c b/jerry-core/ecma/operations/ecma-arraybuffer-object.c index cf44a5983b..b5e68c750c 100644 --- a/jerry-core/ecma/operations/ecma-arraybuffer-object.c +++ b/jerry-core/ecma/operations/ecma-arraybuffer-object.c @@ -75,15 +75,14 @@ ecma_op_create_arraybuffer_object (const ecma_value_t *arguments_list_p, /**< li { JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); - uint32_t length = 0; + ecma_number_t length_num = 0; if (arguments_list_len > 0) { - ecma_number_t num; if (ecma_is_value_number (arguments_list_p[0])) { - num = ecma_get_number_from_value (arguments_list_p[0]); + length_num = ecma_get_number_from_value (arguments_list_p[0]); } else { @@ -94,21 +93,27 @@ ecma_op_create_arraybuffer_object (const ecma_value_t *arguments_list_p, /**< li return to_number_value; } - num = ecma_get_number_from_value (to_number_value); + length_num = ecma_get_number_from_value (to_number_value); ecma_free_value (to_number_value); } - length = ecma_number_to_uint32 (num); + if (ecma_number_is_nan (length_num)) + { + length_num = 0; + } - if (num != ((ecma_number_t) length) - || length > (UINT32_MAX - sizeof (ecma_extended_object_t) - JMEM_ALIGNMENT + 1)) + const uint32_t maximum_size_in_byte = UINT32_MAX - sizeof (ecma_extended_object_t) - JMEM_ALIGNMENT + 1; + + if (length_num <= -1.0 || length_num > (double) maximum_size_in_byte + 0.5) { return ecma_raise_range_error (ECMA_ERR_MSG ("Invalid ArrayBuffer length.")); } } - return ecma_make_object_value (ecma_arraybuffer_new_object (length)); + uint32_t length_uint32 = ecma_number_to_uint32 (length_num); + + return ecma_make_object_value (ecma_arraybuffer_new_object (length_uint32)); } /* ecma_op_create_arraybuffer_object */ /** diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-001.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-001.js index e8794a23fe..88e67da243 100644 --- a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-001.js +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-001.js @@ -15,3 +15,4 @@ var a = new ArrayBuffer(); assert(typeof a === 'object'); +assert(a.byteLength === 0); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-002.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-002.js index 85de9e6b37..cdf8afaa89 100644 --- a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-002.js +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-002.js @@ -15,3 +15,4 @@ var a = new ArrayBuffer(5); assert(typeof a === 'object'); +assert(a.byteLength === 5); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-003.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-003.js index 1d47d46b79..4f96be1425 100644 --- a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-003.js +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-003.js @@ -15,3 +15,4 @@ var a = new ArrayBuffer("5"); assert(typeof a === 'object'); +assert(a.byteLength === 5); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-006.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-006.js index ceb35a6604..b66806acd2 100644 --- a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-006.js +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-006.js @@ -13,15 +13,5 @@ * limitations under the License. */ -var name = ""; - -try -{ - var a = new ArrayBuffer(5.5); -} -catch (e) -{ - name = e.name; -} - -assert(name === "RangeError"); +var a = new ArrayBuffer(5.5); +assert(a.byteLength === 5); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-007.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-007.js index f0d49c9f89..12ffffd829 100644 --- a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-007.js +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-007.js @@ -13,15 +13,5 @@ * limitations under the License. */ -var name = ""; - -try -{ - var a = new ArrayBuffer("string"); -} -catch (e) -{ - name = e.name; -} - -assert(name === "RangeError"); +var a = new ArrayBuffer("string"); +assert(a.byteLength === 0); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-008.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-008.js index 4bd7dc6018..bde34e97f5 100644 --- a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-008.js +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-008.js @@ -13,15 +13,6 @@ * limitations under the License. */ -var name = ""; var obj = {}; -try -{ - var a = new ArrayBuffer(obj); -} -catch (e) -{ - name = e.name; -} - -assert(name === "RangeError"); +var a = new ArrayBuffer(obj); +assert(a.byteLength === 0); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-009.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-009.js new file mode 100644 index 0000000000..7415cb0747 --- /dev/null +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-009.js @@ -0,0 +1,17 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var a = new ArrayBuffer(undefined); +assert(a.byteLength === 0); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-010.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-010.js new file mode 100644 index 0000000000..b1760c6c77 --- /dev/null +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-010.js @@ -0,0 +1,17 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var a = new ArrayBuffer(NaN); +assert(a.byteLength === 0); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-011.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-011.js new file mode 100644 index 0000000000..5bc1b37b99 --- /dev/null +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-011.js @@ -0,0 +1,20 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var a = new ArrayBuffer(-0.3); +assert(a.byteLength === 0); + +var b = new ArrayBuffer(-0.9); +assert(b.byteLength === 0); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-012.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-012.js new file mode 100644 index 0000000000..0da1ee8702 --- /dev/null +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-012.js @@ -0,0 +1,26 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var name = ""; +try +{ + var a = new ArrayBuffer(-1.9); +} +catch (e) +{ + name = e.name; +} + +assert(name === "RangeError"); diff --git a/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-013.js b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-013.js new file mode 100644 index 0000000000..9dba0f1495 --- /dev/null +++ b/tests/jerry-test-suite/es2015/24/24.01/24.01.02/24.01.02-013.js @@ -0,0 +1,26 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var name = ""; +try +{ + var a = new ArrayBuffer(Math.pow(2, 32) - 1); +} +catch (e) +{ + name = e.name; +} + +assert(name === "RangeError");