1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation
2425bb815Sopenharmony_ci *
3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License.
5425bb815Sopenharmony_ci * You may obtain a copy of the License at
6425bb815Sopenharmony_ci *
7425bb815Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8425bb815Sopenharmony_ci *
9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS
11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and
13425bb815Sopenharmony_ci * limitations under the License.
14425bb815Sopenharmony_ci */
15425bb815Sopenharmony_ci
16425bb815Sopenharmony_ci#include "lit-strings.h"
17425bb815Sopenharmony_ci#include "ecma-alloc.h"
18425bb815Sopenharmony_ci#include "ecma-builtins.h"
19425bb815Sopenharmony_ci#include "ecma-conversion.h"
20425bb815Sopenharmony_ci#include "ecma-exceptions.h"
21425bb815Sopenharmony_ci#include "ecma-gc.h"
22425bb815Sopenharmony_ci#include "ecma-globals.h"
23425bb815Sopenharmony_ci#include "ecma-helpers.h"
24425bb815Sopenharmony_ci#include "ecma-objects.h"
25425bb815Sopenharmony_ci#include "ecma-string-object.h"
26425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
27425bb815Sopenharmony_ci#include "ecma-symbol-object.h"
28425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
29425bb815Sopenharmony_ci#include "ecma-try-catch-macro.h"
30425bb815Sopenharmony_ci#include "jrt.h"
31425bb815Sopenharmony_ci
32425bb815Sopenharmony_ci#if ENABLED (JERRY_BUILTIN_STRING)
33425bb815Sopenharmony_ci
34425bb815Sopenharmony_ci#define ECMA_BUILTINS_INTERNAL
35425bb815Sopenharmony_ci#include "ecma-builtins-internal.h"
36425bb815Sopenharmony_ci
37425bb815Sopenharmony_ci#define BUILTIN_INC_HEADER_NAME "ecma-builtin-string.inc.h"
38425bb815Sopenharmony_ci#define BUILTIN_UNDERSCORED_ID string
39425bb815Sopenharmony_ci#include "ecma-builtin-internal-routines-template.inc.h"
40425bb815Sopenharmony_ci
41425bb815Sopenharmony_ci/** \addtogroup ecma ECMA
42425bb815Sopenharmony_ci * @{
43425bb815Sopenharmony_ci *
44425bb815Sopenharmony_ci * \addtogroup ecmabuiltins
45425bb815Sopenharmony_ci * @{
46425bb815Sopenharmony_ci *
47425bb815Sopenharmony_ci * \addtogroup string ECMA String object built-in
48425bb815Sopenharmony_ci * @{
49425bb815Sopenharmony_ci */
50425bb815Sopenharmony_ci
51425bb815Sopenharmony_ci/**
52425bb815Sopenharmony_ci * The String object's 'fromCharCode' routine
53425bb815Sopenharmony_ci *
54425bb815Sopenharmony_ci * See also:
55425bb815Sopenharmony_ci *          ECMA-262 v5, 15.5.3.2
56425bb815Sopenharmony_ci *
57425bb815Sopenharmony_ci * @return ecma value
58425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
59425bb815Sopenharmony_ci */
60425bb815Sopenharmony_cistatic ecma_value_t
61425bb815Sopenharmony_ciecma_builtin_string_object_from_char_code (ecma_value_t this_arg, /**< 'this' argument */
62425bb815Sopenharmony_ci                                           const ecma_value_t args[], /**< arguments list */
63425bb815Sopenharmony_ci                                           ecma_length_t args_number) /**< number of arguments */
64425bb815Sopenharmony_ci{
65425bb815Sopenharmony_ci  JERRY_UNUSED (this_arg);
66425bb815Sopenharmony_ci
67425bb815Sopenharmony_ci  if (args_number == 0)
68425bb815Sopenharmony_ci  {
69425bb815Sopenharmony_ci    return ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY);
70425bb815Sopenharmony_ci  }
71425bb815Sopenharmony_ci
72425bb815Sopenharmony_ci  ecma_value_t ret_value = ECMA_VALUE_EMPTY;
73425bb815Sopenharmony_ci  ecma_string_t *ret_string_p = NULL;
74425bb815Sopenharmony_ci  lit_utf8_size_t utf8_buf_size = args_number * LIT_CESU8_MAX_BYTES_IN_CODE_UNIT;
75425bb815Sopenharmony_ci
76425bb815Sopenharmony_ci  JMEM_DEFINE_LOCAL_ARRAY (utf8_buf_p,
77425bb815Sopenharmony_ci                           utf8_buf_size,
78425bb815Sopenharmony_ci                           lit_utf8_byte_t);
79425bb815Sopenharmony_ci
80425bb815Sopenharmony_ci  lit_utf8_size_t utf8_buf_used = 0;
81425bb815Sopenharmony_ci
82425bb815Sopenharmony_ci  for (ecma_length_t arg_index = 0;
83425bb815Sopenharmony_ci       arg_index < args_number && ecma_is_value_empty (ret_value);
84425bb815Sopenharmony_ci       arg_index++)
85425bb815Sopenharmony_ci  {
86425bb815Sopenharmony_ci    ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, args[arg_index], ret_value);
87425bb815Sopenharmony_ci
88425bb815Sopenharmony_ci    uint32_t uint32_char_code = ecma_number_to_uint32 (arg_num);
89425bb815Sopenharmony_ci    ecma_char_t code_unit = (uint16_t) uint32_char_code;
90425bb815Sopenharmony_ci
91425bb815Sopenharmony_ci    JERRY_ASSERT (utf8_buf_used <= utf8_buf_size - LIT_UTF8_MAX_BYTES_IN_CODE_UNIT);
92425bb815Sopenharmony_ci    utf8_buf_used += lit_code_unit_to_utf8 (code_unit, utf8_buf_p + utf8_buf_used);
93425bb815Sopenharmony_ci    JERRY_ASSERT (utf8_buf_used <= utf8_buf_size);
94425bb815Sopenharmony_ci
95425bb815Sopenharmony_ci    ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
96425bb815Sopenharmony_ci  }
97425bb815Sopenharmony_ci
98425bb815Sopenharmony_ci  if (ecma_is_value_empty (ret_value))
99425bb815Sopenharmony_ci  {
100425bb815Sopenharmony_ci    ret_string_p = ecma_new_ecma_string_from_utf8 (utf8_buf_p, utf8_buf_used);
101425bb815Sopenharmony_ci  }
102425bb815Sopenharmony_ci
103425bb815Sopenharmony_ci  JMEM_FINALIZE_LOCAL_ARRAY (utf8_buf_p);
104425bb815Sopenharmony_ci
105425bb815Sopenharmony_ci  if (ecma_is_value_empty (ret_value))
106425bb815Sopenharmony_ci  {
107425bb815Sopenharmony_ci    ret_value = ecma_make_string_value (ret_string_p);
108425bb815Sopenharmony_ci  }
109425bb815Sopenharmony_ci
110425bb815Sopenharmony_ci  return ret_value;
111425bb815Sopenharmony_ci} /* ecma_builtin_string_object_from_char_code */
112425bb815Sopenharmony_ci
113425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
114425bb815Sopenharmony_ci
115425bb815Sopenharmony_ci/**
116425bb815Sopenharmony_ci * The String object's 'raw' routine
117425bb815Sopenharmony_ci *
118425bb815Sopenharmony_ci * See also:
119425bb815Sopenharmony_ci *          ECMA-262 v6, 21.1.2.4
120425bb815Sopenharmony_ci *
121425bb815Sopenharmony_ci * @return ecma value
122425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
123425bb815Sopenharmony_ci */
124425bb815Sopenharmony_cistatic ecma_value_t
125425bb815Sopenharmony_ciecma_builtin_string_object_raw (ecma_value_t this_arg, /**< 'this' argument */
126425bb815Sopenharmony_ci                                const ecma_value_t args[], /**< arguments list */
127425bb815Sopenharmony_ci                                ecma_length_t args_number) /**< number of arguments */
128425bb815Sopenharmony_ci{
129425bb815Sopenharmony_ci  JERRY_UNUSED (this_arg);
130425bb815Sopenharmony_ci
131425bb815Sopenharmony_ci  /* 1 - 2. */
132425bb815Sopenharmony_ci  const ecma_value_t *substitutions;
133425bb815Sopenharmony_ci  ecma_length_t number_of_substitutions;
134425bb815Sopenharmony_ci
135425bb815Sopenharmony_ci  if (args_number > 1)
136425bb815Sopenharmony_ci  {
137425bb815Sopenharmony_ci    substitutions = args + 1;
138425bb815Sopenharmony_ci    number_of_substitutions = args_number - 1;
139425bb815Sopenharmony_ci  }
140425bb815Sopenharmony_ci  else
141425bb815Sopenharmony_ci  {
142425bb815Sopenharmony_ci    substitutions = NULL;
143425bb815Sopenharmony_ci    number_of_substitutions = 0;
144425bb815Sopenharmony_ci  }
145425bb815Sopenharmony_ci
146425bb815Sopenharmony_ci  /* 3. */
147425bb815Sopenharmony_ci  ecma_value_t template = args_number > 0 ? args[0] : ECMA_VALUE_UNDEFINED;
148425bb815Sopenharmony_ci
149425bb815Sopenharmony_ci  ecma_value_t cooked = ecma_op_to_object (template);
150425bb815Sopenharmony_ci
151425bb815Sopenharmony_ci  /* 4. */
152425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (cooked))
153425bb815Sopenharmony_ci  {
154425bb815Sopenharmony_ci    return cooked;
155425bb815Sopenharmony_ci  }
156425bb815Sopenharmony_ci
157425bb815Sopenharmony_ci  ecma_object_t *cooked_obj_p = ecma_get_object_from_value (cooked);
158425bb815Sopenharmony_ci
159425bb815Sopenharmony_ci  /* 5. */
160425bb815Sopenharmony_ci  ecma_value_t raw = ecma_op_object_get_by_magic_id (cooked_obj_p, LIT_MAGIC_STRING_RAW);
161425bb815Sopenharmony_ci
162425bb815Sopenharmony_ci  ecma_deref_object (cooked_obj_p);
163425bb815Sopenharmony_ci
164425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (raw))
165425bb815Sopenharmony_ci  {
166425bb815Sopenharmony_ci    return raw;
167425bb815Sopenharmony_ci  }
168425bb815Sopenharmony_ci
169425bb815Sopenharmony_ci  ecma_value_t raw_obj = ecma_op_to_object (raw);
170425bb815Sopenharmony_ci
171425bb815Sopenharmony_ci  /* 6. */
172425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (raw_obj))
173425bb815Sopenharmony_ci  {
174425bb815Sopenharmony_ci    ecma_free_value (raw);
175425bb815Sopenharmony_ci    return raw_obj;
176425bb815Sopenharmony_ci  }
177425bb815Sopenharmony_ci
178425bb815Sopenharmony_ci  ecma_object_t *raw_obj_p = ecma_get_object_from_value (raw_obj);
179425bb815Sopenharmony_ci
180425bb815Sopenharmony_ci  ecma_value_t ret_value = ECMA_VALUE_ERROR;
181425bb815Sopenharmony_ci
182425bb815Sopenharmony_ci  /* 7 - 8. */
183425bb815Sopenharmony_ci  uint32_t literal_segments;
184425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (ecma_op_object_get_length (raw_obj_p, &literal_segments)))
185425bb815Sopenharmony_ci  {
186425bb815Sopenharmony_ci    goto cleanup;
187425bb815Sopenharmony_ci  }
188425bb815Sopenharmony_ci
189425bb815Sopenharmony_ci  /* 9. */
190425bb815Sopenharmony_ci  if (literal_segments == 0)
191425bb815Sopenharmony_ci  {
192425bb815Sopenharmony_ci    ret_value = ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY);
193425bb815Sopenharmony_ci    goto cleanup;
194425bb815Sopenharmony_ci  }
195425bb815Sopenharmony_ci
196425bb815Sopenharmony_ci  /* 10. */
197425bb815Sopenharmony_ci  ecma_stringbuilder_t builder = ecma_stringbuilder_create ();
198425bb815Sopenharmony_ci
199425bb815Sopenharmony_ci  /* 11. */
200425bb815Sopenharmony_ci  uint32_t next_index = 0;
201425bb815Sopenharmony_ci
202425bb815Sopenharmony_ci  /* 12. */
203425bb815Sopenharmony_ci  while (true)
204425bb815Sopenharmony_ci  {
205425bb815Sopenharmony_ci    /* 12.a,b */
206425bb815Sopenharmony_ci    ecma_value_t next_seg = ecma_op_object_get_by_uint32_index (raw_obj_p, next_index);
207425bb815Sopenharmony_ci
208425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (next_seg))
209425bb815Sopenharmony_ci    {
210425bb815Sopenharmony_ci      goto builder_cleanup;
211425bb815Sopenharmony_ci    }
212425bb815Sopenharmony_ci
213425bb815Sopenharmony_ci    ecma_string_t *next_seg_srt_p = ecma_op_to_string (next_seg);
214425bb815Sopenharmony_ci
215425bb815Sopenharmony_ci    /* 12.c */
216425bb815Sopenharmony_ci    if (JERRY_UNLIKELY (next_seg_srt_p == NULL))
217425bb815Sopenharmony_ci    {
218425bb815Sopenharmony_ci      ecma_free_value (next_seg);
219425bb815Sopenharmony_ci      goto builder_cleanup;
220425bb815Sopenharmony_ci    }
221425bb815Sopenharmony_ci
222425bb815Sopenharmony_ci    /* 12.d */
223425bb815Sopenharmony_ci    ecma_stringbuilder_append (&builder, next_seg_srt_p);
224425bb815Sopenharmony_ci
225425bb815Sopenharmony_ci    ecma_deref_ecma_string (next_seg_srt_p);
226425bb815Sopenharmony_ci    ecma_free_value (next_seg);
227425bb815Sopenharmony_ci
228425bb815Sopenharmony_ci    /* 12.e */
229425bb815Sopenharmony_ci    if (next_index + 1 == literal_segments)
230425bb815Sopenharmony_ci    {
231425bb815Sopenharmony_ci      ret_value = ecma_make_string_value (ecma_stringbuilder_finalize (&builder));
232425bb815Sopenharmony_ci      goto cleanup;
233425bb815Sopenharmony_ci    }
234425bb815Sopenharmony_ci
235425bb815Sopenharmony_ci    /* 12.f-g */
236425bb815Sopenharmony_ci    if (next_index >= number_of_substitutions)
237425bb815Sopenharmony_ci    {
238425bb815Sopenharmony_ci      next_index++;
239425bb815Sopenharmony_ci      continue;
240425bb815Sopenharmony_ci    }
241425bb815Sopenharmony_ci
242425bb815Sopenharmony_ci    /* 12.h */
243425bb815Sopenharmony_ci    ecma_string_t *next_sub_p = ecma_op_to_string (substitutions[next_index]);
244425bb815Sopenharmony_ci
245425bb815Sopenharmony_ci    /* 12.i */
246425bb815Sopenharmony_ci    if (JERRY_UNLIKELY (next_sub_p == NULL))
247425bb815Sopenharmony_ci    {
248425bb815Sopenharmony_ci      goto builder_cleanup;
249425bb815Sopenharmony_ci    }
250425bb815Sopenharmony_ci
251425bb815Sopenharmony_ci    /* 12.j */
252425bb815Sopenharmony_ci    ecma_stringbuilder_append (&builder, next_sub_p);
253425bb815Sopenharmony_ci    ecma_deref_ecma_string (next_sub_p);
254425bb815Sopenharmony_ci
255425bb815Sopenharmony_ci    /* 12.k */
256425bb815Sopenharmony_ci    next_index++;
257425bb815Sopenharmony_ci  }
258425bb815Sopenharmony_ci
259425bb815Sopenharmony_cibuilder_cleanup:
260425bb815Sopenharmony_ci  ecma_stringbuilder_destroy (&builder);
261425bb815Sopenharmony_ci
262425bb815Sopenharmony_cicleanup:
263425bb815Sopenharmony_ci  ecma_deref_object (raw_obj_p);
264425bb815Sopenharmony_ci  ecma_free_value (raw);
265425bb815Sopenharmony_ci
266425bb815Sopenharmony_ci  return ret_value;
267425bb815Sopenharmony_ci} /* ecma_builtin_string_object_raw */
268425bb815Sopenharmony_ci
269425bb815Sopenharmony_ci/**
270425bb815Sopenharmony_ci * The String object's 'fromCodePoint' routine
271425bb815Sopenharmony_ci *
272425bb815Sopenharmony_ci * See also:
273425bb815Sopenharmony_ci *          ECMA-262 v6, 21.1.2.2
274425bb815Sopenharmony_ci *
275425bb815Sopenharmony_ci * @return ecma value
276425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
277425bb815Sopenharmony_ci */
278425bb815Sopenharmony_cistatic ecma_value_t
279425bb815Sopenharmony_ciecma_builtin_string_object_from_code_point (ecma_value_t this_arg, /**< 'this' argument */
280425bb815Sopenharmony_ci                                            const ecma_value_t args[], /**< arguments list */
281425bb815Sopenharmony_ci                                            ecma_length_t args_number) /**< number of arguments */
282425bb815Sopenharmony_ci{
283425bb815Sopenharmony_ci  JERRY_UNUSED (this_arg);
284425bb815Sopenharmony_ci
285425bb815Sopenharmony_ci  if (args_number == 0)
286425bb815Sopenharmony_ci  {
287425bb815Sopenharmony_ci    return ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY);
288425bb815Sopenharmony_ci  }
289425bb815Sopenharmony_ci
290425bb815Sopenharmony_ci  ecma_stringbuilder_t builder = ecma_stringbuilder_create ();
291425bb815Sopenharmony_ci
292425bb815Sopenharmony_ci  for (ecma_length_t index = 0; index < args_number; index++)
293425bb815Sopenharmony_ci  {
294425bb815Sopenharmony_ci    ecma_value_t to_number_value = ecma_op_to_number (args[index]);
295425bb815Sopenharmony_ci
296425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (to_number_value))
297425bb815Sopenharmony_ci    {
298425bb815Sopenharmony_ci      ecma_stringbuilder_destroy (&builder);
299425bb815Sopenharmony_ci      return to_number_value;
300425bb815Sopenharmony_ci    }
301425bb815Sopenharmony_ci
302425bb815Sopenharmony_ci    ecma_number_t to_number_num = ecma_get_number_from_value (to_number_value);
303425bb815Sopenharmony_ci    ecma_free_value (to_number_value);
304425bb815Sopenharmony_ci
305425bb815Sopenharmony_ci    ecma_number_t to_int_num;
306425bb815Sopenharmony_ci    ecma_value_t to_int_value = ecma_op_to_integer (to_number_value, &to_int_num);
307425bb815Sopenharmony_ci
308425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (to_int_value))
309425bb815Sopenharmony_ci    {
310425bb815Sopenharmony_ci      ecma_stringbuilder_destroy (&builder);
311425bb815Sopenharmony_ci      return to_int_value;
312425bb815Sopenharmony_ci    }
313425bb815Sopenharmony_ci
314425bb815Sopenharmony_ci    if (to_number_num != to_int_num || to_int_num < 0 || to_int_num > LIT_UNICODE_CODE_POINT_MAX)
315425bb815Sopenharmony_ci    {
316425bb815Sopenharmony_ci      ecma_stringbuilder_destroy (&builder);
317425bb815Sopenharmony_ci      return ecma_raise_range_error (ECMA_ERR_MSG ("Error: Invalid code point"));
318425bb815Sopenharmony_ci    }
319425bb815Sopenharmony_ci
320425bb815Sopenharmony_ci    lit_code_point_t code_point = (uint32_t) to_int_num;
321425bb815Sopenharmony_ci
322425bb815Sopenharmony_ci    ecma_char_t converted_cp[2];
323425bb815Sopenharmony_ci    uint8_t encoded_size = lit_utf16_encode_code_point (code_point, converted_cp);
324425bb815Sopenharmony_ci
325425bb815Sopenharmony_ci    for (uint8_t i = 0; i < encoded_size; i++)
326425bb815Sopenharmony_ci    {
327425bb815Sopenharmony_ci      ecma_stringbuilder_append_char (&builder, converted_cp[i]);
328425bb815Sopenharmony_ci    }
329425bb815Sopenharmony_ci  }
330425bb815Sopenharmony_ci
331425bb815Sopenharmony_ci  ecma_string_t *ret_str_p = ecma_stringbuilder_finalize (&builder);
332425bb815Sopenharmony_ci
333425bb815Sopenharmony_ci  return ecma_make_string_value (ret_str_p);
334425bb815Sopenharmony_ci} /* ecma_builtin_string_object_from_code_point */
335425bb815Sopenharmony_ci
336425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
337425bb815Sopenharmony_ci
338425bb815Sopenharmony_ci/**
339425bb815Sopenharmony_ci * Handle calling [[Call]] of built-in String object
340425bb815Sopenharmony_ci *
341425bb815Sopenharmony_ci * See also:
342425bb815Sopenharmony_ci *          ECMA-262 v6, 21.1.1.1
343425bb815Sopenharmony_ci *
344425bb815Sopenharmony_ci * @return ecma value
345425bb815Sopenharmony_ci */
346425bb815Sopenharmony_ciecma_value_t
347425bb815Sopenharmony_ciecma_builtin_string_dispatch_call (const ecma_value_t *arguments_list_p, /**< arguments list */
348425bb815Sopenharmony_ci                                   ecma_length_t arguments_list_len) /**< number of arguments */
349425bb815Sopenharmony_ci{
350425bb815Sopenharmony_ci  JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);
351425bb815Sopenharmony_ci
352425bb815Sopenharmony_ci  ecma_value_t ret_value = ECMA_VALUE_EMPTY;
353425bb815Sopenharmony_ci
354425bb815Sopenharmony_ci  /* 1. */
355425bb815Sopenharmony_ci  if (arguments_list_len == 0)
356425bb815Sopenharmony_ci  {
357425bb815Sopenharmony_ci    ret_value = ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY);
358425bb815Sopenharmony_ci  }
359425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
360425bb815Sopenharmony_ci  /* 2.a */
361425bb815Sopenharmony_ci  else if (ecma_is_value_symbol (arguments_list_p[0]))
362425bb815Sopenharmony_ci  {
363425bb815Sopenharmony_ci    ret_value = ecma_get_symbol_descriptive_string (arguments_list_p[0]);
364425bb815Sopenharmony_ci  }
365425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
366425bb815Sopenharmony_ci  /* 2.b */
367425bb815Sopenharmony_ci  else
368425bb815Sopenharmony_ci  {
369425bb815Sopenharmony_ci    ecma_string_t *str_p = ecma_op_to_string (arguments_list_p[0]);
370425bb815Sopenharmony_ci    if (JERRY_UNLIKELY (str_p == NULL))
371425bb815Sopenharmony_ci    {
372425bb815Sopenharmony_ci      return ECMA_VALUE_ERROR;
373425bb815Sopenharmony_ci    }
374425bb815Sopenharmony_ci
375425bb815Sopenharmony_ci    ret_value = ecma_make_string_value (str_p);
376425bb815Sopenharmony_ci  }
377425bb815Sopenharmony_ci
378425bb815Sopenharmony_ci  return ret_value;
379425bb815Sopenharmony_ci} /* ecma_builtin_string_dispatch_call */
380425bb815Sopenharmony_ci
381425bb815Sopenharmony_ci/**
382425bb815Sopenharmony_ci * Handle calling [[Construct]] of built-in String object
383425bb815Sopenharmony_ci *
384425bb815Sopenharmony_ci * @return ecma value
385425bb815Sopenharmony_ci */
386425bb815Sopenharmony_ciecma_value_t
387425bb815Sopenharmony_ciecma_builtin_string_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */
388425bb815Sopenharmony_ci                                        ecma_length_t arguments_list_len) /**< number of arguments */
389425bb815Sopenharmony_ci{
390425bb815Sopenharmony_ci  JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);
391425bb815Sopenharmony_ci
392425bb815Sopenharmony_ci  return ecma_op_create_string_object (arguments_list_p, arguments_list_len);
393425bb815Sopenharmony_ci} /* ecma_builtin_string_dispatch_construct */
394425bb815Sopenharmony_ci
395425bb815Sopenharmony_ci/**
396425bb815Sopenharmony_ci * @}
397425bb815Sopenharmony_ci * @}
398425bb815Sopenharmony_ci * @}
399425bb815Sopenharmony_ci */
400425bb815Sopenharmony_ci
401425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_BUILTIN_STRING) */
402