本文整理匯總了C++中ECMA_OP_TO_NUMBER_TRY_CATCH函數的典型用法代碼示例。如果您正苦於以下問題:C++ ECMA_OP_TO_NUMBER_TRY_CATCH函數的具體用法?C++ ECMA_OP_TO_NUMBER_TRY_CATCH怎麽用?C++ ECMA_OP_TO_NUMBER_TRY_CATCH使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了ECMA_OP_TO_NUMBER_TRY_CATCH函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的C++代碼示例。
示例1: ecma_builtin_date_prototype_set_utc_month
/**
* The Date.prototype object's 'setUTCMonth' routine
*
* See also:
* ECMA-262 v5, 15.9.5.39
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_date_prototype_set_utc_month (ecma_value_t this_arg, /**< this argument */
ecma_value_t month, /**< month */
ecma_value_t date) /**< date */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = *ecma_get_number_from_value (this_time_value);
/* 2. */
ECMA_OP_TO_NUMBER_TRY_CATCH (m, month, ret_value);
/* 3. */
ECMA_OP_TO_NUMBER_TRY_CATCH (dt, date, ret_value);
if (ecma_is_value_undefined (date))
{
dt = ecma_date_date_from_time (t);
}
/* 4-7. */
ecma_number_t year = ecma_date_year_from_time (t);
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_make_day (year, m, dt),
ecma_date_time_within_day (t),
ECMA_DATE_UTC);
ECMA_OP_TO_NUMBER_FINALIZE (dt);
ECMA_OP_TO_NUMBER_FINALIZE (m);
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_utc_month */
示例2: ecma_builtin_date_prototype_set_utc_seconds
/**
* The Date.prototype object's 'setUTCSeconds' routine
*
* See also:
* ECMA-262 v5, 15.9.5.31
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_date_prototype_set_utc_seconds (ecma_value_t this_arg, /**< this argument */
ecma_value_t sec, /**< second */
ecma_value_t ms) /**< millisecond */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = *ecma_get_number_from_value (this_time_value);
/* 2. */
ECMA_OP_TO_NUMBER_TRY_CATCH (s, sec, ret_value);
/* 3. */
ECMA_OP_TO_NUMBER_TRY_CATCH (milli, ms, ret_value);
if (ecma_is_value_undefined (ms))
{
milli = ecma_date_ms_from_time (t);
}
/* 4-7. */
ecma_number_t hour = ecma_date_hour_from_time (t);
ecma_number_t min = ecma_date_min_from_time (t);
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_day (t),
ecma_date_make_time (hour, min, s, milli),
ECMA_DATE_UTC);
ECMA_OP_TO_NUMBER_FINALIZE (milli);
ECMA_OP_TO_NUMBER_FINALIZE (s);
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_utc_seconds */
示例3: ecma_builtin_date_prototype_set_utc_hours
/**
* The Date.prototype object's 'setUTCHours' routine
*
* See also:
* ECMA-262 v5, 15.9.5.35
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_date_prototype_set_utc_hours (ecma_value_t this_arg, /**< this argument */
const ecma_value_t args[], /**< arguments list */
ecma_length_t args_number) /**< number of arguments */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = *ecma_get_number_from_value (this_time_value);
/* 2. */
ecma_number_t h = ecma_number_make_nan ();
ecma_number_t m = ecma_date_min_from_time (t);
ecma_number_t s = ecma_date_sec_from_time (t);
ecma_number_t milli = ecma_date_ms_from_time (t);
if (args_number > 0 && !ecma_is_value_undefined (args[0]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (hour, args[0], ret_value);
h = hour;
/* 3. */
if (args_number > 1 && !ecma_is_value_undefined (args[1]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (min, args[1], ret_value);
m = min;
/* 4. */
if (args_number > 2 && !ecma_is_value_undefined (args[2]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (sec, args[2], ret_value);
s = sec;
/* 5. */
if (args_number > 3 && !ecma_is_value_undefined (args[3]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (ms, args[3], ret_value);
milli = ms;
ECMA_OP_TO_NUMBER_FINALIZE (ms);
}
ECMA_OP_TO_NUMBER_FINALIZE (sec);
}
ECMA_OP_TO_NUMBER_FINALIZE (min);
}
ECMA_OP_TO_NUMBER_FINALIZE (hour);
}
if (ecma_is_value_empty (ret_value))
{
/* 6-9. */
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_day (t),
ecma_date_make_time (h, m, s, milli),
ECMA_DATE_UTC);
}
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_utc_hours */
示例4: ecma_builtin_date_prototype_set_full_year
/**
* The Date.prototype object's 'setFullYear' routine
*
* See also:
* ECMA-262 v5, 15.9.5.40
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_date_prototype_set_full_year (ecma_value_t this_arg, /**< this argument */
const ecma_value_t args[], /**< arguments list */
ecma_length_t args_number) /**< number of arguments */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = ecma_date_local_time (*ecma_get_number_from_value (this_time_value));
if (ecma_number_is_nan (t))
{
t = ECMA_NUMBER_ZERO;
}
/* 2. */
ecma_number_t y = ecma_number_make_nan ();
ecma_number_t m = ecma_date_month_from_time (t);
ecma_number_t dt = ecma_date_date_from_time (t);
if (args_number > 0 && !ecma_is_value_undefined (args[0]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (year, args[0], ret_value);
y = year;
/* 3. */
if (args_number > 1 && !ecma_is_value_undefined (args[1]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (month, args[1], ret_value);
m = month;
/* 4. */
if (args_number > 2 && !ecma_is_value_undefined (args[2]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (date, args[2], ret_value);
dt = date;
ECMA_OP_TO_NUMBER_FINALIZE (date);
}
ECMA_OP_TO_NUMBER_FINALIZE (month);
}
ECMA_OP_TO_NUMBER_FINALIZE (year);
}
if (ecma_is_value_empty (ret_value))
{
/* 5-8. */
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_make_day (y, m, dt),
ecma_date_time_within_day (t),
ECMA_DATE_LOCAL);
}
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_full_year */
示例5: ecma_builtin_date_prototype_set_minutes
/**
* The Date.prototype object's 'setMinutes' routine
*
* See also:
* ECMA-262 v5, 15.9.5.32
*
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
static ecma_completion_value_t
ecma_builtin_date_prototype_set_minutes (ecma_value_t this_arg, /**< this argument */
const ecma_value_t args[], /**< arguments list */
ecma_length_t args_number) /**< number of arguments */
{
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = ecma_date_local_time (*ecma_get_number_from_value (this_time_value));
/* 2. */
ecma_number_t m = ecma_number_make_nan ();
ecma_number_t s = ecma_date_sec_from_time (t);
ecma_number_t milli = ecma_date_ms_from_time (t);
if (args_number > 0 && !ecma_is_value_undefined (args[0]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (min, args[0], ret_value);
m = min;
/* 3. */
if (args_number > 1 && !ecma_is_value_undefined (args[1]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (sec, args[1], ret_value);
s = sec;
/* 4. */
if (args_number > 2 && !ecma_is_value_undefined (args[2]))
{
ECMA_OP_TO_NUMBER_TRY_CATCH (ms, args[2], ret_value);
milli = ms;
ECMA_OP_TO_NUMBER_FINALIZE (ms);
}
ECMA_OP_TO_NUMBER_FINALIZE (sec);
}
ECMA_OP_TO_NUMBER_FINALIZE (min);
}
if (ecma_is_completion_value_empty (ret_value))
{
/* 5-8. */
ecma_number_t hour = ecma_date_hour_from_time (t);
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_day (t),
ecma_date_make_time (hour, m, s, milli),
ECMA_DATE_LOCAL);
}
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_minutes */
示例6: ecma_builtin_date_prototype_set_utc_date
/**
* The Date.prototype object's 'setUTCDate' routine
*
* See also:
* ECMA-262 v5, 15.9.5.37
*
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
static ecma_completion_value_t
ecma_builtin_date_prototype_set_utc_date (ecma_value_t this_arg, /**< this argument */
ecma_value_t date) /**< date */
{
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = *ecma_get_number_from_value (this_time_value);
/* 2. */
ECMA_OP_TO_NUMBER_TRY_CATCH (dt, date, ret_value);
/* 3-6. */
ecma_number_t year = ecma_date_year_from_time (t);
ecma_number_t month = ecma_date_month_from_time (t);
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_make_day (year, month, dt),
ecma_date_time_within_day (t),
ECMA_DATE_UTC);
ECMA_OP_TO_NUMBER_FINALIZE (dt);
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_utc_date */
示例7: ecma_builtin_date_prototype_set_utc_milliseconds
/**
* The Date.prototype object's 'setUTCMilliseconds' routine
*
* See also:
* ECMA-262 v5, 15.9.5.29
*
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
static ecma_completion_value_t
ecma_builtin_date_prototype_set_utc_milliseconds (ecma_value_t this_arg, /**< this argument */
ecma_value_t ms) /**< millisecond */
{
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = *ecma_get_number_from_value (this_time_value);
/* 2. */
ECMA_OP_TO_NUMBER_TRY_CATCH (milli, ms, ret_value);
/* 3-5. */
ecma_number_t hour = ecma_date_hour_from_time (t);
ecma_number_t min = ecma_date_min_from_time (t);
ecma_number_t sec = ecma_date_sec_from_time (t);
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_day (t),
ecma_date_make_time (hour, min, sec, milli),
ECMA_DATE_UTC);
ECMA_OP_TO_NUMBER_FINALIZE (milli);
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_utc_milliseconds */
示例8: ecma_builtin_date_prototype_set_date
/**
* The Date.prototype object's 'setDate' routine
*
* See also:
* ECMA-262 v5, 15.9.5.36
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_date_prototype_set_date (ecma_value_t this_arg, /**< this argument */
ecma_value_t date) /**< date */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = ecma_date_local_time (*ecma_get_number_from_value (this_time_value));
/* 2. */
ECMA_OP_TO_NUMBER_TRY_CATCH (dt, date, ret_value);
/* 3-6. */
ecma_number_t year = ecma_date_year_from_time (t);
ecma_number_t month = ecma_date_month_from_time (t);
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_make_day (year, month, dt),
ecma_date_time_within_day (t),
ECMA_DATE_LOCAL);
ECMA_OP_TO_NUMBER_FINALIZE (dt);
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_date */
示例9: ecma_builtin_date_prototype_set_time
/**
* The Date.prototype object's 'setTime' routine
*
* See also:
* ECMA-262 v5, 15.9.5.27
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_date_prototype_set_time (ecma_value_t this_arg, /**< this argument */
ecma_value_t time) /**< time */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
if (!ecma_is_value_object (this_arg)
|| ecma_object_get_class_name (ecma_get_object_from_value (this_arg)) != LIT_MAGIC_STRING_DATE_UL)
{
ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("Incompatible type"));
}
else
{
/* 1. */
ECMA_OP_TO_NUMBER_TRY_CATCH (t, time, ret_value);
ecma_number_t *value_p = ecma_alloc_number ();
*value_p = ecma_date_time_clip (t);
/* 2. */
ecma_object_t *obj_p = ecma_get_object_from_value (this_arg);
ecma_property_t *prim_prop_p = ecma_get_internal_property (obj_p,
ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE);
ecma_number_t *prim_value_num_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_number_t,
ecma_get_internal_property_value (prim_prop_p));
*prim_value_num_p = *value_p;
/* 3. */
ret_value = ecma_make_number_value (value_p);
ECMA_OP_TO_NUMBER_FINALIZE (t);
}
return ret_value;
} /* ecma_builtin_date_prototype_set_time */
示例10: ecma_builtin_date_prototype_set_milliseconds
/**
* The Date.prototype object's 'setMilliseconds' routine
*
* See also:
* ECMA-262 v5, 15.9.5.28
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_date_prototype_set_milliseconds (ecma_value_t this_arg, /**< this argument */
ecma_value_t ms) /**< millisecond */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
/* 1. */
ECMA_TRY_CATCH (this_time_value, ecma_builtin_date_prototype_get_time (this_arg), ret_value);
ecma_number_t t = ecma_date_local_time (*ecma_get_number_from_value (this_time_value));
/* 2. */
ECMA_OP_TO_NUMBER_TRY_CATCH (milli, ms, ret_value);
/* 3-5. */
ecma_number_t hour = ecma_date_hour_from_time (t);
ecma_number_t min = ecma_date_min_from_time (t);
ecma_number_t sec = ecma_date_sec_from_time (t);
ret_value = ecma_date_set_internal_property (this_arg,
ecma_date_day (t),
ecma_date_make_time (hour, min, sec, milli),
ECMA_DATE_LOCAL);
ECMA_OP_TO_NUMBER_FINALIZE (milli);
ECMA_FINALIZE (this_time_value);
return ret_value;
} /* ecma_builtin_date_prototype_set_milliseconds */
示例11: ecma_builtin_string_prototype_object_char_code_at
/**
* The String.prototype object's 'charCodeAt' routine
*
* See also:
* ECMA-262 v5, 15.5.4.5
*
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
static ecma_completion_value_t
ecma_builtin_string_prototype_object_char_code_at (ecma_value_t this_arg, /**< this argument */
ecma_value_t arg) /**< routine's argument */
{
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
/* 1 */
ECMA_TRY_CATCH (check_coercible_val,
ecma_op_check_object_coercible (this_arg),
ret_value);
/* 2 */
ECMA_TRY_CATCH (to_string_val,
ecma_op_to_string (this_arg),
ret_value);
/* 3 */
ECMA_OP_TO_NUMBER_TRY_CATCH (index_num,
arg,
ret_value);
/* 4 */
ecma_string_t *original_string_p = ecma_get_string_from_value (to_string_val);
const ecma_length_t len = ecma_string_get_length (original_string_p);
ecma_number_t *ret_num_p = ecma_alloc_number ();
/* 5 */
// When index_num is NaN, then the first two comparisons are false
if (index_num < 0 || index_num >= len || (ecma_number_is_nan (index_num) && !len))
{
*ret_num_p = ecma_number_make_nan ();
}
else
{
/* 6 */
/*
* String length is currently uit32_t, but index_num may be bigger,
* ToInteger performs floor, while ToUInt32 performs modulo 2^32,
* hence after the check 0 <= index_num < len we assume to_uint32 can be used.
* We assume to_uint32 (NaN) is 0.
*/
JERRY_ASSERT (ecma_number_is_nan (index_num) || ecma_number_to_uint32 (index_num) == ecma_number_trunc (index_num));
ecma_char_t new_ecma_char = ecma_string_get_char_at_pos (original_string_p, ecma_number_to_uint32 (index_num));
*ret_num_p = ecma_uint32_to_number (new_ecma_char);
}
ecma_value_t new_value = ecma_make_number_value (ret_num_p);
ret_value = ecma_make_normal_completion_value (new_value);
ECMA_OP_TO_NUMBER_FINALIZE (index_num);
ECMA_FINALIZE (to_string_val);
ECMA_FINALIZE (check_coercible_val);
return ret_value;
} /* ecma_builtin_string_prototype_object_char_code_at */
示例12: ecma_builtin_helper_string_prototype_object_index_of
/**
* Helper function for string indexOf and lastIndexOf functions
*
* This function implements string indexOf and lastIndexOf with required checks and conversions.
*
* See also:
* ECMA-262 v5, 15.5.4.7
* ECMA-262 v5, 15.5.4.8
*
* Used by:
* - The String.prototype.indexOf routine.
* - The String.prototype.lastIndexOf routine.
*
* @return uint32_t - (last) index of search string
*/
ecma_value_t
ecma_builtin_helper_string_prototype_object_index_of (ecma_value_t this_arg, /**< this argument */
ecma_value_t arg1, /**< routine's first argument */
ecma_value_t arg2, /**< routine's second argument */
bool first_index) /**< routine's third argument */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
/* 1 */
ECMA_TRY_CATCH (check_coercible_val,
ecma_op_check_object_coercible (this_arg),
ret_value);
/* 2 */
ECMA_TRY_CATCH (to_str_val,
ecma_op_to_string (this_arg),
ret_value);
/* 3 */
ECMA_TRY_CATCH (search_str_val,
ecma_op_to_string (arg1),
ret_value);
/* 4 */
ECMA_OP_TO_NUMBER_TRY_CATCH (pos_num,
arg2,
ret_value);
/* 5 (indexOf) -- 6 (lastIndexOf) */
ecma_string_t *original_str_p = ecma_get_string_from_value (to_str_val);
const ecma_length_t original_len = ecma_string_get_length (original_str_p);
/* 4b, 6 (indexOf) - 4b, 5, 7 (lastIndexOf) */
ecma_length_t start = ecma_builtin_helper_string_index_normalize (pos_num, original_len, first_index);
/* 7 (indexOf) -- 8 (lastIndexOf) */
ecma_string_t *search_str_p = ecma_get_string_from_value (search_str_val);
ecma_number_t ret_num = ECMA_NUMBER_MINUS_ONE;
/* 8 (indexOf) -- 9 (lastIndexOf) */
ecma_length_t index_of = 0;
if (ecma_builtin_helper_string_find_index (original_str_p, search_str_p, first_index, start, &index_of))
{
ret_num = ((ecma_number_t) index_of);
}
ret_value = ecma_make_number_value (ret_num);
ECMA_OP_TO_NUMBER_FINALIZE (pos_num);
ECMA_FINALIZE (search_str_val);
ECMA_FINALIZE (to_str_val);
ECMA_FINALIZE (check_coercible_val);
return ret_value;
} /* ecma_builtin_helper_string_prototype_object_index_of */
示例13: ecma_builtin_math_object_pow
/**
* The Math object's 'pow' routine
*
* See also:
* ECMA-262 v5, 15.8.2.13
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_math_object_pow (ecma_value_t this_arg __attr_unused___, /**< 'this' argument */
ecma_value_t arg1, /**< first routine's argument */
ecma_value_t arg2) /**< second routine's argument */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
ECMA_OP_TO_NUMBER_TRY_CATCH (x, arg1, ret_value);
ECMA_OP_TO_NUMBER_TRY_CATCH (y, arg2, ret_value);
ecma_number_t *num_p = ecma_alloc_number ();
*num_p = DOUBLE_TO_ECMA_NUMBER_T (pow (x, y));
ret_value = ecma_make_number_value (num_p);
ECMA_OP_TO_NUMBER_FINALIZE (y);
ECMA_OP_TO_NUMBER_FINALIZE (x);
return ret_value;
} /* ecma_builtin_math_object_pow */
示例14: ecma_builtin_string_object_from_char_code
/**
* The String object's 'fromCharCode' routine
*
* See also:
* ECMA-262 v5, 15.5.3.2
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_string_object_from_char_code (ecma_value_t this_arg, /**< 'this' argument */
const ecma_value_t args[], /**< arguments list */
ecma_length_t args_number) /**< number of arguments */
{
JERRY_UNUSED (this_arg);
if (args_number == 0)
{
return ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY);
}
ecma_value_t ret_value = ECMA_VALUE_EMPTY;
ecma_string_t *ret_string_p = NULL;
lit_utf8_size_t utf8_buf_size = args_number * LIT_CESU8_MAX_BYTES_IN_CODE_UNIT;
JMEM_DEFINE_LOCAL_ARRAY (utf8_buf_p,
utf8_buf_size,
lit_utf8_byte_t);
lit_utf8_size_t utf8_buf_used = 0;
for (ecma_length_t arg_index = 0;
arg_index < args_number && ecma_is_value_empty (ret_value);
arg_index++)
{
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, args[arg_index], ret_value);
uint32_t uint32_char_code = ecma_number_to_uint32 (arg_num);
ecma_char_t code_unit = (uint16_t) uint32_char_code;
JERRY_ASSERT (utf8_buf_used <= utf8_buf_size - LIT_UTF8_MAX_BYTES_IN_CODE_UNIT);
utf8_buf_used += lit_code_unit_to_utf8 (code_unit, utf8_buf_p + utf8_buf_used);
JERRY_ASSERT (utf8_buf_used <= utf8_buf_size);
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
}
if (ecma_is_value_empty (ret_value))
{
ret_string_p = ecma_new_ecma_string_from_utf8 (utf8_buf_p, utf8_buf_used);
}
JMEM_FINALIZE_LOCAL_ARRAY (utf8_buf_p);
if (ecma_is_value_empty (ret_value))
{
ret_value = ecma_make_string_value (ret_string_p);
}
return ret_value;
} /* ecma_builtin_string_object_from_char_code */
示例15: ecma_builtin_string_object_from_char_code
/**
* The String object's 'fromCharCode' routine
*
* See also:
* ECMA-262 v5, 15.5.3.2
*
* @return completion value
* Returned value must be freed with ecma_free_completion_value.
*/
static ecma_completion_value_t
ecma_builtin_string_object_from_char_code (ecma_value_t this_arg __attr_unused___, /**< 'this' argument */
const ecma_value_t args[], /**< arguments list */
ecma_length_t args_number) /**< number of arguments */
{
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
if (args_number == 0)
{
ecma_string_t *ret_str_p = ecma_new_ecma_string_from_utf8 (NULL, 0);
return ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p));
}
lit_utf8_size_t utf8_buf_size = args_number * LIT_UTF8_MAX_BYTES_IN_CODE_UNIT;
ecma_string_t *ret_str_p;
MEM_DEFINE_LOCAL_ARRAY (utf8_buf_p, utf8_buf_size, lit_utf8_byte_t);
lit_utf8_size_t utf8_buf_used = 0;
FIXME ("Support surrogate pairs");
for (ecma_length_t arg_index = 0;
arg_index < args_number;
arg_index++)
{
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_num, args[arg_index], ret_value);
uint32_t uint32_char_code = ecma_number_to_uint32 (arg_num);
ecma_char_t code_unit = (uint16_t) uint32_char_code;
JERRY_ASSERT (utf8_buf_used <= utf8_buf_size - LIT_UTF8_MAX_BYTES_IN_CODE_UNIT);
utf8_buf_used += lit_code_unit_to_utf8 (code_unit, utf8_buf_p + utf8_buf_used);
JERRY_ASSERT (utf8_buf_used <= utf8_buf_size);
ECMA_OP_TO_NUMBER_FINALIZE (arg_num);
if (ecma_is_completion_value_throw (ret_value))
{
mem_heap_free_block (utf8_buf_p);
return ret_value;
}
JERRY_ASSERT (ecma_is_completion_value_empty (ret_value));
}
ret_str_p = ecma_new_ecma_string_from_utf8 (utf8_buf_p, utf8_buf_used);
MEM_FINALIZE_LOCAL_ARRAY (utf8_buf_p);
return ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p));
} /* ecma_builtin_string_object_from_char_code */