@@ -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
@@ -1521,10 +1524,21 @@ static void date_period_it_move_forward(zend_object_iterator *iter)
1521
1524
{
1522
1525
date_period_it * iterator = (date_period_it * )iter ;
1523
1526
php_period_obj * object = Z_PHPPERIOD_P (& iterator -> intern .data );
1524
- timelib_time * it_time = object -> current ;
1527
+ timelib_time * it_time = object -> current ;
1528
+ zval current_zv ;
1525
1529
1526
1530
date_period_advance (it_time , object -> interval );
1527
1531
1532
+ if (UNEXPECTED (!object -> std .properties )) {
1533
+ rebuild_object_properties (& object -> std );
1534
+ }
1535
+
1536
+ create_date_period_datetime (object -> current , object -> start_ce , & current_zv );
1537
+ zend_string * property_name = zend_string_init ("current" , sizeof ("current" ) - 1 , 0 );
1538
+ zend_std_write_property (& object -> std , property_name , & current_zv , NULL );
1539
+ zval_ptr_dtor (& current_zv );
1540
+ zend_string_release (property_name );
1541
+
1528
1542
iterator -> current_index ++ ;
1529
1543
date_period_it_invalidate_current (iter );
1530
1544
}
@@ -1722,9 +1736,8 @@ static void date_register_classes(void) /* {{{ */
1722
1736
date_object_handlers_period .offset = XtOffsetOf (php_period_obj , std );
1723
1737
date_object_handlers_period .free_obj = date_object_free_storage_period ;
1724
1738
date_object_handlers_period .clone_obj = date_object_clone_period ;
1725
- date_object_handlers_period .get_properties = date_object_get_properties_period ;
1726
- date_object_handlers_period .get_property_ptr_ptr = date_period_get_property_ptr_ptr ;
1727
1739
date_object_handlers_period .get_gc = date_object_get_gc_period ;
1740
+ date_object_handlers_period .get_property_ptr_ptr = date_period_get_property_ptr_ptr ;
1728
1741
date_object_handlers_period .read_property = date_period_read_property ;
1729
1742
date_object_handlers_period .write_property = date_period_write_property ;
1730
1743
@@ -4564,6 +4577,8 @@ PHP_METHOD(DatePeriod, __construct)
4564
4577
dpobj -> recurrences = recurrences + dpobj -> include_start_date ;
4565
4578
4566
4579
dpobj -> initialized = 1 ;
4580
+
4581
+ initialize_date_period_properties (dpobj );
4567
4582
}
4568
4583
/* }}} */
4569
4584
@@ -5027,45 +5042,16 @@ static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *pr
5027
5042
{
5028
5043
zval zv ;
5029
5044
5030
- if (period_obj -> start ) {
5031
- php_date_obj * date_obj ;
5032
- object_init_ex (& zv , period_obj -> start_ce );
5033
- date_obj = Z_PHPDATE_P (& zv );
5034
- date_obj -> time = timelib_time_clone (period_obj -> start );
5035
- } else {
5036
- ZVAL_NULL (& zv );
5037
- }
5045
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & zv );
5038
5046
zend_hash_str_update (props , "start" , sizeof ("start" )- 1 , & zv );
5039
5047
5040
- if (period_obj -> current ) {
5041
- php_date_obj * date_obj ;
5042
- object_init_ex (& zv , period_obj -> start_ce );
5043
- date_obj = Z_PHPDATE_P (& zv );
5044
- date_obj -> time = timelib_time_clone (period_obj -> current );
5045
- } else {
5046
- ZVAL_NULL (& zv );
5047
- }
5048
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & zv );
5048
5049
zend_hash_str_update (props , "current" , sizeof ("current" )- 1 , & zv );
5049
5050
5050
- if (period_obj -> end ) {
5051
- php_date_obj * date_obj ;
5052
- object_init_ex (& zv , period_obj -> start_ce );
5053
- date_obj = Z_PHPDATE_P (& zv );
5054
- date_obj -> time = timelib_time_clone (period_obj -> end );
5055
- } else {
5056
- ZVAL_NULL (& zv );
5057
- }
5051
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & zv );
5058
5052
zend_hash_str_update (props , "end" , sizeof ("end" )- 1 , & zv );
5059
5053
5060
- if (period_obj -> interval ) {
5061
- php_interval_obj * interval_obj ;
5062
- object_init_ex (& zv , date_ce_interval );
5063
- interval_obj = Z_PHPINTERVAL_P (& zv );
5064
- interval_obj -> diff = timelib_rel_time_clone (period_obj -> interval );
5065
- interval_obj -> initialized = 1 ;
5066
- } else {
5067
- ZVAL_NULL (& zv );
5068
- }
5054
+ create_date_period_interval (period_obj -> interval , & zv );
5069
5055
zend_hash_str_update (props , "interval" , sizeof ("interval" )- 1 , & zv );
5070
5056
5071
5057
/* converted to larger type (int->long); must check when unserializing */
@@ -5076,22 +5062,6 @@ static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *pr
5076
5062
zend_hash_str_update (props , "include_start_date" , sizeof ("include_start_date" )- 1 , & zv );
5077
5063
}
5078
5064
5079
- static HashTable * date_object_get_properties_period (zend_object * object ) /* {{{ */
5080
- {
5081
- HashTable * props ;
5082
- php_period_obj * period_obj ;
5083
-
5084
- period_obj = php_period_obj_from_obj (object );
5085
- props = zend_std_get_properties (object );
5086
- if (!period_obj -> start ) {
5087
- return props ;
5088
- }
5089
-
5090
- date_period_object_to_hash (period_obj , props );
5091
-
5092
- return props ;
5093
- } /* }}} */
5094
-
5095
5065
static bool php_date_period_initialize_from_hash (php_period_obj * period_obj , HashTable * myht ) /* {{{ */
5096
5066
{
5097
5067
zval * ht_entry ;
@@ -5169,6 +5139,8 @@ static bool php_date_period_initialize_from_hash(php_period_obj *period_obj, Has
5169
5139
5170
5140
period_obj -> initialized = 1 ;
5171
5141
5142
+ initialize_date_period_properties (period_obj );
5143
+
5172
5144
return 1 ;
5173
5145
} /* }}} */
5174
5146
@@ -5252,10 +5224,10 @@ PHP_METHOD(DatePeriod, __wakeup)
5252
5224
}
5253
5225
/* }}} */
5254
5226
5255
- /* {{{ date_period_is_magic_property
5227
+ /* {{{ date_period_is_internal_property
5256
5228
* Common for date_period_read_property() and date_period_write_property() functions
5257
5229
*/
5258
- static bool date_period_is_magic_property (zend_string * name )
5230
+ static bool date_period_is_internal_property (zend_string * name )
5259
5231
{
5260
5232
if (zend_string_equals_literal (name , "recurrences" )
5261
5233
|| zend_string_equals_literal (name , "include_start_date" )
@@ -5274,38 +5246,87 @@ static bool date_period_is_magic_property(zend_string *name)
5274
5246
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
5275
5247
{
5276
5248
if (type != BP_VAR_IS && type != BP_VAR_R ) {
5277
- if (date_period_is_magic_property (name )) {
5278
- zend_throw_error (NULL , "Retrieval of DatePeriod->%s for modification is unsupported " , ZSTR_VAL (name ));
5249
+ if (date_period_is_internal_property (name )) {
5250
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5279
5251
return & EG (uninitialized_zval );
5280
5252
}
5281
5253
}
5282
5254
5283
- object -> handlers -> get_properties (object ); /* build properties hash table */
5284
-
5285
5255
return zend_std_read_property (object , name , type , cache_slot , rv );
5286
5256
}
5287
5257
/* }}} */
5288
5258
5289
- /* {{{ date_period_write_property */
5290
5259
static zval * date_period_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot )
5291
5260
{
5292
- if (date_period_is_magic_property (name )) {
5293
- zend_throw_error (NULL , "Writing to DatePeriod->%s is unsupported " , ZSTR_VAL (name ));
5261
+ if (zend_string_equals_literal (name , "current" )) {
5262
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5294
5263
return value ;
5295
5264
}
5296
5265
5297
5266
return zend_std_write_property (object , name , value , cache_slot );
5298
5267
}
5299
- /* }}} */
5300
5268
5301
- /* {{{ date_period_get_property_ptr_ptr */
5302
5269
static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot )
5303
5270
{
5304
- if (date_period_is_magic_property (name )) {
5305
- zend_throw_error (NULL , "Retrieval of DatePeriod->%s for modification is unsupported " , ZSTR_VAL (name ));
5271
+ if (zend_string_equals_literal (name , "current" )) {
5272
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5306
5273
return & EG (error_zval );
5307
5274
}
5308
5275
5309
5276
return zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
5310
5277
}
5311
- /* }}} */
5278
+
5279
+ static void create_date_period_datetime (timelib_time * datetime , zend_class_entry * ce , zval * zv )
5280
+ {
5281
+ if (datetime ) {
5282
+ php_date_obj * date_obj ;
5283
+ object_init_ex (zv , ce );
5284
+ date_obj = Z_PHPDATE_P (zv );
5285
+ date_obj -> time = timelib_time_clone (datetime );
5286
+ } else {
5287
+ ZVAL_NULL (zv );
5288
+ }
5289
+ }
5290
+
5291
+ static void create_date_period_interval (timelib_rel_time * interval , zval * zv )
5292
+ {
5293
+ if (interval ) {
5294
+ php_interval_obj * interval_obj ;
5295
+ object_init_ex (zv , date_ce_interval );
5296
+ interval_obj = Z_PHPINTERVAL_P (zv );
5297
+ interval_obj -> diff = timelib_rel_time_clone (interval );
5298
+ interval_obj -> initialized = 1 ;
5299
+ } else {
5300
+ ZVAL_NULL (zv );
5301
+ }
5302
+ }
5303
+
5304
+ static void initialize_date_period_properties (php_period_obj * period_obj )
5305
+ {
5306
+ zval start_zv , current_zv , end_zv , interval_zv ;
5307
+
5308
+ if (UNEXPECTED (!period_obj -> std .properties )) {
5309
+ rebuild_object_properties (& period_obj -> std );
5310
+ }
5311
+
5312
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & start_zv );
5313
+ zend_update_property (date_ce_period , & period_obj -> std , "start" , sizeof ("start" ) - 1 , & start_zv );
5314
+ zval_ptr_dtor (& start_zv );
5315
+
5316
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & current_zv );
5317
+ zend_string * property_name = zend_string_init ("current" , sizeof ("current" ) - 1 , 0 );
5318
+ zend_std_write_property (& period_obj -> std , property_name , & current_zv , NULL );
5319
+ zval_ptr_dtor (& current_zv );
5320
+ zend_string_release (property_name );
5321
+
5322
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & end_zv );
5323
+ zend_update_property (date_ce_period , & period_obj -> std , "end" , sizeof ("end" ) - 1 , & end_zv );
5324
+ zval_ptr_dtor (& end_zv );
5325
+
5326
+ create_date_period_interval (period_obj -> interval , & interval_zv );
5327
+ zend_update_property (date_ce_period , & period_obj -> std , "interval" , sizeof ("interval" ) - 1 , & interval_zv );
5328
+ zval_ptr_dtor (& interval_zv );
5329
+
5330
+ zend_update_property_long (date_ce_period , & period_obj -> std , "recurrences" , sizeof ("recurrences" ) - 1 , (zend_long ) period_obj -> recurrences );
5331
+ zend_update_property_bool (date_ce_period , & period_obj -> std , "include_start_date" , sizeof ("include_start_date" ) - 1 , period_obj -> include_start_date );
5332
+ }
0 commit comments