Skip to content

Commit c17da4f

Browse files
dbatyairerobika
authored andcommitted
Use a string builder in Array.prototype.join and toLocaleString (#3184)
JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai [email protected]
1 parent cfaecc6 commit c17da4f

File tree

1 file changed

+16
-31
lines changed

1 file changed

+16
-31
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "ecma-iterator-object.h"
2828
#include "ecma-objects.h"
2929
#include "ecma-string-object.h"
30+
#include "lit-char-helpers.h"
3031
#include "jrt.h"
3132

3233
#if ENABLED (JERRY_BUILTIN_ARRAY)
@@ -182,38 +183,29 @@ ecma_builtin_array_prototype_object_to_locale_string (ecma_object_t *obj_p, /**<
182183
}
183184

184185
ecma_string_t *first_string_p = ecma_get_string_from_value (first_value);
185-
ecma_string_t *return_string_p = first_string_p;
186-
ecma_ref_ecma_string (return_string_p);
187-
188-
ecma_value_t ret_value = ECMA_VALUE_ERROR;
186+
ecma_stringbuilder_t builder = ecma_stringbuilder_create_from (first_string_p);
187+
ecma_deref_ecma_string (first_string_p);
189188

190189
/* 9-10. */
191190
for (uint32_t k = 1; k < length; k++)
192191
{
193192
/* 4. Implementation-defined: set the separator to a single comma character. */
194-
return_string_p = ecma_append_magic_string_to_string (return_string_p,
195-
LIT_MAGIC_STRING_COMMA_CHAR);
193+
ecma_stringbuilder_append_byte (&builder, LIT_CHAR_COMMA);
196194

197195
ecma_value_t next_string_value = ecma_builtin_helper_get_to_locale_string_at_index (obj_p, k);
198196

199197
if (ECMA_IS_VALUE_ERROR (next_string_value))
200198
{
201-
ecma_deref_ecma_string (return_string_p);
202-
goto clean_up;
199+
ecma_stringbuilder_destroy (&builder);
200+
return next_string_value;
203201
}
204202

205203
ecma_string_t *next_string_p = ecma_get_string_from_value (next_string_value);
206-
return_string_p = ecma_concat_ecma_strings (return_string_p, next_string_p);
207-
204+
ecma_stringbuilder_append (&builder, next_string_p);
208205
ecma_deref_ecma_string (next_string_p);
209206
}
210207

211-
ret_value = ecma_make_string_value (return_string_p);
212-
213-
clean_up:
214-
ecma_deref_ecma_string (first_string_p);
215-
216-
return ret_value;
208+
return ecma_make_string_value (ecma_stringbuilder_finalize (&builder));
217209
} /* ecma_builtin_array_prototype_object_to_locale_string */
218210

219211
/**
@@ -382,40 +374,33 @@ ecma_builtin_array_prototype_join (ecma_value_t separator_arg, /**< separator ar
382374
}
383375

384376
ecma_string_t *first_string_p = ecma_get_string_from_value (first_value);
385-
ecma_string_t *return_string_p = first_string_p;
386-
ecma_ref_ecma_string (return_string_p);
377+
ecma_stringbuilder_t builder = ecma_stringbuilder_create_from (first_string_p);
378+
ecma_deref_ecma_string (first_string_p);
387379

388-
ecma_value_t ret_value = ECMA_VALUE_ERROR;
389380
/* 9-10. */
390381
for (uint32_t k = 1; k < length; k++)
391382
{
392383
/* 10.a */
393-
return_string_p = ecma_concat_ecma_strings (return_string_p, separator_string_p);
384+
ecma_stringbuilder_append (&builder, separator_string_p);
394385

395386
/* 10.b, 10.c */
396387
ecma_value_t next_string_value = ecma_op_array_get_to_string_at_index (obj_p, k);
397388

398389
if (ECMA_IS_VALUE_ERROR (next_string_value))
399390
{
400-
ecma_deref_ecma_string (return_string_p);
401-
goto clean_up;
391+
ecma_deref_ecma_string (separator_string_p);
392+
ecma_stringbuilder_destroy (&builder);
393+
return next_string_value;
402394
}
403395

404396
/* 10.d */
405397
ecma_string_t *next_string_p = ecma_get_string_from_value (next_string_value);
406-
return_string_p = ecma_concat_ecma_strings (return_string_p, next_string_p);
407-
398+
ecma_stringbuilder_append (&builder, next_string_p);
408399
ecma_deref_ecma_string (next_string_p);
409400
}
410401

411-
ret_value = ecma_make_string_value (return_string_p);
412-
413-
clean_up:
414-
ecma_deref_ecma_string (first_string_p);
415-
416402
ecma_deref_ecma_string (separator_string_p);
417-
418-
return ret_value;
403+
return ecma_make_string_value (ecma_stringbuilder_finalize (&builder));
419404
} /* ecma_builtin_array_prototype_join */
420405

421406
/**

0 commit comments

Comments
 (0)