1
0
mirror of https://github.com/php/php-src.git synced 2026-04-20 14:31:06 +02:00

Convert UNKNOWN default values to null in ext/date

Closes GH-5509
This commit is contained in:
Máté Kocsis
2020-05-01 21:45:30 +02:00
parent 089d8cb03c
commit ffcc8135e2
6 changed files with 114 additions and 105 deletions

View File

@@ -782,14 +782,15 @@ static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime)
{
zend_string *format;
zend_long ts;
zend_bool ts_is_null = 1;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR(format)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(ts)
Z_PARAM_LONG_OR_NULL(ts, ts_is_null)
ZEND_PARSE_PARAMETERS_END();
if (ZEND_NUM_ARGS() == 1) {
if (ts_is_null) {
ts = php_time();
}
@@ -940,13 +941,14 @@ PHP_FUNCTION(gmdate)
PHP_FUNCTION(idate)
{
zend_string *format;
zend_long ts = 0;
zend_long ts;
zend_bool ts_is_null = 1;
int ret;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR(format)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(ts)
Z_PARAM_LONG_OR_NULL(ts, ts_is_null)
ZEND_PARSE_PARAMETERS_END();
if (ZSTR_LEN(format) != 1) {
@@ -954,7 +956,7 @@ PHP_FUNCTION(idate)
RETURN_FALSE;
}
if (ZEND_NUM_ARGS() == 1) {
if (ts_is_null) {
ts = php_time();
}
@@ -1011,14 +1013,15 @@ PHP_FUNCTION(strtotime)
zend_string *times;
int error1, error2;
timelib_error_container *error;
zend_long preset_ts = 0, ts;
zend_long preset_ts, ts;
zend_bool preset_ts_is_null = 1;
timelib_time *t, *now;
timelib_tzinfo *tzi;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR(times)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(preset_ts)
Z_PARAM_LONG_OR_NULL(preset_ts, preset_ts_is_null)
ZEND_PARSE_PARAMETERS_END();
tzi = get_timezone_info();
@@ -1027,7 +1030,7 @@ PHP_FUNCTION(strtotime)
now->tz_info = tzi;
now->zone_type = TIMELIB_ZONETYPE_ID;
timelib_unixtime2local(now,
(ZEND_NUM_ARGS() == 2) ? (timelib_sll) preset_ts : (timelib_sll) php_time());
!preset_ts_is_null ? (timelib_sll) preset_ts : (timelib_sll) php_time());
t = timelib_strtotime(ZSTR_VAL(times), ZSTR_LEN(times), &error,
DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper);
@@ -1051,7 +1054,8 @@ PHP_FUNCTION(strtotime)
/* {{{ php_mktime - (gm)mktime helper */
PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt)
{
zend_long hou = 0, min = 0, sec = 0, mon = 0, day = 0, yea = 0;
zend_long hou, min, sec, mon, day, yea;
zend_bool min_is_null = 1, sec_is_null = 1, mon_is_null = 1, day_is_null = 1, yea_is_null = 1;
timelib_time *now;
timelib_tzinfo *tzi = NULL;
zend_long ts, adjust_seconds = 0;
@@ -1060,11 +1064,11 @@ PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt)
ZEND_PARSE_PARAMETERS_START(1, 6)
Z_PARAM_LONG(hou)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(min)
Z_PARAM_LONG(sec)
Z_PARAM_LONG(mon)
Z_PARAM_LONG(day)
Z_PARAM_LONG(yea)
Z_PARAM_LONG_OR_NULL(min, min_is_null)
Z_PARAM_LONG_OR_NULL(sec, sec_is_null)
Z_PARAM_LONG_OR_NULL(mon, mon_is_null)
Z_PARAM_LONG_OR_NULL(day, day_is_null)
Z_PARAM_LONG_OR_NULL(yea, yea_is_null)
ZEND_PARSE_PARAMETERS_END();
/* Initialize structure with current time */
@@ -1077,33 +1081,34 @@ PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt)
now->zone_type = TIMELIB_ZONETYPE_ID;
timelib_unixtime2local(now, (timelib_sll) php_time());
}
/* Fill in the new data */
switch (ZEND_NUM_ARGS()) {
case 6:
if (yea >= 0 && yea < 70) {
yea += 2000;
} else if (yea >= 70 && yea <= 100) {
yea += 1900;
}
now->y = yea;
/* break intentionally missing again */
case 5:
now->d = day;
/* break missing intentionally here too */
case 4:
now->m = mon;
/* and here */
case 3:
now->s = sec;
/* yup, this break isn't here on purpose too */
case 2:
now->i = min;
/* last intentionally missing break */
case 1:
now->h = hou;
break;
EMPTY_SWITCH_DEFAULT_CASE()
now->h = hou;
if (!min_is_null) {
now->i = min;
}
if (!sec_is_null) {
now->s = sec;
}
if (!mon_is_null) {
now->m = mon;
}
if (!day_is_null) {
now->d = day;
}
if (!yea_is_null) {
if (yea >= 0 && yea < 70) {
yea += 2000;
} else if (yea >= 70 && yea <= 100) {
yea += 1900;
}
now->y = yea;
}
/* Update the timestamp */
if (gmt) {
timelib_update_ts(now, NULL);
@@ -1163,7 +1168,8 @@ PHP_FUNCTION(checkdate)
PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt)
{
zend_string *format;
zend_long timestamp = 0;
zend_long timestamp;
zend_bool timestamp_is_null = 1;
struct tm ta;
int max_reallocs = 5;
size_t buf_len = 256, real_len;
@@ -1172,18 +1178,20 @@ PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt)
timelib_time_offset *offset = NULL;
zend_string *buf;
timestamp = (zend_long) php_time();
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR(format)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(timestamp)
Z_PARAM_LONG_OR_NULL(timestamp, timestamp_is_null)
ZEND_PARSE_PARAMETERS_END();
if (ZSTR_LEN(format) == 0) {
RETURN_FALSE;
}
if (timestamp_is_null) {
timestamp = (zend_long) php_time();
}
ts = timelib_time_ctor();
if (gmt) {
tzi = NULL;
@@ -1286,17 +1294,18 @@ PHP_FUNCTION(time)
PHP_FUNCTION(localtime)
{
zend_long timestamp;
zend_bool timestamp_is_null = 1;
zend_bool associative = 0;
timelib_tzinfo *tzi;
timelib_time *ts;
ZEND_PARSE_PARAMETERS_START(0, 2)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(timestamp)
Z_PARAM_LONG_OR_NULL(timestamp, timestamp_is_null)
Z_PARAM_BOOL(associative)
ZEND_PARSE_PARAMETERS_END();
if (ZEND_NUM_ARGS() == 0) {
if (timestamp_is_null) {
timestamp = (zend_long) php_time();
}
@@ -1339,15 +1348,16 @@ PHP_FUNCTION(localtime)
PHP_FUNCTION(getdate)
{
zend_long timestamp;
zend_bool timestamp_is_null = 1;
timelib_tzinfo *tzi;
timelib_time *ts;
ZEND_PARSE_PARAMETERS_START(0, 1)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(timestamp)
Z_PARAM_LONG_OR_NULL(timestamp, timestamp_is_null)
ZEND_PARSE_PARAMETERS_END();
if (ZEND_NUM_ARGS() == 0) {
if (timestamp_is_null) {
timestamp = (zend_long) php_time();
}
@@ -4511,10 +4521,11 @@ PHP_FUNCTION(date_default_timezone_get)
*/
static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_sunset)
{
double latitude = 0.0, longitude = 0.0, zenith = 0.0, gmt_offset = 0, altitude;
double latitude, longitude, zenith, gmt_offset, altitude;
zend_bool latitude_is_null = 1, longitude_is_null = 1, zenith_is_null = 1, gmt_offset_is_null = 1;
double h_rise, h_set, N;
timelib_sll rise, set, transit;
zend_long time, retformat = 0;
zend_long time, retformat = SUNFUNCS_RET_STRING;
int rs;
timelib_time *t;
timelib_tzinfo *tzi;
@@ -4524,33 +4535,28 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_su
Z_PARAM_LONG(time)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(retformat)
Z_PARAM_DOUBLE(latitude)
Z_PARAM_DOUBLE(longitude)
Z_PARAM_DOUBLE(zenith)
Z_PARAM_DOUBLE(gmt_offset)
Z_PARAM_DOUBLE_OR_NULL(latitude, latitude_is_null)
Z_PARAM_DOUBLE_OR_NULL(longitude, longitude_is_null)
Z_PARAM_DOUBLE_OR_NULL(zenith, zenith_is_null)
Z_PARAM_DOUBLE_OR_NULL(gmt_offset, gmt_offset_is_null)
ZEND_PARSE_PARAMETERS_END();
switch (ZEND_NUM_ARGS()) {
case 1:
retformat = SUNFUNCS_RET_STRING;
case 2:
latitude = INI_FLT("date.default_latitude");
case 3:
longitude = INI_FLT("date.default_longitude");
case 4:
if (calc_sunset) {
zenith = INI_FLT("date.sunset_zenith");
} else {
zenith = INI_FLT("date.sunrise_zenith");
}
case 5:
case 6:
break;
default:
php_error_docref(NULL, E_WARNING, "Invalid format");
RETURN_FALSE;
break;
if (latitude_is_null) {
latitude = INI_FLT("date.default_latitude");
}
if (longitude_is_null) {
latitude = INI_FLT("date.default_longitude");
}
if (zenith_is_null) {
if (calc_sunset) {
zenith = INI_FLT("date.sunset_zenith");
} else {
zenith = INI_FLT("date.sunrise_zenith");
}
}
if (retformat != SUNFUNCS_RET_TIMESTAMP &&
retformat != SUNFUNCS_RET_STRING &&
retformat != SUNFUNCS_RET_DOUBLE)
@@ -4566,7 +4572,7 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_su
t->tz_info = tzi;
t->zone_type = TIMELIB_ZONETYPE_ID;
if (ZEND_NUM_ARGS() <= 5) {
if (gmt_offset_is_null) {
gmt_offset = timelib_get_current_offset(t) / 3600;
}

View File

@@ -2,33 +2,33 @@
/** @generate-function-entries */
function strtotime(string $time, int $now = UNKNOWN): int|false {}
function strtotime(string $time, ?int $now = null): int|false {}
function date(string $format, int $timestamp = UNKNOWN): string {}
function date(string $format, ?int $timestamp = null): string {}
function idate(string $format, int $timestamp = UNKNOWN): int|false {}
function idate(string $format, ?int $timestamp = null): int|false {}
function gmdate(string $format, int $timestamp = UNKNOWN): string {}
function gmdate(string $format, ?int $timestamp = null): string {}
function mktime(
int $hour, int $min = UNKNOWN, int $sec = UNKNOWN,
int $mon = UNKNOWN, int $day = UNKNOWN, int $year = UNKNOWN): int|false {}
int $hour, ?int $min = null, ?int $sec = null,
?int $mon = null, ?int $day = null, ?int $year = null): int|false {}
function gmmktime(
int $hour, int $min = UNKNOWN, int $sec = UNKNOWN,
int $mon = UNKNOWN, int $day = UNKNOWN, int $year = UNKNOWN): int|false {}
int $hour, ?int $min = null, ?int $sec = null,
?int $mon = null, ?int $day = null, ?int $year = null): int|false {}
function checkdate(int $m, int $d, int $y): bool {}
function strftime(string $format, int $timestamp = UNKNOWN): string|false {}
function strftime(string $format, ?int $timestamp = null): string|false {}
function gmstrftime(string $format, int $timestamp = UNKNOWN): string|false {}
function gmstrftime(string $format, ?int $timestamp = null): string|false {}
function time(): int {}
function localtime(int $timestamp = UNKNOWN, bool $associative = false): array {}
function localtime(?int $timestamp = null, bool $associative = false): array {}
function getdate(int $timestamp = UNKNOWN): array {}
function getdate(?int $timestamp = null): array {}
function date_create(string $time = "now", ?DateTimeZone $timezone = null): DateTime|false {}
@@ -104,12 +104,12 @@ function date_default_timezone_get(): string {}
function date_sunrise(
int $time, int $retformat = SUNFUNCS_RET_STRING,
float $latitude = UNKNOWN, float $longitude = UNKNOWN, float $zenith = UNKNOWN,
?float $latitude = null, ?float $longitude = null, ?float $zenith = null,
float $gmt_offset = 0): string|int|float|false {}
function date_sunset(
int $time, int $retformat = SUNFUNCS_RET_STRING,
float $latitude = UNKNOWN, float $longitude = UNKNOWN, float $zenith = UNKNOWN,
?float $latitude = null, ?float $longitude = null, ?float $zenith = null,
float $gmt_offset = 0): string|int|float|false {}
function date_sun_info(int $time, float $latitude, float $longitude): array {}

View File

@@ -2,28 +2,28 @@
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strtotime, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, time, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, now, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, now, IS_LONG, 1, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_date, 0, 1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timestamp, IS_LONG, 1, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_idate, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timestamp, IS_LONG, 1, "null")
ZEND_END_ARG_INFO()
#define arginfo_gmdate arginfo_date
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mktime, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, hour, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, min, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, sec, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, mon, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, day, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, year, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, min, IS_LONG, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, sec, IS_LONG, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mon, IS_LONG, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, day, IS_LONG, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, year, IS_LONG, 1, "null")
ZEND_END_ARG_INFO()
#define arginfo_gmmktime arginfo_mktime
@@ -36,7 +36,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strftime, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timestamp, IS_LONG, 1, "null")
ZEND_END_ARG_INFO()
#define arginfo_gmstrftime arginfo_strftime
@@ -45,12 +45,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_time, 0, 0, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_localtime, 0, 0, IS_ARRAY, 0)
ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timestamp, IS_LONG, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, associative, _IS_BOOL, 0, "false")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_getdate, 0, 0, IS_ARRAY, 0)
ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timestamp, IS_LONG, 1, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_date_create, 0, 0, DateTime, MAY_BE_FALSE)
@@ -212,9 +212,9 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_date_sunrise, 0, 1, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, time, IS_LONG, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, retformat, IS_LONG, 0, "SUNFUNCS_RET_STRING")
ZEND_ARG_TYPE_INFO(0, latitude, IS_DOUBLE, 0)
ZEND_ARG_TYPE_INFO(0, longitude, IS_DOUBLE, 0)
ZEND_ARG_TYPE_INFO(0, zenith, IS_DOUBLE, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, latitude, IS_DOUBLE, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, longitude, IS_DOUBLE, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, zenith, IS_DOUBLE, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, gmt_offset, IS_DOUBLE, 0, "0")
ZEND_END_ARG_INFO()

View File

@@ -13,4 +13,4 @@ try {
}
?>
--EXPECT--
mktime(): Argument #6 ($year) must be of type int, float given
mktime(): Argument #6 ($year) must be of type ?int, float given

View File

@@ -10,4 +10,4 @@ try {
}
?>
--EXPECT--
strtotime(): Argument #2 ($now) must be of type int, object given
strtotime(): Argument #2 ($now) must be of type ?int, object given