@@ -172,19 +172,22 @@ static HashTable *date_object_get_properties_for(zend_object *object, zend_prop_
172
172
static HashTable * date_object_get_gc_interval (zend_object * object , zval * * table , int * n );
173
173
static HashTable * date_object_get_properties_interval (zend_object * object );
174
174
static HashTable * date_object_get_gc_period (zend_object * object , zval * * table , int * n );
175
- static HashTable * date_object_get_properties_period (zend_object * object );
176
175
static HashTable * date_object_get_properties_for_timezone (zend_object * object , zend_prop_purpose purpose );
177
176
static HashTable * date_object_get_gc_timezone (zend_object * object , zval * * table , int * n );
178
177
static HashTable * date_object_get_debug_info_timezone (zend_object * object , int * is_temp );
179
178
static void php_timezone_to_string (php_timezone_obj * tzobj , zval * zv );
180
179
180
+ static void create_date_period_datetime (timelib_time * datetime , zend_class_entry * ce , zval * zv );
181
+ static void create_date_period_interval (timelib_rel_time * interval , zval * zv );
182
+ static void initialize_date_period_properties (php_period_obj * period_obj );
183
+
181
184
static int date_interval_compare_objects (zval * o1 , zval * o2 );
182
185
static zval * date_interval_read_property (zend_object * object , zend_string * member , int type , void * * cache_slot , zval * rv );
183
186
static zval * date_interval_write_property (zend_object * object , zend_string * member , zval * value , void * * cache_slot );
184
187
static zval * date_interval_get_property_ptr_ptr (zend_object * object , zend_string * member , int type , void * * cache_slot );
188
+ static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot );
185
189
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv );
186
190
static zval * date_period_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot );
187
- static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot );
188
191
189
192
static int date_object_compare_timezone (zval * tz1 , zval * tz2 );
190
193
@@ -1523,10 +1526,21 @@ static void date_period_it_move_forward(zend_object_iterator *iter)
1523
1526
{
1524
1527
date_period_it * iterator = (date_period_it * )iter ;
1525
1528
php_period_obj * object = Z_PHPPERIOD_P (& iterator -> intern .data );
1526
- timelib_time * it_time = object -> current ;
1529
+ timelib_time * it_time = object -> current ;
1530
+ zval current_zv ;
1527
1531
1528
1532
date_period_advance (it_time , object -> interval );
1529
1533
1534
+ if (UNEXPECTED (!object -> std .properties )) {
1535
+ rebuild_object_properties (& object -> std );
1536
+ }
1537
+
1538
+ create_date_period_datetime (object -> current , object -> start_ce , & current_zv );
1539
+ zend_string * property_name = zend_string_init ("current" , sizeof ("current" ) - 1 , 0 );
1540
+ zend_std_write_property (& object -> std , property_name , & current_zv , NULL );
1541
+ zval_ptr_dtor (& current_zv );
1542
+ zend_string_release (property_name );
1543
+
1530
1544
iterator -> current_index ++ ;
1531
1545
date_period_it_invalidate_current (iter );
1532
1546
}
@@ -1724,9 +1738,8 @@ static void date_register_classes(void) /* {{{ */
1724
1738
date_object_handlers_period .offset = XtOffsetOf (php_period_obj , std );
1725
1739
date_object_handlers_period .free_obj = date_object_free_storage_period ;
1726
1740
date_object_handlers_period .clone_obj = date_object_clone_period ;
1727
- date_object_handlers_period .get_properties = date_object_get_properties_period ;
1728
- date_object_handlers_period .get_property_ptr_ptr = date_period_get_property_ptr_ptr ;
1729
1741
date_object_handlers_period .get_gc = date_object_get_gc_period ;
1742
+ date_object_handlers_period .get_property_ptr_ptr = date_period_get_property_ptr_ptr ;
1730
1743
date_object_handlers_period .read_property = date_period_read_property ;
1731
1744
date_object_handlers_period .write_property = date_period_write_property ;
1732
1745
@@ -4572,6 +4585,8 @@ PHP_METHOD(DatePeriod, __construct)
4572
4585
dpobj -> recurrences = recurrences + dpobj -> include_start_date ;
4573
4586
4574
4587
dpobj -> initialized = 1 ;
4588
+
4589
+ initialize_date_period_properties (dpobj );
4575
4590
}
4576
4591
/* }}} */
4577
4592
@@ -5035,45 +5050,16 @@ static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *pr
5035
5050
{
5036
5051
zval zv ;
5037
5052
5038
- if (period_obj -> start ) {
5039
- php_date_obj * date_obj ;
5040
- object_init_ex (& zv , period_obj -> start_ce );
5041
- date_obj = Z_PHPDATE_P (& zv );
5042
- date_obj -> time = timelib_time_clone (period_obj -> start );
5043
- } else {
5044
- ZVAL_NULL (& zv );
5045
- }
5053
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & zv );
5046
5054
zend_hash_str_update (props , "start" , sizeof ("start" )- 1 , & zv );
5047
5055
5048
- if (period_obj -> current ) {
5049
- php_date_obj * date_obj ;
5050
- object_init_ex (& zv , period_obj -> start_ce );
5051
- date_obj = Z_PHPDATE_P (& zv );
5052
- date_obj -> time = timelib_time_clone (period_obj -> current );
5053
- } else {
5054
- ZVAL_NULL (& zv );
5055
- }
5056
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & zv );
5056
5057
zend_hash_str_update (props , "current" , sizeof ("current" )- 1 , & zv );
5057
5058
5058
- if (period_obj -> end ) {
5059
- php_date_obj * date_obj ;
5060
- object_init_ex (& zv , period_obj -> start_ce );
5061
- date_obj = Z_PHPDATE_P (& zv );
5062
- date_obj -> time = timelib_time_clone (period_obj -> end );
5063
- } else {
5064
- ZVAL_NULL (& zv );
5065
- }
5059
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & zv );
5066
5060
zend_hash_str_update (props , "end" , sizeof ("end" )- 1 , & zv );
5067
5061
5068
- if (period_obj -> interval ) {
5069
- php_interval_obj * interval_obj ;
5070
- object_init_ex (& zv , date_ce_interval );
5071
- interval_obj = Z_PHPINTERVAL_P (& zv );
5072
- interval_obj -> diff = timelib_rel_time_clone (period_obj -> interval );
5073
- interval_obj -> initialized = 1 ;
5074
- } else {
5075
- ZVAL_NULL (& zv );
5076
- }
5062
+ create_date_period_interval (period_obj -> interval , & zv );
5077
5063
zend_hash_str_update (props , "interval" , sizeof ("interval" )- 1 , & zv );
5078
5064
5079
5065
/* converted to larger type (int->long); must check when unserializing */
@@ -5084,22 +5070,6 @@ static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *pr
5084
5070
zend_hash_str_update (props , "include_start_date" , sizeof ("include_start_date" )- 1 , & zv );
5085
5071
}
5086
5072
5087
- static HashTable * date_object_get_properties_period (zend_object * object ) /* {{{ */
5088
- {
5089
- HashTable * props ;
5090
- php_period_obj * period_obj ;
5091
-
5092
- period_obj = php_period_obj_from_obj (object );
5093
- props = zend_std_get_properties (object );
5094
- if (!period_obj -> start ) {
5095
- return props ;
5096
- }
5097
-
5098
- date_period_object_to_hash (period_obj , props );
5099
-
5100
- return props ;
5101
- } /* }}} */
5102
-
5103
5073
static bool php_date_period_initialize_from_hash (php_period_obj * period_obj , HashTable * myht ) /* {{{ */
5104
5074
{
5105
5075
zval * ht_entry ;
@@ -5177,6 +5147,8 @@ static bool php_date_period_initialize_from_hash(php_period_obj *period_obj, Has
5177
5147
5178
5148
period_obj -> initialized = 1 ;
5179
5149
5150
+ initialize_date_period_properties (period_obj );
5151
+
5180
5152
return 1 ;
5181
5153
} /* }}} */
5182
5154
@@ -5260,10 +5232,10 @@ PHP_METHOD(DatePeriod, __wakeup)
5260
5232
}
5261
5233
/* }}} */
5262
5234
5263
- /* {{{ date_period_is_magic_property
5235
+ /* {{{ date_period_is_internal_property
5264
5236
* Common for date_period_read_property() and date_period_write_property() functions
5265
5237
*/
5266
- static bool date_period_is_magic_property (zend_string * name )
5238
+ static bool date_period_is_internal_property (zend_string * name )
5267
5239
{
5268
5240
if (zend_string_equals_literal (name , "recurrences" )
5269
5241
|| zend_string_equals_literal (name , "include_start_date" )
@@ -5282,38 +5254,87 @@ static bool date_period_is_magic_property(zend_string *name)
5282
5254
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
5283
5255
{
5284
5256
if (type != BP_VAR_IS && type != BP_VAR_R ) {
5285
- if (date_period_is_magic_property (name )) {
5286
- zend_throw_error (NULL , "Retrieval of DatePeriod->%s for modification is unsupported " , ZSTR_VAL (name ));
5257
+ if (date_period_is_internal_property (name )) {
5258
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5287
5259
return & EG (uninitialized_zval );
5288
5260
}
5289
5261
}
5290
5262
5291
- object -> handlers -> get_properties (object ); /* build properties hash table */
5292
-
5293
5263
return zend_std_read_property (object , name , type , cache_slot , rv );
5294
5264
}
5295
5265
/* }}} */
5296
5266
5297
- /* {{{ date_period_write_property */
5298
5267
static zval * date_period_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot )
5299
5268
{
5300
- if (date_period_is_magic_property (name )) {
5301
- zend_throw_error (NULL , "Writing to DatePeriod->%s is unsupported " , ZSTR_VAL (name ));
5269
+ if (zend_string_equals_literal (name , "current" )) {
5270
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5302
5271
return value ;
5303
5272
}
5304
5273
5305
5274
return zend_std_write_property (object , name , value , cache_slot );
5306
5275
}
5307
- /* }}} */
5308
5276
5309
- /* {{{ date_period_get_property_ptr_ptr */
5310
5277
static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot )
5311
5278
{
5312
- if (date_period_is_magic_property (name )) {
5313
- zend_throw_error (NULL , "Retrieval of DatePeriod->%s for modification is unsupported " , ZSTR_VAL (name ));
5279
+ if (zend_string_equals_literal (name , "current" )) {
5280
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5314
5281
return & EG (error_zval );
5315
5282
}
5316
5283
5317
5284
return zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
5318
5285
}
5319
- /* }}} */
5286
+
5287
+ static void create_date_period_datetime (timelib_time * datetime , zend_class_entry * ce , zval * zv )
5288
+ {
5289
+ if (datetime ) {
5290
+ php_date_obj * date_obj ;
5291
+ object_init_ex (zv , ce );
5292
+ date_obj = Z_PHPDATE_P (zv );
5293
+ date_obj -> time = timelib_time_clone (datetime );
5294
+ } else {
5295
+ ZVAL_NULL (zv );
5296
+ }
5297
+ }
5298
+
5299
+ static void create_date_period_interval (timelib_rel_time * interval , zval * zv )
5300
+ {
5301
+ if (interval ) {
5302
+ php_interval_obj * interval_obj ;
5303
+ object_init_ex (zv , date_ce_interval );
5304
+ interval_obj = Z_PHPINTERVAL_P (zv );
5305
+ interval_obj -> diff = timelib_rel_time_clone (interval );
5306
+ interval_obj -> initialized = 1 ;
5307
+ } else {
5308
+ ZVAL_NULL (zv );
5309
+ }
5310
+ }
5311
+
5312
+ static void initialize_date_period_properties (php_period_obj * period_obj )
5313
+ {
5314
+ zval start_zv , current_zv , end_zv , interval_zv ;
5315
+
5316
+ if (UNEXPECTED (!period_obj -> std .properties )) {
5317
+ rebuild_object_properties (& period_obj -> std );
5318
+ }
5319
+
5320
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & start_zv );
5321
+ zend_update_property (date_ce_period , & period_obj -> std , "start" , sizeof ("start" ) - 1 , & start_zv );
5322
+ zval_ptr_dtor (& start_zv );
5323
+
5324
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & current_zv );
5325
+ zend_string * property_name = zend_string_init ("current" , sizeof ("current" ) - 1 , 0 );
5326
+ zend_std_write_property (& period_obj -> std , property_name , & current_zv , NULL );
5327
+ zval_ptr_dtor (& current_zv );
5328
+ zend_string_release (property_name );
5329
+
5330
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & end_zv );
5331
+ zend_update_property (date_ce_period , & period_obj -> std , "end" , sizeof ("end" ) - 1 , & end_zv );
5332
+ zval_ptr_dtor (& end_zv );
5333
+
5334
+ create_date_period_interval (period_obj -> interval , & interval_zv );
5335
+ zend_update_property (date_ce_period , & period_obj -> std , "interval" , sizeof ("interval" ) - 1 , & interval_zv );
5336
+ zval_ptr_dtor (& interval_zv );
5337
+
5338
+ zend_update_property_long (date_ce_period , & period_obj -> std , "recurrences" , sizeof ("recurrences" ) - 1 , (zend_long ) period_obj -> recurrences );
5339
+ zend_update_property_bool (date_ce_period , & period_obj -> std , "include_start_date" , sizeof ("include_start_date" ) - 1 , period_obj -> include_start_date );
5340
+ }
0 commit comments