Optimize number-to-string conversion
* Make constants static in `ecma_number_to_utf8_string`. * Make `ecma_number_to_utf8_string` use early returns, and rewrite its self-recursion in case of negative numbers. * Make the stringification of decimal exponent in `ecma_number_to_utf8_string` use `ecma_uint32_to_utf8_string`. * Changed ERROL0 dtoa implementation to use the `double` type instead of `ecma_number_t`. Thus, even is `ecma_number_t` is 32 bit wide, the algorithm works the same. * Changed `ecma_number_to_decimal` to use the ERROL0 dtoa algorithm for 32-bit floats as well. * Changed `ecma_number_to_decimal` to generate the decimal string representation of the mantissa instead of an `uint64_t` number. * Changed `ecma_number_to_utf8_string` to make use of the already available string representation of the mantissa, generated now by `ecma_number_to_decimal`. * Changed `ecma_number_to_utf8_string` not to use static arrays and variables for digit, "e", etc. generation. * Changed all `Number.prototype.toXXX` implementations and the `ecma_builtin_number_prototype_helper_round` helper to make use of the already available string representation of the mantissa, generated now by `ecma_number_to_decimal`. * Factored out the common stringification parts of all `Number.prototype.toXXX` implementations into a new helper `ecma_builtin_number_prototype_helper_to_string`. JerryScript-DCO-1.0-Signed-off-by: Akos Kiss akiss@inf.u-szeged.hu
This commit is contained in:
committed by
Zoltan Herczeg
parent
65542549af
commit
30fd549e7f
@@ -217,7 +217,7 @@ extern ecma_number_t ecma_number_add (ecma_number_t, ecma_number_t);
|
||||
extern ecma_number_t ecma_number_substract (ecma_number_t, ecma_number_t);
|
||||
extern ecma_number_t ecma_number_multiply (ecma_number_t, ecma_number_t);
|
||||
extern ecma_number_t ecma_number_divide (ecma_number_t, ecma_number_t);
|
||||
extern void ecma_number_to_decimal (ecma_number_t, uint64_t *, int32_t *, int32_t *);
|
||||
extern lit_utf8_size_t ecma_number_to_decimal (ecma_number_t, lit_utf8_byte_t *, int32_t *);
|
||||
|
||||
/* ecma-helpers-values-collection.c */
|
||||
extern ecma_collection_header_t *ecma_new_values_collection (const ecma_value_t[], ecma_length_t, bool);
|
||||
@@ -327,9 +327,7 @@ extern int32_t ecma_number_to_int32 (ecma_number_t);
|
||||
extern lit_utf8_size_t ecma_number_to_utf8_string (ecma_number_t, lit_utf8_byte_t *, lit_utf8_size_t);
|
||||
|
||||
/* ecma-helpers-errol.c */
|
||||
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64
|
||||
extern uint64_t ecma_errol0_dtoa (ecma_number_t, int32_t *, int32_t *);
|
||||
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64 */
|
||||
extern lit_utf8_size_t ecma_errol0_dtoa (double, lit_utf8_byte_t *, int32_t *);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
||||
Reference in New Issue
Block a user