@@ -360,10 +360,12 @@ static int date_interval_compare_objects(zval *o1, zval *o2);
360
360
static zval * date_interval_read_property (zend_object * object , zend_string * member , int type , void * * cache_slot , zval * rv );
361
361
static zval * date_interval_write_property (zend_object * object , zend_string * member , zval * value , void * * cache_slot );
362
362
static zval * date_interval_get_property_ptr_ptr (zend_object * object , zend_string * member , int type , void * * cache_slot );
363
+ static int date_period_has_property (zend_object * object , zend_string * name , int type , void * * cache_slot );
363
364
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv );
364
365
static zval * date_period_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot );
365
366
static zval * date_period_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot );
366
-
367
+ static void date_period_unset_property (zend_object * object , zend_string * name , void * * cache_slot );
368
+ static HashTable * date_period_get_properties_for (zend_object * object , zend_prop_purpose purpose );
367
369
static int date_object_compare_timezone (zval * tz1 , zval * tz2 );
368
370
369
371
/* {{{ Module struct */
@@ -1505,45 +1507,6 @@ static void create_date_period_interval(timelib_rel_time *interval, zval *zv)
1505
1507
}
1506
1508
}
1507
1509
1508
- static void write_date_period_property (zend_object * obj , const char * name , const size_t name_len , zval * zv )
1509
- {
1510
- zend_string * property_name = zend_string_init (name , name_len , 0 );
1511
-
1512
- zend_std_write_property (obj , property_name , zv , NULL );
1513
-
1514
- zval_ptr_dtor (zv );
1515
- zend_string_release (property_name );
1516
- }
1517
-
1518
- static void initialize_date_period_properties (php_period_obj * period_obj )
1519
- {
1520
- zval zv ;
1521
-
1522
- /* rebuild properties */
1523
- zend_std_get_properties_ex (& period_obj -> std );
1524
-
1525
- create_date_period_datetime (period_obj -> start , period_obj -> start_ce , & zv );
1526
- write_date_period_property (& period_obj -> std , "start" , sizeof ("start" ) - 1 , & zv );
1527
-
1528
- create_date_period_datetime (period_obj -> current , period_obj -> start_ce , & zv );
1529
- write_date_period_property (& period_obj -> std , "current" , sizeof ("current" ) - 1 , & zv );
1530
-
1531
- create_date_period_datetime (period_obj -> end , period_obj -> start_ce , & zv );
1532
- write_date_period_property (& period_obj -> std , "end" , sizeof ("end" ) - 1 , & zv );
1533
-
1534
- create_date_period_interval (period_obj -> interval , & zv );
1535
- write_date_period_property (& period_obj -> std , "interval" , sizeof ("interval" ) - 1 , & zv );
1536
-
1537
- ZVAL_LONG (& zv , (zend_long ) period_obj -> recurrences );
1538
- write_date_period_property (& period_obj -> std , "recurrences" , sizeof ("recurrences" ) - 1 , & zv );
1539
-
1540
- ZVAL_BOOL (& zv , period_obj -> include_start_date );
1541
- write_date_period_property (& period_obj -> std , "include_start_date" , sizeof ("include_start_date" ) - 1 , & zv );
1542
-
1543
- ZVAL_BOOL (& zv , period_obj -> include_end_date );
1544
- write_date_period_property (& period_obj -> std , "include_end_date" , sizeof ("include_end_date" ) - 1 , & zv );
1545
- }
1546
-
1547
1510
/* define an overloaded iterator structure */
1548
1511
typedef struct {
1549
1512
zend_object_iterator intern ;
@@ -1663,10 +1626,7 @@ static void date_period_it_move_forward(zend_object_iterator *iter)
1663
1626
zend_std_get_properties_ex (& object -> std );
1664
1627
1665
1628
create_date_period_datetime (object -> current , object -> start_ce , & current_zv );
1666
- zend_string * property_name = ZSTR_INIT_LITERAL ("current" , 0 );
1667
- zend_std_write_property (& object -> std , property_name , & current_zv , NULL );
1668
1629
zval_ptr_dtor (& current_zv );
1669
- zend_string_release (property_name );
1670
1630
1671
1631
iterator -> current_index ++ ;
1672
1632
date_period_it_invalidate_current (iter );
@@ -1837,8 +1797,11 @@ static void date_register_classes(void) /* {{{ */
1837
1797
date_object_handlers_period .clone_obj = date_object_clone_period ;
1838
1798
date_object_handlers_period .get_gc = date_object_get_gc_period ;
1839
1799
date_object_handlers_period .get_property_ptr_ptr = date_period_get_property_ptr_ptr ;
1800
+ date_object_handlers_period .has_property = date_period_has_property ;
1840
1801
date_object_handlers_period .read_property = date_period_read_property ;
1841
1802
date_object_handlers_period .write_property = date_period_write_property ;
1803
+ date_object_handlers_period .get_properties_for = date_period_get_properties_for ;
1804
+ date_object_handlers_period .unset_property = date_period_unset_property ;
1842
1805
1843
1806
date_ce_date_error = register_class_DateError (zend_ce_error );
1844
1807
date_ce_date_object_error = register_class_DateObjectError (date_ce_date_error );
@@ -5138,8 +5101,6 @@ static bool date_period_init_finish(php_period_obj *dpobj, zend_long options, ze
5138
5101
5139
5102
dpobj -> initialized = 1 ;
5140
5103
5141
- initialize_date_period_properties (dpobj );
5142
-
5143
5104
return true;
5144
5105
}
5145
5106
@@ -5843,8 +5804,6 @@ static bool php_date_period_initialize_from_hash(php_period_obj *period_obj, Has
5843
5804
5844
5805
period_obj -> initialized = 1 ;
5845
5806
5846
- initialize_date_period_properties (period_obj );
5847
-
5848
5807
return 1 ;
5849
5808
} /* }}} */
5850
5809
@@ -5964,14 +5923,84 @@ PHP_METHOD(DatePeriod, __wakeup)
5964
5923
zend_throw_error (NULL , "Invalid serialization data for DatePeriod object" );
5965
5924
RETURN_THROWS ();
5966
5925
}
5926
+
5927
+ restore_custom_dateperiod_properties (object , myht );
5967
5928
}
5968
5929
/* }}} */
5969
5930
5931
+ static int date_period_has_property (zend_object * object , zend_string * name , int type , void * * cache_slot )
5932
+ {
5933
+ zval rv ;
5934
+ zval * prop ;
5935
+
5936
+ if (!date_period_is_internal_property (name )) {
5937
+ return zend_std_has_property (object , name , type , cache_slot );
5938
+ }
5939
+
5940
+ php_period_obj * period_obj = php_period_obj_from_obj (object );
5941
+ if (!period_obj -> initialized ) {
5942
+ switch (type ) {
5943
+ case ZEND_PROPERTY_ISSET : /* Intentional fallthrough */
5944
+ case ZEND_PROPERTY_NOT_EMPTY :
5945
+ return 0 ;
5946
+ case ZEND_PROPERTY_EXISTS :
5947
+ return 1 ;
5948
+ EMPTY_SWITCH_DEFAULT_CASE ()
5949
+ }
5950
+ }
5951
+
5952
+ if (type == ZEND_PROPERTY_EXISTS ) {
5953
+ return 1 ;
5954
+ }
5955
+
5956
+ prop = date_period_read_property (object , name , BP_VAR_IS , cache_slot , & rv );
5957
+ ZEND_ASSERT (prop != & EG (uninitialized_zval ));
5958
+
5959
+ bool result ;
5960
+
5961
+ if (type == ZEND_PROPERTY_NOT_EMPTY ) {
5962
+ result = zend_is_true (prop );
5963
+ } else if (type == ZEND_PROPERTY_ISSET ) {
5964
+ result = Z_TYPE_P (prop ) != IS_NULL ;
5965
+ } else {
5966
+ ZEND_UNREACHABLE ();
5967
+ }
5968
+
5969
+ zval_ptr_dtor (prop );
5970
+
5971
+ return result ;
5972
+ }
5973
+
5970
5974
/* {{{ date_period_read_property */
5971
5975
static zval * date_period_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
5972
5976
{
5973
- if (type != BP_VAR_IS && type != BP_VAR_R ) {
5974
- if (date_period_is_internal_property (name )) {
5977
+ if (date_period_is_internal_property (name )) {
5978
+ if (type == BP_VAR_IS || type == BP_VAR_R ) {
5979
+ php_period_obj * period_obj = php_period_obj_from_obj (object );
5980
+
5981
+ if (zend_string_equals_literal (name , "start" )) {
5982
+ create_date_period_datetime (period_obj -> start , period_obj -> start_ce , rv );
5983
+ return rv ;
5984
+ } else if (zend_string_equals_literal (name , "current" )) {
5985
+ create_date_period_datetime (period_obj -> current , period_obj -> start_ce , rv );
5986
+ return rv ;
5987
+ } else if (zend_string_equals_literal (name , "end" )) {
5988
+ create_date_period_datetime (period_obj -> end , period_obj -> start_ce , rv );
5989
+ return rv ;
5990
+ } else if (zend_string_equals_literal (name , "interval" )) {
5991
+ create_date_period_interval (period_obj -> interval , rv );
5992
+ return rv ;
5993
+ } else if (zend_string_equals_literal (name , "recurrences" )) {
5994
+ ZVAL_LONG (rv , period_obj -> recurrences );
5995
+ return rv ;
5996
+ } else if (zend_string_equals_literal (name , "include_start_date" )) {
5997
+ ZVAL_BOOL (rv , period_obj -> include_start_date );
5998
+ return rv ;
5999
+ } else if (zend_string_equals_literal (name , "include_end_date" )) {
6000
+ ZVAL_BOOL (rv , period_obj -> include_end_date );
6001
+ return rv ;
6002
+ }
6003
+ } else {
5975
6004
zend_readonly_property_modification_error_ex ("DatePeriod" , ZSTR_VAL (name ));
5976
6005
return & EG (uninitialized_zval );
5977
6006
}
@@ -6000,3 +6029,26 @@ static zval *date_period_get_property_ptr_ptr(zend_object *object, zend_string *
6000
6029
6001
6030
return zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
6002
6031
}
6032
+
6033
+ static HashTable * date_period_get_properties_for (zend_object * object , zend_prop_purpose purpose )
6034
+ {
6035
+ php_period_obj * period_obj = php_period_obj_from_obj (object );
6036
+ HashTable * props = zend_array_dup (zend_std_get_properties (object ));
6037
+ if (!period_obj -> initialized ) {
6038
+ return props ;
6039
+ }
6040
+
6041
+ date_period_object_to_hash (period_obj , props );
6042
+
6043
+ return props ;
6044
+ }
6045
+
6046
+ static void date_period_unset_property (zend_object * object , zend_string * name , void * * cache_slot )
6047
+ {
6048
+ if (date_period_is_internal_property (name )) {
6049
+ zend_throw_error (NULL , "Cannot unset %s::$%s" , ZSTR_VAL (object -> ce -> name ), ZSTR_VAL (name ));
6050
+ return ;
6051
+ }
6052
+
6053
+ zend_std_unset_property (object , name , cache_slot );
6054
+ }
0 commit comments