@@ -299,7 +299,6 @@ 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 );
@@ -1396,6 +1395,64 @@ PHP_FUNCTION(getdate)
1396
1395
}
1397
1396
/* }}} */
1398
1397
1398
+ static void create_date_period_datetime (timelib_time * datetime , zend_class_entry * ce , zval * zv )
1399
+ {
1400
+ if (datetime ) {
1401
+ php_date_obj * date_obj ;
1402
+
1403
+ object_init_ex (zv , ce );
1404
+ date_obj = Z_PHPDATE_P (zv );
1405
+ date_obj -> time = timelib_time_clone (datetime );
1406
+ } else {
1407
+ ZVAL_NULL (zv );
1408
+ }
1409
+ }
1410
+
1411
+ static void create_date_period_interval (timelib_rel_time * interval , zval * zv )
1412
+ {
1413
+ if (interval ) {
1414
+ php_interval_obj * interval_obj ;
1415
+
1416
+ object_init_ex (zv , date_ce_interval );
1417
+ interval_obj = Z_PHPINTERVAL_P (zv );
1418
+ interval_obj -> diff = timelib_rel_time_clone (interval );
1419
+ interval_obj -> initialized = 1 ;
1420
+ } else {
1421
+ ZVAL_NULL (zv );
1422
+ }
1423
+ }
1424
+
1425
+ static void initialize_date_period_properties (php_period_obj * period_obj )
1426
+ {
1427
+ zval start_zv , current_zv , end_zv , interval_zv ;
1428
+
1429
+ if (UNEXPECTED (!period_obj -> std .properties )) {
1430
+ rebuild_object_properties (& period_obj -> std );
1431
+ }
1432
+
1433
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & start_zv );
1434
+ zend_update_property (date_ce_period , & period_obj -> std , "start" , sizeof ("start" ) - 1 , & start_zv );
1435
+ zval_ptr_dtor (& start_zv );
1436
+
1437
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & current_zv );
1438
+ zend_string * property_name = zend_string_init ("current" , sizeof ("current" ) - 1 , 0 );
1439
+ zend_std_write_property (& period_obj -> std , property_name , & current_zv , NULL );
1440
+ zval_ptr_dtor (& current_zv );
1441
+ zend_string_release (property_name );
1442
+
1443
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & end_zv );
1444
+ zend_update_property (date_ce_period , & period_obj -> std , "end" , sizeof ("end" ) - 1 , & end_zv );
1445
+ zval_ptr_dtor (& end_zv );
1446
+
1447
+ create_date_period_interval (period_obj -> interval , & interval_zv );
1448
+ zend_update_property (date_ce_period , & period_obj -> std , "interval" , sizeof ("interval" ) - 1 , & interval_zv );
1449
+ zval_ptr_dtor (& interval_zv );
1450
+
1451
+ zend_update_property_long (date_ce_period , & period_obj -> std , "recurrences" , sizeof ("recurrences" ) - 1 , (zend_long ) period_obj -> recurrences );
1452
+ zend_update_property_bool (date_ce_period , & period_obj -> std , "include_start_date" , sizeof ("include_start_date" ) - 1 , period_obj -> include_start_date );
1453
+ zend_update_property_bool (date_ce_period , & period_obj -> std , "include_end_date" , sizeof ("include_end_date" ) - 1 , period_obj -> include_end_date );
1454
+ }
1455
+
1399
1456
/* define an overloaded iterator structure */
1400
1457
typedef struct {
1401
1458
zend_object_iterator intern ;
@@ -1491,10 +1548,21 @@ static void date_period_it_move_forward(zend_object_iterator *iter)
1491
1548
{
1492
1549
date_period_it * iterator = (date_period_it * )iter ;
1493
1550
php_period_obj * object = Z_PHPPERIOD_P (& iterator -> intern .data );
1494
- timelib_time * it_time = object -> current ;
1551
+ timelib_time * it_time = object -> current ;
1552
+ zval current_zv ;
1495
1553
1496
1554
date_period_advance (it_time , object -> interval );
1497
1555
1556
+ if (UNEXPECTED (!object -> std .properties )) {
1557
+ rebuild_object_properties (& object -> std );
1558
+ }
1559
+
1560
+ create_date_period_datetime (object -> current , object -> start_ce , & current_zv );
1561
+ zend_string * property_name = zend_string_init ("current" , sizeof ("current" ) - 1 , 0 );
1562
+ zend_std_write_property (& object -> std , property_name , & current_zv , NULL );
1563
+ zval_ptr_dtor (& current_zv );
1564
+ zend_string_release (property_name );
1565
+
1498
1566
iterator -> current_index ++ ;
1499
1567
date_period_it_invalidate_current (iter );
1500
1568
}
@@ -1657,9 +1725,8 @@ static void date_register_classes(void) /* {{{ */
1657
1725
date_object_handlers_period .offset = XtOffsetOf (php_period_obj , std );
1658
1726
date_object_handlers_period .free_obj = date_object_free_storage_period ;
1659
1727
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
1728
date_object_handlers_period .get_gc = date_object_get_gc_period ;
1729
+ date_object_handlers_period .get_property_ptr_ptr = date_period_get_property_ptr_ptr ;
1663
1730
date_object_handlers_period .read_property = date_period_read_property ;
1664
1731
date_object_handlers_period .write_property = date_period_write_property ;
1665
1732
} /* }}} */
@@ -4509,6 +4576,8 @@ PHP_METHOD(DatePeriod, __construct)
4509
4576
dpobj -> recurrences = recurrences + dpobj -> include_start_date + dpobj -> include_end_date ;
4510
4577
4511
4578
dpobj -> initialized = 1 ;
4579
+
4580
+ initialize_date_period_properties (dpobj );
4512
4581
}
4513
4582
/* }}} */
4514
4583
@@ -4972,45 +5041,16 @@ static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *pr
4972
5041
{
4973
5042
zval zv ;
4974
5043
4975
- if (period_obj -> start ) {
4976
- php_date_obj * date_obj ;
4977
- object_init_ex (& zv , period_obj -> start_ce );
4978
- date_obj = Z_PHPDATE_P (& zv );
4979
- date_obj -> time = timelib_time_clone (period_obj -> start );
4980
- } else {
4981
- ZVAL_NULL (& zv );
4982
- }
5044
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & zv );
4983
5045
zend_hash_str_update (props , "start" , sizeof ("start" )- 1 , & zv );
4984
5046
4985
- if (period_obj -> current ) {
4986
- php_date_obj * date_obj ;
4987
- object_init_ex (& zv , period_obj -> start_ce );
4988
- date_obj = Z_PHPDATE_P (& zv );
4989
- date_obj -> time = timelib_time_clone (period_obj -> current );
4990
- } else {
4991
- ZVAL_NULL (& zv );
4992
- }
5047
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & zv );
4993
5048
zend_hash_str_update (props , "current" , sizeof ("current" )- 1 , & zv );
4994
5049
4995
- if (period_obj -> end ) {
4996
- php_date_obj * date_obj ;
4997
- object_init_ex (& zv , period_obj -> start_ce );
4998
- date_obj = Z_PHPDATE_P (& zv );
4999
- date_obj -> time = timelib_time_clone (period_obj -> end );
5000
- } else {
5001
- ZVAL_NULL (& zv );
5002
- }
5050
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & zv );
5003
5051
zend_hash_str_update (props , "end" , sizeof ("end" )- 1 , & zv );
5004
5052
5005
- if (period_obj -> interval ) {
5006
- php_interval_obj * interval_obj ;
5007
- object_init_ex (& zv , date_ce_interval );
5008
- interval_obj = Z_PHPINTERVAL_P (& zv );
5009
- interval_obj -> diff = timelib_rel_time_clone (period_obj -> interval );
5010
- interval_obj -> initialized = 1 ;
5011
- } else {
5012
- ZVAL_NULL (& zv );
5013
- }
5053
+ create_date_period_interval (period_obj -> interval , & zv );
5014
5054
zend_hash_str_update (props , "interval" , sizeof ("interval" )- 1 , & zv );
5015
5055
5016
5056
/* converted to larger type (int->long); must check when unserializing */
@@ -5024,22 +5064,6 @@ static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *pr
5024
5064
zend_hash_str_update (props , "include_end_date" , sizeof ("include_end_date" )- 1 , & zv );
5025
5065
}
5026
5066
5027
- static HashTable * date_object_get_properties_period (zend_object * object ) /* {{{ */
5028
- {
5029
- HashTable * props ;
5030
- php_period_obj * period_obj ;
5031
-
5032
- period_obj = php_period_obj_from_obj (object );
5033
- props = zend_std_get_properties (object );
5034
- if (!period_obj -> start ) {
5035
- return props ;
5036
- }
5037
-
5038
- date_period_object_to_hash (period_obj , props );
5039
-
5040
- return props ;
5041
- } /* }}} */
5042
-
5043
5067
static bool php_date_period_initialize_from_hash (php_period_obj * period_obj , HashTable * myht ) /* {{{ */
5044
5068
{
5045
5069
zval * ht_entry ;
@@ -5125,6 +5149,8 @@ static bool php_date_period_initialize_from_hash(php_period_obj *period_obj, Has
5125
5149
5126
5150
period_obj -> initialized = 1 ;
5127
5151
5152
+ initialize_date_period_properties (period_obj );
5153
+
5128
5154
return 1 ;
5129
5155
} /* }}} */
5130
5156
@@ -5208,10 +5234,10 @@ PHP_METHOD(DatePeriod, __wakeup)
5208
5234
}
5209
5235
/* }}} */
5210
5236
5211
- /* {{{ date_period_is_magic_property
5237
+ /* {{{ date_period_is_internal_property
5212
5238
* Common for date_period_read_property() and date_period_write_property() functions
5213
5239
*/
5214
- static bool date_period_is_magic_property (zend_string * name )
5240
+ static bool date_period_is_internal_property (zend_string * name )
5215
5241
{
5216
5242
if (zend_string_equals_literal (name , "recurrences" )
5217
5243
|| zend_string_equals_literal (name , "include_start_date" )
@@ -5231,38 +5257,32 @@ static bool date_period_is_magic_property(zend_string *name)
5231
5257
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
5232
5258
{
5233
5259
if (type != BP_VAR_IS && type != BP_VAR_R ) {
5234
- if (date_period_is_magic_property (name )) {
5235
- zend_throw_error (NULL , "Retrieval of DatePeriod->%s for modification is unsupported " , ZSTR_VAL (name ));
5260
+ if (date_period_is_internal_property (name )) {
5261
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5236
5262
return & EG (uninitialized_zval );
5237
5263
}
5238
5264
}
5239
5265
5240
- object -> handlers -> get_properties (object ); /* build properties hash table */
5241
-
5242
5266
return zend_std_read_property (object , name , type , cache_slot , rv );
5243
5267
}
5244
5268
/* }}} */
5245
5269
5246
- /* {{{ date_period_write_property */
5247
5270
static zval * date_period_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot )
5248
5271
{
5249
- if (date_period_is_magic_property (name )) {
5250
- zend_throw_error (NULL , "Writing to DatePeriod->%s is unsupported " , ZSTR_VAL (name ));
5272
+ if (zend_string_equals_literal (name , "current" )) {
5273
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5251
5274
return value ;
5252
5275
}
5253
5276
5254
5277
return zend_std_write_property (object , name , value , cache_slot );
5255
5278
}
5256
- /* }}} */
5257
5279
5258
- /* {{{ date_period_get_property_ptr_ptr */
5259
5280
static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot )
5260
5281
{
5261
- if (date_period_is_magic_property (name )) {
5262
- zend_throw_error (NULL , "Retrieval of DatePeriod->%s for modification is unsupported " , ZSTR_VAL (name ));
5282
+ if (zend_string_equals_literal (name , "current" )) {
5283
+ zend_throw_error (NULL , "Cannot modify readonly property DatePeriod::$%s " , ZSTR_VAL (name ));
5263
5284
return & EG (error_zval );
5264
5285
}
5265
5286
5266
5287
return zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
5267
5288
}
5268
- /* }}} */
0 commit comments