Implement TrimStart TrimEnd and aliases (#4102)

Based on: https://tc39.es/ecma262/#sec-string.prototype.trim

JerryScript-DCO-1.0-Signed-off-by: Bela Toth tbela@inf.u-szeged.hu
This commit is contained in:
Tóth Béla
2020-08-25 13:10:36 +02:00
committed by GitHub
parent 85981457e6
commit 09c8d28b2c
10 changed files with 172 additions and 91 deletions
@@ -18,7 +18,9 @@
#include "ecma-container-object.h"
#include "ecma-array-object.h"
#include "ecma-typedarray-object.h"
#include "ecma-string-object.h"
#include "ecma-gc.h"
#include "ecma-helpers.h"
#include "lit-char-helpers.h"
#if ENABLED (JERRY_ESNEXT)
@@ -44,7 +46,9 @@ enum
ECMA_INTRINSIC_ARRAY_TO_STRING,
ECMA_INTRINSIC_DATE_TO_UTC_STRING,
ECMA_INTRINSIC_PARSE_FLOAT,
ECMA_INTRINSIC_PARSE_INT
ECMA_INTRINSIC_PARSE_INT,
ECMA_INTRINSIC_STRING_TRIM_START,
ECMA_INTRINSIC_STRING_TRIM_END,
};
#define BUILTIN_INC_HEADER_NAME "ecma-builtin-intrinsic.inc.h"
@@ -206,6 +210,48 @@ ecma_builtin_intrinsic_dispatch_routine (uint16_t builtin_routine_id, /**< built
return ecma_date_value_to_utc_string (*prim_value_p);
}
case ECMA_INTRINSIC_STRING_TRIM_START:
case ECMA_INTRINSIC_STRING_TRIM_END:
{
ecma_value_t coercible = ecma_op_check_object_coercible (this_arg);
if (ECMA_IS_VALUE_ERROR (coercible))
{
return coercible;
}
ecma_string_t *to_str_p = ecma_op_to_string (this_arg);
if (to_str_p == NULL)
{
return ECMA_VALUE_ERROR;
}
ECMA_STRING_TO_UTF8_STRING (to_str_p, start_p, input_start_size);
lit_utf8_size_t size;
const lit_utf8_byte_t *input_start_p = start_p;
const lit_utf8_byte_t *input_str_end_p = start_p + input_start_size;
ecma_string_t *ret_str_p;
if (builtin_routine_id == ECMA_INTRINSIC_STRING_TRIM_START)
{
const lit_utf8_byte_t *new_start_p = ecma_string_trim_front (input_start_p, input_str_end_p);
size = (lit_utf8_size_t) (input_str_end_p - new_start_p);
ret_str_p = ecma_new_ecma_string_from_utf8 (new_start_p, size);
}
else
{
const lit_utf8_byte_t *new_end_p = ecma_string_trim_back (input_start_p, input_str_end_p);
size = (lit_utf8_size_t) (new_end_p - input_start_p);
ret_str_p = ecma_new_ecma_string_from_utf8 (input_start_p, size);
}
ECMA_FINALIZE_UTF8_STRING (start_p, input_start_size);
ecma_value_t result = ecma_make_string_value (ret_str_p);
ecma_deref_ecma_string (to_str_p);
return result;
}
default:
{
JERRY_ASSERT (builtin_routine_id == ECMA_INTRINSIC_PARSE_INT
@@ -236,7 +282,6 @@ ecma_builtin_intrinsic_dispatch_routine (uint16_t builtin_routine_id, /**< built
ECMA_FINALIZE_UTF8_STRING (string_buff, string_buff_size);
ecma_deref_ecma_string (str_p);
return result;
}
}
@@ -74,6 +74,8 @@ ROUTINE (LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES, ECMA_INTRINSIC_ARRAY_
ROUTINE (LIT_INTERNAL_MAGIC_STRING_TYPEDARRAY_PROTOTYPE_VALUES, ECMA_INTRINSIC_TYPEDARRAY_PROTOTYPE_VALUES, 0, 0)
ROUTINE (LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_VALUES, ECMA_INTRINSIC_SET_PROTOTYPE_VALUES, 0, 0)
ROUTINE (LIT_INTERNAL_MAGIC_STRING_MAP_PROTOTYPE_ENTRIES, ECMA_INTRINSIC_MAP_PROTOTYPE_ENTRIES, 0, 0)
ROUTINE (LIT_MAGIC_STRING_TRIM_START, ECMA_INTRINSIC_STRING_TRIM_START, 0, 0)
ROUTINE (LIT_MAGIC_STRING_TRIM_END, ECMA_INTRINSIC_STRING_TRIM_END, 0, 0)
ROUTINE (LIT_MAGIC_STRING_TO_STRING_UL, ECMA_INTRINSIC_ARRAY_TO_STRING, 0, 0)
ROUTINE (LIT_MAGIC_STRING_TO_UTC_STRING_UL, ECMA_INTRINSIC_DATE_TO_UTC_STRING, 0, 0)
ROUTINE (LIT_MAGIC_STRING_PARSE_FLOAT, ECMA_INTRINSIC_PARSE_FLOAT, 1, 1)
@@ -76,6 +76,15 @@ ROUTINE (LIT_MAGIC_STRING_CODE_POINT_AT, ECMA_STRING_PROTOTYPE_CODE_POINT_AT, 1,
ROUTINE (LIT_MAGIC_STRING_PAD_START, ECMA_STRING_PROTOTYPE_PAD_START, 2, 1)
ROUTINE (LIT_MAGIC_STRING_PAD_END, ECMA_STRING_PROTOTYPE_PAD_END, 2, 1)
ROUTINE (LIT_GLOBAL_SYMBOL_ITERATOR, ECMA_STRING_PROTOTYPE_ITERATOR, 0, 0)
INTRINSIC_PROPERTY (LIT_MAGIC_STRING_TRIM_START, LIT_MAGIC_STRING_TRIM_START,
ECMA_PROPERTY_CONFIGURABLE_WRITABLE)
INTRINSIC_PROPERTY (LIT_MAGIC_STRING_TRIM_LEFT, LIT_MAGIC_STRING_TRIM_START,
ECMA_PROPERTY_CONFIGURABLE_WRITABLE)
INTRINSIC_PROPERTY (LIT_MAGIC_STRING_TRIM_END, LIT_MAGIC_STRING_TRIM_END,
ECMA_PROPERTY_CONFIGURABLE_WRITABLE)
INTRINSIC_PROPERTY (LIT_MAGIC_STRING_TRIM_RIGHT, LIT_MAGIC_STRING_TRIM_END,
ECMA_PROPERTY_CONFIGURABLE_WRITABLE)
#endif /* ENABLED (JERRY_ESNEXT) */
#endif /* ENABLED (JERRY_BUILTIN_STRING) */