From f93fa98a755aa4f557cb354f89a8d23e6460af58 Mon Sep 17 00:00:00 2001 From: Robert Fancsik Date: Thu, 31 Oct 2019 15:06:19 +0100 Subject: [PATCH] Add Number.{EPSILON, {MAX,MIN}_SAFE_INTEGER} to the builtin descriptor (#3258) JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik frobert@inf.u-szeged.hu --- jerry-core/ecma/base/ecma-globals.h | 39 ++++++++++++++++--- .../builtin-objects/ecma-builtin-number.inc.h | 17 ++++++++ .../builtin-objects/ecma-builtins-internal.h | 1 + .../ecma/builtin-objects/ecma-builtins.c | 1 + jerry-core/lit/lit-magic-strings.inc.h | 13 +++++++ jerry-core/lit/lit-magic-strings.ini | 3 ++ tests/jerry/es2015/number-constants.js | 19 +++++++++ 7 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 tests/jerry/es2015/number-constants.js diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 36ca34ba6..048120d12 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -1164,6 +1164,26 @@ typedef union * See also: ECMA_262 v5, 15.7.3.2 */ # define ECMA_NUMBER_MAX_VALUE (FLT_MAX) +/** + * Number.EPSILON + * + * See also: ECMA_262 v6, 20.1.2.1 + */ +# define ECMA_NUMBER_EPSILON ((ecma_number_t) 1.1920928955078125e-7) + +/** + * Number.MAX_SAFE_INTEGER + * + * See also: ECMA_262 v6, 20.1.2.6 + */ +# define ECMA_NUMBER_MAX_SAFE_INTEGER ((ecma_number_t) 0xFFFFFF) + +/** + * Number.MIN_SAFE_INTEGER + * + * See also: ECMA_262 v6, 20.1.2.8 + */ +# define ECMA_NUMBER_MIN_SAFE_INTEGER ((ecma_number_t) -0xFFFFFF) #elif ENABLED (JERRY_NUMBER_TYPE_FLOAT64) /** * Number.MAX_VALUE (i.e., the maximum value of ecma-number) @@ -1171,29 +1191,36 @@ typedef union * See also: ECMA_262 v5, 15.7.3.2 */ # define ECMA_NUMBER_MAX_VALUE ((ecma_number_t) 1.7976931348623157e+308) + /** * Number.MIN_VALUE (i.e., the smallest positive value of ecma-number) * * See also: ECMA_262 v5, 15.7.3.3 */ # define ECMA_NUMBER_MIN_VALUE ((ecma_number_t) 5e-324) -#endif /* !ENABLED (JERRY_NUMBER_TYPE_FLOAT64) */ -#if ENABLED (JERRY_ES2015_BUILTIN) + /** * Number.EPSILON * * See also: ECMA_262 v6, 20.1.2.1 */ # define ECMA_NUMBER_EPSILON ((ecma_number_t) 2.2204460492503130808472633361816e-16) -#endif /* ENABLED (JERRY_ES2015_BUILTIN) */ -#if ENABLED (JERRY_ES2015_BUILTIN) + /** * Number.MAX_SAFE_INTEGER * - * See also: ECMA_262 v6, 20.1.2.1 + * See also: ECMA_262 v6, 20.1.2.6 */ # define ECMA_NUMBER_MAX_SAFE_INTEGER ((ecma_number_t) 0x1FFFFFFFFFFFFF) -#endif /* ENABLED (JERRY_ES2015_BUILTIN) */ + +/** + * Number.MIN_SAFE_INTEGER + * + * See also: ECMA_262 v6, 20.1.2.8 + */ +# define ECMA_NUMBER_MIN_SAFE_INTEGER ((ecma_number_t) -0x1FFFFFFFFFFFFF) +#endif /* !ENABLED (JERRY_NUMBER_TYPE_FLOAT64) */ + /** * Euler number */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-number.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-number.inc.h index 695f9cb9d..77e575561 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-number.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-number.inc.h @@ -54,6 +54,23 @@ NUMBER_VALUE (LIT_MAGIC_STRING_NEGATIVE_INFINITY_U, ECMA_BUILTIN_NUMBER_NEGATIVE_INFINITY, ECMA_PROPERTY_FIXED) +#if ENABLED (JERRY_ES2015_BUILTIN) +/* ECMA-262 v6, 20.1.2.1 */ +NUMBER_VALUE (LIT_MAGIC_STRING_EPSILON_U, + ECMA_BUILTIN_NUMBER_EPSILON, + ECMA_PROPERTY_FIXED) + +/* ECMA-262 v6, 20.1.2.6 */ +NUMBER_VALUE (LIT_MAGIC_STRING_MAX_SAFE_INTEGER_U, + ECMA_BUILTIN_NUMBER_MAX_SAFE_INTEGER, + ECMA_PROPERTY_FIXED) + +/* ECMA-262 v6, 20.1.2.8 */ +NUMBER_VALUE (LIT_MAGIC_STRING_MIN_SAFE_INTEGER_U, + ECMA_BUILTIN_NUMBER_MIN_SAFE_INTEGER, + ECMA_PROPERTY_FIXED) +#endif /* ENABLED (JERRY_ES2015_BUILTIN) */ + /* Object properties: * (property name, object pointer getter) */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins-internal.h b/jerry-core/ecma/builtin-objects/ecma-builtins-internal.h index aaa842caa..b65c17204 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins-internal.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtins-internal.h @@ -51,6 +51,7 @@ typedef enum #if ENABLED (JERRY_ES2015_BUILTIN) ECMA_BUILTIN_NUMBER_EPSILON, /**< value of ECMA_NUMBER_EPSILON */ ECMA_BUILTIN_NUMBER_MAX_SAFE_INTEGER, /**< value of ECMA_NUMBER_MAX_SAFE_INTEGER */ + ECMA_BUILTIN_NUMBER_MIN_SAFE_INTEGER, /**< value of ECMA_NUMBER_MIN_SAFE_INTEGER */ #endif /* ENABLED (JERRY_BUILTIN_NUMBER) */ ECMA_BUILTIN_NUMBER_E, /**< value of ECMA_NUMBER_E */ ECMA_BUILTIN_NUMBER_PI, /**< value of ECMA_NUMBER_PI */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.c b/jerry-core/ecma/builtin-objects/ecma-builtins.c index e2b00cc58..ff01aeb3f 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.c @@ -744,6 +744,7 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object * #if ENABLED (JERRY_ES2015_BUILTIN) ECMA_NUMBER_EPSILON, ECMA_NUMBER_MAX_SAFE_INTEGER, + ECMA_NUMBER_MIN_SAFE_INTEGER, #endif /* ENABLED (JERRY_BUILTIN_NUMBER) */ ECMA_NUMBER_E, ECMA_NUMBER_PI, diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index 58cd55bdc..93c9e8235 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -346,6 +346,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_JSON_UL, "toJSON") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_VALUES, "values") #endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_BOOLEAN_UL, "Boolean") +#if ENABLED (JERRY_BUILTIN_NUMBER) && ENABLED (JERRY_ES2015_BUILTIN) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_EPSILON_U, "EPSILON") +#endif #if ENABLED (JERRY_ES2015_BUILTIN_PROMISE) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PROMISE_UL, "Promise") #endif @@ -727,6 +730,10 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_STRING_ITERATOR_UL, "String Iterator") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_MILLISECONDS_UL, "getMilliseconds") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_MILLISECONDS_UL, "setMilliseconds") #endif +#if ENABLED (JERRY_BUILTIN_NUMBER) && ENABLED (JERRY_ES2015_BUILTIN) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_MAX_SAFE_INTEGER_U, "MAX_SAFE_INTEGER") +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_MIN_SAFE_INTEGER_U, "MIN_SAFE_INTEGER") +#endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_DEFINE_PROPERTIES_UL, "defineProperties") #if ENABLED (JERRY_ES2015_BUILTIN_TYPEDARRAY) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_BYTES_PER_ELEMENT_U, "BYTES_PER_ELEMENT") @@ -868,10 +875,16 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (14, LIT_MAGIC_STRING_DEFINE_PROPERTY_UL LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (15, LIT_MAGIC_STRING_STRING_ITERATOR_UL) #elif ENABLED (JERRY_BUILTIN_DATE) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (15, LIT_MAGIC_STRING_GET_MILLISECONDS_UL) +#elif ENABLED (JERRY_BUILTIN_NUMBER) && ENABLED (JERRY_ES2015_BUILTIN) +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (15, LIT_MAGIC_STRING_MAX_SAFE_INTEGER_U) #else LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (15, LIT_MAGIC_STRING_DEFINE_PROPERTIES_UL) #endif +#if ENABLED (JERRY_BUILTIN_NUMBER) && ENABLED (JERRY_ES2015_BUILTIN) +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (16, LIT_MAGIC_STRING_MAX_SAFE_INTEGER_U) +#else LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (16, LIT_MAGIC_STRING_DEFINE_PROPERTIES_UL) +#endif #if ENABLED (JERRY_ES2015_BUILTIN_TYPEDARRAY) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (17, LIT_MAGIC_STRING_BYTES_PER_ELEMENT_U) #elif ENABLED (JERRY_BUILTIN_NUMBER) diff --git a/jerry-core/lit/lit-magic-strings.ini b/jerry-core/lit/lit-magic-strings.ini index d1429df66..afb493bd9 100644 --- a/jerry-core/lit/lit-magic-strings.ini +++ b/jerry-core/lit/lit-magic-strings.ini @@ -180,6 +180,7 @@ LIT_MAGIC_STRING_SPECIES = "species" LIT_MAGIC_STRING_TO_FIXED_UL = "toFixed" LIT_MAGIC_STRING_UNSHIFT = "unshift" LIT_MAGIC_STRING_VALUE_OF_UL = "valueOf" +LIT_MAGIC_STRING_EPSILON_U = "EPSILON" LIT_MAGIC_STRING_DATAVIEW_UL = "DataView" LIT_MAGIC_STRING_FUNCTION_UL = "Function" LIT_MAGIC_STRING_INFINITY_UL = "Infinity" @@ -308,6 +309,8 @@ LIT_MAGIC_STRING_STRING_ITERATOR_UL = "String Iterator" LIT_MAGIC_STRING_GET_MILLISECONDS_UL = "getMilliseconds" LIT_MAGIC_STRING_SET_MILLISECONDS_UL = "setMilliseconds" LIT_MAGIC_STRING_DEFINE_PROPERTIES_UL = "defineProperties" +LIT_MAGIC_STRING_MAX_SAFE_INTEGER_U = "MAX_SAFE_INTEGER" +LIT_MAGIC_STRING_MIN_SAFE_INTEGER_U = "MIN_SAFE_INTEGER" LIT_MAGIC_STRING_BYTES_PER_ELEMENT_U = "BYTES_PER_ELEMENT" LIT_MAGIC_STRING_NEGATIVE_INFINITY_U = "NEGATIVE_INFINITY" LIT_MAGIC_STRING_POSITIVE_INFINITY_U = "POSITIVE_INFINITY" diff --git a/tests/jerry/es2015/number-constants.js b/tests/jerry/es2015/number-constants.js new file mode 100644 index 000000000..9042d611b --- /dev/null +++ b/tests/jerry/es2015/number-constants.js @@ -0,0 +1,19 @@ +// 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. + +//This test will not pass on FLOAT32 due to precision issues + +assert(Number.MAX_SAFE_INTEGER === 9007199254740991); +assert(Number.MIN_SAFE_INTEGER === -9007199254740991); +assert(Number.EPSILON === 2.2204460492503130808472633361816e-16);