/** * The Date.prototype object's 'setSeconds' routine * * See also: * ECMA-262 v5, 15.9.5.30 * * @return ecma value * Returned value must be freed with ecma_free_value. */ static ecma_value_t ecma_builtin_date_prototype_set_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_date_local_time (*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_LOCAL); 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_seconds */
/** * The Date.prototype object's 'setMonth' routine * * See also: * ECMA-262 v5, 15.9.5.38 * * @return ecma value * Returned value must be freed with ecma_free_value. */ static ecma_value_t ecma_builtin_date_prototype_set_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_date_local_time (*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_LOCAL); 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_month */
/** * The Date.prototype object's 'getYear' routine * * See also: * ECMA-262 v5, AnnexB.B.2.4 * * @return ecma value * Returned value must be freed with ecma_free_value. */ static ecma_value_t ecma_builtin_date_prototype_get_year (ecma_value_t this_arg) /**< this argument */ { ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); /* 1. */ ECMA_TRY_CATCH (value, ecma_builtin_date_prototype_get_time (this_arg), ret_value); ecma_number_t *this_num_p = ecma_get_number_from_value (value); /* 2. */ if (ecma_number_is_nan (*this_num_p)) { ecma_string_t *nan_str_p = ecma_get_magic_string (LIT_MAGIC_STRING_NAN); ret_value = ecma_make_string_value (nan_str_p); } else { /* 3. */ ecma_number_t *ret_num_p = ecma_alloc_number (); *ret_num_p = ecma_date_year_from_time (ecma_date_local_time (*this_num_p)) - 1900; ret_value = ecma_make_number_value (ret_num_p); } ECMA_FINALIZE (value); return ret_value; } /* ecma_builtin_date_prototype_get_year */
/** * The Date.prototype object's 'setDate' routine * * See also: * ECMA-262 v5, 15.9.5.36 * * @return completion value * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t ecma_builtin_date_prototype_set_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_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 */
/** * The Date.prototype object's 'setMilliseconds' routine * * See also: * ECMA-262 v5, 15.9.5.28 * * @return completion value * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t ecma_builtin_date_prototype_set_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_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 */
/** * The Date.prototype object's 'setHours' routine * * See also: * ECMA-262 v5, 15.9.5.34 * * @return ecma value * Returned value must be freed with ecma_free_value. */ static ecma_value_t ecma_builtin_date_prototype_set_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_date_local_time (*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_LOCAL); } ECMA_FINALIZE (this_time_value); return ret_value; } /* ecma_builtin_date_prototype_set_hours */
/** * 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 */
/** * The Date.prototype object's 'setYear' routine * * See also: * ECMA-262 v5, AnnexB.B.2.5 * * @return ecma value * Returned value must be freed with ecma_free_value. */ static ecma_value_t ecma_builtin_date_prototype_set_year (ecma_value_t this_arg, /**< this argument */ ecma_value_t year) /**< year argument */ { 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_OP_TO_NUMBER_TRY_CATCH (year_value, year, ret_value); y = year_value; /* 3. */ if (ecma_number_is_nan (y)) { ret_value = ecma_date_set_internal_property (this_arg, 0, y, ECMA_DATE_UTC); } else { /* 4. */ if (y >= 0 && y <= 99) { y += 1900; } } ECMA_OP_TO_NUMBER_FINALIZE (year_value); if (ecma_is_value_empty (ret_value)) { /* 5-8. */ ecma_number_t m = ecma_date_month_from_time (t); ecma_number_t dt = ecma_date_date_from_time (t); ret_value = ecma_date_set_internal_property (this_arg, ecma_date_make_day (y, m, dt), ecma_date_time_within_day (t), ECMA_DATE_UTC); } ECMA_FINALIZE (this_time_value); return ret_value; } /* ecma_builtin_date_prototype_set_year */