@@ -299,19 +299,22 @@ static HashTable *date_object_get_properties_for(zend_object *object, zend_prop_
299
299
static HashTable * date_object_get_gc_interval (zend_object * object , zval * * table , int * n );
300
300
static HashTable * date_object_get_properties_interval (zend_object * object );
301
301
static HashTable * date_object_get_gc_period (zend_object * object , zval * * table , int * n );
302
- static HashTable * date_object_get_properties_period (zend_object * object );
303
302
static HashTable * date_object_get_properties_for_timezone (zend_object * object , zend_prop_purpose purpose );
304
303
static HashTable * date_object_get_gc_timezone (zend_object * object , zval * * table , int * n );
305
304
static HashTable * date_object_get_debug_info_timezone (zend_object * object , int * is_temp );
306
305
static void php_timezone_to_string (php_timezone_obj * tzobj , zval * zv );
307
306
307
+ static void create_date_period_datetime (timelib_time * datetime , zend_class_entry * ce , zval * zv );
308
+ static void create_date_period_interval (timelib_rel_time * interval , zval * zv );
309
+ static void initialize_date_period_properties (php_period_obj * period_obj );
310
+
308
311
static int date_interval_compare_objects (zval * o1 , zval * o2 );
309
312
static zval * date_interval_read_property (zend_object * object , zend_string * member , int type , void * * cache_slot , zval * rv );
310
313
static zval * date_interval_write_property (zend_object * object , zend_string * member , zval * value , void * * cache_slot );
311
314
static zval * date_interval_get_property_ptr_ptr (zend_object * object , zend_string * member , int type , void * * cache_slot );
315
+ static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot );
312
316
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv );
313
317
static zval * date_period_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot );
314
- static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot );
315
318
316
319
static int date_object_compare_timezone (zval * tz1 , zval * tz2 );
317
320
@@ -1491,10 +1494,21 @@ static void date_period_it_move_forward(zend_object_iterator *iter)
1491
1494
{
1492
1495
date_period_it * iterator = (date_period_it * )iter ;
1493
1496
php_period_obj * object = Z_PHPPERIOD_P (& iterator -> intern .data );
1494
- timelib_time * it_time = object -> current ;
1497
+ timelib_time * it_time = object -> current ;
1498
+ zval current_zv ;
1495
1499
1496
1500
date_period_advance (it_time , object -> interval );
1497
1501
1502
+ if (UNEXPECTED (!object -> std .properties )) {
1503
+ rebuild_object_properties (& object -> std );
1504
+ }
1505
+
1506
+ create_date_period_datetime (object -> current , object -> start_ce , & current_zv );
1507
+ zend_string * property_name = zend_string_init ("current" , sizeof ("current" ) - 1 , 0 );
1508
+ zend_std_write_property (& object -> std , property_name , & current_zv , NULL );
1509
+ zval_ptr_dtor (& current_zv );
1510
+ zend_string_release (property_name );
1511
+
1498
1512
iterator -> current_index ++ ;
1499
1513
date_period_it_invalidate_current (iter );
1500
1514
}
@@ -1657,9 +1671,8 @@ static void date_register_classes(void) /* {{{ */
1657
1671
date_object_handlers_period .offset = XtOffsetOf (php_period_obj , std );
1658
1672
date_object_handlers_period .free_obj = date_object_free_storage_period ;
1659
1673
date_object_handlers_period .clone_obj = date_object_clone_period ;
1660
- date_object_handlers_period .get_properties = date_object_get_properties_period ;
1661
- date_object_handlers_period .get_property_ptr_ptr = date_period_get_property_ptr_ptr ;
1662
1674
date_object_handlers_period .get_gc = date_object_get_gc_period ;
1675
+ date_object_handlers_period .get_property_ptr_ptr = date_period_get_property_ptr_ptr ;
1663
1676
date_object_handlers_period .read_property = date_period_read_property ;
1664
1677
date_object_handlers_period .write_property = date_period_write_property ;
1665
1678
} /* }}} */
@@ -4502,6 +4515,8 @@ PHP_METHOD(DatePeriod, __construct)
4502
4515
dpobj -> recurrences = recurrences + dpobj -> include_start_date + dpobj -> include_end_date ;
4503
4516
4504
4517
dpobj -> initialized = 1 ;
4518
+
4519
+ initialize_date_period_properties (dpobj );
4505
4520
}
4506
4521
/* }}} */
4507
4522
@@ -4965,45 +4980,16 @@ static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *pr
4965
4980
{
4966
4981
zval zv ;
4967
4982
4968
- if (period_obj -> start ) {
4969
- php_date_obj * date_obj ;
4970
- object_init_ex (& zv , period_obj -> start_ce );
4971
- date_obj = Z_PHPDATE_P (& zv );
4972
- date_obj -> time = timelib_time_clone (period_obj -> start );
4973
- } else {
4974
- ZVAL_NULL (& zv );
4975
- }
4983
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & zv );
4976
4984
zend_hash_str_update (props , "start" , sizeof ("start" )- 1 , & zv );
4977
4985
4978
- if (period_obj -> current ) {
4979
- php_date_obj * date_obj ;
4980
- object_init_ex (& zv , period_obj -> start_ce );
4981
- date_obj = Z_PHPDATE_P (& zv );
4982
- date_obj -> time = timelib_time_clone (period_obj -> current );
4983
- } else {
4984
- ZVAL_NULL (& zv );
4985
- }
4986
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & zv );
4986
4987
zend_hash_str_update (props , "current" , sizeof ("current" )- 1 , & zv );
4987
4988
4988
- if (period_obj -> end ) {
4989
- php_date_obj * date_obj ;
4990
- object_init_ex (& zv , period_obj -> start_ce );
4991
- date_obj = Z_PHPDATE_P (& zv );
4992
- date_obj -> time = timelib_time_clone (period_obj -> end );
4993
- } else {
4994
- ZVAL_NULL (& zv );
4995
- }
4989
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & zv );
4996
4990
zend_hash_str_update (props , "end" , sizeof ("end" )- 1 , & zv );
4997
4991
4998
- if (period_obj -> interval ) {
4999
- php_interval_obj * interval_obj ;
5000
- object_init_ex (& zv , date_ce_interval );
5001
- interval_obj = Z_PHPINTERVAL_P (& zv );
5002
- interval_obj -> diff = timelib_rel_time_clone (period_obj -> interval );
5003
- interval_obj -> initialized = 1 ;
5004
- } else {
5005
- ZVAL_NULL (& zv );
5006
- }
4992
+ create_date_period_interval (period_obj -> interval , & zv );
5007
4993
zend_hash_str_update (props , "interval" , sizeof ("interval" )- 1 , & zv );
5008
4994
5009
4995
/* converted to larger type (int->long); must check when unserializing */
@@ -5017,22 +5003,6 @@ static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *pr
5017
5003
zend_hash_str_update (props , "include_end_date" , sizeof ("include_end_date" )- 1 , & zv );
5018
5004
}
5019
5005
5020
- static HashTable * date_object_get_properties_period (zend_object * object ) /* {{{ */
5021
- {
5022
- HashTable * props ;
5023
- php_period_obj * period_obj ;
5024
-
5025
- period_obj = php_period_obj_from_obj (object );
5026
- props = zend_std_get_properties (object );
5027
- if (!period_obj -> start ) {
5028
- return props ;
5029
- }
5030
-
5031
- date_period_object_to_hash (period_obj , props );
5032
-
5033
- return props ;
5034
- } /* }}} */
5035
-
5036
5006
static bool php_date_period_initialize_from_hash (php_period_obj * period_obj , HashTable * myht ) /* {{{ */
5037
5007
{
5038
5008
zval * ht_entry ;
@@ -5118,6 +5088,8 @@ static bool php_date_period_initialize_from_hash(php_period_obj *period_obj, Has
5118
5088
5119
5089
period_obj -> initialized = 1 ;
5120
5090
5091
+ initialize_date_period_properties (period_obj );
5092
+
5121
5093
return 1 ;
5122
5094
} /* }}} */
5123
5095
@@ -5201,10 +5173,10 @@ PHP_METHOD(DatePeriod, __wakeup)
5201
5173
}
5202
5174
/* }}} */
5203
5175
5204
- /* {{{ date_period_is_magic_property
5176
+ /* {{{ date_period_is_internal_property
5205
5177
* Common for date_period_read_property() and date_period_write_property() functions
5206
5178
*/
5207
- static bool date_period_is_magic_property (zend_string * name )
5179
+ static bool date_period_is_internal_property (zend_string * name )
5208
5180
{
5209
5181
if (zend_string_equals_literal (name , "recurrences" )
5210
5182
|| zend_string_equals_literal (name , "include_start_date" )
@@ -5224,38 +5196,87 @@ static bool date_period_is_magic_property(zend_string *name)
5224
5196
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
5225
5197
{
5226
5198
if (type != BP_VAR_IS && type != BP_VAR_R ) {
5227
- if (date_period_is_magic_property (name )) {
5228
- zend_throw_error (NULL , "Retrieval of DatePeriod->%s for modification is unsupported " , ZSTR_VAL (name ));
5199
+ if (date_period_is_internal_property (name )) {
5200
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5229
5201
return & EG (uninitialized_zval );
5230
5202
}
5231
5203
}
5232
5204
5233
- object -> handlers -> get_properties (object ); /* build properties hash table */
5234
-
5235
5205
return zend_std_read_property (object , name , type , cache_slot , rv );
5236
5206
}
5237
5207
/* }}} */
5238
5208
5239
- /* {{{ date_period_write_property */
5240
5209
static zval * date_period_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot )
5241
5210
{
5242
- if (date_period_is_magic_property (name )) {
5243
- zend_throw_error (NULL , "Writing to DatePeriod->%s is unsupported " , ZSTR_VAL (name ));
5211
+ if (zend_string_equals_literal (name , "current" )) {
5212
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5244
5213
return value ;
5245
5214
}
5246
5215
5247
5216
return zend_std_write_property (object , name , value , cache_slot );
5248
5217
}
5249
- /* }}} */
5250
5218
5251
- /* {{{ date_period_get_property_ptr_ptr */
5252
5219
static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot )
5253
5220
{
5254
- if (date_period_is_magic_property (name )) {
5255
- zend_throw_error (NULL , "Retrieval of DatePeriod->%s for modification is unsupported " , ZSTR_VAL (name ));
5221
+ if (zend_string_equals_literal (name , "current" )) {
5222
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5256
5223
return & EG (error_zval );
5257
5224
}
5258
5225
5259
5226
return zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
5260
5227
}
5261
- /* }}} */
5228
+
5229
+ static void create_date_period_datetime (timelib_time * datetime , zend_class_entry * ce , zval * zv )
5230
+ {
5231
+ if (datetime ) {
5232
+ php_date_obj * date_obj ;
5233
+ object_init_ex (zv , ce );
5234
+ date_obj = Z_PHPDATE_P (zv );
5235
+ date_obj -> time = timelib_time_clone (datetime );
5236
+ } else {
5237
+ ZVAL_NULL (zv );
5238
+ }
5239
+ }
5240
+
5241
+ static void create_date_period_interval (timelib_rel_time * interval , zval * zv )
5242
+ {
5243
+ if (interval ) {
5244
+ php_interval_obj * interval_obj ;
5245
+ object_init_ex (zv , date_ce_interval );
5246
+ interval_obj = Z_PHPINTERVAL_P (zv );
5247
+ interval_obj -> diff = timelib_rel_time_clone (interval );
5248
+ interval_obj -> initialized = 1 ;
5249
+ } else {
5250
+ ZVAL_NULL (zv );
5251
+ }
5252
+ }
5253
+
5254
+ static void initialize_date_period_properties (php_period_obj * period_obj )
5255
+ {
5256
+ zval start_zv , current_zv , end_zv , interval_zv ;
5257
+
5258
+ if (UNEXPECTED (!period_obj -> std .properties )) {
5259
+ rebuild_object_properties (& period_obj -> std );
5260
+ }
5261
+
5262
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & start_zv );
5263
+ zend_update_property (date_ce_period , & period_obj -> std , "start" , sizeof ("start" ) - 1 , & start_zv );
5264
+ zval_ptr_dtor (& start_zv );
5265
+
5266
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & current_zv );
5267
+ zend_string * property_name = zend_string_init ("current" , sizeof ("current" ) - 1 , 0 );
5268
+ zend_std_write_property (& period_obj -> std , property_name , & current_zv , NULL );
5269
+ zval_ptr_dtor (& current_zv );
5270
+ zend_string_release (property_name );
5271
+
5272
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & end_zv );
5273
+ zend_update_property (date_ce_period , & period_obj -> std , "end" , sizeof ("end" ) - 1 , & end_zv );
5274
+ zval_ptr_dtor (& end_zv );
5275
+
5276
+ create_date_period_interval (period_obj -> interval , & interval_zv );
5277
+ zend_update_property (date_ce_period , & period_obj -> std , "interval" , sizeof ("interval" ) - 1 , & interval_zv );
5278
+ zval_ptr_dtor (& interval_zv );
5279
+
5280
+ zend_update_property_long (date_ce_period , & period_obj -> std , "recurrences" , sizeof ("recurrences" ) - 1 , (zend_long ) period_obj -> recurrences );
5281
+ zend_update_property_bool (date_ce_period , & period_obj -> std , "include_start_date" , sizeof ("include_start_date" ) - 1 , period_obj -> include_start_date );
5282
+ }
0 commit comments