@@ -2156,8 +2156,54 @@ static zend_object *date_object_clone_interval(zend_object *this_ptr) /* {{{ */
21562156 return & new_obj -> std ;
21572157} /* }}} */
21582158
2159- static bool php_date_initialize_from_hash (php_date_obj * dateobj , const HashTable * myht );
2160- static bool php_date_timezone_initialize_from_hash (php_timezone_obj * tzobj , const HashTable * myht );
2159+ static HashTable * date_object_get_gc_interval (zend_object * object , zval * * table , int * n ) /* {{{ */
2160+ {
2161+
2162+ * table = NULL ;
2163+ * n = 0 ;
2164+ return zend_std_get_properties (object );
2165+ } /* }}} */
2166+
2167+ static void date_interval_object_to_hash (php_interval_obj * intervalobj , HashTable * props )
2168+ {
2169+ zval zv ;
2170+
2171+ /* Records whether this is a special relative interval that needs to be recreated from a string */
2172+ if (intervalobj -> from_string ) {
2173+ ZVAL_BOOL (& zv , (bool )intervalobj -> from_string );
2174+ zend_hash_str_update (props , "from_string" , strlen ("from_string" ), & zv );
2175+ ZVAL_STR_COPY (& zv , intervalobj -> date_string );
2176+ zend_hash_str_update (props , "date_string" , strlen ("date_string" ), & zv );
2177+ return ;
2178+ }
2179+
2180+ #define PHP_DATE_INTERVAL_ADD_PROPERTY (n ,f ) \
2181+ ZVAL_LONG(&zv, (zend_long)intervalobj->diff->f); \
2182+ zend_hash_str_update(props, n, sizeof(n)-1, &zv);
2183+
2184+ PHP_DATE_INTERVAL_ADD_PROPERTY ("y" , y );
2185+ PHP_DATE_INTERVAL_ADD_PROPERTY ("m" , m );
2186+ PHP_DATE_INTERVAL_ADD_PROPERTY ("d" , d );
2187+ PHP_DATE_INTERVAL_ADD_PROPERTY ("h" , h );
2188+ PHP_DATE_INTERVAL_ADD_PROPERTY ("i" , i );
2189+ PHP_DATE_INTERVAL_ADD_PROPERTY ("s" , s );
2190+ ZVAL_DOUBLE (& zv , (double )intervalobj -> diff -> us / 1000000.0 );
2191+ zend_hash_str_update (props , "f" , sizeof ("f" ) - 1 , & zv );
2192+ PHP_DATE_INTERVAL_ADD_PROPERTY ("invert" , invert );
2193+ if (intervalobj -> diff -> days != TIMELIB_UNSET ) {
2194+ PHP_DATE_INTERVAL_ADD_PROPERTY ("days" , days );
2195+ } else {
2196+ ZVAL_FALSE (& zv );
2197+ zend_hash_str_update (props , "days" , sizeof ("days" )- 1 , & zv );
2198+ }
2199+ ZVAL_BOOL (& zv , (bool )intervalobj -> from_string );
2200+ zend_hash_str_update (props , "from_string" , strlen ("from_string" ), & zv );
2201+
2202+ #undef PHP_DATE_INTERVAL_ADD_PROPERTY
2203+ }
2204+
2205+ static bool php_date_initialize_from_hash (php_date_obj * * dateobj , const HashTable * myht );
2206+ static bool php_date_timezone_initialize_from_hash (php_timezone_obj * * tzobj , const HashTable * myht );
21612207static void php_date_interval_initialize_from_hash (php_interval_obj * intobj , const HashTable * myht );
21622208
21632209static bool php_date_copy_direct_cache_state (
@@ -2234,52 +2280,6 @@ static bool php_date_copy_direct_cache_state(
22342280 return false;
22352281}
22362282
2237- static HashTable * date_object_get_gc_interval (zend_object * object , zval * * table , int * n ) /* {{{ */
2238- {
2239-
2240- * table = NULL ;
2241- * n = 0 ;
2242- return zend_std_get_properties (object );
2243- } /* }}} */
2244-
2245- static void date_interval_object_to_hash (php_interval_obj * intervalobj , HashTable * props )
2246- {
2247- zval zv ;
2248-
2249- /* Records whether this is a special relative interval that needs to be recreated from a string */
2250- if (intervalobj -> from_string ) {
2251- ZVAL_BOOL (& zv , (bool )intervalobj -> from_string );
2252- zend_hash_str_update (props , "from_string" , strlen ("from_string" ), & zv );
2253- ZVAL_STR_COPY (& zv , intervalobj -> date_string );
2254- zend_hash_str_update (props , "date_string" , strlen ("date_string" ), & zv );
2255- return ;
2256- }
2257-
2258- #define PHP_DATE_INTERVAL_ADD_PROPERTY (n ,f ) \
2259- ZVAL_LONG(&zv, (zend_long)intervalobj->diff->f); \
2260- zend_hash_str_update(props, n, sizeof(n)-1, &zv);
2261-
2262- PHP_DATE_INTERVAL_ADD_PROPERTY ("y" , y );
2263- PHP_DATE_INTERVAL_ADD_PROPERTY ("m" , m );
2264- PHP_DATE_INTERVAL_ADD_PROPERTY ("d" , d );
2265- PHP_DATE_INTERVAL_ADD_PROPERTY ("h" , h );
2266- PHP_DATE_INTERVAL_ADD_PROPERTY ("i" , i );
2267- PHP_DATE_INTERVAL_ADD_PROPERTY ("s" , s );
2268- ZVAL_DOUBLE (& zv , (double )intervalobj -> diff -> us / 1000000.0 );
2269- zend_hash_str_update (props , "f" , sizeof ("f" ) - 1 , & zv );
2270- PHP_DATE_INTERVAL_ADD_PROPERTY ("invert" , invert );
2271- if (intervalobj -> diff -> days != TIMELIB_UNSET ) {
2272- PHP_DATE_INTERVAL_ADD_PROPERTY ("days" , days );
2273- } else {
2274- ZVAL_FALSE (& zv );
2275- zend_hash_str_update (props , "days" , sizeof ("days" )- 1 , & zv );
2276- }
2277- ZVAL_BOOL (& zv , (bool )intervalobj -> from_string );
2278- zend_hash_str_update (props , "from_string" , strlen ("from_string" ), & zv );
2279-
2280- #undef PHP_DATE_INTERVAL_ADD_PROPERTY
2281- }
2282-
22832283static void php_date_direct_cache_add_assoc_int64 (zval * array_zv , const char * name , int64_t value )
22842284{
22852285#if PHP_DATE_SIZEOF_LONG == 8
@@ -2379,11 +2379,15 @@ static bool php_date_unserialize_direct_cache_state(zval *object, zval *state)
23792379
23802380 if (instanceof_function (Z_OBJCE_P (object ), date_ce_date ) ||
23812381 instanceof_function (Z_OBJCE_P (object ), date_ce_immutable )) {
2382- return php_date_initialize_from_hash (Z_PHPDATE_P (object ), Z_ARRVAL_P (state ));
2382+ php_date_obj * dateobj = Z_PHPDATE_P (object );
2383+
2384+ return php_date_initialize_from_hash (& dateobj , Z_ARRVAL_P (state ));
23832385 }
23842386
23852387 if (instanceof_function (Z_OBJCE_P (object ), date_ce_timezone )) {
2386- return php_date_timezone_initialize_from_hash (Z_PHPTIMEZONE_P (object ), Z_ARRVAL_P (state ));
2388+ php_timezone_obj * tzobj = Z_PHPTIMEZONE_P (object );
2389+
2390+ return php_date_timezone_initialize_from_hash (& tzobj , Z_ARRVAL_P (state ));
23872391 }
23882392
23892393 if (instanceof_function (Z_OBJCE_P (object ), date_ce_interval )) {
@@ -2399,6 +2403,7 @@ const zend_opcache_static_cache_safe_direct_handlers *php_date_get_direct_cache_
23992403{
24002404 static const zend_opcache_static_cache_safe_direct_handlers handlers = {
24012405 true,
2406+ { false, NULL , NULL },
24022407 php_date_copy_direct_cache_state ,
24032408 NULL ,
24042409 php_date_serialize_direct_cache_state ,
@@ -3038,7 +3043,7 @@ PHP_METHOD(DateTimeImmutable, createFromTimestamp)
30383043}
30393044/* }}} */
30403045
3041- static bool php_date_initialize_from_hash (php_date_obj * dateobj , const HashTable * myht )
3046+ static bool php_date_initialize_from_hash (php_date_obj * * dateobj , const HashTable * myht )
30423047{
30433048 zval * z_date ;
30443049 zval * z_timezone_type ;
@@ -3067,7 +3072,7 @@ static bool php_date_initialize_from_hash(php_date_obj *dateobj, const HashTable
30673072 zend_string * tmp = zend_string_concat3 (
30683073 Z_STRVAL_P (z_date ), Z_STRLEN_P (z_date ), " " , 1 ,
30693074 Z_STRVAL_P (z_timezone ), Z_STRLEN_P (z_timezone ));
3070- bool ret = php_date_initialize (dateobj , ZSTR_VAL (tmp ), ZSTR_LEN (tmp ), NULL , NULL , 0 );
3075+ bool ret = php_date_initialize (* dateobj , ZSTR_VAL (tmp ), ZSTR_LEN (tmp ), NULL , NULL , 0 );
30713076 zend_string_release (tmp );
30723077 return ret ;
30733078 }
@@ -3087,7 +3092,7 @@ static bool php_date_initialize_from_hash(php_date_obj *dateobj, const HashTable
30873092 tzobj -> tzi .tz = tzi ;
30883093 tzobj -> initialized = true;
30893094
3090- ret = php_date_initialize (dateobj , Z_STRVAL_P (z_date ), Z_STRLEN_P (z_date ), NULL , & tmp_obj , 0 );
3095+ ret = php_date_initialize (* dateobj , Z_STRVAL_P (z_date ), Z_STRLEN_P (z_date ), NULL , & tmp_obj , 0 );
30913096 zval_ptr_dtor (& tmp_obj );
30923097 return ret ;
30933098 }
@@ -3110,7 +3115,7 @@ PHP_METHOD(DateTime, __set_state)
31103115
31113116 php_date_instantiate (date_ce_date , return_value );
31123117 dateobj = Z_PHPDATE_P (return_value );
3113- if (!php_date_initialize_from_hash (dateobj , myht )) {
3118+ if (!php_date_initialize_from_hash (& dateobj , myht )) {
31143119 zend_throw_error (NULL , "Invalid serialization data for DateTime object" );
31153120 RETURN_THROWS ();
31163121 }
@@ -3132,7 +3137,7 @@ PHP_METHOD(DateTimeImmutable, __set_state)
31323137
31333138 php_date_instantiate (date_ce_immutable , return_value );
31343139 dateobj = Z_PHPDATE_P (return_value );
3135- if (!php_date_initialize_from_hash (dateobj , myht )) {
3140+ if (!php_date_initialize_from_hash (& dateobj , myht )) {
31363141 zend_throw_error (NULL , "Invalid serialization data for DateTimeImmutable object" );
31373142 RETURN_THROWS ();
31383143 }
@@ -3217,7 +3222,7 @@ PHP_METHOD(DateTime, __unserialize)
32173222
32183223 dateobj = Z_PHPDATE_P (object );
32193224
3220- if (!php_date_initialize_from_hash (dateobj , myht )) {
3225+ if (!php_date_initialize_from_hash (& dateobj , myht )) {
32213226 zend_throw_error (NULL , "Invalid serialization data for DateTime object" );
32223227 RETURN_THROWS ();
32233228 }
@@ -3239,7 +3244,7 @@ PHP_METHOD(DateTimeImmutable, __unserialize)
32393244
32403245 dateobj = Z_PHPDATE_P (object );
32413246
3242- if (!php_date_initialize_from_hash (dateobj , myht )) {
3247+ if (!php_date_initialize_from_hash (& dateobj , myht )) {
32433248 zend_throw_error (NULL , "Invalid serialization data for DateTimeImmutable object" );
32443249 RETURN_THROWS ();
32453250 }
@@ -3262,7 +3267,7 @@ static void php_do_date_time_wakeup(INTERNAL_FUNCTION_PARAMETERS, const char *cl
32623267
32633268 myht = Z_OBJPROP_P (object );
32643269
3265- if (!php_date_initialize_from_hash (dateobj , myht )) {
3270+ if (!php_date_initialize_from_hash (& dateobj , myht )) {
32663271 zend_throw_error (NULL , "Invalid serialization data for %s object" , class_name );
32673272 RETURN_THROWS ();
32683273 }
@@ -4283,15 +4288,16 @@ PHP_METHOD(DateTimeZone, __construct)
42834288}
42844289/* }}} */
42854290
4286- static bool php_date_timezone_initialize_from_hash (php_timezone_obj * tzobj , const HashTable * myht ) /* {{{ */
4291+ static bool php_date_timezone_initialize_from_hash (php_timezone_obj * * tzobj , const HashTable * myht ) /* {{{ */
42874292{
4288- zval * z_timezone_type ;
4289- zval * z_timezone ;
4293+ zval * z_timezone_type ;
42904294
42914295 if ((z_timezone_type = zend_hash_str_find (myht , "timezone_type" , sizeof ("timezone_type" ) - 1 )) == NULL ) {
42924296 return false;
42934297 }
42944298
4299+ zval * z_timezone ;
4300+
42954301 if ((z_timezone = zend_hash_str_find (myht , "timezone" , sizeof ("timezone" ) - 1 )) == NULL ) {
42964302 return false;
42974303 }
@@ -4308,7 +4314,7 @@ static bool php_date_timezone_initialize_from_hash(php_timezone_obj *tzobj, cons
43084314 if (UNEXPECTED (zend_str_has_nul_byte (Z_STR_P (z_timezone )))) {
43094315 return false;
43104316 }
4311- return timezone_initialize (tzobj , Z_STR_P (z_timezone ), NULL );
4317+ return timezone_initialize (* tzobj , Z_STR_P (z_timezone ), NULL );
43124318} /* }}} */
43134319
43144320/* {{{ */
@@ -4323,7 +4329,7 @@ PHP_METHOD(DateTimeZone, __set_state)
43234329
43244330 php_date_instantiate (date_ce_timezone , return_value );
43254331 tzobj = Z_PHPTIMEZONE_P (return_value );
4326- if (!php_date_timezone_initialize_from_hash (tzobj , myht )) {
4332+ if (!php_date_timezone_initialize_from_hash (& tzobj , myht )) {
43274333 zend_throw_error (NULL , "Invalid serialization data for DateTimeZone object" );
43284334 RETURN_THROWS ();
43294335 }
@@ -4343,7 +4349,7 @@ PHP_METHOD(DateTimeZone, __wakeup)
43434349
43444350 myht = Z_OBJPROP_P (object );
43454351
4346- if (!php_date_timezone_initialize_from_hash (tzobj , myht )) {
4352+ if (!php_date_timezone_initialize_from_hash (& tzobj , myht )) {
43474353 zend_throw_error (NULL , "Invalid serialization data for DateTimeZone object" );
43484354 RETURN_THROWS ();
43494355 }
@@ -4407,7 +4413,7 @@ PHP_METHOD(DateTimeZone, __unserialize)
44074413
44084414 tzobj = Z_PHPTIMEZONE_P (object );
44094415
4410- if (!php_date_timezone_initialize_from_hash (tzobj , myht )) {
4416+ if (!php_date_timezone_initialize_from_hash (& tzobj , myht )) {
44114417 zend_throw_error (NULL , "Invalid serialization data for DateTimeZone object" );
44124418 RETURN_THROWS ();
44134419 }
@@ -4834,10 +4840,10 @@ static void php_date_interval_initialize_from_hash(php_interval_obj *intobj, con
48344840{
48354841 /* If we have a date_string, use that instead */
48364842 const zval * date_str = zend_hash_str_find (myht , "date_string" , strlen ("date_string" ));
4837- timelib_time * time ;
4838- timelib_error_container * err ;
48394843 if (date_str && Z_TYPE_P (date_str ) == IS_STRING ) {
4840- err = NULL ;
4844+ timelib_time * time ;
4845+ timelib_error_container * err = NULL ;
4846+
48414847 time = timelib_strtotime (Z_STRVAL_P (date_str ), Z_STRLEN_P (date_str ), & err , DATE_TIMEZONEDB , php_date_parse_tzfile_wrapper );
48424848
48434849 if (err -> error_count > 0 ) {
0 commit comments