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");