Use a string builder in Array.prototype.join and toLocaleString (#3184)
JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai dbatyai@inf.u-szeged.hu
This commit is contained in:
committed by
Robert Fancsik
parent
cfaecc6698
commit
c17da4f33b
@@ -27,6 +27,7 @@
|
|||||||
#include "ecma-iterator-object.h"
|
#include "ecma-iterator-object.h"
|
||||||
#include "ecma-objects.h"
|
#include "ecma-objects.h"
|
||||||
#include "ecma-string-object.h"
|
#include "ecma-string-object.h"
|
||||||
|
#include "lit-char-helpers.h"
|
||||||
#include "jrt.h"
|
#include "jrt.h"
|
||||||
|
|
||||||
#if ENABLED (JERRY_BUILTIN_ARRAY)
|
#if ENABLED (JERRY_BUILTIN_ARRAY)
|
||||||
@@ -182,38 +183,29 @@ ecma_builtin_array_prototype_object_to_locale_string (ecma_object_t *obj_p, /**<
|
|||||||
}
|
}
|
||||||
|
|
||||||
ecma_string_t *first_string_p = ecma_get_string_from_value (first_value);
|
ecma_string_t *first_string_p = ecma_get_string_from_value (first_value);
|
||||||
ecma_string_t *return_string_p = first_string_p;
|
ecma_stringbuilder_t builder = ecma_stringbuilder_create_from (first_string_p);
|
||||||
ecma_ref_ecma_string (return_string_p);
|
ecma_deref_ecma_string (first_string_p);
|
||||||
|
|
||||||
ecma_value_t ret_value = ECMA_VALUE_ERROR;
|
|
||||||
|
|
||||||
/* 9-10. */
|
/* 9-10. */
|
||||||
for (uint32_t k = 1; k < length; k++)
|
for (uint32_t k = 1; k < length; k++)
|
||||||
{
|
{
|
||||||
/* 4. Implementation-defined: set the separator to a single comma character. */
|
/* 4. Implementation-defined: set the separator to a single comma character. */
|
||||||
return_string_p = ecma_append_magic_string_to_string (return_string_p,
|
ecma_stringbuilder_append_byte (&builder, LIT_CHAR_COMMA);
|
||||||
LIT_MAGIC_STRING_COMMA_CHAR);
|
|
||||||
|
|
||||||
ecma_value_t next_string_value = ecma_builtin_helper_get_to_locale_string_at_index (obj_p, k);
|
ecma_value_t next_string_value = ecma_builtin_helper_get_to_locale_string_at_index (obj_p, k);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (next_string_value))
|
if (ECMA_IS_VALUE_ERROR (next_string_value))
|
||||||
{
|
{
|
||||||
ecma_deref_ecma_string (return_string_p);
|
ecma_stringbuilder_destroy (&builder);
|
||||||
goto clean_up;
|
return next_string_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
ecma_string_t *next_string_p = ecma_get_string_from_value (next_string_value);
|
ecma_string_t *next_string_p = ecma_get_string_from_value (next_string_value);
|
||||||
return_string_p = ecma_concat_ecma_strings (return_string_p, next_string_p);
|
ecma_stringbuilder_append (&builder, next_string_p);
|
||||||
|
|
||||||
ecma_deref_ecma_string (next_string_p);
|
ecma_deref_ecma_string (next_string_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret_value = ecma_make_string_value (return_string_p);
|
return ecma_make_string_value (ecma_stringbuilder_finalize (&builder));
|
||||||
|
|
||||||
clean_up:
|
|
||||||
ecma_deref_ecma_string (first_string_p);
|
|
||||||
|
|
||||||
return ret_value;
|
|
||||||
} /* ecma_builtin_array_prototype_object_to_locale_string */
|
} /* ecma_builtin_array_prototype_object_to_locale_string */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -382,40 +374,33 @@ ecma_builtin_array_prototype_join (ecma_value_t separator_arg, /**< separator ar
|
|||||||
}
|
}
|
||||||
|
|
||||||
ecma_string_t *first_string_p = ecma_get_string_from_value (first_value);
|
ecma_string_t *first_string_p = ecma_get_string_from_value (first_value);
|
||||||
ecma_string_t *return_string_p = first_string_p;
|
ecma_stringbuilder_t builder = ecma_stringbuilder_create_from (first_string_p);
|
||||||
ecma_ref_ecma_string (return_string_p);
|
ecma_deref_ecma_string (first_string_p);
|
||||||
|
|
||||||
ecma_value_t ret_value = ECMA_VALUE_ERROR;
|
|
||||||
/* 9-10. */
|
/* 9-10. */
|
||||||
for (uint32_t k = 1; k < length; k++)
|
for (uint32_t k = 1; k < length; k++)
|
||||||
{
|
{
|
||||||
/* 10.a */
|
/* 10.a */
|
||||||
return_string_p = ecma_concat_ecma_strings (return_string_p, separator_string_p);
|
ecma_stringbuilder_append (&builder, separator_string_p);
|
||||||
|
|
||||||
/* 10.b, 10.c */
|
/* 10.b, 10.c */
|
||||||
ecma_value_t next_string_value = ecma_op_array_get_to_string_at_index (obj_p, k);
|
ecma_value_t next_string_value = ecma_op_array_get_to_string_at_index (obj_p, k);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (next_string_value))
|
if (ECMA_IS_VALUE_ERROR (next_string_value))
|
||||||
{
|
{
|
||||||
ecma_deref_ecma_string (return_string_p);
|
ecma_deref_ecma_string (separator_string_p);
|
||||||
goto clean_up;
|
ecma_stringbuilder_destroy (&builder);
|
||||||
|
return next_string_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 10.d */
|
/* 10.d */
|
||||||
ecma_string_t *next_string_p = ecma_get_string_from_value (next_string_value);
|
ecma_string_t *next_string_p = ecma_get_string_from_value (next_string_value);
|
||||||
return_string_p = ecma_concat_ecma_strings (return_string_p, next_string_p);
|
ecma_stringbuilder_append (&builder, next_string_p);
|
||||||
|
|
||||||
ecma_deref_ecma_string (next_string_p);
|
ecma_deref_ecma_string (next_string_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret_value = ecma_make_string_value (return_string_p);
|
|
||||||
|
|
||||||
clean_up:
|
|
||||||
ecma_deref_ecma_string (first_string_p);
|
|
||||||
|
|
||||||
ecma_deref_ecma_string (separator_string_p);
|
ecma_deref_ecma_string (separator_string_p);
|
||||||
|
return ecma_make_string_value (ecma_stringbuilder_finalize (&builder));
|
||||||
return ret_value;
|
|
||||||
} /* ecma_builtin_array_prototype_join */
|
} /* ecma_builtin_array_prototype_join */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user