/** * Helper function to get month from time value. * * See also: * ECMA-262 v5, 15.9.1.4 * * @return month number */ ecma_number_t ecma_date_month_from_time (ecma_number_t time) /**< time value */ { JERRY_ASSERT (!ecma_number_is_nan (time)); ecma_number_t year = ecma_date_year_from_time (time); int day_within_year = (int) (ecma_date_day (time) - ecma_date_day_from_year (year)); JERRY_ASSERT (day_within_year >= 0); if (day_within_year <= 30) { return 0; } day_within_year -= ecma_date_in_leap_year (year); JERRY_ASSERT (day_within_year < 365); for (int i = 0; i < 10; i++) { if (day_within_year <= ecma_date_month_end_day[i]) { return i + 1; } } return 11; } /* ecma_date_month_from_time */
/** * 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 */
/** * 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 */
/** * 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 */
/** * 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 */
/** * Helper function to get weekday from time value. * * See also: * ECMA-262 v5, 15.9.1.6 * * Used by: * - The Date.prototype.getDay routine. (Generated.) * - The Date.prototype.getUTCDay routine. (Generated.) * * @return weekday number */ ecma_number_t ecma_date_week_day (ecma_number_t time) /**< time value */ { JERRY_ASSERT (!ecma_number_is_nan (time)); ecma_number_t week_day = (ecma_number_t) fmod ((ecma_date_day (time) + 4), 7); return (week_day < 0) ? (7 + week_day) : week_day; } /* ecma_date_week_day */
/** * Helper function to make day value from year, month and date. * * See also: * ECMA-262 v5, 15.9.1.12 * * @return day value */ ecma_number_t ecma_date_make_day (ecma_number_t year, /**< year value */ ecma_number_t month, /**< month value */ ecma_number_t date) /**< date value */ { /* 1. */ if (ecma_number_is_nan (year) || ecma_number_is_nan (month) || ecma_number_is_nan (date) || ecma_number_is_infinity (year) || ecma_number_is_infinity (month) || ecma_number_is_infinity (date)) { return ecma_number_make_nan (); } /* 2., 3., 4. */ ecma_number_t y = ecma_number_trunc (year); ecma_number_t m = ecma_number_trunc (month); ecma_number_t dt = ecma_number_trunc (date); /* 5. */ ecma_number_t ym = y + (ecma_number_t) floor (m / 12); /* 6. */ ecma_number_t mn = (ecma_number_t) fmod (m, 12); mn = (mn < 0) ? 12 + mn : mn; /* 7. */ ecma_number_t time = ecma_date_time_from_year (ym); /** * The algorithm below searches the following date: ym-mn-1 * To find this time it starts from the beginning of the year (ym) * then find the first day of the month. */ if (ecma_date_year_from_time (time) == ym) { /* Get the month */ time += 31 * mn * ECMA_DATE_MS_PER_DAY; /* Get the month's first day */ time += ((ecma_number_t) 1.0 - ecma_date_date_from_time (time)) * ECMA_DATE_MS_PER_DAY; if (ecma_date_month_from_time (time) == mn && ecma_date_date_from_time (time) == 1) { /* 8. */ return ecma_date_day (time) + dt - ((ecma_number_t) 1.0); } } return ecma_number_make_nan (); } /* ecma_date_make_day */
/** * 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 */
/** * Unit test's main function. */ int main () { /* int ecma_date_day (time)*/ TEST_ASSERT (ecma_date_day (0) == 0); TEST_ASSERT (ecma_date_day (MS_PER_DAY) == 1); /* ecma_number_t ecma_date_time_within_day (time) */ TEST_ASSERT (ecma_date_time_within_day (0) == 0); TEST_ASSERT (ecma_date_time_within_day (42) == 42); TEST_ASSERT (ecma_date_time_within_day (42.51) == 42.51); TEST_ASSERT (ecma_date_time_within_day (MS_PER_DAY + 42) == 42); /* int ecma_date_days_in_year (year) */ TEST_ASSERT (ecma_date_days_in_year (0) == 366); TEST_ASSERT (ecma_date_days_in_year (1600) == 366); TEST_ASSERT (ecma_date_days_in_year (1603) == 365); TEST_ASSERT (ecma_date_days_in_year (1900) == 365); TEST_ASSERT (ecma_date_days_in_year (1970) == 365); TEST_ASSERT (ecma_date_days_in_year (2000) == 366); TEST_ASSERT (ecma_date_days_in_year (2000.45) == 366); TEST_ASSERT (ecma_date_days_in_year (2012) == 366); TEST_ASSERT (ecma_date_days_in_year (2015) == 365); TEST_ASSERT (ecma_date_days_in_year (285616 + 1970) == 365); TEST_ASSERT (ecma_date_days_in_year (-1970) == 365); /* int ecma_date_day_from_year (year) */ TEST_ASSERT (ecma_date_day_from_year (1969) == -365); TEST_ASSERT (ecma_date_day_from_year (1970) == 0); TEST_ASSERT (ecma_date_day_from_year (1971) == 365); TEST_ASSERT (ecma_date_day_from_year (2000) == 10957); /* int ecma_date_year_from_time (time) */ TEST_ASSERT (ecma_date_year_from_time (0) == 1970); TEST_ASSERT (ecma_date_year_from_time (0) == 1970); TEST_ASSERT (ecma_date_year_from_time (MS_PER_DAY) == 1970); TEST_ASSERT (ecma_date_year_from_time ((MS_PER_DAY) * (ecma_number_t) 365 - 1) == 1970); TEST_ASSERT (ecma_date_year_from_time (MS_PER_DAY * (ecma_number_t) 365) == 1971); TEST_ASSERT (ecma_date_year_from_time (MS_PER_DAY * (ecma_number_t) (365 * (2015 - 1970))) == 2014); TEST_ASSERT (ecma_date_year_from_time (MS_PER_DAY * (ecma_number_t) (365.25 * (2015 - 1970))) == 2015); TEST_ASSERT (ecma_date_year_from_time (-MS_PER_YEAR) == 1969); TEST_ASSERT (ecma_date_year_from_time (-1970 * MS_PER_YEAR) == 1); TEST_ASSERT (ecma_date_year_from_time (START_OF_GREGORIAN_CALENDAR) == 0); TEST_ASSERT (ecma_date_year_from_time (START_OF_GREGORIAN_CALENDAR - 1) == -1); TEST_ASSERT (ecma_date_year_from_time (START_OF_GREGORIAN_CALENDAR - 3 * MS_PER_YEAR) == -3); /* int ecma_date_day_within_year (time) */ /* FIXME: Implement */ /* int ecma_date_month_from_time (time) */ TEST_ASSERT (ecma_date_month_from_time (START_OF_GREGORIAN_CALENDAR) == 0); TEST_ASSERT (ecma_date_month_from_time (0) == 0); TEST_ASSERT (ecma_date_month_from_time (-MS_PER_DAY) == 11); TEST_ASSERT (ecma_date_month_from_time (31 * MS_PER_DAY) == 1); /* int ecma_date_date_from_time (time) */ TEST_ASSERT (ecma_date_date_from_time (START_OF_GREGORIAN_CALENDAR) == 1); TEST_ASSERT (ecma_date_date_from_time (0) == 1); TEST_ASSERT (ecma_date_date_from_time (-MS_PER_DAY) == 31); TEST_ASSERT (ecma_date_date_from_time (31 * MS_PER_DAY) == 1); /* int ecma_date_week_day (ecma_number_t time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_local_tza () */ /* FIXME: Implement */ /* ecma_number_t ecma_date_daylight_saving_ta (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_local_time (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_utc (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_hour_from_time (time) */ TEST_ASSERT (ecma_date_hour_from_time (START_OF_GREGORIAN_CALENDAR) == 0); TEST_ASSERT (ecma_date_hour_from_time (0) == 0); TEST_ASSERT (ecma_date_hour_from_time (-MS_PER_DAY) == 0); TEST_ASSERT (ecma_date_hour_from_time (-1) == 23); /* ecma_number_t ecma_date_min_from_time (time) */ TEST_ASSERT (ecma_date_min_from_time (START_OF_GREGORIAN_CALENDAR) == 0); TEST_ASSERT (ecma_date_min_from_time (0) == 0); TEST_ASSERT (ecma_date_min_from_time (-MS_PER_DAY) == 0); TEST_ASSERT (ecma_date_min_from_time (-1) == 59); /* ecma_number_t ecma_date_sec_from_time (time) */ TEST_ASSERT (ecma_date_sec_from_time (START_OF_GREGORIAN_CALENDAR) == 0); TEST_ASSERT (ecma_date_sec_from_time (0) == 0); TEST_ASSERT (ecma_date_sec_from_time (-MS_PER_DAY) == 0); TEST_ASSERT (ecma_date_sec_from_time (-1) == 59); /* ecma_number_t ecma_date_ms_from_time (time) */ TEST_ASSERT (ecma_date_ms_from_time (START_OF_GREGORIAN_CALENDAR) == 0); TEST_ASSERT (ecma_date_ms_from_time (0) == 0); TEST_ASSERT (ecma_date_ms_from_time (-MS_PER_DAY) == 0); TEST_ASSERT (ecma_date_ms_from_time (-1) == 999); /* ecma_number_t ecma_date_make_time (hour, min, sec, ms) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_make_day (year, month, date) */ TEST_ASSERT (ecma_date_make_day (1970, 0, 1) == 0); TEST_ASSERT (ecma_date_make_day (1970, -1, 1) == -31); TEST_ASSERT (ecma_date_make_day (1970, 0, 2.5) == 1); TEST_ASSERT (ecma_date_make_day (1970, 1, 35) == 65); TEST_ASSERT (ecma_date_make_day (1970, 13, 35) == 430); TEST_ASSERT (ecma_date_make_day (2016, 2, 1) == 16861); /* ecma_number_t ecma_date_make_date (day, time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_time_clip (year) */ /* FIXME: Implement */ return 0; } /* main */
/** * Unit test's main function. */ int main (int __attr_unused___ argc, char __attr_unused___ **argv) { /* int ecma_date_day (time)*/ JERRY_ASSERT (ecma_date_day (0) == 0); JERRY_ASSERT (ecma_date_day (MS_PER_DAY) == 1); /* ecma_number_t ecma_date_time_within_day (time) */ JERRY_ASSERT (ecma_date_time_within_day (0) == 0); JERRY_ASSERT (ecma_date_time_within_day (42) == 42); JERRY_ASSERT (ecma_date_time_within_day (42.51) == 42.51); JERRY_ASSERT (ecma_date_time_within_day (MS_PER_DAY + 42) == 42); /* int ecma_date_days_in_year (year) */ JERRY_ASSERT (ecma_date_days_in_year (0) == 366); JERRY_ASSERT (ecma_date_days_in_year (1600) == 366); JERRY_ASSERT (ecma_date_days_in_year (1603) == 365); JERRY_ASSERT (ecma_date_days_in_year (1900) == 365); JERRY_ASSERT (ecma_date_days_in_year (1970) == 365); JERRY_ASSERT (ecma_date_days_in_year (2000) == 366); JERRY_ASSERT (ecma_date_days_in_year (2000.45) == 366); JERRY_ASSERT (ecma_date_days_in_year (2012) == 366); JERRY_ASSERT (ecma_date_days_in_year (2015) == 365); JERRY_ASSERT (ecma_date_days_in_year (285616 + 1970) == 365); JERRY_ASSERT (ecma_date_days_in_year (-1970) == 365); /* int ecma_date_day_from_year (year) */ JERRY_ASSERT (ecma_date_day_from_year (1969) == -365); JERRY_ASSERT (ecma_date_day_from_year (1970) == 0); JERRY_ASSERT (ecma_date_day_from_year (1971) == 365); JERRY_ASSERT (ecma_date_day_from_year (2000) == 10957); /* int ecma_date_year_from_time (time) */ JERRY_ASSERT (ecma_date_year_from_time (0) == 1970); JERRY_ASSERT (ecma_date_year_from_time (MS_PER_DAY) == 1970); JERRY_ASSERT (ecma_date_year_from_time ((MS_PER_DAY) * (ecma_number_t) 365 - 1) == 1970); JERRY_ASSERT (ecma_date_year_from_time (MS_PER_DAY * (ecma_number_t) 365) == 1971); JERRY_ASSERT (ecma_date_year_from_time (MS_PER_DAY * (ecma_number_t) (365 * (2015 - 1970))) == 2014); JERRY_ASSERT (ecma_date_year_from_time (MS_PER_DAY * (ecma_number_t) (365.25 * (2015 - 1970))) == 2015); /* int ecma_date_day_within_year (time) */ /* FIXME: Implement */ /* int ecma_date_month_from_time (time) */ /* FIXME: Implement */ /* int ecma_date_date_from_time (time) */ /* FIXME: Implement */ /* int ecma_date_week_day (ecma_number_t time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_local_tza () */ /* FIXME: Implement */ /* ecma_number_t ecma_date_daylight_saving_ta (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_local_time (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_utc (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_hour_from_time (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_min_from_time (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_sec_from_time (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_ms_from_time (time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_make_time (hour, min, sec, ms) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_make_day (year, month, date) */ JERRY_ASSERT (ecma_date_make_day (1970, 0, 1) == 0); JERRY_ASSERT (ecma_date_make_day (1970, 0, 2.5) == 1); JERRY_ASSERT (ecma_date_make_day (1970, 1, 35) == 65); JERRY_ASSERT (ecma_date_make_day (1970, 13, 35) == 430); JERRY_ASSERT (ecma_date_make_day (2016, 2, 1) == 16861); /* ecma_number_t ecma_date_make_date (day, time) */ /* FIXME: Implement */ /* ecma_number_t ecma_date_time_clip (year) */ /* FIXME: Implement */ return 0; } /* main */
/** * Dispatch set date functions * * @return ecma value * Returned value must be freed with ecma_free_value. */ static ecma_value_t ecma_builtin_date_prototype_dispatch_set (uint16_t builtin_routine_id, /**< built-in wide routine * identifier */ ecma_extended_object_t *ext_object_p, /**< date extended object */ ecma_number_t date_num, /**< date converted to number */ const ecma_value_t arguments_list[], /**< list of arguments * passed to routine */ ecma_length_t arguments_number) /**< length of arguments' list */ { ecma_number_t converted_number[4]; ecma_length_t conversions = 0; /* If the first argument is not specified, it is always converted to NaN. */ converted_number[0] = ecma_number_make_nan (); switch (builtin_routine_id) { #ifndef CONFIG_DISABLE_ANNEXB_BUILTIN case ECMA_DATE_PROTOTYPE_SET_YEAR: #endif /* !CONFIG_DISABLE_ANNEXB_BUILTIN */ case ECMA_DATE_PROTOTYPE_SET_DATE: case ECMA_DATE_PROTOTYPE_SET_UTC_DATE: case ECMA_DATE_PROTOTYPE_SET_UTC_MILLISECONDS: case ECMA_DATE_PROTOTYPE_SET_MILLISECONDS: { conversions = 1; break; } case ECMA_DATE_PROTOTYPE_SET_MONTH: case ECMA_DATE_PROTOTYPE_SET_UTC_MONTH: case ECMA_DATE_PROTOTYPE_SET_UTC_SECONDS: case ECMA_DATE_PROTOTYPE_SET_SECONDS: { conversions = 2; break; } case ECMA_DATE_PROTOTYPE_SET_FULL_YEAR: case ECMA_DATE_PROTOTYPE_SET_UTC_FULL_YEAR: case ECMA_DATE_PROTOTYPE_SET_MINUTES: case ECMA_DATE_PROTOTYPE_SET_UTC_MINUTES: { conversions = 3; break; } default: { JERRY_ASSERT (builtin_routine_id == ECMA_DATE_PROTOTYPE_SET_HOURS || builtin_routine_id == ECMA_DATE_PROTOTYPE_SET_UTC_HOURS); conversions = 4; break; } } if (conversions > arguments_number) { conversions = arguments_number; } for (ecma_length_t i = 0; i < conversions; i++) { ecma_value_t value = ecma_op_to_number (arguments_list[i]); if (ECMA_IS_VALUE_ERROR (value)) { return value; } converted_number[i] = ecma_get_number_from_value (value); ecma_free_value (value); } ecma_number_t day_part; ecma_number_t time_part; if (builtin_routine_id <= ECMA_DATE_PROTOTYPE_SET_UTC_DATE) { if (ecma_number_is_nan (date_num)) { if (ECMA_DATE_PROTOTYPE_IS_SET_YEAR_ROUTINE (builtin_routine_id)) { date_num = ECMA_NUMBER_ZERO; } else { return ecma_make_number_value (date_num); } } time_part = ecma_date_time_within_day (date_num); ecma_number_t year = ecma_date_year_from_time (date_num); ecma_number_t month = ecma_date_month_from_time (date_num); ecma_number_t day = ecma_date_date_from_time (date_num); switch (builtin_routine_id) { case ECMA_DATE_PROTOTYPE_SET_FULL_YEAR: case ECMA_DATE_PROTOTYPE_SET_UTC_FULL_YEAR: { year = converted_number[0]; if (conversions >= 2) { month = converted_number[1]; } if (conversions >= 3) { day = converted_number[2]; } break; } #ifndef CONFIG_DISABLE_ANNEXB_BUILTIN case ECMA_DATE_PROTOTYPE_SET_YEAR: { year = converted_number[0]; if (year >= 0 && year <= 99) { year += 1900; } break; } #endif /* !CONFIG_DISABLE_ANNEXB_BUILTIN */ case ECMA_DATE_PROTOTYPE_SET_MONTH: case ECMA_DATE_PROTOTYPE_SET_UTC_MONTH: { month = converted_number[0]; if (conversions >= 2) { day = converted_number[1]; } break; } default: { JERRY_ASSERT (builtin_routine_id == ECMA_DATE_PROTOTYPE_SET_DATE || builtin_routine_id == ECMA_DATE_PROTOTYPE_SET_UTC_DATE); day = converted_number[0]; break; } } day_part = ecma_date_make_day (year, month, day); #ifndef CONFIG_DISABLE_ANNEXB_BUILTIN if (builtin_routine_id == ECMA_DATE_PROTOTYPE_SET_YEAR) { builtin_routine_id = ECMA_DATE_PROTOTYPE_SET_UTC_YEAR; if (ecma_number_is_nan (converted_number[0])) { day_part = 0; time_part = converted_number[0]; } } #endif /* !CONFIG_DISABLE_ANNEXB_BUILTIN */ } else { if (ecma_number_is_nan (date_num)) { return ecma_make_number_value (date_num); } day_part = ecma_date_day (date_num); ecma_number_t hour = ecma_date_hour_from_time (date_num); ecma_number_t min = ecma_date_min_from_time (date_num); ecma_number_t sec = ecma_date_sec_from_time (date_num); ecma_number_t ms = ecma_date_ms_from_time (date_num); switch (builtin_routine_id) { case ECMA_DATE_PROTOTYPE_SET_HOURS: case ECMA_DATE_PROTOTYPE_SET_UTC_HOURS: { hour = converted_number[0]; if (conversions >= 2) { min = converted_number[1]; } if (conversions >= 3) { sec = converted_number[2]; } if (conversions >= 4) { ms = converted_number[3]; } break; } case ECMA_DATE_PROTOTYPE_SET_MINUTES: case ECMA_DATE_PROTOTYPE_SET_UTC_MINUTES: { min = converted_number[0]; if (conversions >= 2) { sec = converted_number[1]; } if (conversions >= 3) { ms = converted_number[2]; } break; } case ECMA_DATE_PROTOTYPE_SET_UTC_SECONDS: case ECMA_DATE_PROTOTYPE_SET_SECONDS: { sec = converted_number[0]; if (conversions >= 2) { ms = converted_number[1]; } break; } default: { JERRY_ASSERT (builtin_routine_id == ECMA_DATE_PROTOTYPE_SET_UTC_MILLISECONDS || builtin_routine_id == ECMA_DATE_PROTOTYPE_SET_MILLISECONDS); ms = converted_number[0]; break; } } time_part = ecma_date_make_time (hour, min, sec, ms); } bool is_utc = BUILTIN_DATE_FUNCTION_IS_UTC (builtin_routine_id); ecma_number_t full_date = ecma_date_make_date (day_part, time_part); if (!is_utc) { full_date = ecma_date_utc (full_date); } full_date = ecma_date_time_clip (full_date); *ECMA_GET_INTERNAL_VALUE_POINTER (ecma_number_t, ext_object_p->u.class_prop.u.value) = full_date; return ecma_make_number_value (full_date); } /* ecma_builtin_date_prototype_dispatch_set */