@@ -360,10 +360,12 @@ static int date_interval_compare_objects(zval *o1, zval *o2);
360360static  zval  * date_interval_read_property (zend_object  * object , zend_string  * member , int  type , void  * * cache_slot , zval  * rv );
361361static  zval  * date_interval_write_property (zend_object  * object , zend_string  * member , zval  * value , void  * * cache_slot );
362362static  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 );
363364static  zval  * date_period_read_property (zend_object  * object , zend_string  * name , int  type , void  * * cache_slot , zval  * rv );
364365static  zval  * date_period_write_property (zend_object  * object , zend_string  * name , zval  * value , void  * * cache_slot );
365366static  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 );
367369static  int  date_object_compare_timezone (zval  * tz1 , zval  * tz2 );
368370
369371/* {{{ Module struct */ 
@@ -1505,45 +1507,6 @@ static void create_date_period_interval(timelib_rel_time *interval, zval *zv)
15051507	}
15061508}
15071509
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- 
15471510/* define an overloaded iterator structure */ 
15481511typedef  struct  {
15491512	zend_object_iterator   intern ;
@@ -1663,10 +1626,7 @@ static void date_period_it_move_forward(zend_object_iterator *iter)
16631626	zend_std_get_properties_ex (& object -> std );
16641627
16651628	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 );
16681629	zval_ptr_dtor (& current_zv );
1669- 	zend_string_release (property_name );
16701630
16711631	iterator -> current_index ++ ;
16721632	date_period_it_invalidate_current (iter );
@@ -1837,8 +1797,11 @@ static void date_register_classes(void) /* {{{ */
18371797	date_object_handlers_period .clone_obj  =  date_object_clone_period ;
18381798	date_object_handlers_period .get_gc  =  date_object_get_gc_period ;
18391799	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 ;
18401801	date_object_handlers_period .read_property  =  date_period_read_property ;
18411802	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 ;
18421805
18431806	date_ce_date_error  =  register_class_DateError (zend_ce_error );
18441807	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
51385101
51395102	dpobj -> initialized  =  1 ;
51405103
5141- 	initialize_date_period_properties (dpobj );
5142- 
51435104	return  true;
51445105}
51455106
@@ -5843,8 +5804,6 @@ static bool php_date_period_initialize_from_hash(php_period_obj *period_obj, Has
58435804
58445805	period_obj -> initialized  =  1 ;
58455806
5846- 	initialize_date_period_properties (period_obj );
5847- 
58485807	return  1 ;
58495808} /* }}} */ 
58505809
@@ -5964,14 +5923,84 @@ PHP_METHOD(DatePeriod, __wakeup)
59645923		zend_throw_error (NULL , "Invalid serialization data for DatePeriod object" );
59655924		RETURN_THROWS ();
59665925	}
5926+ 
5927+ 	restore_custom_dateperiod_properties (object , myht );
59675928}
59685929/* }}} */ 
59695930
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+ 
59705974/* {{{ date_period_read_property */ 
59715975static  zval  * date_period_read_property (zend_object  * object , zend_string  * name , int  type , void  * * cache_slot , zval  * rv )
59725976{
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  {
59756004			zend_readonly_property_modification_error_ex ("DatePeriod" , ZSTR_VAL (name ));
59766005			return  & EG (uninitialized_zval );
59776006		}
@@ -6000,3 +6029,26 @@ static zval *date_period_get_property_ptr_ptr(zend_object *object, zend_string *
60006029
60016030	return  zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
60026031}
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