1/* Copyright JS Foundation and other contributors, http://js.foundation 2 * 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "ecma-builtins.h" 17#include "ecma-array-object.h" 18#include "ecma-gc.h" 19#include "lit-char-helpers.h" 20 21#if ENABLED (JERRY_ES2015) 22 23#define ECMA_BUILTINS_INTERNAL 24#include "ecma-builtins-internal.h" 25 26/** 27 * This object has a custom dispatch function. 28 */ 29#define BUILTIN_CUSTOM_DISPATCH 30 31/** 32 * List of built-in routine identifiers. 33 */ 34enum 35{ 36 ECMA_INTRINSIC_ROUTINE_START = ECMA_BUILTIN_ID__COUNT - 1, 37 ECMA_INTRINSIC_PARSE_FLOAT, 38 ECMA_INTRINSIC_PARSE_INT, 39 ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES 40}; 41 42#define BUILTIN_INC_HEADER_NAME "ecma-builtin-intrinsic.inc.h" 43#define BUILTIN_UNDERSCORED_ID intrinsic 44#include "ecma-builtin-internal-routines-template.inc.h" 45 46/** \addtogroup ecma ECMA 47 * @{ 48 * 49 * \addtogroup ecmabuiltins 50 * @{ 51 * 52 * \addtogroup intrinsic ECMA Intrinsic object built-in 53 * @{ 54 */ 55 56/** 57 * The %ArrayProto_values% intrinsic routine 58 * 59 * See also: 60 * ECMA-262 v5, 15.4.4.4 61 * 62 * @return ecma value 63 * Returned value must be freed with ecma_free_value. 64 */ 65static ecma_value_t 66ecma_builtin_intrinsic_array_prototype_values (ecma_value_t this_value) /**< this argument */ 67{ 68 ecma_value_t this_obj = ecma_op_to_object (this_value); 69 70 if (ECMA_IS_VALUE_ERROR (this_obj)) 71 { 72 return this_obj; 73 } 74 75 ecma_object_t *this_obj_p = ecma_get_object_from_value (this_obj); 76 77 ecma_value_t ret_value = ecma_op_create_array_iterator (this_obj_p, ECMA_ITERATOR_VALUES); 78 79 ecma_deref_object (this_obj_p); 80 81 return ret_value; 82} /* ecma_builtin_intrinsic_array_prototype_values */ 83 84/** 85 * Dispatcher of the built-in's routines 86 * 87 * @return ecma value 88 * Returned value must be freed with ecma_free_value. 89 */ 90ecma_value_t 91ecma_builtin_intrinsic_dispatch_routine (uint16_t builtin_routine_id, /**< built-in wide routine identifier */ 92 ecma_value_t this_arg, /**< 'this' argument value */ 93 const ecma_value_t arguments_list_p[], /**< list of arguments 94 * passed to routine */ 95 ecma_length_t arguments_number) /**< length of arguments' list */ 96{ 97 JERRY_UNUSED (arguments_number); 98 99 ecma_value_t routine_arg_1 = arguments_list_p[0]; 100 ecma_value_t routine_arg_2 = arguments_list_p[1]; 101 102 if (builtin_routine_id == ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES) 103 { 104 return ecma_builtin_intrinsic_array_prototype_values (this_arg); 105 } 106 ecma_value_t ret_value = ECMA_VALUE_EMPTY; 107 if (builtin_routine_id <= ECMA_INTRINSIC_PARSE_INT) 108 { 109 ecma_string_t *str_p = ecma_op_to_string (routine_arg_1); 110 111 if (JERRY_UNLIKELY (str_p == NULL)) 112 { 113 return ECMA_VALUE_ERROR; 114 } 115 116 ECMA_STRING_TO_UTF8_STRING (str_p, string_buff, string_buff_size); 117 118 if (builtin_routine_id == ECMA_INTRINSIC_PARSE_INT) 119 { 120 ret_value = ecma_number_parse_int (string_buff, 121 string_buff_size, 122 routine_arg_2); 123 } 124 else 125 { 126 JERRY_ASSERT (builtin_routine_id == ECMA_INTRINSIC_PARSE_FLOAT); 127 ret_value = ecma_number_parse_float (string_buff, 128 string_buff_size); 129 } 130 ECMA_FINALIZE_UTF8_STRING (string_buff, string_buff_size); 131 ecma_deref_ecma_string (str_p); 132 } 133 134 return ret_value; 135} /* ecma_builtin_intrinsic_dispatch_routine */ 136 137/** 138 * @} 139 * @} 140 * @} 141 */ 142 143#endif /* ENABLED (JERRY_ES2015) */ 144